PDO und Multidimensionale Arrays

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

  • PDO und Multidimensionale Arrays

    Wie erstelle ich eine Multidimensionale array mit PDO?


    Ein-Dimensionale Array mit PDO sieht bei mir so aus
    PHP-Code:
    $statement $dbh->prepare('SELECT * FROM navigation WHERE category = "1"');
    $statement ->execute();
        
    while (
    $row $statement->fetch()) {
    echo 
    ''.$row['name'].'<br />';

    Eine 2 Dimensionale Array mit der mysql_ Funktion sieht bei mir so aus:

    PHP-Code:
    $result mysql_query('SELECT * FROM navigation WHERE category = "1"') or die (mysql_error());
    while(
    $row mysql_fetch_array($result))
    {
    echo 
    $row['name']);
            
        
    $result2 mysql_query('SELECT * FROM navigation WHERE category = "0" AND parentID = "'.$row[id].'"') or die (mysql_error());
        while(
    $row2 mysql_fetch_array($result2))
        {
            echo 
    $row2[name]);
        }


    Und wenn ich mit so was versuche mit PDO:
    PHP-Code:
    $statement $dbh->prepare('SELECT * FROM navigation WHERE category = "1"');
    $statement ->execute();
        
    while (
    $row $statement->fetch()) {
        echo 
    $row['navi_name'];
            
        
    $statement $dbh->prepare('SELECT * FROM navigation WHERE parentID = "'.$row['id'].'"');
        
    $statement ->execute();
            
        while (
    $row2 $statement->fetch()) {
            echo 
    ''.$row2['name'].'<br />';
        }
            

    Die erste Schleife der 1. Dimension wird ausgegeben, und wenn er bei der 2. Dimension an kommt, gibts die Fehlermeldung:
    Fatal error: Call to a member function execute() on a non-object in /var/www/vhosts/localhost/httpdocs/test.php on line 17

    Kann mir jemand ein Beispiel für eine Multi-Dimensionale Array mit PDO geben?

  • #2
    mal von der fehlermeldung abgesehen
    der algorithmus passt doch auch nicht so ganz oder?

    in deinem fall wird die erste while schleife nur einmal durchlaufen,
    da $statement->fetch() nach der zweiten ja false zurückgeben sollte

    es könnte sein, dass $row['id'] garnicht existiert oder so...
    dreh error_reporting auf

    Kommentar


    • #3
      Mit $statement2 wäre das nicht passiert.

      Kommentar


      • #4
        Stellt dein error_reporting mal hoch, wer weiß, ob dein zweites prepare erfolgreich war!

        Kommentar


        • #5
          Als Angang mal die Datenbank Struktur


          Also folgendes:
          PHP-Code:
          $statement $dbh->prepare('SELECT * FROM navigation WHERE category = "1"');
          $statement ->execute();
              
          while (
          $row $statement->fetch()) {
              echo 
          $row['navi_name'];
                  

          Ergibt:
          News
          Artikel


          Diese Schleife funktioniert also korrekt.

          error_reporting(E_ALL); ergibt auch nichts.
          Der Fehler liegt angeblich in dem 2. $statement ->execute();

          Habe auch mal die $statement variable der zweiten schlaufe in $statement2 umbenennt... gleicher fehler:

          PHP-Code:
          $statement $dbh->prepare('SELECT * FROM navigation WHERE category = "1"');
          $statement ->execute();
              
          while (
          $row $statement->fetch()) {
              echo 
          $row['navi_name'];
                  
              
          $statement2 $dbh->prepare('SELECT * FROM navigation WHERE parentID = "'.$row['id'].'"');
              
          $statement2 ->execute();
                  
              while (
          $row2 $statement2->fetch()) {
                  echo 
          ''.$row2['name'].'<br />';
              }
                  

          Fatal error: Call to a member function execute() on a non-object in /var/www/vhosts/localhost/httpdocs/test.php on line 17
          Line 17 ist die $statement2 ->execute();

          Auch wenn ich die $row['id'] im zweiten prepare statement auf ein "1" ändere, kommt der gleiche Fehler.

          Hat niemand ein einfaches Beispiel einer 2 Dimensionalen Array mit PDO das auch funktioniert?

          Kommentar


          • #6
            Sorry, Dateianhang wird wohl wieder gelöscht wenn man eine Vorschau macht.

            Die Arrays sollten folgendes ergeben:

            News
            - News Test 1
            - News Test 2
            - News Test 3
            Artikel
            - Artikel 1
            - Artikel 2
            - Artikel 3
            Angehängte Dateien

            Kommentar


            • #7
              Deine Fehlermeldung: Call to a member function execute() on a non-object ... $statement2 ist also kein Objekt.
              $dbh->prepare() hat also kein Objekt zurückgegeben. Wieso? Lesen wir im Manual nach:
              If the database server cannot successfully prepare the statement, PDO:repare() returns FALSE.

              Aha, der DB-Server ist schuld. Aber was genau hat er? Frag ihn! PDO::errorInfo()!


              So und dann ziehst du das prepare() mal aus der Schleife raus und nutzt einen Named Parameter. Das ist nämlich der Sinn von prepare() - einmal die Query vorbereiten und dann parametrisiert ausführen. Ansonsten kannst du auch gleich PDO::query() nehmen.

              Kommentar


              • #8
                Danke für deine Antworten, onemorenerd.

                PDO::errorInfo(): Array ( [0] => HY000 [1] => 2014 [2] => 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. )
                Ja, ursprünglich habe ich ja auch PDO::query() für meine Multi Dimensonale Arrays genommen. Doch als ich dann auf einen anderen Server umgestiegen bin, haben die Script nicht mehr funktioniert.

                Suche ergab: If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().
                For a query that you need to issue multiple times, you will realize better performance if you prepare a PDOStatement object using PDO:: prepare() and issue the statement with multiple calls to PDOStatement::execute().

                Ein closeCursor() kann ich schlecht in einer Schleife benutzen, da er sonst die schleife direkt beendet. Daher habe ich es mit fetch() und prepare() versucht.
                Aber nun steh ich wieder vor dem gleichen Problem. PDO kann immer nur eine query im buffer haben.

                Kannst du mir ein Beispiel für eine Schleife mit einem Named Parameter geben, verstehe es nicht ganz.

                Kommentar


                • #9
                  Man sollte keine SQL Queries innerhalb von While-Schleifen absetzen. Und man sollte kein SELECT * verwenden.

                  Kommentar


                  • #10
                    Hat denn irgendjemand ein einfaches Beispiel einer Multidimensonalen Array mit PDO?
                    Oder kann mir sagen wie ich das hier:
                    PHP-Code:
                    $result mysql_query('SELECT * FROM navigation WHERE category = "1"') or die (mysql_error());
                    while(
                    $row mysql_fetch_array($result))
                    {
                    echo 
                    $row['name']);
                            
                        
                    $result2 mysql_query('SELECT * FROM navigation WHERE category = "0" AND parentID = "'.$row[id].'"') or die (mysql_error());
                        while(
                    $row2 mysql_fetch_array($result2))
                        {
                            echo 
                    $row2[name]);
                        }

                    mit PDO erreichen kann?

                    Kommentar


                    • #11
                      Mach kein SELECT * und keine Queries in While-Schleifen.

                      Kommentar


                      • #12
                        Original geschrieben von Londrag
                        Kannst du mir ein Beispiel für eine Schleife mit einem Named Parameter geben, verstehe es nicht ganz.
                        Es gibt Beispiele auf http://usphp.com/manual/en/function....nt-execute.php - zwar ohne Schleife, aber das kannst du dir dazudenken. Das Schema ist einfach: Die Query wird einmal vorbereitet (prepare) und in einer Schleife immer wieder ausgeführt (execute).

                        Dein eigentliches Problem kannst du entweder mit MYSQL_ATTR_USE_BUFFERED_QUERY lösen oder mit fetchAll() für die erste Query.

                        Aber du hättest das Problem gar nicht, wenn du JOINen würdest.

                        Kommentar


                        • #13
                          Und dann solltest du den PDO::ATTR_ERRMODE auch mal auf PDO::ERRMODE_WARNING oder PDO::ERRMODE_EXCEPTION setzen, dann fliegt beim nächsten mal eine Exception / Warnung.

                          Kommentar


                          • #14
                            Original geschrieben von onemorenerd
                            Es gibt Beispiele auf http://usphp.com/manual/en/function....nt-execute.php - zwar ohne Schleife, aber das kannst du dir dazudenken. Das Schema ist einfach: Die Query wird einmal vorbereitet (prepare) und in einer Schleife immer wieder ausgeführt (execute).
                            Genau hier schein ich das Problem zu haben. Ich habe schwierigkeiten mir das vorzustellen. Denn mein Prinzip war immer eine Query in einer While-Schleife zu haben, doch h3ll meint ja das soll nicht sein.
                            Kann mir jemand ein Beispiel geben?


                            Original geschrieben von onemorenerd
                            Dein eigentliches Problem kannst du entweder mit MYSQL_ATTR_USE_BUFFERED_QUERY lösen oder mit fetchAll() für die erste Query.
                            MYSQL_ATTR_USE_BUFFERED_QUERY wäre eine Möglichkeit, doch wenn ich schon PDO benutze, mach ich es lieber korrekt, damit es für alle Datenbanken funktioniert.

                            Original geschrieben von onemorenerd
                            Aber du hättest das Problem gar nicht, wenn du JOINen würdest.
                            JOINen mit nur einer Tabelle? Kann sich eine Tabelle selber JOINen?

                            Kommentar


                            • #15
                              Genau hier schein ich das Problem zu haben. Ich habe schwierigkeiten mir das vorzustellen. Denn mein Prinzip war immer eine Query in einer While-Schleife zu haben, doch h3ll meint ja das soll nicht sein. Kann mir jemand ein Beispiel geben?
                              Hab den Thread jetzt nicht komplett verfolgt. Aber hier scheint in der Tat die Rede davon zu sein, dass die Query mehrfach ausgeführt werden soll. Gut ist das nicht, da hat h3ll recht. Aber wenns erforderlich sein sollte, dann machs halt. Immerhin muss die Query dank PDO nur einmal geparst werden.

                              JOINen mit nur einer Tabelle? Kann sich eine Tabelle selber JOINen?
                              Ja klar kann "sie" das. Ausprobiert?

                              Kommentar

                              Lädt...
                              X