NDB – nahrazení „?“ pro string delší než 20 znaků
- zdick
- Člen | 4
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)
- zdick
- Člen | 4
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)