Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Incorrect arguments to mysql_stmt_execute
Forum PHP.pl > Forum > Bazy danych > MySQL
mxm
Od jakiegoś czasu szukam na necie rozwiązania w związku z błędem zapytania MySQL, który pojawił się w moim skrypcie. Do połączenia z bazą mysql wykorzystuje bibliotekę PDO. Baza jest postawiona na silniku InnoDB. Mam zapytanie predefiniowane wykonywane poleceniem bindValue.
Przykładowe zapytanie to:
  1. SELECT * FROM tab1
  2. LEFT JOIN tab2
  3. USING (ID)
  4. WHERE tab1.temat LIKE :q OR tab1.temat2 LIKE :q OR tab1.klucz LIKE :q OR tab1.opis LIKE :q

Oczywiście pod ':q' podczepione jest:
  1. bindValue(":q", "%{$q}%", PDO::PARAM_STR)

Teraz najlepsze. Zapytanie na mojej bazie MySQL postawionej na Windowsie (wersja mysql: 5.0.51a-community-nt) wykonywane jest PRAWIDŁOWO. Natomiast to samo zapytanie wykonywane na na linuxie FreeBSD (wersja mysql: 5.0.9-beta) pokazuje błąd:
  1. SQLSTATE[HY000]: General error: 1210 Incorrect arguments to mysql_stmt_execute

Co ciekawe jeśli zmniejszę ilość warunków, czyli zapytanie jest w postaci np.:
  1. SELECT * FROM tab1
  2. LEFT JOIN tab2
  3. USING ( ID )
  4. WHERE tab1.klucz LIKE :q OR tab1.temat2 LIKE :q

wszystko wykonywane jest prawidłowo. Ciekawe prawda?

Jeśli całe zapytanie z wszystkimi warunkami przetworze bezpośrednio w phpmyadminie, ale bez zapytania predefionowanego to też wszystko jest ok.

Tak więc pytanie czym ten błąd jest spowodowany i dlaczego tak ograniczane jest to zapytanie predefiniowane przez bazę?
erix
Pokaż kod, którym to wywołujesz oraz podaj, z jakiej wersji interpretera korzystasz - instalowana z paczek/z portów/samodzielnie kompilowana?
mxm
Jeśli chodzi o PHP na windzie to:
  1. Apache/2.2.8 (win32) PHP/5.3.0

Jeśli chodzi o serwer linuxa to:
  1. Apache/2.0.54 (FreeBSD) mod_scgi/1.2 PHP/5.0.4

Z tym że do PHP z linuxa PDO był kompilowany specjalnie (tamta wersja PHP go nie miała) i dodany do rozszerzeń w php.ini:
- pdo.so (chyba 1.0.3)
- pdo_mysql.so (chyba 1.0.2)
Powyższe pliki pobrane z http://pecl.php.net/get/....

Co do kodu, z którego to wywołuje, to jest problem, ponieważ wszystko jest zabudowane w osobnej klasie (wszystkie instrukcje komunikatujące się z PDO). Ale postaram się napisać jak wyglądałby kod w jednym pliku:
  1. //W zapytaniu są zmienione prawdziwe nazwy, ale to chyba nie ma znaczenia
  2. $sql = "SELECT * FROM tab1
  3. LEFT JOIN tab2
  4. USING (ID)
  5. WHERE tab1.temat LIKE :q OR tab1.temat2 LIKE :q OR tab1.klucz LIKE :q OR tab1.opis LIKE :q ";
  6. $stmt = $this->pdo->prepare($sql);
  7. $stmt->bindValue(":q", "%{$q}%", PDO::PARAM_STR);
  8. $stmt->execute();

Dodam, iż błąd pojawia się na instrukcji "execute", wiec mogę pomarzyć o zobaczeniu jakichkolwiek wyników...
erix
Możesz używać nowszej wersji niż ten staroć, jakim jest 5.0? W tej chwili najnowszym stabilnym buildem jest 5.3, a z lini 5.2 - 5.2.12 bodajże.

Najpierw uaktualnij, potem pogadamy. ;]
mxm
Było z tym trochę zachodu i sporo czasu straciłem na naukę FreeBSD, ale zainstalowałem PHP w wersji 5.2.11 wraz z najnowszymi rozszerzeniami, najnowszym PDO i już błąd się nie pojawia. Zupełnie jakbym uruchamiał skrypt u siebie na kompie winksmiley.jpg

Wielki dzięki. Temat do zamknięcia smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.