sql >> Databasteknik >  >> RDS >> Mysql

PDO bindParam för datum fungerar inte

Det här är ditt primära problem:

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

Anropet till fetchColumn() flyttar resultatuppsättningen förbi sin första rad. När du sedan anropar fetchAll(), hämtar den bara de återstående rader. Den kan inte gå tillbaka och hämta första raden, det är förlorat. Så om ditt sökresultat bara hade en rad kommer du aldrig att se det.

Istället skulle jag föreslå den här koden:

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

Andra tips:

Placera aldrig parameterplatshållare inom citattecken. Om du gör det är de inte parameterplatshållare längre, de är bara bokstavliga strängar som ":befDate". Dessa är inte giltiga datumbokstavar.

Parametrarna i ett uttryck som BETWEEN :befDate AND :aftDate producera inte BETWEEN 2016-07-17 AND 2016-07-25 som en fråga. Parametrar blir aldrig sådana uttryck, de blir alltid ett skalärt värde (t.ex. ett citerat datum bokstavligt) per parameter.

Jag provade din kod. Först aktiverade jag MySQL generella frågelogg:

mysql> SET GLOBAL general_log = ON;

Nu kan jag se exakt vad MySQL tror är frågan som skickats av PDO. Jag körde PHP-skriptet och läste min allmänna frågelogg (/var/lib/mysql/localhost.log på min virtuella maskin):

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, jag glömde att ställa in värden för variablerna bundna till parametrarna. Om du inte hade något värde i någon av dessa variabler skulle det förklara varför ditt resultat är tomt, eftersom varje jämförelse med NULL inte är sann. Så jag redigerade PHP för att ställa in exempelvärden på variablerna först.

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

Jag körde frågan igen och i loggen ser jag följande:

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

Detta bevisar att PDO sätter citattecken runt ett parametriserat värde (om det är en sträng eller ett datum).




  1. sök de poster som har kolumnvärde innehåller %-tecken i mysql

  2. Vad är en Postgres-session?

  3. Går det bra att ha flera DAO?

  4. Ändra datumformat i mySql-databastabellen