Upgrade na 2.3.10 nedoplní do SQL pro prázdné pole (1=1)

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

Po upgrade na Nette verze 2.3.10 mi do query pro prázdné pole nedoplní (1=1) a SQL statement padá.

$datavar = $this->database->query('SELECT ... WHERE id IN (?)', $EmptyArray);

Nette 2.2.3
SELECT ... WHERE id IN (1=1)

Nette 2.3.10
SELECT ... WHERE id IN ()

Nette\Database\DriverException #42000
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 ')

Prohledával jsme fórum a našel zmínku zde: https://forum.nette.org/…-for-testing .Jde o beta 2.3.0, kde je poznámka: fixed

Toto chování mám v dnes stažené verzi 2.3.10. Nevíte někdo?
Děkuji mnohokrát!

David Grudl
Nette Core | 8228
+
0
-

Je to tak, v ostré verzi to bylo revertnuto, ale už si nepamatuju přesně proč.

Podporovaný způsob je … WHERE', ['id' => $items]

petroff
Člen | 5
+
0
-

Děkuji za velmi rychlou reakci :)
Nicméně nějak nemohu zlomit syntaxi. Je to komplikovaný SQL join, kde používám placeholdery (?). Můžu ještě poprosit o pomoc? Viz tučná pole…

$datavar = $this->database->query(‚SELECT ul.*, ud.UniLinDsc, uhd.UniHeaDsc, uh.UniTyp
FROM varunihea AS vuh
JOIN unihea AS uh ON uh.UsrUniHea=vuh.UsrUniHea
LEFT OUTER JOIN uniheadsc AS uhd ON vuh.UsrUniHea=uhd.UsrUniHea and uhd.Lang=?
JOIN unilin AS ul ON vuh.UsrUniHea=ul.UsrUniHea
LEFT OUTER JOIN unilindsc AS ud ON ud.IdUniLin=ul.IdUniLin and ud.Lang=?
LEFT OUTER JOIN varunilin AS vul ON vul.ParCod=ul.ParCod
WHERE vuh.UsrUniHea in (?) and vuh.IdPrdHea=?
ORDER BY vuh.HeaOrder, ul.UniLinOrd‘, $langdb, $langdb, $VarHeaArr, $IdPrdHea);

CZechBoY
Člen | 3608
+
0
-

Co se třeba kouknout jestli pole není prázdné? Takhle to dělám všude a je to v pohodě.

$args = [$langdb, $langdb];

$sql = 'SELECT ul.*, ud.UniLinDsc, uhd.UniHeaDsc, uh.UniTyp' .
	' FROM varunihea AS vuh' .
	' JOIN unihea AS uh ON uh.UsrUniHea=vuh.UsrUniHea' .
	' LEFT OUTER JOIN uniheadsc AS uhd ON vuh.UsrUniHea=uhd.UsrUniHea and uhd.Lang=?' .
	' JOIN unilin AS ul ON vuh.UsrUniHea=ul.UsrUniHea' .
	' LEFT OUTER JOIN unilindsc AS ud ON ud.IdUniLin=ul.IdUniLin and ud.Lang=?' .
	' LEFT OUTER JOIN varunilin AS vul ON vul.ParCod=ul.ParCod';
if ($VarHeaArr) {
	$sql .= ' WHERE vuh.UsrUniHea in (?) and';

	$args[] = $VarHeaArr; // nebo až na konec skládání dotazu s opakováním podmínky
} else {
	$sql .= ' WHERE';
}
$sql .= ' vuh.IdPrdHea=?' .
	' ORDER BY vuh.HeaOrder, ul.UniLinOrd';

$args[] = $IdPrdHea;

$datavar = $this->database->query($sql, $args);

Editoval CZechBoY (18. 4. 2016 17:01)

petroff
Člen | 5
+
0
-

Ano, skládání SQL bude asi nutné, ale je to trochu víc „upovídané“ než původní řešení.
Děkuji a zdravím!