Špatné escapování řetězců v selectech
- H0w4rd
- Člen | 99
Narazil jsem v minulosti v Nette 2.0 a i teď v 2.1.2 na následující problém.
Vypisuji nějaké záznamy a nyní potřebuju přidat do názvu položek na konec nějaký řetězec, pokud má daný záznam active = 0.
Pár příkladů:
$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE ' inactive' END) AS `text`");
Slovo inactive je oescapováno apostrofy, takže pak mám v názvech toto:
Abcd `inactive
`
Když dám slovo inactive do uvozovek, tak je to OK:
$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE \" inactive\" END) AS `text`");
Pak mám v názvech toto: Abcd inactive
Ale chtěl bych to česky, tedy to slovo přeložím:
$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE \" neaktivní\" END) AS `text`");
A výsledek je bohužel: Abcd `neaktivn
`í
Úplně špatně.
V laděnce je tohle:
SELECT `washstand`.`id` AS `value`, CONCAT(`washstand`.`name`, CASE WHEN `washstand`.`active` THEN
'' ELSE " `neaktivn`í" END) AS `text`
FROM `washstand`
Chtělo by to poladit, na tenhle problém narážím už dlouho. Musím to teď zase nějak obejít.
EDIT: Ještě jeden poznatek, když napíšu slovo aktivní velkými písmeny – NEAKTIVNÍ – tak to funguje správně.
$rows->select("washstand.id");
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE \" NEAKTIVNÍ\" END) AS `text`");
A výsledek je: Abcd NEAKTIVNÍ
Editoval H0w4rd (29. 4. 2014 11:00)
- Jan Endel
- Člen | 1016
Proč tohle řešíš na databázové vrstvě a neuděláš to krásně v šabloně:
$washstand->name {if $washstand->active}neaktivní{/if}
V případě že by jsi to mermomoci chtěl v db vrstvě tak nějak takto:
$rows->select("CONCAT(washstand.name, CASE WHEN washstand.active THEN '' ELSE ? END) AS `text`", "neaktivní");