【问题标题】:Sql select where clause issueSql select where子句问题
【发布时间】:2013-04-06 00:10:58
【问题描述】:

希望有人能帮我解决这个问题。

谁能告诉我这个选择有什么问题,它目前可以正确搜索,但它会检查“画廊”中的每个结果,而不仅仅是“类别:夏季”和“状态:使用”中的结果。

所以我想要它做的是搜索关键字 ($find),只有当它们属于“夏季”类别和“使用”状态时。任何想法我需要做什么。 大声笑在这一点上会采取任何措施。强调:)

$result = mysql_query("
  SELECT
     Gallery_URL,
     Thumbnail_URL,
     Nickname,
     Description 
  FROM Galleries
  WHERE 
    Category = 'summer' 
    AND Status = 'Used'
    AND Nickname LIKE '%$find1%'
    OR Nickname LIKE '%$find2%'
    OR Nickname LIKE '%$find3%'
    OR Description LIKE '%$find1%'
    OR Description LIKE '%  $find2%'
    OR Description LIKE '%$find3%'
  LIMIT 0 , 10");

【问题讨论】:

    标签: mysql sql select where


    【解决方案1】:

    尝试在 where 子句中对表达式进行分组。例如

    $result = mysql_query("SELECT Gallery_URL, Thumbnail_URL
    , Nickname, Description 
    FROM Galleries 
    WHERE Category = 'summer' 
    AND Status = 'Used' 
    AND (Nickname LIKE '%$find1%' 
    OR Nickname LIKE '%$find2%' 
    OR Nickname LIKE '%$find3%' 
    OR Description LIKE '%$find1%' 
    OR Description LIKE '% $find2%' 
    OR Description LIKE '%$find3%') 
    LIMIT 0 , 10");
    

    【讨论】:

      【解决方案2】:

      您正在使ANDOR 运算符短路。尝试通过将OR 放在一个组中来隔离它们,

      SELECT  Gallery_URL, 
              Thumbnail_URL, 
              Nickname,
              Description 
      FROM    Galleries 
      WHERE   Category = 'summer' AND 
              Status = 'Used' AND 
              (
                  Nickname LIKE '%$find1%' OR 
                  Nickname LIKE '%$find2%' OR 
                  Nickname LIKE '%$find3%' OR 
                  Description LIKE '%$find1%' OR 
                  Description LIKE '% $find2%' OR 
                  Description LIKE '%$find3%' 
              )
      LIMIT   0 , 10
      

      作为旁注,如果变量的值(s)来自外部,则查询很容易受到SQL Injection 的攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

      【讨论】:

        【解决方案3】:

        像这样添加括号:

        SELECT Gallery_URL, Thumbnail_URL, Nickname, Description 
        FROM Galleries  
        WHERE 
           Category = 'summer' 
           AND Status = 'Used' 
           AND (Nickname LIKE '%$find1%' 
           OR Nickname LIKE '%$find2%' 
           OR Nickname LIKE '%$find3%' 
           OR Description LIKE '%$find1%' 
           OR Description LIKE '%  $find2%' 
           OR Description LIKE '%$find3%')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-18
          • 1970-01-01
          相关资源
          最近更新 更多