MYSQL: verschachtelte SELECTS

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

  • MYSQL: verschachtelte SELECTS

    Hallo,

    ich nutze in einer Methode verschachtelte SELECTS, d. h. in der WHILE-Schleife zum Auslesen der Sätze der ersten Tabelle mache ich einen SELECT auf eine zweite Tabelle. Hierbei wird ein zweiter Link auf die DB genutzt.

    Das Script läuft in meiner localhost Umgebung ohne Probleme, auf meinem Rootserver aber nicht.

    Kann das mit unterschiedlichen PHP Versionen zusammenhängen? Der Rootserver war mit PHP 5.2.0 vorinstalliert, lokal nutze ich PHP 5.2.3. Bei SQL gibts auch Unterschiede: lokal ist es 5.0.45 und am Rootserver 5.026

  • #2
    was heißt es läuft nich? Fehlermeldungen? mysql_error() error_reporting

    Kommentar


    • #3
      Hier die Fehlermeldung:

      Error!: SQLSTATE[HY000]: General error: 2014 Cannot execute queries
      while other unbuffered queries are active. Consider using
      PDOStatement::fetchAll(). Alternatively, if your code is only ever going to
      run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

      Kommentar


      • #4
        zeig mal den quelltext dazu oder sollen wir raten was du machst. ich meine vor langer zeit mal was gelesen zu haben, dass du zwei selects nich gleichzeitig ausführen kannst ohne vorher diesen zu schließen


        PHP-Code:
        ->closeCursor(); 
        könnte dir evtl weiterhelfen.

        mfg
        bugbuster


        ps: nur vermutung da ich ja nich weiss was du letzendlich machst -> showSource();
        tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
        documentation: php.net mysql.com framework.zend.com

        Die Nachtwache!

        Kommentar


        • #5
          Das sieht mir nicht nach einem Subselect sondern nach einem weiteren select in einer Schleife aus. Wie die Fehlermeldung schon sagt, musst du erst den einen Resultset abarbeiten bevor du eine weitere Selectanweisung ausführen kannst. Lokal wird PDO::MYSQL_ATTR_USE_BUFFERED_QUERY wohl per default eingeschaltet sein, sonst würd das da nicht laufen.

          Kommentar


          • #6
            hier der Code; ich habe die Methode mal komplett gepostet

            PHP-Code:
            function untergeordneteTeams($userid) {
                
            $dbtyp 'mysql';
                
            $dbhost 'localhost';
                
            $dbport 3306;
                
            $dbname 'bms';
                
            $dbuser 'root';
                
            $dbpass '';
                
                
            $dbh staticpdo :: singleton($dbtyp$dbhost$dbport$dbname$dbuser$dbpass);
                
            $dbh->setAttribute(PDO :: ATTR_ERRMODEPDO :: ERRMODE_EXCEPTION);
                
            $dbh->exec("SET CHARACTER SET 'utf8' ");
                
            $dbh->exec("SET NAMES 'utf8' ");

                
            $dbh1 staticpdo :: singleton($dbtyp$dbhost$dbport$dbname$dbuser$dbpass);
                
            $dbh1->setAttribute(PDO :: ATTR_ERRMODEPDO :: ERRMODE_EXCEPTION);
                
            $dbh1->exec("SET CHARACTER SET 'utf8' ");
                
            $dbh1->exec("SET NAMES 'utf8' ");

                
            $teams = array ();
                
            $abteilungen = array ();
                
            $anzahlabteilungen 0;
                try {
                    
            $count 0;
                    
            $sql "SELECT AbteilungID FROM abteilungen WHERE Manager=? AND Unternehmen=? ";
                    
            $stmt $dbh->prepare($sql);
                    if (
            $stmt->execute(array (
                            
            $userid,
                            
            $this->unternehmen
                        
            ))) {
                        while (
            $row $stmt->fetch()) {
                            
            $anzahlabteilungen $anzahlabteilungen +1;
                            
                            
            $index $row["AbteilungID"];
                            
            $abteilungen["$index"] = $row["AbteilungID"];
                            
                            
            $anzahlbeginn 0;
                            
            $anzahlende 1;
                            
            $a = new abteilung;
                            while (
            $anzahlende !== $anzahlbeginn) {
                                
            $anzahlbeginn count($abteilungen);
                                
            $a->untergeordneteAbteilungen($abteilungen);
                                
            $abteilungen $a->getAbteilungen();
                                
            $anzahlende count($abteilungen);
                            }
                            

                            foreach (
            $abteilungen as $abteilung) {
                                try {
                                    
            $sql1 "SELECT TeamID FROM teams
             WHERE Unternehmen=? AND UebergeordneteAbteilung=? "
            ;
                                    
            $stmt1 $dbh1->prepare($sql1);
                                    if (
            $stmt->execute(array (
                                            
            $this->unternehmen,
                                            
            $abteilung
                                        
            ))) {
                                        while (
            $row1 $stmt1->fetch()) {
                                            
            $index $row1["TeamID"];
                                            
            $teams["$index"] = $row1["TeamID"];
                                        }
                                    }
                                } catch (
            PDOException $e1) {
                                    echo 
            "<br>Error!: " $e1->getMessage() . "<br/>";
                                    echo 
            "<br>SQL1 " $sql1;
                                    echo 
            "<br>Abfrage der Teams-DB in 
            untergeordneteTeams fehlgeschlagen<BR>"
            ;
                                    die();
                                }
                            }
                        }
                    }
                } catch (
            PDOException $e) {
                    echo 
            "<br>Error!: " $e->getMessage() . "<br/>";
                    echo 
            "<br>SQL  " $sql;
                    echo 
            "<br>Abfrage der abteilungen-tabelle in 
            untergeordneteTeams fehlgeschlagen<BR>"
            ;
                    die();
                }

                
            // eigenes Team hinzufuegen
                
            $index $this->teamid;
                
            $teams["$index"] = $this->teamid;

                return 
            $teams;
            // Ende der Methode 
            Zuletzt geändert von Stonebreaker62; 25.01.2008, 01:57.

            Kommentar


            • #7
              Irgendwie bin ich immernoch der Überzeugung:

              ->closeCursor();


              schau dir das mal an:

              beispiel


              ps: bitte auf die uhrzeit schauen wenn ich was übersehen habe liegts an der unchristlichen uhrzeit

              good night
              bugbuster
              Zuletzt geändert von Bugbuster; 25.01.2008, 05:56.
              tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
              documentation: php.net mysql.com framework.zend.com

              Die Nachtwache!

              Kommentar


              • #8
                Du verwendest wohl $dbh und $dbh1, ich gehe aber mal davon aus, deine Singleton ist so implementiert, das beide auf die gleiche PDO-Instanz verweisen. Wie ich also sagte, du kannst nicht "einfach so" zwei Cursor offen haben. Entweder PDO::MYSQL_ATTR_USE_BUFFERED_QUERY setzen oder die Selects anders verarbeiten. Das würde ich sowieso empfehlen, da Queries innerhalb von Schleifen tödlich werden können!

                Kommentar


                • #9
                  Habe die Methode jetzt so umgestaltet, dass ich ohne verschachtelte SELECTS herumkomme und werde in Zukunft auf solche Konstrukte verzichten. Das Werk war ohnehin eines meiner ersten und war sowieso unsinning gestaltet, obwohl es seinen Zweck in lokaler Umgebung erfüllt hat (Für die Verschachtelung gab es eigentlich garkeine Notwendigkeit).

                  Habe bei der Übertragung auf den Rootserver festgestellt, dass auch andere schlecht bzw. syntaktisch unkorrekt programmierte Methoden nicht mehr funktioniert haben, die lokal keine Probleme gemacht haben. Offensichtlich ist das neuere MySQL Release, das ich lokal benutze, erheblich fehlertoleranter als das, das sich auf dem Rootserver befindet.

                  Für Eure Hilfe möchte ich mich herzlich bedanken.

                  Kommentar


                  • #10
                    OffTopic:

                    *mir so vor komm als wär ich durchsichtig* hallo kann man mich sehen?




                    tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
                    documentation: php.net mysql.com framework.zend.com

                    Die Nachtwache!

                    Kommentar


                    • #11
                      Hallo bugbuster,

                      klar kann ich Dich sehen.

                      Scheinst ne Nachteule zu sein, die noch länger vor der Klotze sitzt als ich.

                      Hab gesehen, dass ich Mist programmiert hatte und hab das geändert. Deshalb war der Test mit dem closeCursor() nicht mehr erforderlich.

                      Trotzdem danke für deine Hilfe. Werde den closeCursor() dann einsetzen, wenn ich ihn benötige.

                      Kommentar


                      • #12
                        Scheinst ne Nachteule zu sein, die noch länger vor der Klotze sitzt als ich.

                        Naja eher vor vielen Monitoren und überwachen -> nennt sich Nachtschicht ^^

                        Hab gesehen, dass ich Mist programmiert hatte
                        konnte mich da heut morgen nich mehr reinversetzen hab nur gesehen zwei selects und nirgends ein close.

                        ob man mich sieht war auch mehr als spässle gemeint



                        mfg
                        bugbuster
                        tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
                        documentation: php.net mysql.com framework.zend.com

                        Die Nachtwache!

                        Kommentar

                        Lädt...
                        X