Portál AbcLinuxu, 12. května 2025 17:13

Dotaz: mysqli multi_query náhodně neproběhne

5.12.2008 17:03 fakenickname | skóre: 42 | blog: fakeblog
mysqli multi_query náhodně neproběhne
Přečteno: 544×
Odpovědět | Admin

Zdravim,

  pisu takovy maly PHP+MySQL ukolnicek a zasekl jsem se na funkci addTodo() kde pomoci multi_query pridavam do databaze novy zapisek. Problem je, ze pridani do DB probehne jenom nekdy. Nepodarilo se mi vypatrat zadnou souvislost s nicim, zadne pominene chovani, proste uplne nahodne. Kod vypada priblizne takto (zkousim ruzne pokusy aby se to rozbehlo):

    public function addTodo($author, $priority, $deadline, $text, $labels)
    {
        $enteredDate = $this->todayDate();
        $query  = "START TRANSACTION;\n";
        $query .= "SELECT @IDT:=MAX(idtodo)+1 FROM Todos;\n";
        $query .= "SELECT @IDU:=idusr FROM Users WHERE username=\"".$author."\";\n";
        $query .= "INSERT INTO Todos VALUES (";
        $query .= "'0', @IDU, @IDT, '".$priority."', '".$enteredDate."', ";
        $query .= "'".$deadline."', '".$text."');\n";
        $query .= "COMMIT;";

        echo "<pre>".$query."</pre>";
        if ( $this->db->multi_query($query) )
        {
            echo "SQL DOTAZ je OK<br>";
        }
        return true;
    }

Pri vykonavani ten SQL dotaz vypada napriklad takto:

START TRANSACTION;
SELECT @IDT:=MAX(idtodo)+1 FROM Todos;
SELECT @IDU:=idusr FROM Users WHERE username="demo";
INSERT INTO Todos VALUES ('0', @IDU, @IDT, '1', '2008-12-05', '2008-1-1', 'oo');

COMMIT;

Zkoušel jsem vyloučit data, místo SQL proměnných jsem použil vnořené selecty (to nefungovalo vůbec). Bez transakcí to dělá to samé. Zkoušel jsem všechno co mě napadlo a vážně už nevím (DB master zrovna nejsem).

 

Poznámky:

 

Jako PHP používám PHP 5.2.7 with Suhosin-Patch 0.9.6.3, Apache 2.2.10, browser Firefox3, distro Archlinux

 

Díky moc za jakékoliv rady

 

 

 

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.12.2008 17:12 fakenickname | skóre: 42 | blog: fakeblog
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
Odpovědět | | Sbalit | Link | Blokovat | Admin

Možná jsem zle vyjádřil chování. V praxi tohle: dám F5 a znovu pošlu data z formuláře do controlleru, ten je dá DB a ta je zapíše do DB. Vždycky všechno proběhne v pořádku (funkce mysqli hlásí úspěch), ale když ve vedlejším okně nechám vypsat tabulku, tak se nezmění. Dám znova F5, pošlu úplně ta samá data, úplně identický SQL dotaz, jen o pár vteřin poté a data se objeví v DB. Někdy musím dát F5 (znovuposlání dat) třeba i čtyřikrát, někdy je to okamžitě, ale nemá to žádný časový nebo množstevní charakter). Jen doufám, že je to nějaký typický newbie trap.

5.12.2008 18:06 fakenickname | skóre: 42 | blog: fakeblog
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hmmm, tak to přecejenom byl newbie trap..

It's very important that after executing mysqli_multi_query you have first process the resultsets before sending any another statement to the server, otherwise your socket is still blocked.

Please note that even if your multi statement doesn't contain SELECT queries, the server will send result packages containing errorcodes (or OK packet) for single statements. (-- http://cz2.php.net/manual/en/mysqli.multi-query.php)

Škoda, že sem si ty komentáře nečetl dřív a pozorněji..
default avatar 5.12.2008 23:41 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
Odpovědět | | Sbalit | Link | Blokovat | Admin
SELECT @IDT:=MAX(idtodo)+1 FROM Todos;
SELECT @IDU:=idusr FROM Users WHERE username="demo";
INSERT INTO Todos VALUES ('0', @IDU, @IDT, '1', '2008-12-05', '2008-1-1', 'oo');

Boha jeho!

6.12.2008 10:09 Karel Borkovec | skóre: 28 | blog: HP_NX9010 | Tábor
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne

Určitě by bylo lepší rovnou napsat co máš přesně na mysli ;-)

Používat max() pro nové ID je nesmysl. Když někdo jiný v tu chvíli vloží jiný záznam, tak data nebudou konzistentní.

V MySQL použij auto_increment, v DB systémech, kde auto_increment není se používá sequence a trigger (např.).

7.12.2008 01:15 fakenickname | skóre: 42 | blog: fakeblog
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
je to jenom vysek relevantnich casti komplikovanejsiho sql dotazu. pro rucni vytvareni noveho ID mam svoje dobre duvody
6.12.2008 10:27 depka | skóre: 20 | blog: eterity
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
Odpovědět | | Sbalit | Link | Blokovat | Admin

btw: transakce je zbytecna, pro nove id pouzij jiz zminovany auto_increment a pro zjisteni id toho druheho vnoreny poddotaz a budes to met vsechno v jenom dotazu

6.12.2008 11:41 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
Odpovědět | | Sbalit | Link | Blokovat | Admin
A že se ještě nikdo nezmínil o vytváření SQL dotazů skládáním řetězců…
Ještě na tom nejsem tak špatně, abych četl Viewegha.
okbob avatar 8.12.2008 11:16 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne

Uz jsem rezignoval - na to kazdy musi prijit sam

10.12.2008 23:33 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: mysqli multi_query náhodně neproběhne
Hint: PHP

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.