Hier ist das Problem:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Die Handbuchseite für PDOStatement::execute() sagt (Hervorhebung von mir):
Parameter
input_parameters
Ein Array von Werten mit so vielen Elementen wie gebundene Parameter in der ausgeführten SQL-Anweisung vorhanden sind. Alle Werte werden als PDO::PARAM_STR behandelt .
Daher werden Ihre Parameter als Zeichenfolgen eingefügt, sodass der endgültige SQL-Code folgendermaßen aussieht:
LIMIT '0', '10'
Dies ist ein besonderer Fall, in dem MySQL nicht in eine Zahl umwandelt, sondern einen Parsing-Fehler auslöst:
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
Welche Dokumente muss sagen:
Das LIMIT
-Klausel kann verwendet werden, um die Anzahl der Zeilen einzuschränken, die von SELECT
zurückgegeben werden Erklärung. LIMIT
nimmt ein oder zwei numerische Argumente entgegen, die beide nichtnegative ganzzahlige Konstanten sein müssen, mit folgenden Ausnahmen:
-
Innerhalb vorbereiteter Anweisungen
LIMIT
Parameter können mit ? Platzhaltermarkierungen. -
Innerhalb gespeicherter Programme
LIMIT
Parameter können mit ganzzahligen Routineparametern oder lokalen Variablen angegeben werden.
Sie haben folgende Auswahlmöglichkeiten:
-
Binden Sie die Parameter einzeln, damit Sie einen Typ festlegen können:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Übergeben Sie diese Werte nicht als Parameter:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Deaktivieren Sie emulierte Vorbereitungen (der MySQL-Treiber hat einen Fehler/eine Funktion, die ihn dazu bringt, numerische Argumente zu zitieren):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);