Autor Zpráva
majak108
Profil
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
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
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
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
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
Viz manuál:
Returns FALSE if the first statement failed
majak108
Profil
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
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čí).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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