Autor Zpráva
Sylar
Profil
Zdravím,
přecházím z mysql na mysqli a řeším problém s mysql_real_escape_string() funkcí, kterou jsem používal na ošetření proměnných. Nová funkce http://php.net/manual/en/mysqli.real-escape-string.php chce jako první parametr připojení k databázi, což ve staré fci nebylo. Současnou funkci mysql_real_escape_string() mám řešenou mimo databázovou vrstvu v samostatném souboru, kde se proměnná s připojením k databázi nachází.

Existuje nějaká možnost, jak fci mysqli_real_escape_string() použít ve výše zmiňovaném schématu soborů? Jako nejjednodušší mě napadlo, hodit si připojení k databázi do nějaké konstansty a to pak použít uvnitř funkce, ale to je prasárna, to se mi moc nechce. Jako druhou možnost pak vidím pouze přehodit novou funkci mysqli_real_escape_string() ze samostatného souboru do souboru s databázovou vrstvou, ale to by znamenalo úpravu i všech dalších souborů v dalších vrstvách, kde je současná funkce použita, cemuž jsem se chtěl také vyhnout.
juriad
Profil
Sylar:
Ale escapování dat pro databázi nemá smysl nikde jinde než v databázové vrstvě. O způsobu a nutnosti escapování by zbytek aplikace vůbec neměl vědět. Escapování se provádí zpravidla až těsně před položením dotazu, často až v místě, kde se skládá řetězec.

Při používání mysqli existuje ještě jeden způsob, který umožňuje, abys mysqli_real_escape_string vůbec nemusel používat. Můžeš využít prepared statements -- dotaz, který neobsahuje žádná data, jen otazníky, které se později nahradí hodnotami. Tyto hodnoty se automaticky escapují podle datového typu. Prostě pro každý parametr zavoláš funkci bind_param.
Přečti si o tom na Fisirově webu: http://www.fisir.tk/itblog/mysql_
Sylar
Profil
juriad:
Máš pravdu, teď už vidím taky tak, ale v minulosti jsem řešil escapování spolu s dalšími ošetřovacími funkcemi např. pro odstranění html, trimování apod. v controlleru, aby to bylo vše pohromadě, přišlo mi to jednoduší např. u UPDATE dotazů, kde jsem si prostě každou proměnnou ošetřil, složil dotaz a ten poslal do databázové vrstvy, kde se už jen provedl.

Ta funkce bind_param() vypadá hezky - koukám, že se to nemusí ani dělat pro každý parametr zvlášť, ale lze to i dohromady $statement->bind_param("si", $string, $integer) .

Díky moc za odpověď a vysvětlení, jdu to předělat :)
Alphard
Profil
Sylar:
Máš pravdu, teď už vidím taky tak
Jestli neznáte Escapování - definitivní příručka » phpFashion, doporučuji přečíst. Snaha vytvářet nějaká univerzální řešení je chybou.

Ta funkce bind_param() vypadá hezky
Jestli neznáte tohle a líbí se vám to, možná vás zaujme i něco z následujícího dibi (s fluent rozhraním, které bohužel v tom quick startu není), NotORM a časem možná i něco jako Doctrine.
1Pupik1989
Profil
Ten čas hrozně letí, pamatuji, když jsem si tenkrát napsal mysql objektově. Akorát místo bind_param se moje metoda jsenovala bindParameters. To ještě PHP 5 nebylo. Jinak je to super věc a ušetří spoustu myšlení a práce do budoucna. Takže není třeba nějak myslet na ošetření vstupu. Samozřejmě je dobré vědět jak funguje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: