Dit is je voornaamste probleem:
if ($stmt->fetchColumn()>=1) {
$result = $stmt->fetchAll();
}
else{
$result = 'nope';
}
De aanroep van fetchColumn() brengt de resultatenset verder dan de eerste rij. Wanneer u vervolgens fetchAll() aanroept, haalt het alleen de resterende . op rijen. Het kan niet teruggaan en de eerste rij halen, dat is verloren. Dus als het resultaat van uw zoekopdracht maar één rij bevat, ziet u het nooit.
In plaats daarvan zou ik deze code aanraden:
$result = $stmt->fetchAll();
if (empty($result)) {
$result = "nope";
}
Andere tips:
Plaats nooit tijdelijke aanduidingen voor parameters tussen aanhalingstekens. Als je dat doet, zijn het geen tijdelijke aanduidingen meer voor parameters, maar letterlijke tekenreeksen zoals ":befDate". Dit zijn geen geldige datumletters.
De parameters in een expressie zoals BETWEEN :befDate AND :aftDate
niet produceren BETWEEN 2016-07-17 AND 2016-07-25
als een vraag. Parameters worden nooit zulke uitdrukkingen, ze worden altijd een scalaire waarde (bijvoorbeeld een letterlijke datum tussen aanhalingstekens) per parameter.
Ik heb je code geprobeerd. Eerst heb ik het algemene zoeklogboek van MySQL ingeschakeld:
mysql> SET GLOBAL general_log = ON;
Nu kan ik precies zien wat MySQL denkt dat de door PDO ingediende query is. Ik heb het PHP-script uitgevoerd en mijn algemene querylogboek gelezen (/var/lib/mysql/localhost.log op mijn virtuele machine):
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, ik ben vergeten waarden in te stellen voor de variabelen die aan de parameters zijn gebonden. Als u geen waarde had in een van deze variabelen, zou dit verklaren waarom uw resultaat leeg is, omdat elke vergelijking met NULL niet waar is. Dus ik heb de PHP bewerkt om eerst voorbeeldwaarden voor de variabelen in te stellen.
$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;
Ik heb de query opnieuw uitgevoerd en in het logboek zie ik het volgende:
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
Dit bewijst dat PDO aanhalingstekens rond een geparametreerde waarde plaatst (als het een string of een datum is).