SQLSTATE[42000]: Syntax error or access violation

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Andurit
Člen | 131
+
0
-

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
+
0
-

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
+
0
-

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)

iguana007
Člen | 970
+
0
-

Myslím si, že problém je v tom, že do metody query předáváš string, ve kterém jsou i ty params pro where podmínku.
Spíše bych se ten zápis snažil upravit tak, aby si ve výsledku volal něco jako:

return $this->db->query($query, (array) $searchParams);
Andurit
Člen | 131
+
0
-

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
+
0
-

@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
+
0
-

@CZechBoY jen oprava, kdyz se parametry predavaji v poli, musi se pouzit queryArgs

Andurit
Člen | 131
+
0
-

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
+
0
-

@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
+
0
-

@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
+
0
-

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