Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie
Inny

[PHP][PDO] bindValue nadpisuje string znakiem zapytania (insert ignore)SQLSTATE[42000]: Syntax error or access violation

inny


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

#1 Engi

    [EKSiD] playaz44

  • Power User

Reputacja: 236
Wszechwidzący

  • Postów:837
  • GG:
  • Imię:Seba
  • Lokalizacja:Gdańsk
Offline

Napisano 16.01.2015 18:07

Cześć, idąc kodem;
 
//$where jest zawsze stringiem i nigdy nie jest pusty
$i = $pdo -> prepare("INSERT IGNORE INTO :tabl (id, nick) VALUES (:id, :nick)");	
$i -> bindValue(":tabl", $where, PDO::PARAM_STR);
$i -> bindValue(":id", $udata["users"]["id"], PDO::PARAM_INT);
$i -> bindValue(":nick", $udata["users"]["nick"], PDO::PARAM_STR);
$i -> execute();
$i -> closeCursor();
Otrzymuję:
 
exception 'PDOException' with message 'SQLSTATE[42000]: 
Syntax error or access violation: 1064 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 '? (id, nick' at line 1' in /folder/plik.php:35
Stack trace:
#0 plik.php(35): PDO->prepare('INSERT IGNORE I...')

Czyli w skrócie bindValue podmienia mi $where na znak zapytania '?', zapytanie bezpośrednio w PMA wykonuje się bez problemowo.
Wpisanie $where bezpośrednio do zapytania pomijając bindValue rozwiązuje problem ale to nie jest rozwiązanie.
Jakieś sugestie?

Nie ma znaczenia, że nie podałem oryginalnego zapytania (od pierwszego nawiasu w zapytaniu), ani to, że nie podałem całego stack trace, błąd jest w ":tabl" i bindValue.
  • +
  • -
  • 0

Użytkowniku! Zanim napiszesz wiadomość wiedz, że:
 

W odpowiedzi na ten status, przejrzałem kilka ostatnich Twoich postów i dodałem Ci kolejne 3 punkty ostrzeżeń. Mam nadzieję, że pomogłem.

1:0 dla Benia :D
I pamiętaj, na GG i Steam pomagam tylko odpłatnie. Mój numer GG to: 6746210, a nazwa na Steam to: playaz44


#2 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 16.01.2015 18:29

Coś tak mi się wydaję, że te bindowanie nie jest do nazw tabel, dlatego nie działa.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#3 Engi

    [EKSiD] playaz44

  • Autor tematu
  • Power User

Reputacja: 236
Wszechwidzący

  • Postów:837
  • GG:
  • Imię:Seba
  • Lokalizacja:Gdańsk
Offline

Napisano 16.01.2015 18:30

bindParam również nie rozwiązuje problemu, ten sam błąd.
  • +
  • -
  • 0

Użytkowniku! Zanim napiszesz wiadomość wiedz, że:
 

W odpowiedzi na ten status, przejrzałem kilka ostatnich Twoich postów i dodałem Ci kolejne 3 punkty ostrzeżeń. Mam nadzieję, że pomogłem.

1:0 dla Benia :D
I pamiętaj, na GG i Steam pomagam tylko odpłatnie. Mój numer GG to: 6746210, a nazwa na Steam to: playaz44


#4 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 16.01.2015 18:50

Spróbuj na sztywno wpisać nazwę tabeli, bo tak jak napisałem, wydaję mi się, że bindowanie nie jest do nazw tabel.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#5 Engi

    [EKSiD] playaz44

  • Autor tematu
  • Power User

Reputacja: 236
Wszechwidzący

  • Postów:837
  • GG:
  • Imię:Seba
  • Lokalizacja:Gdańsk
Offline

Napisano 16.01.2015 19:14

Wspominałem w pierwszym poście, że na sztywno działa ale to dla mnie nie jest rozwiązaniem.
Są dwie możliwości, albo bind podmienia $where na znak zapytania albo wpisuje $where w '' zamiast `` czego SQL nie lubi.
Chciałem var_dumpować ale coś nie mogę, zawsze wywala ten błąd z PDO i nie dumpuje.
  • +
  • -
  • 0

Użytkowniku! Zanim napiszesz wiadomość wiedz, że:
 

W odpowiedzi na ten status, przejrzałem kilka ostatnich Twoich postów i dodałem Ci kolejne 3 punkty ostrzeżeń. Mam nadzieję, że pomogłem.

1:0 dla Benia :D
I pamiętaj, na GG i Steam pomagam tylko odpłatnie. Mój numer GG to: 6746210, a nazwa na Steam to: playaz44


#6 Portek

    Kończymy zabawę, permanentna emerytura!

  • Przyjaciel

Reputacja: 976
Master

  • Postów:3007
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Częstochowa
Offline

