Posts tagged sql

Проблем при сравнение на числа с плаваща запетая при MySQL

2

Докато работих по един клиентски проблем се оказа, че има проблем при „сравнение“ на числата с плаваща запетая поне при MySQL. Може и да не е проблем, но някои хора може да се сблъскат с този проблем.
Да кажем, че искате да направите сайт за аукциони и искате да има графа „аукциони от 1 стотинка“. Това означава, че искате да вземете всички аукциони, които имат начална цена 0.01.
Обикновено вие (както и аз) бихте направили това:
SELECT * FROM auctions WHERE auction_start_price=0.01
Далеч не ви препоръчвам да си пишете така заявките, но това е друг въпрос. Реално няма да има никакви резултати дори в auctions.auction_start_price да има 0.01 в някои от редовете. Затова ще променим заявката така:
SELECT * FROM auctions WHERE ROUND(auction_start_price,2)=0.01
Сега всичко ще е наред. Друго решение е просто да посочите, че auction_start_price<0.02 и всичко щеше да е ок, но в някои случаи, ще е по-добър вариант закръглянето :)

Функция за заявка към база данни

0

Това е втората ми публикация от серията „Уроци„. Този път съм приготвил една проста функция за sql заявка:
function db_query ($sql)
{
mysql_query(‘SET NAMES utf8′);
return mysql_query($sql);
if (mysql_error())
{
$log=fopen($GLOBALS['path'].’logs.txt’,'r+’);
fwrite($log, mysql_error().’|||’.$sql.’|||’.time().“\n“);
fclose($log);
}
}

Тъй като голяма част от проектите на програмистите трябва да поддържат и други символи освен тези от латиницата им се налага да използват някакъв по-специален енкодинг. В случая на нас ни върши перфектна работа utf8.
Тъй като php има така да се каже проблем с енкодинга се налага да се търсят някакви решения на този проблем. Примерно ‘б’ php ще го сметне като 2 символа, а ‘b’ като 1 символ. В предния си пост показах една сравнително елегантна функция за съкращаване на текст, която работи с всякакви символи. При работата с бази данни php прави проблем с енкодинга и всичко различно от латиница би се счупило.
Решение на този проблем е да се пише mysql_query(‘SET NAMES utf8′); преди всяка друга sql заявка, но много по-добро решение е това да се вмъкне във функция.
Ето и какво прави нашата функция за sql заявки.
Първо задава подходящия енкодинг, след това изпълнява и заявката с код $sql.
Примерно $sql е равно на ‘SELECT * FROM news’ или пък на ‘INSERT INTO users (username, pass) VALUES („‘.mysql_real_escape_string($username).’“,“‘.md5($username.$pass).’“)’ – всякакъв sql код.
SQL грешки може да има поради много възможности – опит за хак, ваша грешка или потребител, който си играе или не знае какво прави.
Хубаво е да се записват тези грешки.
if (mysql_error())
{
$log=fopen($GLOBALS['path'].’logs.txt’,'r+’);
fwrite($log, mysql_error().’|||’.$sql.’|||’.time().“\n“);
fclose($log);
}
Ако има sql грешка изпълняваме функцията fopen с път $path ($GLOBALS['path']) и име на файла logs.txt. Задаваме правя върху файла r+ – т.е. може да се чете и да се пише в него. Файлът logs.txt трябва да е записан в същата директория, където ще се ползва и функцията. В този файл записваме
sql грешката, sql кода + времето и задаваме нов ред с \n. Можете да запишете и ip на потребителя, който е направил грешката с $_SERVER['REMOTE_ADDR'].
След това затваряме файла с fclose.
Всичко би трябвало да работи.

Go to Top