Č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.