Autor Zpráva
lukaz1010
Profil
Ahoj

Nedaří se mi vytvořit stored procedure (rutinu) v MySQL pomocí PHP skriptu. Skript vytvoří úspěšně novou databázi, přepne se na její používání, vytvoří tabulku, ale nedokončí tvorbu uložených procedur (routines / stored procedures) v databázi.

Zkoušel jsem měnit DELIMITER ale nepomahá to. Pokud jste někdo zápasil s tímto tématem nebo víte jak na to, budu vám velice vděčnej.

Projekt na kterém pracuji bude OpenSource. Nemám za něj vůbec nic, než svoje potěšení z psaní, ale teď jsem tvrdě narazil a nevím jak dál. Googlil jsem neúspěšně.

Děkuju za případnou radu.

Zde je skript:
.
.
.
$db = $_SESSION["db"] ;

$prikaz = "
CREATE DATABASE $db; 
USE $db; 

CREATE TABLE tagy (
  id int(11) NOT NULL auto_increment,
  tag varchar(1000) collate utf8_czech_ci NOT NULL default '_nekategorizovano',
  pocet int(11) NOT NULL default '-1',
  PRIMARY KEY  (id),
  FULLTEXT KEY tag (tag)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

DELIMITER //
CREATE PROCEDURE tag_novy(
        IN par_jmeno           text
        
)
BEGIN
INSERT INTO tagy
(
        tag,
	pocet
)
VALUES
(
        par_jmeno,
	1
);
END
//

CREATE PROCEDURE tag_uprava(
	IN par_id		INT,
        IN par_tag  text
        )
BEGIN
UPDATE tagy
SET
        tag = par_tag
WHERE
        id = par_id;
END
//
DELIMITER ;
";

echo $prikaz;

$spojeni = @mysql_connect( $db_server, $db_uzivatel ,  $db_heslo);
$vysledek = mysql_query($prikaz,$spojeni);
mysql_close($spojeni);
.
.
.
fajzen
Profil
pomocou mysql_query sa dá vykonať iba jeden príkaz... pre vykonanie viacerých príkazov sa používa metóda multi_query triedy mysqli
fajzen
Profil
aj keď v PHP manuáli v komentári niekto píše, že sa to dá:
The documentation claims that "multiple queries are not supported".

However, multiple queries seem to be supported. You just have to pass flag 65536 as mysql_connect's 5 parameter (client_flags). This value is defined in /usr/include/mysql/mysql_com.h:
#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* Enable/disable multi-stmt support */

Executed with multiple queries at once, the mysql_query function will return a result only for the first query. The other queries will be executed as well, but you won't have a result for them.
lukaz1010
Profil
to fajzen:
Díky kámo, za tvou pohotově zadanou odpověď. Než-li jsem jí stačil přečíst včas, tak jsem to napsal bez Delimiteru a rozdělil jsem si to na více příkazů. Děkuji velice, za tvou radu Fajzen. Zdá se mi ten multi_query hodně dobrý příkaz. Určitě si ho v budoucnu ještě moc užiju ;-) Přeji dobrou noc, čau a ještě jednou díky moc!


Tak to pracuje. Ten Delimiter // nejde posílat ze skriptu do db, nejspíš protože není ukončen středníkem.
test.php:
$prikaz1 = "
    CREATE TABLE tags (
    id int(11) NOT NULL auto_increment,
    tag varchar(1000) NOT NULL default 'not categorized',
    PRIMARY KEY  (id),
    FULLTEXT KEY tag (tag)
    ) ENGINE=MyISAM ;
";

$prikaz2="
    CREATE PROCEDURE tag_new(
        IN par_tag  text
    )
    BEGIN
    INSERT INTO tags
    (
        tag,
        count
    )
    VALUES
    (
        par_tag,
        1
    );
    END
";

    $db_server = "localhost";
    $db_uzivatel = "root";
    $db_heslo = "l0ngWAy";
    $db_nazev = "test03";

    // PŘIPOJÍM SERVER
    //
    $spojeni = mysql_connect($db_server, $db_uzivatel, $db_heslo);
    if (!$spojeni) { die('Nelze pripojit: '.mysql_error()); }

    // ZAHODÍM DB POKUD EXISTUJE
    //
    $prikaz = "drop database if exists $db_nazev";
    if (mysql_query($prikaz, $spojeni))
    {
        echo "Databaze $db_nazev zahozena uspesne. ";
    }
    else
    {
        die("Chyba pri zahazovani db: ".mysql_error());
    }

    // VYTVOŘÍM DB
    //
    $prikaz = "CREATE DATABASE $db_nazev";
    if (mysql_query($prikaz, $spojeni))
    {
            echo "Databaze $db_nazev vytvorena. ";
    }
    else
    {
            die("Chyba pri tvorbe databaze: ".mysql_error());
    }

    // VYBERU NOVĚ VYTVOŘENOU DB
    //
    if (!mysql_select_db($db_nazev)) { die('DB nelze vybrat: '.mysql_error()); }

    // DOTAZUJI VYTVOŘENÍ TABULKY
    //
    if (!mysql_query($prikaz1)) { die('Spatny dotaz: '.mysql_error());}
    echo $prikaz1 ." -> Uspesne vytvorena tabulka. ";

    // DOTAZUJI VYTVOŘENÍ STORED PROCEDURE ->
    // "DELIMITER //" neni treba pokud zadavam prikaz po prikazu
    //
    if (!mysql_query($prikaz2)) { die('Spatny dotaz: '.mysql_error());}
    echo $prikaz2 ." -> Uspesne vytvorena stored procedure. ";

    // ODPOJÍM SERVER
    //
    mysql_close($spojeni); 

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: