To jest twój główny problem:
if ($stmt->fetchColumn()>=1) {
$result = $stmt->fetchAll();
}
else{
$result = 'nope';
}
Wywołanie fetchColumn() przesuwa zbiór wyników poza jego pierwszy wiersz. Następnie, gdy wywołujesz fetchAll(), pobiera tylko pozostałe wydziwianie. Nie może wrócić i pobrać pierwszego rzędu, to stracone. Więc jeśli wynik zapytania miał tylko jeden wiersz, nigdy go nie zobaczysz.
Zamiast tego proponowałbym ten kod:
$result = $stmt->fetchAll();
if (empty($result)) {
$result = "nope";
}
Inne wskazówki:
Nigdy nie umieszczaj symboli zastępczych parametrów w cudzysłowie. Jeśli to zrobisz, nie są już symbolami zastępczymi parametrów, są tylko dosłownymi ciągami, takimi jak ":befDate". To nie są prawidłowe literały daty.
Parametry w wyrażeniu takim jak BETWEEN :befDate AND :aftDate
nie produkuj BETWEEN 2016-07-17 AND 2016-07-25
jako zapytanie. Parametry nigdy nie stają się takimi wyrażeniami, zawsze stają się wartościami skalarnymi (np. literałem daty w cudzysłowie) na parametr.
Wypróbowałem twój kod. Najpierw włączyłem ogólny dziennik zapytań MySQL:
mysql> SET GLOBAL general_log = ON;
Teraz widzę dokładnie, co MySQL myśli o zapytaniu przesłanym przez PDO. Uruchomiłem skrypt PHP i przeczytałem mój ogólny dziennik zapytań (/var/lib/mysql/localhost.log na mojej maszynie wirtualnej):
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
Ach, zapomniałem ustawić wartości dla zmiennych powiązanych z parametrami. Jeśli nie masz żadnej wartości w żadnej z tych zmiennych, wyjaśniałoby to, dlaczego Twój wynik jest pusty, ponieważ każde porównanie z NULL nie jest prawdziwe. Zmodyfikowałem więc PHP, aby najpierw ustawić przykładowe wartości na zmienne.
$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;
Uruchomiłem zapytanie ponownie i w dzienniku widzę:
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
To dowodzi, że PDO umieszcza cudzysłowy wokół sparametryzowanej wartości (jeśli jest to ciąg znaków lub data).