Ezt elolvasva ez egy olyan valami, ami visszatér azzal hogy van-e még result, és azt a resultot prepareli is, utánna a store result-al vagy user result-al le kell fetchelni.
Viszont a te while feltételedben hozzá van éselve a more_results, ami miatt ha nincs több result akkor kilép.
Erős tippem, hogy az történik, hogy az és miatt muszáj mindkettőt kiértékelni, és balról jobbra haladva teszi. A next_result kiértékelése előveszi az utolsó resultot és igazat ad vissza mert volt mit elővegyen, ezután értékelődik ki a more_results ami hamisat ad vissza, mert nincs több, pont az előbb lőtted el az utolsót. Így kilép, és az utolsó ottmarad lefetcheletlenül.
Elnézést ha nem voltam php meg mysql szabatos, de nagyon nem a területem.
A ciklusfeltételem (szerintem) Laja #9963-as megoldásának procedurális változata, ami kivédi a strict hibát. Ha ezt visszaalakítom, ott vagyok, ahol kezdtem az egészet.
Kérlek áruld el a megoldást, mert én nem tudok jobbat kitalálni. Sajnos/szerencsére nem ebből élek, nincs is akkora gyakorlatom, mint nektek.
UPDATE _test SET df=5 WHERE df BETWEEN 50000 AND 59999;
SELECT * FROM _test WHERE df=1;
SELECT * FROM _test WHERE df=5;
SELECT * FROM _test WHERE df<80000;
Minden tökéletesen lefut, kivéve egy dolgot: akármennyi select van (és a pma szerint lenne mit hoznia, de ) még sincs meg az utolsó select eredménye. Miért?
Ööö... nem. Azt nem értem, hogy ha külön-külön OK a függvényemnek akármennyi insert és update, akkor egyben miért nem. A logika nem világos, de most megpróbálok rájönni.
Mármint azt akarod kérdezni, hogy miért sikerül az első batch, és miért nem a második. Arra gyanakszol, hogy talán az egyes batch-ekben lévő utasítások fajtája (INSERT, CREATE TABLE, UPDATE, stb) számít. Nem, az nem számít. Az számít, hogy nem volt elég 'next_result' hívás. Laja73 olvtárs ezt már írta is a (9963)-ban.
Azért a MySQL kf. parancsain már túl vagyok :) Tudom, hogy mi a result set, affected rows meg hasonlók.
Az még nem tiszta, hogy miért van 100 insert/update/selectre elég next_resultom, de ha ezek egy csomagban vannak, akkor már nincs. Meg egy truncate + alter table párosra sincs.
De azért addig oké, hogy alapvetően kétféle utasítás van? Az egyik a SELECT, a másik meg a mindig más (DML, DDL, etc)?
A MySql (vagy a PHP) derék programozói mindent 'query'-nek neveznek, de attól még fontos tudni, hogy az egyikből (SELECT) jön kifelé eredmény, amit lehet FETCH-elni; a másikból meg nem, csak olyan státusz-infó jön, hogy siker/hibakód, érintett sorok száma, automatikusan generált ID értéke.
Persze mindettől függetlenül a programoddal az a baj, hogy nem hívod elégszer a next_result-ot, már a 9963-ban írta neked Laja73 olvtárs.
Tényleg nem értelek. Ha megnézed a kódomat, nincs fetch, ha nincs result.
if ( $result = MySQLi_store_result ( $dbConn )){ //ha van $result while ( $row = MySQLi_fetch_assoc ( $result )){ //akkor van fetch $r[] = $row; // itt most egyszerűsítettem } MySQLi_free_result ( $result ); } else { //ha meg nincs, akkor... if ( MySQLi_errno ( $dbConn) == 0 ){ return ( "success" ); // ha mysqli_errno == 0, akkor sincs, } else { return ( MySQLi_errno ( $dbConn ) . " - " . MySQLi_error ( $dbConn )); // de ha nem annyi, akkor sincs } }
Csak-update csomagnál visszajön, hogy success, insertnél ugyanúgy, n+1 insert ÉS update csomagnál meg out of sync.
Lehet, hogy egy egyszerű pontszemű lény vagyok, de nem jövök rá, hogy a kérdésed hogy a fenébe kapcsolódik a 2014 - Out of sync hibához. Sajnálom. Ha tudod a megoldást, kérlek írd le egyenesen: azért van out of sync, mert...
Ezen nagyon derék dolog, dicséretes, helyeslem. Na most akkor próbáljunk egy másik kérdést: Ugye az lehetetlen, hogy query (SELECT) és non-query (INSERT, UPDATE, DELETE, ...) kevereg egy csomagban? Mert ha csak non-query-k vannak, akkor minek a fetch?
Bocs, már túl este van. Nincs olyan, hogy insert és update egyben. De nem gondolom, hogy azért lesz out of sync, mert fetch-elem az üres result-ot. Max. fut a kód egy milliszekundumot feleslegesen.
Nem lehetetlen, próbáltam olyat, hogy beszúrok 100 sort aztán többféleképpen update-elem az egész táblát. Most így hirtelen nem ugrik be példa, hogy ez mire jó a gyakorlatban, csak tesztelgettem a multi_query-t. Olyat nem próbáltam, hogy insert - update - insert megint - stb. egyben.
Olyan viszont volt, hogy truncate és auto increment nullázás ment egy multi_query-ben, és erre is out of sync-et kaptam.
Egy olyan saját függvényt szeretnék összehozni, amit bárhol alkalmazhatok, csak átdobom neki az SQL-eket tömbben és szépen feldolgozza. Csak ezt az out of sync-et nem értem, hogy miért jön elő. Mert akkor is előjön, ha átmegy 100 insert és a függvény újra futtatásával követi ezt valamennyi update, kb így:
$r1 = dbMultiQuery ( $sql_inserts );
$r2 = dbMultiQuery ( $sql_updates );
Ilyenkor az $r1 lefut, az $r2 out of sync. Ha az $r1-et kihagyom, akkor az $r2 simán lefut. Órákat töltöttem már a doksival, fórumokban és a Google-lel, de nem jövök rá, hogy mi a baja.
Ugye az lehetetlen, hogy query (SELECT) és non-query (INSERT, UPDATE, DELETE, ...) kevereg egy csomagban? Mert ha csak non-query-k vannak, akkor minek a fetch?
Ne haragudj, lehet, hogy rossz legókockákat nézegetek, de nem tudom összerakni, hogy mire gondolsz. A strict hibát önerőből kiküszöböltem (amúgy a php.net példája magával hozza a strict hibát), az meg nem esik le, hogy a 2014-es Out of sync hibát hogy kerülhetem el.
A 2014-esről ennyit ír a MySQL doksija::
Commands out of sync
If you get Commands out of sync; you can't run this command now in your client code, you are calling client functions in the wrong order.
Akárhogy nézem a kódomat, sz'tem minden benne van, aminek ott kell lennie: először multy_query, aztán store_result, aztán free_result. A 2014-es hiba csak akkor jön elő, ha keverem az utasításokat (pl. insert és update, vagy truncate table és alter table egy csomagban). Ha n+1 insert vagy update van egyben, az hibátlanul lefut.
Légszi egy kicsit szájbarágósabb stílusban rávezetnél a megoldásra?
Kéne még segítség a tanulásban. Ha kétszer egymás után futtatom a lenti dbMultiQuery függvényemet, az első csomag (mondjuk insertekkel) simán lefut, a másodikra - ami többféleképpen update-eli az egész táblát - viszont hibaüzenetet dob a MySQL: "2014 - Commands out of sync; you can't run this command now".
(Azt tudom, hogy nem sok értelme van ugyanabba a táblába több insertet MySQLi_multi_query-vel átküldeni, de csak próbálom felfogni a multi_query működését.)
A MySQL doksi szerint ez a hiba akkor fordul elő, ha új lekérdezés indul az előző mysqli_free_resulttal való lezárása nélkül. Ahogy lentebb bemásoltam, benne van a függvényemben az utasítás, enélkül (gondolom) az első, insertes csomag se futna le. Ha az insertet kihagyom és csak az update részt futtatom, az rendben lefut. Mi a gond?
Még valami... Próbából betettem az első, insertes sql csomag elejére két sort: "TRUNCATE TABLE _test;", "ALTER TABLE _table AUTO_INCREMENT=1;". Ha ezek ott vannak, akkor is jön a 2014-es hiba, pedig csak egyszer futtatom a dbMultiQuery függvényemet. Kiakad a MySQL, ha többféle utasítást kap egy multi csomagban? Vagy van valami időzítési trükk, amit nem vettem volna észre a doksiban (pedig egy tucat helyen utánaolvastam)?
Help. Most először próbálgatom a mysqli_multi_query-t. A gyakorláshoz szinte 1 az 1ben kimásoltam a php.net doksijából a példát:
$r = array();
if (mysqli_multi_query($link, $query)) { do { if ($result = mysqli_store_result($link)) { while ($row = mysqli_fetch_row($result)) { $r[] = $row[0]; } mysqli_free_result($result); } } while (mysqli_next_result($link)); }
Ha viszont ezt futtatom, akkor az eredményekkel együtt ezt kapom:
Strict Standards: mysqli_next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method in…
Próbáltam az utolsó sorban a mysqli_next_resultot lecserélni, de akkor végtelen ideig (=30mp) fut a php script. Próbáltam az if ( $result= mellé is betenni, de az se segít. Így gyorsan lefut a script, de ugyanúgy jön a strict üzenet. Mi a jó megoldás (már azon kívül, hogy kikapcsolom a strict üzeneteket)?