【问题标题】:mysql PDO how to bind LIKEmysql PDO如何绑定LIKE
【发布时间】:2011-02-12 21:48:21
【问题描述】:

在这个查询中

select wrd from tablename WHERE wrd LIKE '$partial%'

我正在尝试将变量 '$partial%' 与 PDO 绑定。不确定这如何与最后的 % 一起使用。

会不会

select wrd from tablename WHERE wrd LIKE ':partial%'

其中:partial 绑定到$partial="somet"

还是这样

select wrd from tablename WHERE wrd LIKE ':partial'

其中:partial 绑定到$partial="somet%"

还是会完全不同?

【问题讨论】:

    标签: php mysql pdo bindparam


    【解决方案1】:

    你也可以说:

    SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')
    

    在 MySQL 端进行字符串连接,并不是说在这种情况下有任何特殊原因。

    如果您要查找的部分 wrd 本身可以包含百分号或下划线字符(因为它们对于 LIKE 运算符具有特殊含义)或反斜杠(MySQL 将其用作另一层转义,事情会变得更加棘手在 LIKE 运算符中 — 不正确,根据 ANSI SQL 标准)。

    希望这不会影响您,但如果您确实需要正确处理这种情况,这里有一个混乱的解决方案:

    $stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'");
    $escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var);
    $stmt->bindParam(':term', $escaped);
    

    【讨论】:

    • 逃还是不逃……这取决于角色的意图。它的意图是成为通配符还是文字?我不希望有一个准备好的声明来为我做出决定。它的工作是转义值中会终止 LIKE 子句并注入不需要的 sql 的字符。
    • +1 表示“混乱”的解决方案。我唯一不会使用它的情况是,如果我想让我的用户能够将通配符放在他们自己的搜索字符串中。
    • 我想补充一下为什么 str_replace 不循环 - Because str_replace() replaces left to right 所以首先,+ 被转义,然后是 %,最后是 _ ...所以没有 +++++++++ :-)
    【解决方案2】:

    我认为接受的答案(@bobince)可以简化一点。

    您可以将其缩减为类似这样以处理参数中的下划线、百分比等,但仍将 LIKE 查询与部分百分比匹配:

    $stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
    $stmt->execute([":partial" => addcslashes($value, '_%') . "%"]);
    $rows = $stmt->fetchAll();
    

    【讨论】:

      【解决方案3】:

      您可以在准备好的语句之前使用 addcslashes。我在mysql上测试过。

      $value = addcslashes($value, '%');
      $stmt = $db->prepare('select * from products where description like ?');
      $stmt->execute(["$value%"]);
      

      【讨论】:

        【解决方案4】:

        下面的代码只显示了数据库中的第一个关键字!

        "SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"
        

        如果你想从数据库中搜索所有关键字,试试这个

        "SELECT wrd FROM tablename WHERE wrd LIKE :partial";
        $stmt->execute(array(':partial'=>'%'.$YourVarHere.'%'));
        

        【讨论】:

          【解决方案5】:

          你应该这样做

          bindValue(':partial', '%' . $_GET['partial'] . '%');
          

          谢谢,

          Qwerty

          【讨论】:

          • 这是一个非常糟糕的主意。
          • @acoder 没有解释你的评论没有帮助。
          • 即使是抽象的,在查询中使用未经过滤的原始 _GET 值听起来等待发生的时间真的很糟糕。
          【解决方案6】:

          谁编写了答案(可能是 karim79):

          $var ="partial%"
          $stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial")
          $stmt->bindParam(":partial",$var)
          $stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
                            // first calling bindParam()
          $rs =$stmt->fetchAll();
          

          使用问号参数:

          $stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
          $stmt->execute(array('partial%'));
          $rs =$stmt->fetchAll();
          

          非常感谢他。我正在搜索代码并看到很多示例,但我无法解决我的问题。这次我成功了。我使用了代码的“使用问号参数:”部分。

          对于其他人的帮助,如果您想从变量中检索值,您可以将代码更改为

          $stmt->execute(array($variable.'%'));
          

          而不是

          $stmt->execute(array('partial%'));
          

          因为“部分”一词已在答案中指定且无法更改。非常感谢。

          【讨论】:

            【解决方案7】:
            $var = "partial%";
            $stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
            $stmt->bindParam(":partial", $var);
            $stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
                              // first calling bindParam()
            $rs = $stmt->fetchAll();
            

            使用问号参数:

            $stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
            $stmt->execute(array('partial%'));
            $rs = $stmt->fetchAll();
            

            http://www.php.net/manual/en/pdo.prepare.php

            【讨论】:

              猜你喜欢
              • 2023-03-26
              • 2013-06-07
              • 2021-11-20
              • 2018-06-06
              • 2010-12-19
              相关资源
              最近更新 更多