SQLSTATE[42000]: Syntax error or access violation
- Andurit
- Člen | 131
Ahojte,
skritpom skladám SQL query a následne ho volám v dalšej metode do
$this->db->query()
Naneštastie akokoľvek sa snažím vždy dostnem chybu:
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 ''SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman' at line 1
Táto chyba priamo ukazuje na SQLko čo by s Nette nemalo mať nič
spoločné.
A tak som to urobil nasledovne:
$query = $this->buildSearchQuery($searchParams);
dump($query);
return $this->db->query($query);
Dumpujem si QUERY, ktoré mi vracia funkcia a tento dump vyzera nejako takto:
"'SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman'" (81)
je ale maximálne divné, že pokial tento SQL priakz skopirujem a teda vznikne z toho nieco take:
return $this->db->query('SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman');
Takto prechádza úplne krásne.
V čom môžem robiť chybu?
Diky
- F.Vesely
- Člen | 369
Tohle je volani funkce s jedenim parametrem
$this->db->query("'SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman'");
Tohle je volani funkce se 3 parametry
$this->db->query('SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman');
- Andurit
- Člen | 131
F.Vesely napsal(a):
Tohle je volani funkce s jedenim parametrem
$this->db->query("'SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman'");
Tohle je volani funkce se 3 parametry
$this->db->query('SELECT * FROM candidates WHERE firstname = ? AND surname = ?','Dante', 'Hickman');
Ak sa nemýlim (a je dost mozne ze sa mýlim) , tak dump() vráti string v ""(uvodzovkách) a následne dá do zátvorky počet znakov. Takže tie krajné úvodzovky by nemali byt súčastou query nie?
Editoval Andurit (20. 11. 2015 16:35)
- Andurit
- Člen | 131
Ja som to teda skúšal nejako rozdeliť,nešlo mi to nijako, tak som to
spravil nasledovne :
Priamo do metody findSearchedCandidates som pridal takéto query na test
$query = '"SELECT * FROM candidates WHERE firstname = ? AND surname = ?"';
return $this->db->query($query.",'Dante', 'Hickman'");
Z čoho vlastne vznikne query:
"SELECT *
FROM candidates
WHERE firstname = ? AND surname = ?",'Dante', 'Hickman'
No teraz dostavam Error 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 ‚„SELECT * FROM candidates WHERE firstname = ? AND surname = ?“,'Dante‘, ‚Hickman‘ at line 1
V čom robím chybu?
Editoval Andurit (26. 11. 2015 11:07)
- CZechBoY
- Člen | 3608
@Andurit ale @iguana007 ti psal něco úplně jinýho
$query = 'SELECT * FROM candidates WHERE firstname = ? AND surname = ?';
return $this->db->query($query, ['Dante', 'Hickman']);
nebo čistěji
$query = 'SELECT * FROM candidates WHERE firstname = ? AND surname = ?';
return $this->db->queryArgs($query, ['Dante', 'Hickman']);
nebo můžeš každý placeholder předat jako parametr
$query = 'SELECT * FROM candidates WHERE firstname = ? AND surname = ?';
return $this->db->query($query, 'Dante', 'Hickman');
edit: opraveny dvoje uvozovky
edit2: přidán queryArgs
edit3: parametry query, které nejsou v poli, ale každý jako jeden
parametr
Editoval CZechBoY (26. 11. 2015 11:44)
- David Matějka
- Moderator | 6445
@CZechBoY jen oprava, kdyz se parametry predavaji v poli, musi se pouzit queryArgs
- Andurit
- Člen | 131
CZechBoY napsal(a):
@Andurit ale @iguana007 ti psal něco úplně jinýho
$query = '"SELECT * FROM candidates WHERE firstname = ? AND surname = ?"'; return $this->db->queryArgs($query, ['Dante', 'Hickman']);
edit: přepsáno na quereyArgs
Ďakujem za odpoveď,
síce chápem, že je potrebné to poslať v Arrayi namiesto ako „hlupy“
string no takýto kód vracia: There are more parameters than placeholders. čo
je trocha nezmysel. Nakolko to query je cele hardcordnute vzdy su tam proste
2 parametre a 2 placeholdery
Editoval Andurit (26. 11. 2015 11:37)
- David Matějka
- Moderator | 6445
@Andurit ukaz, jak mas ten kod ted. zkousel jsem to a funguje to (teda
s opravou, ze tady jsou omylem '"
namisto jednich uvozovek)
- CZechBoY
- Člen | 3608
@DavidMatějka co jsem teď zjistil, tak jde i
$this->db->query($query, 'Dante', 'Hickman');
queryArgs
je jen čistší volba a stejně se v metodě
query
dělá pole z parametrů pokud to není pole :-)
https://api.nette.org/…ion.php.html#181
- Andurit
- Člen | 131
Okey tak som to nakoniec rozbehal:
finálne to vyzerá nejako takto:
// metoda buildSearchQuery mi vráti array kde [1] je query s placeholdermi a [2] su jednotlive parametre
$builder = $this->buildSearchQuery($searchParams);
return $this->db->queryArgs($builder[0], $builder[1]);
pričom dump $builderu vyzerá nejako takto:
array (2)
0 => "SELECT * FROM candidates WHERE firstname = ? AND surname = ?" (60)
1 => array (2)
0 => "Dante" (5)
1 => "Hickman" (7)
Dakujem za pomoc