NDB – nahrazení „?“ pro string delší než 20 znaků

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

nette/nette v2.3.10

Potřebuju zavolat Postgre databázovou funkci, které předávám jako parametr string o délce více než 20 znaků (variabilní délka, vstup od uživatele).

dibi řešení funguje:

<?php
dibi::fetchSingle("SELECT schema.funkce(%s)", $nazev_promenne);
?>

ale když to chci přepsat na NDB:

<?php
$db->query("SELECT schema.funkce(?)", $nazev_promenne);
?>

tak k nahrazení nedojde a do db se odešle dotaz SELECT schema.funkce(?). Mám vysledováno že pro stringy do 20 znaků včetně to jede v pořádku, konkrétně tohle omezení je v metodě formatValue třídy SqlPreprocessor.
Celý text se mi do SQL dotazu podařilo dostat použitím SqlLiteral, to ale nepovažuji za šťastné protože vstup není ošetřený a musel bych si takto složitě obalovat všechny textové řetězce, které chci předat SQL funkcím jako parametr (a v naší firemní aplikaci je těch SQL funkcí opravdu hromada).

Dokážete mi někdo poradit?

Editoval zdick (27. 11. 2016 20:04)

David Matějka
Moderator | 6445
+
0
-

a kde je problem? ten retezec se tam posle do DB jako parametr

zdick
Člen | 4
+
0
-

Právě že se ten řetězec z proměnné do db neodešle, tam jde dotaz SELECT schema.funkce(?) který skončí chybou.

Edit: doplňuji příklad:

<?php
$nazev_promenne = '123';
$db->query("SELECT schema.funkce(?)", $nazev_promenne);
// do db jde dotaz "SELECT schema.funkce('123');"

$nazev_promenne = '12345678901234567890123';
$db->query("SELECT schema.funkce(?)", $nazev_promenne);
// do db jde dotaz "SELECT schema.funkce(?);"
?>

Editoval zdick (27. 11. 2016 20:03)

CZechBoY
Člen | 3608
+
0
-

Jakou chybou? Nemenil si driver?

zdick
Člen | 4
+
0
-

Jakou chybou? No když do databáze jde dotaz
SELECT schema.funkce(?);
místo
SELECT schema.funkce('12345678901234567890123');
tak kromě toho že nemám v parametru správnou hodnotu mi postgre vyhodí chybu zmiňující se o chybné syntaxi.