Mysqli - multi_query
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
aufbau
code
datenbank
fehler
first
frage
http
multi
schleife
statement
test
transaktion
url
verbessern
verwendung
vorschlag
vorteil
zeile
zugreifen
-
Hi,
ich hab da ein paar Fragen zum Thema multi_query() in mysqli:
1. Ich habe ein etwas größeres Script, dass sich bei Maximum Execution Time, zu 90% immer in meinen beiden multi_queries aufhängt. Will heißen die beiden multi_queries von mir scheinen die meiste Zeit in der Ausführung zu beanspruchen. Was genau kann man machen, um dies zu beschleunigen? Konkret geht es um das hier:
$Result = $this->Connect->multi_query($Query); if($Result !== false) { // Query was ok - got result while($this->Connect->next_result()); } else { // If the query failed return false; }
Genauer gesagt geht es um die while() Zeile. Hier hängt sich das Skript häufig auf. Kann man an dieser Zeile irgendwas verbessern - das ganze performanter gestalten? Machen muss ich dies, weil später noch andere Queries ausgeführt werden, und ich die results ja vorher erst durchgehen muss...
2. Ich möchte mit $this->Connect->error auf verschiedene Fehlerfehlermeldungen einer multi_query zugreifen! "To retrieve subsequent errors from other statements you have to call mysqli_next_result() first." Schön und gut. Ich hab also in die while Schleife oben auch mal echo $this->Connect->error; gepackt, allerdings nichts erhalten. Ausgegeben wird immer nur die erste Fehlermeldung zur ersten misslungenen Teilquery - was kann man machen?
Vielen Dank für eure Hilfe! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
midwar schrieb:
yo mey! junge! um das geht es hier überhaupt nicht ;) wo ist dein query! (auch mysqli kocht die suppe nur mit wasser.) von dem da kann man nix sehen. also query her ;)
... Konkret geht es um das hier:$Result = $this->Connect->multi_query($Query); if($Result !== false) { // Query was ok - got result while($this->Connect->next_result()); } else { // If the query failed return false; }
-
midwar schrieb:
...was kann man machen?
Vorschlag!
Lies dir nochmal die Verwendung von mysqli.multi-query durch.
Mir scheint das so, als ob du den Aufbau etwas verdreht hast.
BTW, warum eigentlich multi_query?
Hast du so viele Abfragen?
Wie sieht es mit Transaktionen aus? Dort kannst du auch alles eingeben und dann mit einem COMMIT alles in die Datenbank schreiben, mit dem Vorteil, dass bei einem Fehler alles wieder zurück gerollt wird. -
kgreen schrieb:
midwar schrieb:
...was kann man machen?
Vorschlag!
Lies dir nochmal die Verwendung von mysqli.multi-query durch.
Mir scheint das so, als ob du den Aufbau etwas verdreht hast.
BTW, warum eigentlich multi_query?
Hast du so viele Abfragen?
Wie sieht es mit Transaktionen aus? Dort kannst du auch alles eingeben und dann mit einem COMMIT alles in die Datenbank schreiben, mit dem Vorteil, dass bei einem Fehler alles wieder zurück gerollt wird.
Also erstmal:
Ja, ich habe viele Abfragen, daher die multi-query.
Nein, ich will das nicht über Transactions machen, sondern einfach auf die errors einer Subquery von einer multi_query zugreifen können. So schwer kann das ja nicht sein.
Also hier ein extra falsch gebautes multi_query.
$test = new mysqli("localhost","root","","test"); $test->query("SELECT gibtsnicht FROM gibtsauchnicht WHERE id = 4"); echo $test->error; echo "<br><br>"; $test->multi_query("SELECT gibtsnicht FROM gibtsauchnichtxD WHERE id = 4;SELECT gibtsnicht2 FROM gibtsauchnicht3 WHERE test = 4"); echo $test->error . "<br><br>"; $test->next_result(); echo $test->error . "<br><br>";
Normalerweise müssten doch jetzt für jede der beiden Subqueries die entsprechende Fehlermeldung kommen, oder? Tut es aber nicht! "Strict Standards: mysqli::next_result() [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". Dabei steht explizit in der Anleitung: "To retrieve subsequent errors from other statements you have to call mysqli_next_result() first." Also was bitte soll ich machen, um mit $test->error auf die subquery errors zugreifen zu können?
Und zu meiner anderen Frage: Was genau in meiner $Query steht, die dann als multi_query ausgeführt wird ist doch vollkommen egal! Irgendwas halt. Kannste meinetwegen eine SELECT id FROM tabelle WHERE name = 3 reinbasteln und dazu ein SELECT nichts FROM garnichts WHERE id = -3. Es geht einfach nur darum, dass wenn man nach einer multi_query noch weitere querys ausführen will erst die results leeren muss (so hab ich das zumindest verstanden) und daher mit while($test->next_resul()); einmal alles komplett durchlaufen lassen muss. Allerdings hängt sich das Script häufiger an dieser Stelle auf, deswegen von mir die Frage ob man an genau dieser while Schleife nicht irgendetwas verbessern kann? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage