PHP中的LIKE条件无法正常工作

时间:2011-12-26 07:41:27

标签: php database get conditional-statements sql-like

我的数据库中有一行名为“active_sizes”,我希望按大小过滤我的网站项目,为此,我在php中使用LIKE Con​​dition:

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 个答案:

答案 0 :(得分:2)

在数据库的单个字段中使用逗号分隔值表示设计错误。你应该规范化事物,并有一个单独的“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

答案 1 :(得分:0)

您的%值附近有$_GET个符号。结合LIKE,这意味着任何只包含您的get值的字符串都将被重新调整。如果您想要完全匹配,请使用=运算符,而不使用百分号。

答案 2 :(得分:0)

这将解决您的直接问题:

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

如果您使用的是MySQL以外的数据库,请使用相应的转义函数。永远不要相信输入数据。

此外,我建议对active_sizes字段使用数字字段(DECIMAL or NUMERIC)。这将加速您的查询,让您消耗更少的内存,创建active_sizes BETWEEN 16.5 AND 17.5之类的查询,并且通常这是鞋尺码的更正确的数据类型。