Това е основният ви проблем:
if ($stmt->fetchColumn()>=1) {
$result = $stmt->fetchAll();
}
else{
$result = 'nope';
}
Извикването на fetchColumn() придвижва набора от резултати след първия му ред. След това, когато извикате fetchAll(), той извлича само останалото редове. Не може да се върне и да извлече първия ред, това е загубено. Така че, ако резултатът от вашата заявка има само един ред, никога няма да го видите.
Вместо това бих предложил този код:
$result = $stmt->fetchAll();
if (empty($result)) {
$result = "nope";
}
Други съвети:
Никога не поставяйте контейнери за параметри в кавички. Ако го направите, те вече не са заместители на параметри, те са просто буквални низове като ":befDate". Това не са валидни литерали за дата.
Параметрите в израз като BETWEEN :befDate AND :aftDate
не произвеждайте BETWEEN 2016-07-17 AND 2016-07-25
като запитване. Параметрите никога не се превръщат в такива изрази, те винаги се превръщат в скаларна стойност (напр. цитиран литерал на дата) за параметър.
Опитах вашия код. Първо активирах общия регистър на заявките на MySQL:
mysql> SET GLOBAL general_log = ON;
Сега мога да видя точно какво според MySQL е заявката, изпратена от PDO. Изпълних PHP скрипта и прочетох общия си регистър на заявките (/var/lib/mysql/localhost.log на моята виртуална машина):
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
А, забравих да задам стойности за променливите, свързани с параметрите. Ако нямате стойност в нито една от тези променливи, това би обяснило защо вашият резултат е празен, защото всяко сравнение с NULL не е вярно. Затова редактирах PHP, за да задам първо примерни стойности на променливите.
$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;
Пуснах заявката отново и в регистрационния файл виждам следното:
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
Това доказва, че PDO поставя кавички около параметризирана стойност (ако е низ или дата).