[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: поиск чисел по текстовому полю
memba
Добрый день.

Столкнулся с проблемой.

База MySQL, имеется таблица с текстовым полем 'strnum' (varchar)

в нем лежат числа в разном формате
2
3
10
20
11.2
14,4
44

мне нужно вытащить строки в определённом интервале

$_GET['num'] = 4;
$_GET['num'] = str_replace(",", ".", $_GET['num']);


"strnum >= '".$_GET['num'])."' AND strnum <= '".$_GET['num'])."'";


если в качестве разделителя указывать кавычки, то MySQL начинает искать как текст, сравнивая побитно

и под раздачу попадают 2,3,10,20
без кавычек всё обстоит по другому, но это не безопастно

Что можно ещё придумать?





Спустя 9 минут, 32 секунды (10.11.2010 - 14:25) Sanchopansa написал(а):
а разве можно сравнивать данные как числа если даже не понятно к какому типу данных их отнести? например такие данные из твоего списка 11.2 и 14,4.. если 11.2 еще подпадает под float то вот 14,4 это я уже хз.. тебе нада сначала както отформатировать данные

Спустя 5 минут, 26 секунд (10.11.2010 - 14:30) memba написал(а):
поэтому я делаю следующие

$_GET['num'] = str_replace(",", ".", $_GET['num']);


запятые меняем на точки.

Спустя 2 минуты, 54 секунды (10.11.2010 - 14:33) Sanchopansa написал(а):
нуа в базе данные не отфильтрованы.. судя по твоему списку..
Цитата
в нем лежат числа в разном формате
2
3
10
20
11.2
14,4
44

Спустя 1 минута, 46 секунд (10.11.2010 - 14:35) vasa_c написал(а):
Цитата
без кавычек всё обстоит по другому

Риальни?

Цитата
но это не безопастно

Ну так обезопасте данные из гета. Приведите к int'у, например.

Цитата
Что можно ещё придумать?

Данные, которые обрабатываются, как числа и хранить, как числа

Спустя 5 минут, 32 секунды (10.11.2010 - 14:40) memba написал(а):
про то что в базе, сорри я ошибся тут.. там отфильтровано.

vasa_c
да если убрать одинарные кавычки, то Мускул ищет как числа.

не могу я приводить к int, потому что там не только int, сейчас делаю так:
function strtonumber($str)
{
$str = str_replace(",", ".", $str);
if( ! is_numeric($str)) $str = false;
return $str;
}

но это мне тоже не очень нравится

Цитата
Данные, которые обрабатываются, как числа и хранить, как числа

у меня данные могу быть как int так и float.
приводить всё к float и получать формат вида 2.0, я не могу

Спустя 8 минут, 3 секунды (10.11.2010 - 14:48) Sanchopansa написал(а):
function strtonumber($str)
{
$str = str_replace(",", ".", $str);
if( ! is_numeric($str)) $str = false;
return $str;
}
Цитата
но это мне тоже не очень нравится

так у тебя вся проблема в нравах?

ну чтоб больше нравилось (в плане безопастности) то почитай про такие функции в ПХП как
strip_tags, addslashes, htmlspecialchars

Спустя 28 секунд (10.11.2010 - 14:49) linker написал(а):
memba
Мускул не дурак, если поле имеет тип "число", то он не работает с ним как со строкой, сколько бы ты кавычек там не по-наставил. Если в поле могут присутствовать числа с плавающей точкой, то тип данного поля следует указывать аля "double".

Спустя 5 минут, 3 секунды (10.11.2010 - 14:54) memba написал(а):
Sanchopansa
кавычки, и спец символы все преобразуются, просто я тут не указывал

linker
Да, но у меня поле имеет тип varchar и мускул может работать с ним как с числом, если убрать кавычки.

вообщем нашёл оптимальное для себя решение

SELECT * FROM `test` WHERE `strnum` < CAST('4' AS SIGNED)

Спустя 1 минута, 30 секунд (10.11.2010 - 14:55) linker написал(а):
memba
Цитата
Да, но у меня поле имеет тип varchar и мускул может работать с ним как с числом, если убрать кавычки.

И это ужасно.

Спустя 4 минуты, 11 секунд (10.11.2010 - 15:00) memba написал(а):
linker

Вы читаете историю сообщений? )

у меня числа хранятся как вида int так и float
конечно можно всё привезти к float , но тогда целые числа будут иметь вид 3.0
И это не подходит.

Спустя 30 минут, 4 секунды (10.11.2010 - 15:30) linker написал(а):
Цитата
Да, но у меня поле имеет тип varchar

Чьи это слова?
Число "3.0" ничем не отличается от "3", именно поэтому в таблицу будет заноситься "3", а не "3.0". Соответственно и вывод тоже будет содержать "3".

Спустя 8 минут, 5 секунд (10.11.2010 - 15:38) memba написал(а):
ещё я написал что если поле привести к типу float
то при добавление числа '3' ... оно сохраняется как 3.0

а на счёт varchar ...
Цитата
у меня числа хранятся как вида int так и float

имеется ввиду ВИД .. а не ТИП

Спустя 29 минут, 4 секунды (10.11.2010 - 16:07) linker написал(а):
DOUBLE, не надо ничего переводить, просто заносишь в таблицу "3", "3.0", "3.565443" и не паришься
CREATE TABLE  `test` (
`num` DOUBLE NOT NULL DEFAULT '0'
) TYPE = MYISAM ;
INSERT INTO `test` VALUES ('3')
INSERT INTO `test` VALUES ('3.0')
INSERT INTO `test` VALUES ('3.565443')
SELECT * FROM `test`
Вывод:
3
3
3.565443

Спустя 2 минуты, 52 секунды (10.11.2010 - 16:10) memba написал(а):
не знал, попробуем
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.