Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PDO][MySQL] Podpinanie w LIMIT, Błąd w PDO_MYSQL?
WebCM
post 18.07.2009, 13:25:12
Post #1





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

Ostrzeżenie: (0%)
-----


Zapytanie:
  1. <?php
  2. if(!$q)
  3. {
  4.    $q = $db->prepare('SELECT i.ID, i.name, i.date, i.txt, c.name as cat
  5.        FROM news i JOIN cats c
  6.        ON i.cat = c.ID
  7.        WHERE i.access=1 AND (c.access = 1 OR c.access = ?)
  8.        ORDER BY i.ID DESC LIMIT ?');
  9. }
  10. $q->execute(array('en', 20));
  11. ?>

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-nt
Wersja 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:
  1. Zapytanie SQL zostało wykonane pomyślnie
  2.  
  3. PREPARE query FROM 'SELECT i.ID,i.name,i.date,i.txt,c.name as cat
  4. FROM news i JOIN cats c ON i.cat=c.ID
  5. WHERE i.access=1 AND (c.access=1 OR c.access=?)
  6. ORDER BY i.ID DESC LIMIT ?';
  7. # MySQL zwrócił pusty wynik (zero rekordów).
  8.  
  9. SET @a = 'en'; # MySQL zwrócił pusty wynik (zero rekordów).
  10. SET @b = 20; # MySQL zwrócił pusty wynik (zero rekordów).
  11.  
  12. EXECUTE query USING @a, @b; # Rekordów: 1
Niestety bindValue() z PDO::PARAM_INT też nie pomaga. To ogranicza użycie przygotowanych zapytań.

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.


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
erix
post 18.07.2009, 13:32:55
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




http://blog.ulf-wendel.de/?p=191

  1. <?php
  2. $stmt->bindValue(':limit', 1, PDO::PARAM_INT);
  3. -->
  4. >pdo_mysql_stmt_execute
  5. | info : stmt=0
  6. | info : SELECT * FROM test LIMIT 1
  7. >pdo_mysql_stmt_execute
  8. ?>


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:50