Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Zuviele Datenbankabfragen / Mysqli /

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Zuviele Datenbankabfragen / Mysqli /

    Hallo,

    es bezieht sich auf dieses Thema vor einiger Zeit:

    Querverweis

    Diese Abfrage von vor ein paar Tagen, gibt mir momentan 4 Einträge aus, was völlig korrekt ist. Weil soviele Anfragen vorhanden sind. Nun soll er diese Werte in einer anderen Datenbank vergleichen und mir die Übereinstimmenden ausgeben.

    Nun zum jetztigen Problem

    PHP-Code:
            $sql "SELECT
                        Tab2.ID,
                        Tab2.Wert1,
                        Tab2.Wert2
                    FROM
                        Tab2    
                    WHERE
                        Tab2.Wert3 = ? AND
                        Tab2.Zeit <= DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:59') AND 
                        Tab2.Zeit >= DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00') AND 
                        Tab2.Aktiv = 'Aktiv'
               "
    ;
            
    $stmt $db->prepare($sql);
            foreach(
    $Werte_Speichern as $Werte_Speicher => $Werte_Speich) {
                foreach(
    $Werte_Speich as $Werte_Spei => $Werte) {
                    
    $stmt->bind_param('i'$Werte_Speich['Quer']);
                        
    $stmt->execute();
            
    $stmt->bind_result($Csid$Csshid$Csssid);
            while(
    $stmt->fetch()) {
                    
    $Werte_Tab2_Speichern[] = array('Ids'     => $Csid,
                                         
    'Csshid'  => $Csshid,
                                         
    'Csssid'  => $Csssid
                                                                   
    );
                                          }
                                          break 
    1;
                }
            }        
            
    $stmt->close(); 
    Nun zu meinem Problem, die Abfrage funktioniert. Mein Problem ist, er müsste mir 2 Ergebnisse, wenn ich "var_dump($Werte_Tab2_Speichern);" ausgeben. Er gibt mir aber 4 aus, wovon 2 komplett doppelt sind, weil ja nur 2 Parameter übereinstimmen.

    Ich vermute, dass es mit den Schleifen zusammenhängt, aber ich weiss leider nicht genau, wo genau der Fehler zu suchen ist.

    Mfg
    Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

  • #2
    mal ne Frage, wieso sind da 2 foreach()-Schleifen? und wieso ist bind_result() in den Schleifen (wo doch prepare() außen ist)?

    Kommentar


    • #3
      Frage1: Weil "$Werte_Tab2_Speichern" ein Multidimensionales Array ist.,.
      Frage2: Gute Frage.,. Kann ich dir nicht beantworten, warum ich das so gemacht habe.,.

      PHP-Code:
              $sql "SELECT
                          Tab2.ID,
                          Tab2.Wert1,
                          Tab2.Wert2
                      FROM
                          Tab2    
                      WHERE
                          Tab2.Wert3 = ? AND
                          Tab2.Zeit <= DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:59') AND 
                          Tab2.Zeit >= DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00') AND 
                          Tab2.Aktiv = 'Aktiv'
                 "
      ;
              
      $stmt $db->prepare($sql);
              foreach(
      $Werte_Speichern as $Werte_Speicher => $Werte_Speich) {
                  foreach(
      $Werte_Speich as $Werte_Spei => $Werte) {
                      
      $stmt->bind_param('i'$Werte_Speich['Quer']);
                      
      $stmt->execute();
                      break 
      1;
                  }
              }  
              
      $stmt->bind_result($Csid$Csshid$Csssid);
              while(
      $stmt->fetch()) {
                      
      $Werte_Tab2_Speichern[] = array('Ids'     => $Csid,
                                           
      'Csshid'  => $Csshid,
                                           
      'Csssid'  => $Csssid
                                                                     
      );
                                            }      
              
      $stmt->close(); 
      Und jetzt habe ich meine 2 Ergebnisse Ich danke dir.,. Eine Frage habe ich noch.,. Gibts auch eine Lösung, dass ich das ohne die "Break 1;" Anweisung hinbekomme ?

      Mfg
      Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

      Kommentar


      • #4
        Zitat von _cyrix_ Beitrag anzeigen
        Gibts auch eine Lösung, dass ich das ohne die "Break 1;" Anweisung hinbekomme ?
        break 1 steigt nach einem Durchlauf aus der Schleife aus ... wieso nutzt du dann überhaupt eine Schleife, wenn du nur einen Wert verarbeiten willst?

        PHP-Code:
                foreach($Werte_Speichern as $Werte_Speicher => $Werte_Speich) {
                    foreach(
        $Werte_Speich as $Werte_Spei => $Werte) {
                        
        $stmt->bind_param('i'$Werte_Speich['Quer']);
                        
        $stmt->execute();
                        break 
        1;
                    }
                } 
        Sieht irgendwie nach hochgradigem Blödsinn aus ...

        $Werte_Speicher und $Werte_Spei benutzt du nirgends, und vor allem $Werte auch nicht - was soll der Quatsch?

        Du solltest dir mal vernünftige Datenstrukturen überlegen, dann brauchst du auch nicht so sinnfrei mit Schleifen in Schleifen herumhantieren.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          die zweite foreach()-Schleife weglassen, ich sehe keinen Grund, wozu die nützlich sein sollte, da du weder $Werte_Spei noch $Werte irgendwo in der Schleife benutzt.

          PS. ich weiß schon, warum ich PDO verwende …

          Kommentar


          • #6
            So, hab es jetzt angepasst, auf eine Schleife.,.

            PHP-Code:
             ....
                    
            $stmt $db->prepare($sql);
                    foreach(
            $Werte_Speichern as $Werte_Speicher) {
                            
            $stmt->bind_param('i'$Werte_Speich['Quer']);
                            
            $stmt->execute();
                    } 
                    
            $stmt->bind_result($Csid$Csshid$Csssid);
                    while(
            $stmt->fetch()) {
                            
            $Werte_Tab2_Speichern[] = array('Ids'     => $Csid,
                                                 
            'Csshid'  => $Csshid,
                                                 
            'Csssid'  => $Csssid
                                                                           
            );
                                                  }      
                    
            $stmt->close(); 
            Ich habe mal var_dumps gesetzt für $Werte_Speicher
            PHP-Code:
            int(38int(38int(49int(49
            korrekt, es sind auch 4 Einträge vorhanden.,.

            und

            Werte_Tab2_Speichern
            PHP-Code:
            array(2) { [0]=>  array(3) { ["Ids"]=>  int(67) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) }
             [
            1]=>  array(3) { ["Ids"]=>  int(68) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } } 
            nicht korrekt, es sind 3 Einträge vorhanden.,.

            PHP-Code:
             ....
                    
            $stmt $db->prepare($sql);
                    foreach(
            $Werte_Speichern as $Werte_Speicher) {
                            
            $stmt->bind_param('i'$Werte_Speich['Quer']);
                            
            $stmt->execute(); 
                    
            $stmt->bind_result($Csid$Csshid$Csssid);
                    while(
            $stmt->fetch()) {
                            
            $Werte_Tab2_Speichern[] = array('Ids'     => $Csid,
                                                 
            'Csshid'  => $Csshid,
                                                 
            'Csssid'  => $Csssid
                                                                           
            );
                                                  } 
                    }     
                    
            $stmt->close(); 

            Werte_Tab2_Speichern

            PHP-Code:
            array(6) { [0]=>  array(3) { ["Ids"]=>  int(69) ["Csshid"]=>  int(1) ["Csssid"]=>  int(38) } 
            [
            1]=>  array(3) { ["Ids"]=>  int(69) ["Csshid"]=>  int(1) ["Csssid"]=>  int(38) } 
            [
            2]=>  array(3) { ["Ids"]=>  int(67) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } 
            [
            3]=>  array(3) { ["Ids"]=>  int(68) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } 
            [
            4]=>  array(3) { ["Ids"]=>  int(67) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } 
            [
            5]=>  array(3) { ["Ids"]=>  int(68) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } } 
            nicht korrekt, es sind 3 Einträge vorhanden.,. hier hat er wieder jeden doppelt gesetzt

            Ich werd hier irgendwie nicht schlau draus.,.
            Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

            Kommentar


            • #7
              ich gaube, das hier ergibt mehr Sinn:
              PHP-Code:
              $stmt $db->prepare($sql);
              $stmt->bind_param('i'$Wert);
              $stmt->bind_result($Csid$Csshid$Csssid);
              foreach(
              $Werte_Speichern as $Wert) {
                  
              $stmt->execute();
                  
              $stmt->fetch();
                  
              // ergebnisverarbeitung hier

              PS. mit einem geeigneten Iterator geht das sogar noch kürzer

              Kommentar


              • #8
                Mal angepasst und var_dump gesetzt

                PHP-Code:
                array(4) { [0]=>  array(3) { ["Ids"]=>  NULL ["Csshid"]=>  NULL ["Csssid"]=>  NULL 
                [
                1]=>  array(3) { ["Ids"]=>  NULL ["Csshid"]=>  NULL ["Csssid"]=>  NULL 
                [
                2]=>  array(3) { ["Ids"]=>  NULL ["Csshid"]=>  NULL ["Csssid"]=>  NULL 
                [
                3]=>  array(3) { ["Ids"]=>  NULL ["Csshid"]=>  NULL ["Csssid"]=>  NULL } } 
                Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

                Kommentar


                • #9
                  Zitat von _cyrix_ Beitrag anzeigen
                  Mal angepasst und var_dump gesetzt
                  wie? wo?

                  EDIT: wenn man sich einmal auf Analogien verläßt … bind_result() muß nach execute() aufgerufen werden (hab grad nachgeschaut)

                  Kommentar


                  • #10
                    PHP-Code:
                            $stmt $db->prepare($sql);
                            
                    $stmt->bind_param('i'$Wert['Quer']);
                            foreach(
                    $Werte_Speichern as $Wert) {
                                
                    $stmt->execute();
                                
                    $stmt->bind_result($Csid$Csshid$Csssid);
                                
                    $stmt->fetch();
                                
                    $Werte_Tab2_Speichern[] = array('Ids'     => $Csid,
                                                     
                    'Csshid'  => $Csshid,
                                                     
                    'Csssid'  => $Csssid
                                                     
                    );
                            }
                            
                    $stmt->close(); 
                    Nach deiner anderen Editierten Nachricht hiervor.,.

                    Edit: var_dump von $Werte_Tab2_Speichern

                    Ich kann das mit dem execute() und bind_result() drehen und wenden wie ich möchte, zwischen dem foreach, vor dem foreach oder so wie im Beispiel, der var_dump bleibt gleich.,.
                    Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

                    Kommentar


                    • #11
                      mit PDO wär das einfacher (nur mal als Konzept):
                      PHP-Code:
                      // SELECT `Tab2`.`ID` AS `Ids`, …
                      $ps $pdo->prepare($sql);
                      $ps->bindParam(1$WertPDO::PARAM_INT);
                      $ps->setFetchMode(PDO::FETCH_ASSOC);
                      foreach (
                      $Werte as $Wert)
                      {
                          
                      $ps->execute();
                          
                      $out[] = $ps->fetch();

                      Kommentar


                      • #12
                        Sieht wirklich einfacher aus.,.

                        Problem ist nur, dass mein ganzes Projekt auf mysqli basiert und ich nun nicht wegen den letzten paar querys alles andere umstellen möchte.,.

                        es muss doch auch irgendwie über diese methode gehen.,.

                        für das nächste projekt beschäftige ich mich gleich mit pdo, wird wohl einiges erleichtern.,.
                        Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

                        Kommentar


                        • #13
                          der Spaß beginnt, wenn du folgendes machst:
                          PHP-Code:
                          // funktioniert mit deinem Query so nicht (zu wenig Fetch-Ergebnisse)
                          $ps $pdo->prepare($sql);
                          $ps->bindValue(1$WertPDO::PARAM_INT);
                          $ps->setFetchMode(PDO::FETCH_CLASS'MyOutputClass');
                          foreach (
                          $ps as $row)
                          {
                              echo 
                          $row;

                          Zitat von _cyrix_ Beitrag anzeigen
                          es muss doch auch irgendwie über diese methode gehen.,.
                          k.A. ich hab mir die Prepared Statements bei MySQLi angeschaut und bin wieder zu PDO zurückgegangen, das Handling der Prepared Statements in MySQLi ist einfach kanalisationswürdig.

                          Kommentar


                          • #14
                            Zitat von Dormilich Beitrag anzeigen
                            der Spaß beginnt, wenn du folgendes machst:
                            PHP-Code:
                            // funktioniert mit deinem Query so nicht (zu wenig Fetch-Ergebnisse)
                            $ps $pdo->prepare($sql);
                            $ps->bindValue(1$WertPDO::PARAM_INT);
                            $ps->setFetchMode(PDO::FETCH_CLASS'MyOutputClass');
                            foreach (
                            $ps as $row)
                            {
                                echo 
                            $row;

                            Mal mich kurz dazu belesen Hört sich interessant an.,.


                            Zitat von Dormilich Beitrag anzeigen
                            k.A. ich hab mir die Prepared Statements bei MySQLi angeschaut und bin wieder zu PDO zurückgegangen, das Handling der Prepared Statements in MySQLi ist einfach kanalisationswürdig.
                            Wenn ich das so im Schnelldurchlauf vergleiche ist das echt nen paar Klassen darunter.,.

                            Ich hab jetzt mal folgendes gemacht.,.

                            PHP-Code:
                                    $stmt $db->prepare($sql);
                                    foreach(
                            $Werte_Speichern as $Wert) {
                                        
                            $stmt->bind_param('i'$Wert['Quer']);
                                        
                            $stmt->execute();
                                        
                            $stmt->bind_result($Csid$Csshid$Csssid);
                                        
                            $stmt->fetch();
                                        
                            $Werte_Tab2_Speichern[] = array('Ids'     => $Csid,
                                                             
                            'Csshid'  => $Csshid,
                                                             
                            'Csssid'  => $Csssid
                                                             
                            );
                                    }
                                    
                            $stmt->close(); 
                            var_dump;
                            PHP-Code:
                            array(4) { [0]=>  array(3) { ["Ids"]=>  int(69) ["Csshid"]=>  int(1) ["Csssid"]=>  int(38) } 
                            [
                            1]=>  array(3) { ["Ids"]=>  int(69) ["Csshid"]=>  int(1) ["Csssid"]=>  int(38) } 
                            [
                            2]=>  array(3) { ["Ids"]=>  int(67) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } 
                            [
                            3]=>  array(3) { ["Ids"]=>  int(67) ["Csshid"]=>  int(1) ["Csssid"]=>  int(49) } } 
                            Jetzt haut er mir jede Abfrage direkt ohne ins Array.,. Warum will das nicht gelingen.,.
                            Github_Cyrix, Laravelgemeinschaft bei php.de,Laravel Chat

                            Kommentar


                            • #15
                              laß es mich mal so ausdrücken …
                              Zitat von Dormilich Beitrag anzeigen
                              das Handling der Prepared Statements in MySQLi ist einfach kanalisationswürdig.

                              Kommentar

                              Lädt...
                              X