Mickymaus: Mysql multiquery freimachen

Servus,

ich führe mit $MySQL->multi_query($Query); eine große Query aus. Danach möchte ich durch andere Funktionen noch ganz einfache normaler querys ausführen. Allerdings kriege ich immer den "Commands out of sync; you can't run this command now" Fehler - will heißen ich muss erst die Results meiner multi_query freimachen, wenn ich das richtig verstehe.

Bloß: Wie mache ich das? Und wieso? Klar, es gibt die Funktionen mysqli::use_result etc, aber das was ich mit meiner MultiQuery mache sind nur ein paar Inserts... Ich will also nichts ausgeben und das auch nicht weiter verarbeiten. ich möchte einfach nur ein paar Inserts in einer Query ausführen und danach normal weiterarbeiten können.

Wenn mir jemand genau erklären könnte warum man nach multi_query diesen ganzen Mist machen soll, wäre ich sehr dankbar!

  1. Hallöle,

    Bloß: Wie mache ich das?

    Ich mach das so, zB bei Updates und Inserts:

      
    mysqli_multi_query($db,$multi_sql);  
    if(mysqli_more_results($db)) {  
      while(mysqli_next_result($db));  
    }  
    
    

    Oder Multi-Selects...

      
    if (mysqli_multi_query($db, $multi_sql)) {  
      do {  
        if ($result = mysqli_store_result($db)) {  
          while ($row = mysqli_fetch_assoc($result)) {  
            var_dump($row);  
          } mysqli_free_result($result);  
        }  
      } while(mysqli_next_result($db));  
    }  
    
    

    Würde empfehlen, entsprechende Funktionen zu erzeugen.

    Vielleicht hilft dir das ein bisschen.

    1. Ich mach das so, zB bei Updates und Inserts:

      mysqli_multi_query($db,$multi_sql);
      if(mysqli_more_results($db)) {
        while(mysqli_next_result($db));
      }

        
      Hallo,  
        
      erstmal großen Dank dafür. So funktioniert es bei mir (musste es natürlich noch auf OOP statt prozedural anpassen):  
        
      // Insert all the Data via multi query  
      			$Query = implode(";",$Query);  
      			$this->Connect->multi\_query($Query);  
               		if($this->Connect->more\_results()) {  
          				while($this->Connect->next\_result());  
      			}  
        
      Nur will ich nach wie vor wissen WIESO man das bitte machen muss, ich habe noch nicht wirklich verstanden wieso dieser Hickhack nötig ist. Ausserdem finde ich es komisch, dass in das if() noch ein while() reinmuss! Ohne das while klappt es nämlich nicht. Kann mir das jemand einmal bitte für dumme erklären?  
        
      Und ne andere Frage diesbezüglich: Ich habe ca. 50 einzelne Update Querys zu einer $this->Connect->multi\_query($Query); zusammengefasst. Ist das nun ein signifikanter Geschwindigkeitszuwachs? Oder kann man das irgendwie anders noch beschleunigen?
      
      1. // Insert all the Data via multi query
        $Query = implode(";",$Query);
        $this->Connect->multi_query($Query);
                  if($this->Connect->more_results()) {
             while($this->Connect->next_result());
        }

        Nur will ich nach wie vor wissen WIESO man das bitte machen muss, ich habe noch nicht wirklich verstanden wieso dieser Hickhack nötig ist. Ausserdem finde ich es komisch, dass in das if() noch ein while() reinmuss! Ohne das while klappt es nämlich nicht. Kann mir das jemand einmal bitte für dumme erklären?

        Weil es so im manual steht: mysqli.multi-query. (Siehe Beispiel) Warum? Commands out of sync.

        Und ne andere Frage diesbezüglich: Ich habe ca. 50 einzelne Update Querys zu einer $this->Connect->multi_query($Query); zusammengefasst. Ist das nun ein signifikanter Geschwindigkeitszuwachs?

        Es kommt darauf an. Wennst einen entfernten DB-Server hast, kann die Kommunikation sonst erheblich länger dauern. Selbst auf dem selben Server kann meiner Erfahrung nach deutlich Zeit durch die Verwendung der Multi-Queries gespart werden, da das Script nicht laufend Ping-Pong mit dem DB-Server spielen muss. Einfach benchmarken.

        Oder kann man das irgendwie anders noch beschleunigen?

        Man kann soviel tunen, dass man nur damit seine Zeit verbrignen kann *g* Servervariablen, Indexe richtig setzen,...

        Viele Grüße,
        Jonny 5

      2. Hallo nochmal,

        Oder kann man das irgendwie anders noch beschleunigen?

        Wenn große Datenmengen hin und her gehen kann zB auch MYSQLI_CLIENT_COMPRESS sinnvoll sein (ev geht das nur mit mysqli_real_connect / siehe supported flags)

        zB:

          
        $db = mysqli_init();  
          
        mysqli_real_connect(  
          $db,  
          DB_IP,  
          DB_USER,  
          DB_PASS,  
          DB_NAME,  
          DB_PORT,  
          DB_SOCK,  
          MYSQLI_CLIENT_COMPRESS  
        )
        

        Am besten messen, obs dir was bringt.