PHP中的LIKE条件不能正常工作

PHP中的LIKE条件不能正常工作,php,database,get,conditional-statements,sql-like,Php,Database,Get,Conditional Statements,Sql Like,我的数据库中有一行名为“active_sizes”,我想按大小筛选我的网站项目,为此,我在php中使用类似条件: AND active_sizes LIKE '%" . $_GET['size'] . "%' 但是通过使用这个代码,我有一个问题 例如,当$\u GET['size']=7.0此代码显示活动\u size=17.0 我的活动大小值看起来像17.0,5.0,6.5,7.5,, 谢谢您在$周围有%标志您可以获得价值。与类似于的相结合,这意味着只包含get值的任何字符串都将被重新调整。

我的数据库中有一行名为“active_sizes”,我想按大小筛选我的网站项目,为此,我在php中使用类似条件:

AND active_sizes LIKE '%" . $_GET['size'] . "%'
但是通过使用这个代码,我有一个问题

例如,当
$\u GET['size']=7.0
此代码显示
活动\u size=17.0

我的活动大小值看起来像
17.0,5.0,6.5,7.5,,


谢谢

您在
$周围有
%
标志
您可以获得
价值。与类似于
相结合,这意味着只包含get值的任何字符串都将被重新调整。如果要精确匹配,请使用
=
运算符,而不使用百分号。

在数据库的单个字段中使用逗号分隔的值表示设计不好。你应该规范化事情,并有一个单独的“项目大小”表。现在,您需要一个非常丑陋的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)

以失去便携性为代价。此处的相关文档:

这将解决您当前的问题:

AND active_sizes LIKE '" . mysql_real_escape_string($_GET['size']) . "%'
如果您使用的是MySQL以外的数据库,请使用相应的转义函数。永远不要相信输入数据

此外,我建议对
活动\u大小
字段使用数字字段()。这将加快查询速度,减少内存消耗,创建介于16.5和17.5之间的
active\u大小查询,通常这是鞋码更正确的数据类型。

我使用WHERE find\u in\u set($s,active\u大小)