Ankündigung

Einklappen
Keine Ankündigung bisher.

PDO bindValue mit PDO::PARAM_INT für LIMIT

Einklappen

Neue Werbung 2019

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

  • PDO bindValue mit PDO::PARAM_INT für LIMIT

    Hi,
    wollte schnell nur einige kleine Ergänzungen zu hausl PDO-Beitrag schreiben,
    da fällt mir beim Testen etwas auf, was mich etwas vom PDO-Glauben abfallen lässt.

    Mein Kenntnisstand war bisher wie folgt:
    Wird bindValue ein Wert mit der Option PDO::PARAM_STR (=default) übergeben, dann erscheint der Parameter im MySQL-Log in Singlequotes eingeschlossen.

    PHP-Code:
    $sql "SELECT * FROM personen WHERE id = :id";
    $stmt $db ->prepare($sql);
    $id 1;
    $stmt->bindValue('id',$id);
    //log:SELECT * FROM personen WHERE id = '1' 
    Mit

    PHP-Code:
    $id 1;
    $stmt->bindValue('id',$id,PDO::PARAM_INT);
    //log:SELECT * FROM personen WHERE id = 1 
    Da MySQL für LIMIT keine Ausdrücke wie LIMIT '1' akzeptiert, muß ein LIMIT mit Preparad Statements
    per PDO mit PDO::PARAM_INT umgesetzt werden:

    PHP-Code:
    $sql "SELECT * FROM personen LIMIT :limit";
    $stmt $db ->prepare($sql);

    $limit 1;
    $stmt->bindValue('limit',$limit,PDO::PARAM_INT);
    //log:SELECT * FROM personen LIMIT 1 
    Soweit alles Ok. Nun aber der Wermutstropfen:
    Kommt $limit als String daher, setzt PDO dies nicht als Integer um.

    PHP-Code:
    $limit '1';

    $stmt->bindValue('limit',$limit,PDO::PARAM_INT);

    //log: SELECT * FROM personen LIMIT '1' 
    Dies führt zu einen Fehler in der SQL Syntax.
    Es ist daher ratsam (auch in zahlreichen Beiträgen bei stackoverflow zu sehen),
    den Wert grundsätzlich zu integer zu casten:

    PHP-Code:
    $stmt->bindValue('limit',(int)$limit,PDO::PARAM_INT); 
    Mein Unverständnis betrifft die Frage, warum beim Flag PDO::PARAM_INT
    nicht grundsätzlich intern zu int gecastet wird ?

  • #2
    Das ist in der Tat eine gute Frage.
    Kann das auch mit der Einstellung von PDO::ATTR_EMULATE_PREPARES zusammenhängen?
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Zitat von jspit Beitrag anzeigen
      Dies führt zu einen Fehler in der SQL Syntax.
      Es ist daher ratsam (auch in zahlreichen Beiträgen bei stackoverflow zu sehen),
      den Wert grundsätzlich zu integer zu casten:
      am besten einfach emulate prepares auf false setzen. dann funktioniert es auch ohne casten.

      hatte das komische cast-verhalten von pdo auch schonmal hier angemerkt gehabt:
      http://www.php.de/forum/webentwicklu...27#post1193927
      liebe Grüße
      Fräulein Dingsda

      Kommentar


      • #4
        Zitat von Arne Drews Beitrag anzeigen
        Das ist in der Tat eine gute Frage.
        Kann das auch mit der Einstellung von PDO::ATTR_EMULATE_PREPARES zusammenhängen?

        Laut dem hier, scheinbar: http://stackoverflow.com/a/19751405

        In case of emulation mode PDO::PARAM_INT isn't of much help either, as it will never cast a string type variable but rather bind it as string.
        The string "()()" is not palindrom but the String "())(" is.

        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


        • #5
          Zitat von jspit Beitrag anzeigen
          Mein Unverständnis betrifft die Frage, warum beim Flag PDO::PARAM_INT
          nicht grundsätzlich intern zu int gecastet wird ?
          ich hatte hier auch schonmal eine ähnliche frage gestellt. mysqli und pdo verhalten sich da nämlich ganz unterschiedlich:
          http://www.php.de/forum/webentwicklu...-der-datenbank


          liebe Grüße
          Fräulein Dingsda

          Kommentar


          • #6
            zu PDO::ATTR_EMULATE_PREPARES:
            Lokal hab ich hier noch eine veraltete PHP/MySQL Version, da ist das Verhalten gleich, egal wie ich PDO::ATTR_EMULATE_PREPARES setze.

            Mein Unix-Testserver meckert, wenn ich PDO::ATTR_EMULATE_PREPARES setze.

            dingsda : mit bindParam() bin ich noch nicht durch, da ist es bei INT noch verrückter. Hab hier unterschiedliche Ergebnisse, ob ich die Variable vor oder nach dem Binden setze.

            Edit: Möchte die Möglichkeiten mit PDO::ATTR_EMULATE_PREPARES gar nicht weiter untersuchen.
            PDO soll unabhängig von der PHP/MySQL-Version und diversen Spezialeinstellungen laufen. Dieser Artikel auf stackoverflow liefert noch einige Hintergrundinformationen zu PDO::ATTR_EMULATE_PREPARES.

            Kommentar

            Lädt...
            X