Joerg: mysqli_multi_query Abfrage mit while Schleife

Guten Abend,

ich hoffe mir kann jemand einen Ansatz zur Lösung meines Problems geben.
Ich frage eine MySQL Datenbank mit "mysqli_multi_query" ab.

  
$eingabe_id  = mysqli_real_escape_string($db,$_POST['id']);  
$query = "SELECT `user`, `email` FROM `tabelle` WHERE `id` = '".$eingabe_id."';";  
$query .= "SELECT `trip`, `ort` FROM `tabelle2` WHERE `id` = '".$eingabe_id."';";  
$result = mysqli_multi_query($db,$select);  

Nun kann das erste Statement nur ein Ergebnis liefern. Das zweite Statement kann mehrere Ergebnisse liefern und muss daher in einer Schleife ausgegeben werden.

Beispiel der gewünschten Ausgabe:
Reisefreund (user) hat folgende Reisen unternommen:
Italien-Rom, Spanien-Barcelona, Griechenland-Kreta (while trip-ort)
Für Fragen schreib an email@da.de (email)

Wie kann ich das machen?

Danke für Tipps

Joerg

  1. Hi,

    Wie kann ich das machen?

    Woran scheiterst du …?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      ich scheitere daran, dass ich das gewünschte Ergebnis nicht erziele.
      Ich bekomme keinen Buchstaben ausgegeben.

      Gruß
      Joerg

      1. Meine Herren!

        ich scheitere daran, dass ich das gewünschte Ergebnis nicht erziele.
        Ich bekomme keinen Buchstaben ausgegeben.

        Schau dir nochmal genau an, wie deine Variable-Bezeichner heißen.

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Danke, das war nur hier ein Schreibfehler:

            
          $eingabe_id  = mysqli_real_escape_string($db,$_POST['id']);  
          $query = "SELECT `user`, `email` FROM `tabelle` WHERE `id` = '".$eingabe_id."';";  
          $query .= "SELECT `trip`, `ort` FROM `tabelle2` WHERE `id` = '".$eingabe_id."';";  
          $result = mysqli_multi_query($db,$query);  
          
          
          1. Meine Herren!

            $eingabe_id  = mysqli_real_escape_string($db,$_POST['id']);
            $query = "SELECT user, email FROM tabelle WHERE id = '".$eingabe_id."';";
            $query .= "SELECT trip, ort FROM tabelle2 WHERE id = '".$eingabe_id."';";
            $result = mysqli_multi_query($db,$query);

              
            Okay, dieses Stück Quelltext macht jetzt einen fehlerfreien Eindruck auf mich, wie geht es weiter? Hast du mal Kontroll-Ausgaben mit var\_dump() vorgenommen um die Zwischenschritte zu analysieren?  
            
            -- 
            “All right, then, I'll go to hell.” – Huck Finn
            
            1. Hi,

              ja, ich habe mir die querys in phpmyadmin ausgeben lassen. Ich bekomme dort bei z.B. drei Einträgen in der tabelle2 auch 3 Zeilen ausgegeben. Alle drei Zeilen haben in den Spalten user und email die gleichen Inhalte.
              Trotzdem bekomme ich es nicht gelöst, die erste query so zu verarbeiten:

                
              $ausgabe = mysqli_fetch_object($result);  
              
              

              und die zweite so:

                
              while($ausgabe2 = mysqli_fetch_object($result))  
              
              

              Das dient zur Veranschaulichung.

              1. Meine Herren!

                Das dient zur Veranschaulichung.

                Das dient leider noch nicht der Lösungs-Findung.
                Sehr löblich von dir, dass du nicht einfach deinen gesamten Quelltext hier rein knallst, aber ein wenig mehr darf es schon sein. Und wie gesagt unternimmt mal Kontrollausgaben direkt mit PHP. Was liefert zum Beispiel ein var_dump( $ausgabe )?

                --
                “All right, then, I'll go to hell.” – Huck Finn
                1. Vielen Dan. Ich baue einfach eine zweite Verbindung zur DB auf und frage die Daten mit zwei query ab - dadurch erhalte ich was ich brauche...

                  1. Hi,

                    Ich baue einfach eine zweite Verbindung zur DB auf und frage die Daten mit zwei query ab

                    Dazu brauchst du keine zweite Verbindung.

                    Alternativ könntest du dir natürlich auch das Beispiel zu mysqli_multi_query im Handbuch anschauen – um zu sehen, wie man das Ergebnis korrekt behandelt.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                  2. Moin!

                    Vielen Dan. Ich baue einfach eine zweite Verbindung zur DB auf und frage die Daten mit zwei query ab - dadurch erhalte ich was ich brauche...

                    Ich hätte da ja einfach einen JOIN als Query gebaut - dann gibts das gleiche Ergebnis (datenmäßig) in nur zwei Zeilen.

                    Oder UNION SELECT.

                    Zwei Querys sind aber auch ok - sind jedenfalls besser als multi-query, weil man sich nicht aus Versehen eine richtig böse SQL-Injection mit mehreren Statements einfangen kann.

                    - Sven Rautenberg

                    1. Hi,

                      Ich hätte da ja einfach einen JOIN als Query gebaut - dann gibts das gleiche Ergebnis (datenmäßig) in nur zwei Zeilen.

                      War auch mein erster Gedanke.

                      Oder UNION SELECT.

                      Das haut hier zwar technisch vermutlich hin (gleiche Anzahl Felder, vermutlich kompatible Datentypen);

                      Aber erster Datensatz mit den Feldern user und email, und folgenden mit den Feldern trip und ort – das ist keine besonders logische Datenmenge.
                      Klar, wenn man genau weiß was man als Ergebnis erwartet und wie man damit umgehen möchte, ist das machbar – aber vom inhaltlich-strukturellen Standpunkt her schüttelt es mich da doch ein bisschen.

                      MfG ChrisB

                      --
                      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                  3. Hallo Jörg,

                    $eingabe_id  = mysqli_real_escape_string($db,$_POST['id']);
                    $query = "SELECT user, email FROM tabelle WHERE id = '".$eingabe_id."';";
                    $query .= "SELECT trip, ort FROM tabelle2 WHERE id = '".$eingabe_id."';";
                    $result = mysqli_multi_query($db,$select);

                      
                    
                    > Nun kann das erste Statement nur ein Ergebnis liefern. Das zweite Statement kann mehrere Ergebnisse liefern und muss daher in einer Schleife ausgegeben werden.  
                      
                    Das ganze funktioniert bei [multi queries etwas anders](http://www.php.net/manual/de/mysqli.multi-query.php). Um ein oder mehrere Ergebnisse zu bekommen, verwende [mysqli_use_result()](http://www.php.net/manual/de/mysqli.use-result.php) oder [mysqli_store_result()](http://www.php.net/manual/de/mysqli.store-result.php).  
                      
                    Ich setze für gewöhnlich einen Identifikator für queries, um dann im result zu wissen, um welche query es sich genau handelt, falls die Spaltennamen ähnlich sind. Z.b... SELECT '1' qtype... In deinem Beispiel nicht nötig, da du ja unterschiedliche Spalten-Namen hast.  
                      
                    ~~~php
                      
                    if(mysqli_multi_query($db, $query))  
                    {  
                      do{  
                        if($result = mysqli_use_result($db))  
                        {  
                          while($row = mysqli_fetch_assoc($result))  
                          {  
                            var_dump($row);  
                          } mysqli_free_result($result);  
                        }  
                      } while(mysqli_next_result($db));  
                    }  
                    
                    

                    Man kann durch die Verwendung von multi queries die Kommunikation zwischen PHP und MySql-Server reduzieren, verwende es recht häufig in meinen Projekten. Ob es in deinem Fall Sinn macht, sei dir überlassen, so sollte es jedenfalls funkionieren.

                    Viel Erfolg,
                    Jonny 5

                    1. Hallo Jonny 5,

                      vielen Dank für deinen Tipp.
                      Ich habe ähnliches seit Stunden umgesetzt, kann aber immer noch nicht die Ergebnisse ausgeben.
                      Im var_dump ist alles so wie es sein soll. Ich weiss aber nicht wie ich es ausgeben soll.
                      Habe versucht die Daten in 2 Variable zu Speicher. Aber auch das blieb erfolglos (kein echo).

                        
                      array(3) {  
                        ["id"]=>  
                        string(2) "45"  
                        ["user"]=>  
                        string(4) "Hans"  
                        ["email"]=>  
                        string(5) "da@dort.de"  
                      }  
                      array(3) {  
                        ["id"]=>  
                        string(2) "45"  
                        ["ort"]=>  
                        string(5) "Köln"  
                        ["trip"]=>  
                        string(11) "Deutschland"  
                      }  
                      array(3) {  
                        ["id"]=>  
                        string(2) "45"  
                        ["ort"]=>  
                        string(3) "Rom"  
                        ["trip"]=>  
                        string(7) "Italien"  
                      }  
                      array(3) {  
                        ["id"]=>  
                        string(2) "45"  
                        ["ort"]=>  
                        string(5) "Salou"  
                        ["trip"]=>  
                        string(7) "Spanien"  
                      }  
                      
                      
                      1. Hallo Jörg,

                        Ich weiss aber nicht wie ich es ausgeben soll.
                        Habe versucht die Daten in 2 Variable zu Speicher.

                        Du musst ja wissen, welches Ergebnis zu welcher Query gehört. Das könntest du z.B. so machen:

                          
                        $rows = array();  
                          
                        if(mysqli_multi_query($db, $query))  
                        {  
                          do{  
                            if($result = mysqli_use_result($db))  
                            {  
                              while($row = mysqli_fetch_assoc($result))  
                              {  
                                if(isset($row['user'])) {  
                                   $rows[0][] = $row;  
                                } else if(isset($row['ort'])) {  
                                   $rows[1][] = $row;  
                                }  
                              } mysqli_free_result($result);  
                            }  
                          } while(mysqli_next_result($db));  
                        }  
                          
                        print_r($rows);  
                        
                        
                    2. Moin!

                      Man kann durch die Verwendung von multi queries die Kommunikation zwischen PHP und MySql-Server reduzieren,

                      Für diese Behauptung hätte ich ja gerne mal Belege oder zumindest Indizien.

                      Wie soll das funktionieren? Die Länge der Queries (in Bytes) ist identisch. Die Länge der Ergebnisse (in Bytes) ist ebenfalls identisch. An dieser Stelle ist Kommunikation nicht reduzierbar. Wo sonst?

                      - Sven Rautenberg

                      1. Hallo Sven,

                        Für diese Behauptung hätte ich ja gerne mal Belege oder zumindest Indizien.

                        es macht Sinn, wenn man viele Updates oder Selects in Batches zusammenfasst, da die Kommunikation zwischen MySql Server und PHP reduziert wird.

                        Hier ein Beispiel.

                          
                        $db = mysqli_init();  
                          
                        @mysqli_real_connect(  
                          $db, DB_IP,  
                          DB_USER, DB_PASS,  
                          DB_NAME, DB_PORT, DB_SOCK,  
                          MYSQLI_CLIENT_COMPRESS  
                        ) or die ("  
                          Keine Verbindung zur Datenbank:  
                          ".mysqli_connect_error()  
                        );  
                          
                        // 1.) single selects  
                        // -----------------------  
                          
                        $mc_test = microtime(true);  
                          
                        for($i=0; $i<=10; $i++)  
                        {  
                          $sql = "SELECT * FROM `test` WHERE `id` =  ".$i.";";  
                          $result = mysqli_query($db, $sql);  
                          if($result) {  
                            while($row = mysqli_fetch_assoc($result)) {  
                            }  
                          }  
                        }  
                          
                        echo "1.) ".round(microtime(true)-$mc_test,3)."s<br />";  
                          
                        // 2.) batched selects  
                        // -----------------------  
                          
                        $mc_test = microtime(true);  
                          
                        $sql_multi = "";  
                          
                        for($i=0; $i<=10; $i++) {  
                          $sql_multi .= "SELECT * FROM `test` WHERE `id` =  ".$i.";";  
                        }  
                          
                        if (!empty($sql_multi)) {  
                          if (mysqli_multi_query($db, $sql_multi)) {  
                            do {  
                              if ($result = mysqli_store_result($db)) {  
                                while ($row = mysqli_fetch_assoc($result)) {  
                                } mysqli_free_result($result);  
                              }  
                            } while(mysqli_next_result($db));  
                          }  
                        }  
                          
                        echo "2.) ".round(microtime(true)-$mc_test,3)."s<br />";  
                          
                        // 3.) single updates  
                        // ----------------------  
                          
                        $mc_test = microtime(true);  
                          
                        for($i=0; $i<=10; $i++) {  
                          $sql = "UPDATE `test` SET `value` =  1 WHERE `id` =  ".$i.";";  
                          mysqli_query($db,$sql);  
                        }  
                          
                        echo "3.) ".round(microtime(true)-$mc_test,3)."s<br />";  
                          
                        // 4.) batched updates  
                        // ----------------------  
                          
                        $mc_test = microtime(true);  
                          
                        $sql_multi = "";  
                          
                        for($i=0; $i<=10; $i++) {  
                          $sql_multi .= "UPDATE `test` SET `value` =  1 WHERE `id` =  ".$i.";";  
                        }  
                          
                        mysqli_multi_query($db, $sql_multi);  
                        if (mysqli_more_results($db)) {  
                          while (mysqli_next_result($db));  
                        }  
                          
                        echo "4.) ".round(microtime(true)-$mc_test,3)."s<br />";  
                        
                        

                        Der MySql Server steht in Wien, der Webserver in Salzburg:

                        1.) 0.216s
                        2.) 0.06s
                        3.) 0.234s
                        4.) 0.062s

                        Auf dem selben Server in Wien:

                        1.) 0.002s
                        2.) 0.001s
                        3.) 0.001s
                        4.) 0s

                        Je nach Anzahl der Queries, kann man so ganz gut Zeit herausholen. Gibt es viele Zugriffe/Sec, kann das wichtig sein.

                        Herzliche Grüße,
                        Robert

          2. Meine Herren!

            $result = mysqli_multi_query($db,$query);

              
            `mysqli_multi_query()`{:.language-php} liefert [scheinbar](http://www.php.net/manual/de/mysqli.multi-query.php) gar kein Ergebnis-Objekt zurück. Das heißt `mysqli_fetch_object()`{:.language-php} kann im Folgenden auch nicht funktionieren.  
            
            -- 
            “All right, then, I'll go to hell.” – Huck Finn