【问题标题】:Binding parameters for WHERE IN clause with PDOWHERE IN 子句与 PDO 的绑定参数
【发布时间】:2011-08-12 17:43:48
【问题描述】:

我的代码:

$myArray = implode($myArray, ',');
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)');
$sth->bindParam(':ids', $myArray);
$sth->execute();
$result = $sth->fetch();
echo $sth->rowCount();

始终显示计数为 1,但是当我跳过参数化并将变量本身添加到它的位置时,我得到了准确的计数。这是怎么回事?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您不能像这样为 IN 子句绑定参数。 $myArray 字符串只会算作一个值,就像你这样做:

    SELECT foo FROM bar WHERE ids IN ('1,2,3')
    

    即使有三个逗号分隔的值,数据库也只会将它们读取为一个字符串值。

    您需要手动将 IN 列表插入到查询中,这是老式的方式。

    'SELECT foo FROM bar WHERE ids IN (' . $myArray .')'
    

    很遗憾,没有其他办法。至少现在是这样。

    【讨论】:

    • 认真的吗?准备好的语句不能处理吗?这是多么蹩脚:/
    • @hoppa:他们可以这样处理:id IN (:id1, :id2, :id3...),你明白了。你最好用老派的方法。
    • 这个问题证实了这一点:stackoverflow.com/questions/920353/…
    • @Jared,我想我的问题是重复的。应该搜索更多:(
    • 不用担心,这个问题无论如何是从 2009 年开始的。就你所知,PDO 可能已经打了补丁来支持这一点。考虑到另一个问题的年龄,我不会认为它是重复的:)
    【解决方案2】:

    我知道这个问题很老,但这对我有用:

    $arrayOfValues = array(1,2,3,4,5);
    $questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?"));
    $stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)");
    $stmt->execute($arrayOfValues);
    

    【讨论】:

      【解决方案3】:

      你为什么不使用这个解决方案?

      https://stackoverflow.com/a/39353278/1834212

      它解析一个值数组,这些值是成对的绑定占位符及其元素,在 IN 的情况下,您只需要提供一个 Array ,然后它将解析数组并使用绑定名称为您修改字符串动态生成,然后输入数组的这些值

      【讨论】:

        猜你喜欢
        • 2011-03-23
        • 2018-02-26
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        • 2015-01-06
        相关资源
        最近更新 更多