Być może napotkaliście kiedyś problem z reprezentacją liczb naturalnych w PHP i MySQL. Otóż MySQL jako punkt dziesiętny stosuje zawsze kropkę, w PHP zależy to natomiast od ustawionej lokalizacji.
Tym samym, jeżeli w PHP ustawimy lokalizację, w której punkt dziesiętny nie jest kropką (na przykład polską), wstawiając takie liczby do zapytania SQL otrzymamy błąd SQL:
setlocale(LC_ALL ~LC_NUMERIC,'pl_PL'); //lub setlocale(LC_ALL,'plk_PLK') na systemach Windows $result=5/2; mysql_query('UPDATE table SET value='.$result); |
You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near ‘5’ at line 1
Rozwiązanie problemu jest oczywiście bardzo proste. Możemy wybrać, wśród dostępnych kategorii, jakich funkcji ma dotyczyć ustawienie lokalizacji.
setlocale(LC_TIME,'pl_PL'); //lub setlocale(LC_TIME,'plk_PLK') na systemach Windows $result=5/2; mysql_query('UPDATE table SET value='.$result); //teraz będzie ok |
Oto lista wszystkich dostępnych opcji dla setlocale. Dla każdej z nich można ustawić inną lokalizację:
- LC_ALL for all of the below
- LC_COLLATE for string comparison, see strcoll()
- LC_CTYPE for character classification and conversion, for example strtoupper()
- LC_MONETARY for localeconv()
- LC_NUMERIC for decimal separator (See also localeconv())
- LC_TIME for date and time formatting with strftime()
- LC_MESSAGES for system responses (available if PHP was compiled with libintl)