Как условия в PHP не работают правильно - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть строка в моей базе данных с именем "active_sizes", и я хочу фильтровать элементы моего сайта по размеру, для этого я использую LIKE Condition в php:

AND active_sizes LIKE '%" . $_GET['size'] . "%'

, но с помощью этого кода яесть проблема

, например, когда $_GET['size']=7.0 этот код показывает элементы, которые active_sizes=17.0

мое значение active_sizes выглядит как 17.0,5.0,6.5,7.5,,

спасибо

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

Использование значений, разделенных запятыми, в одном поле в базе данных свидетельствует о плохом дизайне.Вы должны нормализовать вещи и иметь отдельную таблицу "item_sizes".В нынешнем виде вам нужно ОЧЕНЬ уродливое предложение where для обработки таких несовпадений подстрок:

$s = (intval)$_GET['size'];

... WHERE (active_sizes = $s)   // the only value in the field
      OR (active_sizes LIKE '$s%,') // at the beginning of the field
      OR (active_sizes LIKE '%,$s,%')  // in the middle of the field
      OR (active_sizes LIKE '%,$s') // at the end of the field

Или, если вы правильно нормализовали вещи и имели эти отдельные значения в своей дочерней таблице:

WHERE (active_sizes_child.size = $s)

Я знаю, какой из них я бы выбрал ...

Вы не указываете, какую БД вы используете, но если вы в MySQL, вы можете временно выполнитьто же самое с

WHERE find_in_set($s, active_sizes)

ценой потери переносимости.Соответствующие документы здесь: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

0 голосов
/ 26 декабря 2011

Это решит вашу непосредственную проблему:

AND active_sizes LIKE '" . mysql_real_escape_string($_GET['size']) . "%'

Если вы используете базу данных, отличную от MySQL, используйте соответствующую функцию escape.Никогда не доверяйте входным данным.

Кроме того, я бы предложил использовать числовое поле ( DECIMAL или NUMERIC ) для поля active_sizes.Это ускорит ваши запросы, позволит вам потреблять меньше памяти, создавать запросы типа active_sizes BETWEEN 16.5 AND 17.5, и, как правило, это более правильный тип данных для размера обуви.

0 голосов
/ 26 декабря 2011

У вас есть % знаки вокруг вашего $_GET значения. В сочетании с LIKE это означает, что любая строка, которая просто содержит ваше значение get, будет перенастроена. Если вы хотите точное совпадение, используйте вместо этого оператор = без знаков процента.

...