【问题标题】:PHP PDO bindParam for variable/string used for "IN" statement...? [duplicate]用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]
【发布时间】:2012-06-04 05:43:40
【问题描述】:

可能重复:
PHP PDO: Can I bind an array to an IN() condition?

好吧,这真的很困扰我。如何在 PHP 的 PDO 中为 SQL“IN”语句绑定参数(具有多个值)?

这里是基础知识...

$allow = "'red', 'blue'";

SELECT * FROM colors WHERE type IN (:allow);

$stmt->bindParam(':allow', $allow);

当我自己插入 $allow 时,这可以正常工作,但是当尝试绑定它并使用 :allow 时,它无法工作。有谁知道这是为什么?

注意:我确实正确设置了 PDO 的其余部分,并且其他变量(不是字符串)正常工作,我只是没有包含它,因为它是不必要的。

感谢您的帮助,谢谢。

【问题讨论】:

  • PHP PDO: Can I bind an array to an IN() condition?。您必须单独绑定每个值,否则数据库将尝试匹配字符串“'red','blue'”,而不是两个字符串“red”和“blue”。
  • 这就是为什么那些声称参数化查询是所有 live 问题的解决方案的人悄悄溜进黑暗的原因......

标签: php mysql sql string pdo


【解决方案1】:

绑定函数会将整个列表视为一个字符串,而不是多个离散值。

【讨论】:

    【解决方案2】:

    deceze 在 cmets 中所说的是正确的。这是我以前做过的一种方法。

    基本上,您通过循环数组值并添加绑定名称来创建 sql 字符串的 IN 部分。

    $allow = array( 'red', 'blue' );
    
    $sql = sprintf(
        "Select * from colors where type in ( %s )",
        implode(
            ',',
            array_map(
                function($v) {
                    static $x=0;
                    return ':allow_'.$x++;
                },
                $allow
            )
        )
    );
    

    这导致Select * from colors where type in ( :allow_0,:allow_1 )

    然后只需循环 $allow 数组并使用 bindValue 绑定每个变量。

    foreach( $allow as $k => $v ){
        $stmnt->bindValue( 'allow_'.$k, $v );
    }
    

    我在意识到 deceze 与给出类似示例的问题相关联之前添加了此内容。我将把它留在这里,因为它展示了如何使用命名绑定变量而不是 ?s

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2015-09-07
      • 2011-11-10
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多