【问题标题】:LIKE Condition in PHP Not Work correctlyPHP 中的 LIKE 条件无法正常工作
【发布时间】:2012-01-27 20:46:05
【问题描述】:

我的数据库中有一行名称为“active_sizes”,我想按大小过滤我的网站项目,为此,我在 php 中使用 LIKE 条件:

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

但是使用这段代码我有问题

例如,当$_GET['size']=7.0 这段代码显示active_sizes=17.0 的项目时

我的 active_sizes 值看起来像 17.0,5.0,6.5,7.5,,

谢谢

【问题讨论】:

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


    【解决方案1】:

    您的$_GET 值周围有% 标志。结合LIKE,这意味着任何仅包含您的获取值的字符串都将被重新调整。如果您想要完全匹配,请改用 = 运算符,不带百分号。

    【讨论】:

      【解决方案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

      【讨论】:

      • 我使用 WHERE find_in_set($s, active_sizes)
      【解决方案3】:

      这将解决您的直接问题:

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

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

      此外,我建议将数字字段 (DECIMAL or NUMERIC) 用于 active_sizes 字段。这将加速您的查询,让您消耗更少的内存,创建像 active_sizes BETWEEN 16.5 AND 17.5 这样的查询,而且通常这是更适合鞋码的数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多