Mysql
 sql >> Base de données >  >> RDS >> Mysql

PDO bindParam pour la date ne fonctionne pas

C'est votre principal problème :

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

L'appel à fetchColumn() fait avancer le jeu de résultats au-delà de sa première ligne. Ensuite, lorsque vous appelez fetchAll (), il ne récupère que le restant Lignes. Il ne peut pas revenir en arrière et récupérer la première ligne, c'est perdu. Ainsi, si le résultat de votre requête n'avait qu'une seule ligne, vous ne le verrez jamais.

Au lieu de cela, je suggérerais ce code :

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

Autres conseils :

Ne placez jamais d'espaces réservés pour les paramètres entre guillemets. Si vous le faites, ce ne sont plus des paramètres fictifs, ce sont juste des chaînes littérales comme ":befDate". Ce ne sont pas des littéraux de date valides.

Les paramètres dans une expression comme BETWEEN :befDate AND :aftDate ne produisez pas BETWEEN 2016-07-17 AND 2016-07-25 sous forme de requête. Les paramètres ne deviennent jamais des expressions comme ça, ils deviennent toujours une valeur scalaire (par exemple, un littéral de date entre guillemets) par paramètre.

J'ai essayé votre code. J'ai d'abord activé le journal des requêtes générales MySQL :

mysql> SET GLOBAL general_log = ON;

Maintenant, je peux voir exactement ce que MySQL pense être la requête soumise par PDO. J'ai exécuté le script PHP et lu mon journal de requête général (/var/lib/mysql/localhost.log sur ma machine virtuelle) :

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, j'ai oublié de définir des valeurs pour les variables liées aux paramètres. Si vous n'aviez aucune valeur dans l'une de ces variables, cela expliquerait pourquoi votre résultat est vide, car toute comparaison avec NULL n'est pas vraie. J'ai donc modifié le PHP pour définir d'abord des exemples de valeurs pour les variables.

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

J'ai exécuté à nouveau la requête et dans le journal, je vois ce qui suit :

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

Cela prouve que PDO place des guillemets autour d'une valeur paramétrée (s'il s'agit d'une chaîne ou d'une date).