<?php if(!$q) { $q = $db->prepare('SELECT i.ID, i.name, i.date, i.txt, c.name as cat FROM news i JOIN cats c ON i.cat = c.ID WHERE i.access=1 AND (c.access = 1 OR c.access = ?) ORDER BY i.ID DESC LIMIT ?'); } ?>
Błąd:
Cytat
Syntax error or access violation: 1064 Something is wrong in your syntax obok ''20''
Dokumentacja MySQL:
Cytat
As of MySQL 5.0.7, placeholders can be used for the arguments of the LIMIT clause when using prepared statements.
Wersja MySQL: 5.0.41-community-ntWersja PHP: 5.3 Thread-Safe VC9 (używam PDO)
PDO przekazuje wartości liczbowe jako string. W SQLite nie ma żadnych problemów.
Sprawdziłem w phpMyAdmin:
Niestety bindValue() z PDO::PARAM_INT też nie pomaga. To ogranicza użycie przygotowanych zapytań.
Zapytanie SQL zostało wykonane pomyślnie PREPARE query FROM 'SELECT i.ID,i.name,i.date,i.txt,c.name as cat FROM news i JOIN cats c ON i.cat=c.ID WHERE i.access=1 AND (c.access=1 OR c.access=?) ORDER BY i.ID DESC LIMIT ?'; # MySQL zwrócił pusty wynik (zero rekordów). SET @a = 'en'; # MySQL zwrócił pusty wynik (zero rekordów). SET @b = 20; # MySQL zwrócił pusty wynik (zero rekordów). EXECUTE query USING @a, @b; # Rekordów: 1
Czy jest jakieś obejście? Czy pozostaje wstawiać wartości bezpośrednio do zapytania?
Poruszyłem ten temat już na innym forum, jednak na IRC-u twierdzą, że działa podpinanie do LIMIT w PHP 5.3.