Upgrade na 2.3.10 nedoplní do SQL pro prázdné pole (1=1)
- petroff
- Člen | 5
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
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
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
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)