sql >> Databáze >  >> RDS >> Mysql

PDO bindParam pro datum nefunguje

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).




  1. Klíčové slovo MySQL AS

  2. Django 1.7 dlouhé migrace nikdy nekončí

  3. SQL Server 2008:Mám 1000 tabulek, potřebuji vědět, které tabulky obsahují data

  4. Jak používat GROUP BY po klauzuli Having Mysql