【问题标题】:Dynamically create contents of IN operator SQL php [duplicate]动态创建IN运算符SQL php的内容[重复]
【发布时间】:2015-06-16 12:53:44
【问题描述】:

是否可以将准备好的语句与 MySQLi 或 PDO 一起使用,并且仍然能够动态地将项目添加到查询的 IN 部分,例如...

$somearray = ['tagvalue1', 'tagvalue2', 'tagvalue3'];
$sql = "SELECT foo FROM bar 
            WHERE tag IN(?)";

我问这个是因为我有一种情况,即直到运行时才知道 IN 部分中的元素数量。

【问题讨论】:

    标签: php mysql pdo mysqli prepared-statement


    【解决方案1】:

    你问:

    是否可以在 MySQLi 或 PDO 中使用准备好的语句 并且仍然能够动态地将项目添加到 例如查询...

    ,很遗憾不是。碰巧 ColdFusion 会这样做,但不是 php。

    【讨论】:

      【解决方案2】:

      虽然您无法使用准备好的查询完全满足您的需求,但您可以为查询动态生成 $sql 字符串以完成相同的操作。

      给定一些数组 $array = (n, n1, n2, ... nN)

      $sql = "SELECT foo FROM bar WHERE tag IN (";
      foreach($array as $value) {                 
          $sql .= "'" . $value . "', ";
      }
      // Strip off the last comma and space from the IN clause 
      $sql = substr($sql, 0, strlen($sql) - 2);
      $sql .= ")";
      

      这当然不是最优雅的解决方案,您必须做更多的数据验证或转义准备好的查询可以更好地处理的危险字符,但它会完成这项工作。

      附带说明一下,有一些 ORM(对象关系映射器)库支持诸如接受一组值以在数据库语句中生成 IN 子句之类的东西。 Propel 是我最有经验的一种,但我相信像 Doctrine 这样的其他人也会有类似的方法。

      一个推进式的例子就像

      $results = BarQuery::create()
          ->select('foo')
          ->filterByTag(array($value1, $value2, ..., $vauleN)
          ->find();
      

      许多附加功能和支持,但确实增加了项目的初始设置时间。

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 2010-11-15
        相关资源
        最近更新 更多