Zde je problém:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Manuální stránka pro PDOStatement::execute() říká (důraz můj):
Parametry
input_parameters
Pole hodnot s tolika prvky, kolik je svázaných parametrů v právě prováděném SQL příkazu. Všechny hodnoty jsou považovány za PDO::PARAM_STR .
Vaše parametry se tedy vkládají jako řetězce, takže konečný kód SQL vypadá takto:
LIMIT '0', '10'
Toto je konkrétní případ, kdy MySQL nepřetypuje na číslo, ale spustí chybu analýzy:
mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1
Jaké dokumenty musím říct:
LIMIT
klauzuli lze použít k omezení počtu řádků vrácených pomocíSELECT
prohlášení.LIMIT
přebírá jeden nebo dva číselné argumenty, které musí být oba nezáporné celočíselné konstanty, s těmito výjimkami:
V rámci připravených příkazů
LIMIT
parametry lze zadat pomocí ? zástupné značky.V rámci uložených programů
LIMIT
parametry lze zadat pomocí celočíselných parametrů rutiny nebo lokálních proměnných.
Mezi vaše možnosti patří:
-
Svažte parametry jeden po druhém, abyste mohli nastavit typ:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Tyto hodnoty nepředávejte jako parametry:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Zakázat emulované přípravy (ovladač MySQL obsahuje chybu/funkci, která způsobí, že bude citovat číselné argumenty):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);