Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO bindParam für Datum funktioniert nicht

Das ist Ihr Hauptproblem:

if ($stmt->fetchColumn()>=1) {
    $result = $stmt->fetchAll();
}
else{
    $result = 'nope';
}

Der Aufruf von fetchColumn() rückt die Ergebnismenge über die erste Zeile hinaus vor. Wenn Sie dann fetchAll() aufrufen, holt es nur den Rest Reihen. Es kann nicht zurückgehen und die erste Reihe holen, das ist verloren. Wenn Ihr Abfrageergebnis also nur eine Zeile hat, werden Sie es nie sehen.

Stattdessen würde ich diesen Code vorschlagen:

$result = $stmt->fetchAll();
if (empty($result)) {
  $result = "nope";
}

Weitere Tipps:

Platzhalter für Parameter niemals in Anführungszeichen setzen. Wenn Sie dies tun, sind sie keine Parameterplatzhalter mehr, sondern nur wörtliche Zeichenfolgen wie ":befDate". Dies sind keine gültigen Datumsliterale.

Die Parameter in einem Ausdruck wie BETWEEN :befDate AND :aftDate BETWEEN 2016-07-17 AND 2016-07-25 nicht produzieren als Abfrage. Parameter werden nie zu solchen Ausdrücken, sie werden immer zu einem skalaren Wert (z. B. einem Datumsliteral in Anführungszeichen) pro Parameter.

Ich habe deinen Code ausprobiert. Zuerst habe ich das allgemeine MySQL-Abfrageprotokoll aktiviert:

mysql> SET GLOBAL general_log = ON;

Jetzt kann ich genau sehen, was MySQL für die von PDO übermittelte Abfrage hält. Ich habe das PHP-Skript ausgeführt und mein allgemeines Abfrageprotokoll gelesen (/var/lib/mysql/localhost.log auf meiner virtuellen Maschine):

160716 19:26:16     8 Connect   [email protected] on test
            8 Query SELECT * FROM `flights` WHERE `date` BETWEEN NULL AND NULL 
                     AND `from` = NULL 
                     AND `to` = NULL 
                     AND `weight` >= NULL
            8 Quit  

Ah, ich habe vergessen, Werte für die an die Parameter gebundenen Variablen festzulegen. Wenn Sie in keiner dieser Variablen einen Wert hätten, würde dies erklären, warum Ihr Ergebnis leer ist, da jeder Vergleich mit NULL nicht wahr ist. Also bearbeitete ich das PHP, um zuerst Beispielwerte für die Variablen festzulegen.

$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;

Ich habe die Abfrage erneut ausgeführt und im Protokoll sehe ich Folgendes:

160716 19:33:17    13 Query SELECT * FROM `flights` WHERE `date` BETWEEN '2016-07-21' AND '2016-07-28' 
                     AND `from` = 1 
                     AND `to` = 2 
                     AND `weight` >= 10

Dies beweist, dass PDO einen parametrisierten Wert in Anführungszeichen setzt (wenn es sich um einen String oder ein Datum handelt).