Toto je váš hlavní problém:
if ($stmt->fetchColumn()>=1) {
$result = $stmt->fetchAll();
}
else{
$result = 'nope';
}
Volání fetchColumn() posune sadu výsledků za její první řádek. Když pak zavoláte fetchAll(), načte pouze zbývající řádky. Nemůže se vrátit a získat první řadu, to je ztraceno. Pokud tedy výsledek vašeho dotazu měl pouze jeden řádek, nikdy jej neuvidíte.
Místo toho bych navrhl tento kód:
$result = $stmt->fetchAll();
if (empty($result)) {
$result = "nope";
}
Další tipy:
Nikdy nevkládejte zástupné symboly parametrů do uvozovek. Pokud tak učiníte, již to nejsou zástupné symboly parametrů, jsou to pouze doslovné řetězce jako ":befDate". Toto nejsou platné datové literály.
Parametry ve výrazu jako BETWEEN :befDate AND :aftDate
nevytvářejte BETWEEN 2016-07-17 AND 2016-07-25
jako dotaz. Parametry se nikdy nestanou podobnými výrazy, vždy se stanou skalární hodnotou (např. citovaný datový literál) pro parametr.
Zkoušel jsem tvůj kód. Nejprve jsem povolil obecný protokol dotazů MySQL:
mysql> SET GLOBAL general_log = ON;
Nyní přesně vidím, co si MySQL myslí, že je dotaz zadaný PDO. Spustil jsem skript PHP a přečetl si svůj obecný protokol dotazů (/var/lib/mysql/localhost.log na mém virtuálním počítači):
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
Aha, zapomněl jsem nastavit hodnoty proměnných vázaných na parametry. Pokud byste neměli žádnou hodnotu v žádné z těchto proměnných, vysvětlilo by to, proč je váš výsledek prázdný, protože jakékoli srovnání s hodnotou NULL není pravdivé. Upravil jsem tedy PHP, abych nejdříve nastavil vzorové hodnoty proměnným.
$befDate = '2016-07-21';
$aftDate = '2016-07-28';
$from = 1;
$to = 2;
$weight = 10;
Spustil jsem dotaz znovu a v protokolu vidím následující:
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 dokazuje, že PDO vkládá uvozovky kolem parametrizované hodnoty (pokud je to řetězec nebo datum).