Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP PDO - Start- und Endzeile

Einklappen

Neue Werbung 2019

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

  • PHP PDO - Start- und Endzeile

    Hi Leute,

    ich bin auf der Suche nach einem PDO-Aufruf einer MySQL Tabelle, mit dem man einen Startpunkt und einen Endpunkt setzen kann.

    Z.B.: Anfang mit Zeile 3 und Ende bei Zeile 7.

    Bis jetzt habe ich Folgendes:
    PHP-Code:
        $sql $pdo->prepare("SELECT title FROM content WHERE parent = ?");
        
    $sql->execute(array($parent)); 
        foreach (
    $sql as $row) {
            
    $name $row['title'];
            echo 
    "<br>Name: $name";
        }; 

    ich habe Folgendes gefunden, weiß es aber nicht richtig einzubinden... :
    PHP-Code:
    $sql->bindValue(37PDO::PARAM_INT); 
    Würde mich um eine Unterstützung sehr freuen!


    Grüße,
    Joe


  • #2
    Dafür gibts LIMIT und OFFSET:

    https://dev.mysql.com/doc/refman/8.0/en/select.html

    Kommentar


    • #3
      MOD: Verschoben von PHP-Einsteiger
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von hellbringer Beitrag anzeigen
        Mein nächster Versuch:

        PHP-Code:
            $anfang 3;
            
        $ende 7;

            
        $sql $pdo->prepare("SELECT title FROM content WHERE parent = ? LIMIT ?, ?");
            
        $sql->execute(array($parent,$anfang$ende)); 
            foreach (
        $sql as $row) {
                
        $name $row['title'];
                echo 
        "<br>Name: $name";
            }; 
        Leider erfolglos. Erhalte weder eine Fehlermeldung noch Ergebnisse..

        Kommentar


        • #5
          Moin,

          Limit lässt sich nicht dynamisch per Prepared Statement setzen. Wenn du die Limit-Werte zu int castest (falls sie von irgendeiner User-Eingabe oder ähnlichem stammen können), ist die Abfrage an der Stelle aber trotzdem sicher.
          PHP-Code:
          $sql $pdo->prepare("SELECT title FROM content WHERE parent = ? LIMIT " . (int)$anfang ", " . (int)$ende); 
          Relax, you're doing fine.
          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

          Kommentar


          • #6
            Perfekt! So funktioniert das einwandfrei. Vielen Dank!

            Kommentar


            • #7
              Zitat von VPh Beitrag anzeigen
              Limit lässt sich nicht dynamisch per Prepared Statement setzen.
              Nicht?

              PHP-Code:
              $db = new PDO('mysql:host=localhost;dbname=test;charset=utf8''root''', [
                  
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                  
              PDO::ATTR_EMULATE_PREPARES => false
              ]);

              $db->query("
                  CREATE TEMPORARY TABLE temp (
                      id INT NOT NULL AUTO_INCREMENT,
                      value VARCHAR(255) NOT NULL,
                      PRIMARY KEY (id)
                  )
              "
              );

              $stmt $db->prepare("INSERT INTO `temp` (`value`) VALUES (?), (?), (?)");
              $stmt->execute(['foo''bar''baz']);

              $stmt $db->prepare("SELECT `value` FROM `temp` ORDER BY `id` LIMIT ?");
              $stmt->execute([2]);
              print_r($stmt->fetchAll(PDO::FETCH_COLUMN)); 
              Code:
              Array
              (
                  [0] => foo
                  [1] => bar
              )

              Kommentar


              • #8
                VPh deine Meinung hägt ev. damit zusammen: https://stackoverflow.com/a/10014200/10537201 (irgendwo hatten wir das Thema schon mal).
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Das hatte ich auch eben probiert...

                  PHP-Code:
                  <?php
                  $sqlCreate 
                  = <<<ENDSQL
                  CREATE TABLE testdata (id INTEGER PRIMARY KEY, name TEXT, vorname TEXT);
                  INSERT INTO testdata (name, vorname) VALUES
                  ("Merkel", "Angela"),
                  ("Seehofer", "Horst"),
                  ("Trump", "Donald"),
                  ("Duck", "Donald"),
                  ("Putin", "Wladimir"),
                  ("Gysi", "Gregor"),
                  ("Nahles", "Andrea");
                  ENDSQL;
                  $memDB = new PDO('sqlite::memory:');
                  $memDB->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
                  $memDB->exec($sqlCreate);
                  $limit 2;
                  $offset 2;
                  $result $memDB->prepare("SELECT id, name, vorname from testdata where id > ? LIMIT ? OFFSET ?");
                  $result -> execute([2,$limit,$offset]);
                  $myResult $result->fetchAll(PDO::FETCH_CLASS);
                  var_dump($myResult);
                  ?>
                  Code:
                  array (size=2)
                    0 => 
                      object(stdClass)[3]
                        public 'id' => string '5' (length=1)
                        public 'name' => string 'Putin' (length=5)
                        public 'vorname' => string 'Wladimir' (length=8)
                    1 => 
                      object(stdClass)[4]
                        public 'id' => string '6' (length=1)
                        public 'name' => string 'Gysi' (length=4)
                        public 'vorname' => string 'Gregor' (length=6)

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen

                    Nicht?
                    Doch

                    Zitat von hausl Beitrag anzeigen
                    VPh deine Meinung hägt ev. damit zusammen: https://stackoverflow.com/a/10014200/10537201 (irgendwo hatten wir das Thema schon mal).
                    Jop, kann sein!
                    Relax, you're doing fine.
                    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                    Kommentar


                    • #11
                      [QUOTE=kaminbausatz;n1541007]

                      PHP-Code:
                      <?php
                      $myResult 
                      $result->fetchAll(PDO::FETCH_CLASS);
                      PDO::FETCH_OBJ ist geläufiger und liefert hier das gleiche Ergebnis. Kannte bisher PDO::FETCH_CLASS nur mit Referenz auf eine Klasse.
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Noch einige Bemerkungen und eine Frage zum Thema LIMIT mit Prepared Statements.
                        ​​​​​​​
                        ​​​​​​​- Das Beispiel von hellbringer #7 funktioniert unter MySQL nur mit der Option PDO::ATTR_EMULATE_PREPARES => false. PDO::ATTR_EMULATE_PREPARES steht jedoch per Default auf true. Das Ändern dieser Option bewirkt jedoch noch eine Reihe von Veränderungen im Verhalten von PDO (Verhalten bei Fehlern, Datentypen Rückgabe,..).
                        Mit neueren PHP-Versionen lässt sich die Option per PDO::getAttribute abfragen. Dieses Resultat ist jedoch nicht vom Typ Bool, sondern 0 oder 1. Bei älteren PHP Versionen hab ich in Erinnerung kam beim Versuch der Abfrage eine Warnung.

                        Frage dazu: Weiß jemand aus Erfahrung ab welcher PHP-Version ca. dieser BUG raus ist?

                        ​​​​​​​- Das Beispiel von kaminbausatz ist zudem nicht geeignet das Verhalten von PDO mit MySQL/MariaDB zu zeigen. SQLite ist von Hause aus schon so gemacht, das eine Abfrage der Form
                        Code:
                        "SELECT id, name, vorname from testdata where id > '2' LIMIT '2' OFFSET '2'"
                        funktioniert. Unter MySQL kommt es bei dieser Abfrage zu einem Fehler.
                        PHP-Klassen auf github

                        Kommentar


                        • #13
                          ??

                          Reden wir aneinander vorbei?

                          http://sqlfiddle.com/#!9/a6c585/76613

                          Wahrscheinlich kommt es bei Dir zu einem Fehler weil Limit und Offset als Strings formatiert sind.

                          Kommentar


                          • #14
                            Ich vermute er zielt auf die Parameterübergabe per execute() ab. Hier werden die Werte per default als PARAM_STR übergeben, was bedeuten würde, dass alle Werte in SingleQuotes maskiert werden.
                            Ob PDOStatement so schlau ist, die Datentypen automatisch zu setzen, weiß ich adhoc nicht, aber ich schätze mal nicht.
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              Zitat von Arne Drews Beitrag anzeigen
                              Ich vermute er zielt auf die Parameterübergabe per execute() ab. Hier werden die Werte per default als PARAM_STR übergeben, was bedeuten würde, dass alle Werte in SingleQuotes maskiert werden.
                              Ob PDOStatement so schlau ist, die Datentypen automatisch zu setzen, weiß ich adhoc nicht, aber ich schätze mal nicht.
                              Genau so ist es.
                              kaminbausatz

                              Dein Beispiel funktioniert bei mir genauso. (Dein sqlfiddle konnte ich jetzt nicht anschauen, das Teil ist überlastet.) Unter SQLite ist es egal wie die Daten daherkommen. Mit
                              PHP-Code:
                              $limit '2';
                              $offset '2';
                              $result $memDB->prepare("SELECT id, name, vorname from testdata where id > ? LIMIT ? OFFSET ?");
                              $result -> execute(['2',$limit,$offset]); 
                              funktioniert das auch noch. Aber nur unter SQLite, da dort auch eben so etwas
                              Code:
                               "SELECT id, name, vorname from testdata where id > '2' LIMIT '2' OFFSET '2'"
                              akzeptiert wird.
                              Mit dem MySQL-Treiber setzt PDO bei execute (leider) immer PDO::PARAM_STR, was zur folge hat, dass alle Werte in SingleQuotes maskiert werden. MySQL akzeptiert aber kein LIMIT '2' !

                              Es würde in meinen Augen Sinn machen, für MySQL bei exceute mit Daten vom Typ interger intern dann automatisch PDO::PARAM_INT zu nehmen.
                              Ich umschiffe diese Problem aktuell mit einer Methode, welche die Parameter aus dem Array intern typabhängig setzt.
                              PHP-Klassen auf github

                              Kommentar

                              Lädt...
                              X