Autor | Zpráva | ||
---|---|---|---|
majak108 Profil |
#1 · Zasláno: 3. 5. 2010, 18:03:38
Dobrý den,
rád bych se zeptal, jestli někdo nevíte co s mysqli multi_query. Provádím transakci a pouzivam multi_query pro skupinu insertů. Všechno proběhne v pořádku, ale později když dělám další dotaz vypíše mi to "Commands out of sync; you can't run this command now". Nikde jsem nenašel žádné rozumné řešení. Díky za radu |
||
bohyn Profil |
#2 · Zasláno: 3. 5. 2010, 20:04:17
majak108:
Před dalším dotazem musíš uvolnit všechny výsledky dotazů: if($mysqli->multi_query("...")) { while($mysqli->next_result()) { if($result = $mysqli->use_result()) { $result->close(); } } } |
||
majak108 Profil |
#3 · Zasláno: 3. 5. 2010, 21:50:32
Diky moc, funguje to.
Chtel bych se jeste zeptat, jak funguje multi_query. I když mám chybu v dotazech, vrací mi to 1, tedy true. Lze nějak zjistit chyby, které se vyskytli? |
||
bohyn Profil |
#4 · Zasláno: 3. 5. 2010, 22:49:52 · Upravil/a: bohyn
majak108:
Chyba se dá zjistit jen pro první dotaz. Pokus selže druhý nebo další tak MySQLi žádnou chybu nevrátí. Jestli chceš zjistit jestli se vše provedlo správně musíš spočítat dotazy a pak spočítat kolik jich uvolňuješ. Ted když na to koukám tak první dotaz se v předchozím kódu neuvolňuje, takže by to mělo být nějak takhle: $uvolneno = 0; if($mysqli->multi_query("...")) { do { if($result = $mysqli->use_result()) { $result->close(); $uvolneno++; } } while($mysqli->more_results() && $mysqli->next_result()); } else { echo "Chyba v prvním dotazu {$mysqli->error}"; } echo "Uvolněno {$uvolneno} dotazů"; Víc informací z MySQLi nevymačkáš. |
||
majak108 Profil |
#5 · Zasláno: 4. 5. 2010, 11:43:14 · Upravil/a: majak108
Díky moc za rady, mám snad už jen poslední:
nevíte proč mi multi_query vrací vždy true? Mám to nějak takto: $query = " START TRANSACTION; SELECTsasdasd * FROM `sn_objednavka`; COMMIT; "; schválně jsem pokazil dotaz select, ale stejně mi to vrátí 1 a vypíše se mi podle předchozího kódu: Uvolněno {0} dotazů nedělám někde chybu? Děkuju |
||
Mastodont Profil |
#6 · Zasláno: 4. 5. 2010, 11:52:33
Viz manuál:
Returns FALSE if the first statement failed |
||
majak108 Profil |
#7 · Zasláno: 4. 5. 2010, 11:55:37 · Upravil/a: majak108
no to jsem četl, ale pochopil jsem to tak, že první příkaz(dotaz) je ten select.
Navic ted jsem nasel, ze server by mel vracet ERROR nebo OK odpovedi i kdyz multi query neobsahuje zadny select a to mi to teda nevraci. Viz: 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. |
||
bohyn Profil |
#8 · Zasláno: 4. 5. 2010, 18:02:14
majak108:
První dotaz je START TRANSACTION A ten prošel bez chyby. Další je ten SELECT a na ten už MySQLi chybovou hlášku nevrátí. Třetí je COMMIT a ten se už neprovede protože SELECT hodil chybu. Stejně tak by se neprovedly ani další dotazy (jestli je zahájená transaction nebo ne v případě multi_query nezáleží, na první chybě končí). |
||
Časová prodleva: 13 let
|
0