Článek v rubrikách:

»PHP
»MySQL

Proč nepoužívat sprintf() a setlocale() v případě ošetření mysql dotazů?

V případě, že používáte funkci setlocale, tak by se Vám ošetření vstupních hodnot mysql datazů pomocí příkazu sprintf nemuselo vyplatit.


Jedna z možností jak programátoři ošetřují hodnoty pro použití v mysql dotazu je funkce sprintf. Nejde jen o ošetření dotazu, pro zajištění numerických a textových hodnot na správném místě, ale umožňuje nám to i vytvořit si šablonu dotazu např. $q="SELECT * FROM table WHERE id_table='%s'";. Později lze získat konkrétní dotaz voláním $query=sprintf($q, $id);. Výhody a smysl použití ať posoudí každý sám.

Problém je ovšem v použití desetinné čárky a nastavení lokalizace pomocí setlocale. Protože např. česká lokalizace způsobí, že tato šablona dotazu: $q="UPDATE table SET price='%f'";, bude nefunkční. Protože po použití $query=sprintf($q, $price);, bude výsledkem $query="UPDATE table SET price='10,56'";, tedy desetinná čárka a ne tečka, to mysql nevezme a uloží jen 10.

Já to řeším tak, že vždy nastavuji setlocale(LC_NUMERIC, "en_US");, netvrdím, že je to správné řešení, ale už dlouho si s ním vystačím. Vzpomínám si, že odhalit a uvědomit si takovou chybu mi dalo kdysi dost práce.

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
19.03.2009 17:34 | Anonym (Jakub Vrána) | %F

Od PHP 4.3.10 a PHP 5.0.3 je k dispozici také modifikátor %F, který nehledí na lokální nastavení.

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>