Napisano 16.01.2015 20:26

A może możesz zrobić czegos takiego:

$i = $pdo -> prepare("INSERT IGNORE INTO ".$where." (id, nick) VALUES (:id, :nick)");   

 

PDO nie pozwala(ł) na bindowanie tabel.


  • +
  • -
  • 0

Dołączona grafika
IP: ts3.cserwerek.pl


#7 Engi

    [EKSiD] playaz44

  • Autor tematu
  • Power User

Reputacja: 236
Wszechwidzący

  • Postów:837
  • GG:
  • Imię:Seba
  • Lokalizacja:Gdańsk
Offline

Napisano 16.01.2015 21:13

Dwa razy pisałem, że mogę ale to nie jest rozwiązanie. No ale jak się nie da bo nie pozwala na to sam PDO no to trudno, małe pytanie dodatkowe mam tylko czy wystarczy addslashes (było jeszcze takie od MySQL'a ale nie działa na PDO, zapomniałem jak się nazywa ale była taka piękna funkcja slashująca wszystkie groźne znaki).


  • +
  • -
  • 0

Użytkowniku! Zanim napiszesz wiadomość wiedz, że:
 

W odpowiedzi na ten status, przejrzałem kilka ostatnich Twoich postów i dodałem Ci kolejne 3 punkty ostrzeżeń. Mam nadzieję, że pomogłem.

1:0 dla Benia :D
I pamiętaj, na GG i Steam pomagam tylko odpłatnie. Mój numer GG to: 6746210, a nazwa na Steam to: playaz44


#8 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 16.01.2015 21:38

Ale po co Ci podawać dynamicznie tabelę? Użytkownik nigdzie nie powinien mieć możliwości wpisywania nazwy tabeli (a przynajmniej nie widzę takiego zastosowania do polecenie "INSERT"), więc chyba masz jakiś zły plan, itp.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#9 Engi

    [EKSiD] playaz44

  • Autor tematu
  • Power User

Reputacja: 236
Wszechwidzący

  • Postów:837
  • GG:
  • Imię:Seba
  • Lokalizacja:Gdańsk
Offline

Napisano 16.01.2015 21:58

User nie ma takiego dostępu żeby sobie "wpisać" nazwę tabeli, a to, że zły plan to po prostu nie wymyśliłem nic lepszego niż to, właściwie to miałem ze stałej tabeli te dane ale nie wiedziałem jak je odczytać i zastosować w skrypcie (te w "dynamicznych" tabelach i tak są tymczasowe, mam drugą stałą tabelę z danymi "globalnymi"), zastosować znaczy podać w tej samej nazwie zmiennej tymczasowe dane lub jeżeli są dostępne dane globalne to przypisanie danych globalnych. Dlaczego do jednej nazwy, no cóż, jestem za leniwy żeby pisać dwa razy dłuższy kod xD teoretycznie problemu nie ma bo dane tymczasowe po 15 minutach są nieaktualne, są inne niż globalne jeżeli w 15 minut zdążę komuś dać stałe globalne no i są trzymane w osobnej bazie xD


  • +
  • -
  • 0

Użytkowniku! Zanim napiszesz wiadomość wiedz, że:
 

W odpowiedzi na ten status, przejrzałem kilka ostatnich Twoich postów i dodałem Ci kolejne 3 punkty ostrzeżeń. Mam nadzieję, że pomogłem.

1:0 dla Benia :D
I pamiętaj, na GG i Steam pomagam tylko odpłatnie. Mój numer GG to: 6746210, a nazwa na Steam to: playaz44


#10 DarkGL

    Nie oddam ciasteczka !

  • Właściciel

Reputacja: 6056
Godlike

  • Postów:10910
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 17.01.2015 23:43   Najlepsza odpowiedź

http://stackoverflow.com/a/15990488


  • +
  • -
  • 2

#11 Engi

    [EKSiD] playaz44

  • Autor tematu
  • Power User

Reputacja: 236
Wszechwidzący

  • Postów:837
  • GG:
  • Imię:Seba
  • Lokalizacja:Gdańsk
Offline

Napisano 18.01.2015 13:51

Dzięki Darczysławie Naczelniku, jak zawsze wszystko wiesz  :giggle:


  • +
  • -
  • 0

Użytkowniku! Zanim napiszesz wiadomość wiedz, że:
 

W odpowiedzi na ten status, przejrzałem kilka ostatnich Twoich postów i dodałem Ci kolejne 3 punkty ostrzeżeń. Mam nadzieję, że pomogłem.

1:0 dla Benia :D
I pamiętaj, na GG i Steam pomagam tylko odpłatnie. Mój numer GG to: 6746210, a nazwa na Steam to: playaz44






Również z jednym lub większą ilością słów kluczowych: inny

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych