#floating-point #php-5.3
#с плавающей запятой #php-5.3
Вопрос:
Я использую следующий код, чтобы взять переменные HTML $ _POST [type: text], представляющие минимальную и максимальную цену, очистить и удалить «$» и «,», зафиксировать их в $ _SESSION, а затем использовать их для запроса MySQL к данным в столбце типа «Float». Код выглядит следующим образом…
//The locale I'm using
setlocale(LC_ALL, 'en_US.UTF8');
//The minimum price is handled
//Sanitized POST var to SESSION var
$_SESSION['minprice'] = filter_var($_POST['minprice'], FILTER_SANITIZE_STRIPPED);
// Strip currency symbol and commas
$_SESSION['minprice'] = str_replace(array(',','$'),array('',''),$_SESSION['minprice']);
//SESSION var to local float var for SQL query
$minprice = floatval($_SESSION['minprice']);
//The same is done for the maximum price
//Sanitized POST var to SESSION var
$_SESSION['maxprice'] = filter_var($_POST['maxprice'], FILTER_SANITIZE_STRIPPED);
// Strip currency symbol and commas
$_SESSION['maxprice'] = str_replace(array(',','$'),array('',''),$_SESSION['maxprice']);
//SESSION var to local float var for SQL query
$maxprice = floatval($_SESSION['maxprice']);
//The SQL query
$sql = 'SELECT * FROM tablename WHERE ';
$sql .= "zip like '$searchzip%' "; //Ignore this
$sql .= "amp;amp; sellprice >= '$minprice' ";
$sql .= "amp;amp; sellprice <= '$maxprice' ";
$sql .= "ORDER BY id DESC";
затем $ minprice и $ maxprice сравниваются со значением из таблицы MySQL, и результат обрабатывается соответствующим образом, в основном $ minprice <= $sellprice <= $ maxprice.
Для переменной $sellprice = 12.01 следующие поисковые запросы будут возвращать строки из базы данных MySQL:
Следующее возвращает строки замечательно.
($ minprice, $ maxprice)
0, 13
0.00, 13.00
$ 0.00, $ 13.00
$ 10.00, $ 12.02
$ 0.00, $ 12111
$ 0.00, $ 82711
Следующее не возвращает строки, не знаю почему.
($ minprice, $ maxprice)
0, 100
0, 1000-100 000 и далее
0, 1000-100 000 и далее
0, 111 // Я думал, что это просто проблема с неправильным разбором 0 или запятых
$ 0.00, $ 111 — $ 111111 и далее
10, 11112 //Обратите внимание, что 12111 возвращает строки выше
Должно быть, я здесь чего-то не хватает, возможно, чего-то фундаментального и глупого. Я был бы очень признателен за любую помощь, которую люди готовы оказать, спасибо.
Если вы хотите взглянуть на сам сайт, URL-адрес http://listing.dyndns.org, в этом нет ничего особенного, но это мой проект для начинающих.
Edit0: В настоящее время там есть только один список, найдите его по почтовому индексу 99208.
Правка 1: использовалось выражение ‘select id from tablename where sellprice >= 0 amp;amp; sellprice <= 111111.11;’ и оно вернуло все правильные строки, поэтому я знаю, что данные в базе данных в порядке. Должно быть, мой PHP.
Правка 2: похоже, что только числа перед первой запятой или десятичной дробью оцениваются по сравнению с тем, что есть в базе данных. Я так растерялся.
Исправлено: Прочитайте отличный пост здесь о вреде, который возникает, когда сообщения о денежных значениях отображаются в столбце с плавающей запятой, а не в ДЕСЯТИЧНОМ столбце. Изменил тип столбца на ДЕСЯТИЧНЫЙ (9,2) и явно преобразовал переменные PHP с помощью (int). Теперь значения хранятся идеально, и выполнение операций сравнения со значениями базы данных работает отлично. Надеюсь, это кому-то пригодится.
Ответ №1:
setlocale в php 5.3 устарел и не имеет эффекта, когда возвращает false!