Dit is het probleem:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
De handleiding voor PDOStatement::execute() zegt (nadruk van mij):
Parameters
input_parameters
Een array van waarden met zoveel elementen als er gebonden parameters zijn in de SQL-instructie die wordt uitgevoerd. Alle waarden worden behandeld als PDO::PARAM_STR .
Dus uw parameters worden ingevoegd als strings, dus de uiteindelijke SQL-code ziet er als volgt uit:
LIMIT '0', '10'
Dit is een specifiek geval waarin MySQL niet naar nummer cast maar een parseerfout veroorzaakt:
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
Wat docs moet zeggen:
De
LIMIT
clausule kan worden gebruikt om het aantal rijen te beperken dat wordt geretourneerd door deSELECT
uitspraak.LIMIT
neemt een of twee numerieke argumenten, die beide niet-negatieve integer-constanten moeten zijn, met de volgende uitzonderingen:
Binnen voorbereide verklaringen,
LIMIT
parameters kunnen worden opgegeven met ? tijdelijke aanduidingen.Binnen opgeslagen programma's,
LIMIT
parameters kunnen worden gespecificeerd met behulp van routineparameters met een gehele waarde of lokale variabelen.
Uw keuzes omvatten:
-
Bind parameters één voor één zodat u een type kunt instellen:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Geef deze waarden niet door als parameters:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Schakel geëmuleerde voorbereidingen uit (het MySQL-stuurprogramma heeft een bug/functie waardoor het numerieke argumenten aanhaalt):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);