Mysql
 sql >> Database >  >> RDS >> Mysql

PDO bindParam per la data non funziona

Questo è il tuo problema principale:

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

La chiamata a fetchColumn() fa avanzare il set di risultati oltre la prima riga. Quindi, quando chiami fetchAll(), recupera solo il rimanente righe. Non può tornare indietro e recuperare la prima riga, quella è persa. Quindi, se il risultato della tua query aveva solo una riga, non la vedrai mai.

Invece, suggerirei questo codice:

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

Altri suggerimenti:

Non inserire mai i segnaposto dei parametri tra virgolette. Se lo fai, non sono più segnaposto di parametri, sono solo stringhe letterali come ":befDate". Questi non sono valori letterali di data validi.

I parametri in un'espressione come BETWEEN :befDate AND :aftDate non produrre BETWEEN 2016-07-17 AND 2016-07-25 come una domanda. I parametri non diventano mai espressioni del genere, diventano sempre un valore scalare (ad es. una data letterale tra virgolette) per parametro.

ho provato il tuo codice Per prima cosa ho abilitato il registro delle query generali di MySQL:

mysql> SET GLOBAL general_log = ON;

Ora posso vedere esattamente ciò che secondo MySQL è la query inviata da PDO. Ho eseguito lo script PHP e ho letto il registro delle query generali (/var/lib/mysql/localhost.log sulla mia macchina virtuale):

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, ho dimenticato di impostare i valori per le variabili associate ai parametri. Se non avessi alcun valore in nessuna di queste variabili, spiegherebbe perché il tuo risultato è vuoto, perché qualsiasi confronto con NULL non è vero. Quindi ho modificato il PHP per impostare prima i valori di esempio sulle variabili.

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

Ho eseguito di nuovo la query e nel registro vedo quanto segue:

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

Ciò dimostra che PDO mette virgolette attorno a un valore parametrizzato (se si tratta di una stringa o di una data).