Oto problem:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Strona podręcznika dla PDOStatement::execute() mówi (podkreślenie moje):
Parametry
input_parameters
Tablica wartości zawierająca tyle elementów, ile jest powiązanych parametrów w wykonywanej instrukcji SQL. Wszystkie wartości są traktowane jako PDO::PARAM_STR .
W ten sposób twoje parametry są wstawiane jako ciągi, więc końcowy kod SQL wygląda tak:
LIMIT '0', '10'
Jest to szczególny przypadek, w którym MySQL nie będzie rzutować na numer, ale wywoła błąd parsowania:
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
Jakie dokumenty muszę powiedzieć:
LIMIT
klauzula może być użyta do ograniczenia liczby wierszy zwracanych przez SELECT
oświadczenie. LIMIT
przyjmuje jeden lub dwa argumenty liczbowe, które muszą być nieujemnymi stałymi całkowitymi, z następującymi wyjątkami:
-
W ramach przygotowanych instrukcji
LIMIT
parametry można określić za pomocą ? znaczniki zastępcze. -
W ramach zapisanych programów
LIMIT
parametry można określić za pomocą parametrów procedury o wartościach całkowitych lub zmiennych lokalnych.
Twoje wybory obejmują:
-
Powiąż parametry jeden po drugim, aby ustawić typ:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Nie przekazuj tych wartości jako parametrów:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Wyłącz emulowane przygotowania (sterownik MySQL ma błąd/funkcję, która powoduje, że cytuje argumenty numeryczne):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);