kostenloser Webspace werbefrei: lima-city


Mysqli - multi_query

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    midwar

    midwar hat kostenlosen Webspace.

    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!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. midwar schrieb:
    ... 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;
    			}
    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 ;)
  4. 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.
  5. Autor dieses Themas

    midwar

    midwar hat kostenlosen Webspace.

    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?
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!