Her er problemet:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Manualsiden til PDOStatement::execute() siger (fremhæver mit):
Parametre
input_parameters
En matrix af værdier med lige så mange elementer, som der er bundne parametre i den SQL-sætning, der udføres. Alle værdier behandles som PDO::PARAM_STR .
Dine parametre bliver således indsat som strenge, så den endelige SQL-kode ser sådan ud:
LIMIT '0', '10'
Dette er et særligt tilfælde, hvor MySQL ikke vil caste til nummer, men udløse en parse-fejl:
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
Hvilke dokumenter må sige:
LIMIT
klausul kan bruges til at begrænse antallet af rækker, der returneres af SELECT
udmelding. LIMIT
tager et eller to numeriske argumenter, som begge skal være ikke-negative heltalskonstanter, med disse undtagelser:
-
Indenfor forberedte erklæringer,
LIMIT
parametre kan angives ved hjælp af ? pladsholdermarkører. -
Inden for lagrede programmer,
LIMIT
parametre kan specificeres ved hjælp af heltalsværdier rutineparametre eller lokale variabler.
Dine valg omfatter:
-
Bind parametre en efter en, så du kan indstille en type:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Send ikke disse værdier som parametre:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Deaktiver emulerede forberedelser (MySQL-driveren har en fejl/funktion, der får den til at citere numeriske argumenter):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);