Här är problemet:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Manualsidan för PDOStatement::execute() säger (min betoning):
Parametrar
input_parameters
En matris med värden med lika många element som det finns bundna parametrar i SQL-satsen som körs. Alla värden behandlas som PDO::PARAM_STR .
Dina parametrar infogas därför som strängar, så den slutliga SQL-koden ser ut så här:
LIMIT '0', '10'
Detta är ett speciellt fall där MySQL inte kommer att casta till nummer utan utlöser ett parsefel:
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
Vilka dokument måste säga:
LIMIT
sats kan användas för att begränsa antalet rader som returneras avSELECT
påstående.LIMIT
tar ett eller två numeriska argument, som båda måste vara icke-negativa heltalskonstanter, med dessa undantag:
Inom förberedda uttalanden,
LIMIT
parametrar kan specificeras med ? platshållarmarkörer.Inom lagrade program,
LIMIT
parametrar kan specificeras med heltalsvärde rutinparametrar eller lokala variabler.
Dina val inkluderar:
-
Bind parametrar en efter en så att du kan ställa in en typ:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Skicka inte dessa värden som parametrar:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Inaktivera emulerade förberedelser (MySQL-drivrutinen har en bugg/funktion som gör att den citerar numeriska argument):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);