tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

chyba v modifikatoru %sql

před 10 lety

knedle
Člen | 34

jedna se o dvoji uvozovky ve stringu zpracovavanym modifikatorem %sql

trochu blbe se mi to vysvetluje

priklady

// nejdrive
$input = array("text%sql" => 'LOWER("retezec \'uvnitr uvozovek\' pak venku \"a jeste jendou\" a konec")');
dibi::test("INSERT INTO [test]", $input);

--sql;
INSERT INTO `test` (`text`)
VALUES (LOWER('retezec \'uvnitr uvozovek\' pak venku \\'a jeste jendou\' a konec'))

analogicky

$input = array("text%sql" => "LOWER('retezec \'uvnitr uvozovek\' pak venku \"a jeste jendou\" a konec')");
dibi::test("INSERT INTO [test]", $input);

--sql;
INSERT INTO `test` (`text`)
VALUES (LOWER('retezec \\'uvnitr uvozovek\' pak venku \"a jeste jendou\" a konec'))

tj. pokud mam cely (pro lower) retezec v jednoduchych uvozovkach a uvnitr jsou take jednoduche, osetrene pomoci zpetneho lomitka, pri prvnim nalezu „\'“ prida zpetne lomitko a sql dotaz je nevalidni

spravny vystup v obou pripadech by mel byt

INSERT INTO `test` (`text`)
VALUES (LOWER('retezec \'uvnitr uvozovek\' pak venku \"a jeste jendou\" a konec'))

před 10 lety

David Grudl
Nette Core | 6806

Tento zápis

$input = array("text%sql" => 'LOWER("retezec \'uvnitr uvozovek\' pak venku \"a jeste jendou\" a konec")');

je z podstaty dibi chápán jako databázově nezávislý a platí tady escapování podle pravidel dibi. A dibi escapuje zdvojením uvozovek. Tudíž je potřeba psát

$input = array("text%sql" => 'LOWER("retezec \'uvnitr uvozovek\' pak venku ""a jeste jendou"" a konec")');

Anebo použít databázově závislý modifikátor %SQL (velkými písmeny) a pak bude fungovat i tvůj zápis:

$input = array("text%SQL" => 'LOWER("retezec \'uvnitr uvozovek\' pak venku \"a jeste jendou\" a konec")');

Ale myslím, že nejsrozumitelnější je využít modifikátor:

$input = array("text%sql" => array('LOWER(%s)', 'retezec \'uvnitr uvozovek\' pak venku "a jeste jendou" a konec'));

před 10 lety

knedle
Člen | 34

pekne osvetleno, diky