Ankündigung

Einklappen
Keine Ankündigung bisher.

PDOStatement->bindValue() mit den MySQL-Funktionen

Einklappen

Neue Werbung 2019

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

  • PDOStatement->bindValue() mit den MySQL-Funktionen

    Hallo,

    ich würde gerne wissen, ob jemand bereits Erfahrung im Einsatz von PDOStatement->bindValue() mit den MySQL-Funktionen wie NOW() hat.

    Während das Binden von normalem Datetime mit PDOStatement->bindValue(:mitglied_seit, '2010-05-12 15:25:45', PDO::PARAM_STR) problemlos klappt, muckt die Datenbank bei PDOStatement->bindValue(:mitglied_seit, 'NOW()', PDO::PARAM_STR) auf. Auch andere Datentypangaben wie PDO::PARAM_INT usw. habe ich bereits ausprobiert. Das Ergebnis ist das gleiche: 0000-00-00 00:00:00.

    Heißt das für den Entwickler "endtweder mit PHP gebastelte Datumsangabe und bindValue oder kein bindValue dafür aber gemütliche MySQL-Funktion!" ?

  • #2
    "NOW" wird nicht gebunden, sondern as-is an die Datenbank übergeben.

    bind_param ist, wie der Name bereits andeutet, für variable Parameter zuständig (NOW wird aber von der Datenbank evaluiert)
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Bitte beschreibe Probleme und eventelle Fehlermeldungen etwas fachlich korrekter, als mit „muckt auf“.
      [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

      Kommentar


      • #4
        Zitat von ChrisB Beitrag anzeigen
        Bitte beschreibe Probleme und eventelle Fehlermeldungen etwas fachlich korrekter, als mit „muckt auf“.
        Uhh, entschuldigung.

        Fachlich korrekt ausgedrückt würde im obigen Fall heißen: PDOStatement->bindValue(':somedate', 'NOW()', PDO::PARAM_STR) führt dazu, dass MySQL ein hässliches 0000-00-00 00:00:00 in das Feld schreibt.

        Zitat von lstegelitz Beitrag anzeigen
        (NOW wird aber von der Datenbank evaluiert)
        Das hier beantwortet meine Frage aber voll und ganz. Das bedeutet, dass ich mehr Abfragen in die Routinen einbauen und im Falle von
        PHP-Code:
        insert into `bla` (`id`, `somedate`) values (nullNOW()) 
        auf bindValue verzichten muss.

        Kommentar


        • #5
          Zitat von karthago Beitrag anzeigen
          Fachlich korrekt ausgedrückt würde im obigen Fall heißen: PDOStatement->bindValue(':somedate', 'NOW()', PDO::PARAM_STR) führt dazu, dass MySQL ein hässliches 0000-00-00 00:00:00 in das Feld schreibt.
          Das passiert, wenn die Datenbank versucht, einen ungültigen Datumsstring zu konvertieren und in ein DATETIME Feld einzufügen.

          Wenn es ums aktuelle Datum geht, würde ich NOW() vorziehen, da es Code spart und somit potentielle Fehlerquellen (Aufbereitung des Datums als String, in richtigen Zeitzone versteht sich und im für die Datenbank richtigen Format, dann Übergabe an die Datenbank, die den String analysiert und versucht, ihn in den Zieldatentyp zu konvertieren)
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Zitat von karthago Beitrag anzeigen
            Das bedeutet, dass ich mehr Abfragen in die Routinen einbauen und im Falle von
            PHP-Code:
            insert into `bla` (`id`, `somedate`) values (nullNOW()) 
            auf bindValue verzichten muss.
            was heißt "müssen" … NOW() ist Teil der SQL-Syntax und gehört daher nicht in den Datenteil des Prepared Statements, sondern in den SQL-Teil. die Verwendung von ->bindValue() ergibt daher eh keinen Sinn (da, wie schon gesagt, NOW() auf dem SQL-Server ausgeführt werden muß (was ja mit Daten auf gar keinen Fall passiert))

            Kommentar


            • #7
              Zitat von Dormilich Beitrag anzeigen
              was heißt "müssen" … NOW() ist Teil der SQL-Syntax und gehört daher nicht in den Datenteil des Prepared Statements, sondern in den SQL-Teil. die Verwendung von ->bindValue() ergibt daher eh keinen Sinn (da, wie schon gesagt, NOW() auf dem SQL-Server ausgeführt werden muß (was ja mit Daten auf gar keinen Fall passiert))
              Dormilich, das Problem ergab sich, weil sich die Query generisch zusammensetzte.
              PHP-Code:
              $classVariables = array(
                  
              'benutzername' => 'das_ist_mein_nickname',
                  
              'emailadresse' => 'meine@email.de',
                  
              'mitglied_seit' => 'NOW()'
              );

              $query  "INSERT INTO `mytable` (`";
              $query .= implode(', `'array_keys($classVariables));
              $query .= "`) VALUES (:";
              $query .= implode(', :'array_keys($classVariables));
              $query .= ")";

              // generiert:
              // INSERT INTO `mytable` (`benutzername, `emailadresse, `mitglied_seit`) VALUES (:benutzername, :emailadresse, :mitglied_seit)

              $smtp $mydb->prepare($query);
              foreach (
              $classVariables as $field => $value) {
                  
              $smtp->bindValue(':' $field$value);
              }
              $smtp->execute(); 
              Somit hatte ich das Problem, dass bindValue den Platzhalter :mitglied_seit versuchte mit 'NOW()' zu befüllen, was wiederum zu dem genannten Fehler führte.

              Kommentar


              • #8
                Zitat von karthago Beitrag anzeigen
                Dormilich, das Problem ergab sich, weil sich die Query generisch zusammensetzte.
                Prepared Statements sind halt keine Queries …

                Kommentar

                Lädt...
                X