ďťż

[PHP][MySQL] Podpinanie w LIMIT błąd MySQL czy PDO?

       

Podstrony


telcocafe

Zapytanie: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 ?'); } $q->execute(array('en', 20));
Błąd:
Syntax error or access violation: 1064 Something is wrong in your syntax obok ''20''
Dokumentacja MySQL:
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-nt
Wersja PHP: 5.3 Thread-Safe VC9 (używam PDO)

PDO prawdopodobnie przekazuje wartości liczbowe jako string albo sam podpina dane do zapytania.

W SQLite nie ma żadnych problemów.
Użytkownik Ferrari edytował ten post 16 lipiec 2009, 10:52


a wyprintuj sobie SQLkę jaką chcesz wykonać i wrzuć do phpmyadmina - zobaczysz czy przejdzie czy nie.

Przeszła. :)

Zapytanie SQL zostało wykonane pomyślnie PREPARE query FROM 'SELECT i.ID,i.name,i.date,i.txt,c.name as cat FROM f3_news i JOIN f3_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: 1To wina PDO. Gratuluję twórcom niekompetencji. Spróbuję jeszcze podpiąć wartości za pomocą bindValue, choć w tym przypadku może lepiej nie korzystać z prepared statements.

Niestety bindValue() z PDO::PARAM_INT też nie pomaga. To ogranicza użycie przygotowanych zapytań.
Użytkownik Ferrari edytował ten post 16 lipiec 2009, 13:50
To wykonaj zapytanie bez bindowania, i/lub zgłoś błąd na php.net. I nie licz że php rozwijają sami kompetentni programiści ;) Przy nich ścięcia developerów Gentoo to pikuś :D

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.