MYSQL中不在查询中的PHP PDO

MYSQL中不在查询中的PHP PDO,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我有一个名为$\u post['excludeids']的post变量,其值如下: 1,2,3,4,5,6,7,8,9 我想通过NOT IN将其传递到SQL查询中,因此我使用以下查询: $STH = $DBH->prepare("SELECT * FROM books WHERE id NOT IN (:excludeids)"); $STH->bindValue(':excludeids', $_POST['excludeids']); $STH->execute();

我有一个名为
$\u post['excludeids']
的post变量,其值如下:

1,2,3,4,5,6,7,8,9
我想通过
NOT IN
将其传递到SQL查询中,因此我使用以下查询:

$STH = $DBH->prepare("SELECT * FROM books WHERE id NOT IN (:excludeids)");
$STH->bindValue(':excludeids', $_POST['excludeids']);
$STH->execute();

绑定变量在这种情况下不起作用,我不知道为什么。上面的查询有什么问题?

您必须循环通过ID(首先将它们分解为一个数组)并动态创建新参数,无论是在SQL字符串中还是使用
bindValue
它都不能以这种方式工作,因为
in()
子句需要值的集合,而不是逗号分隔的字符串,这就是您通过尝试将它们作为单个参数绑定而提供的

为了实现这一点,您需要分别绑定集合中的每个元素:

// Split the IDs into an array
$ids = preg_split('/\s*,\s*/', $_POST['excludeids'], -1, PREG_SPLIT_NO_EMPTY);

// Create an array of ? characters the same length as the number of IDs and join
// it together with commas, so it can be used in the query string
$placeHolders = implode(', ', array_fill(0, count($ids), '?'));

// Prepare the statement
$STH = $DBH->prepare("SELECT * FROM books WHERE id NOT IN ($placeHolders)");

// Iterate the IDs and bind them
// Remember ? placeholders are 1-indexed!
foreach ($ids as $index => $value) {
    $STH->bindValue($index + 1, $value, PDO::PARAM_INT);
}

// This should now work
$STH->execute();
$all_id=array(1,2,3,4,5);
$countArr=计数($all_id);
对于($countArr;$countArr>0;$countArr--)
以[]表示的$='?';
$in=内爆(',',$in);
$stmt=$dbh->prepare(“
选择ID
来自b_iblock_元素
其中XML_ID不在(“.$IN.”)
");
如果($stmt->execute($all_id)){
而($row=$stmt->fetch(PDO::fetch\U ASSOC)){
回显“”;打印($row);回显“”;
}
}
$stmt->execute();

缺少一个
在SQL语句中更正此错误:)请参阅此问题。它们是字符串,不是数组,我想我用jquery将其作为字符串传递。你可以给我一个例子,因为我听不懂你的意思。谢谢:)我发布了一个问题供你参考。现在我面临另一个问题…我想使用
$STH->bindValue(':test',$\u POST['test'])绑定另一个变量
但我得到了以下错误:
无效的参数编号:混合命名参数和位置参数
现在我面临另一个问题…我想使用
$STH->bindValue(':test',$\u POST['test'])绑定另一个变量
但我得到了以下错误:
无效的参数编号:混合命名参数和位置参数
@MichaelSamuel您需要在整个查询过程中使用问号样式的占位符,以便上述代码正常工作-但是您可以在适当的位置轻松找到更多的参数。如果您的额外参数需要在
IN()
子句之前,只需在循环之前
bindValue(1,'your value')
,并将
$index+1
更改为
$index+2
。好的,解决了这个问题,但还有另一个问题……为什么我必须进行preg\u拆分?当我试图用
$ids=array($\u POST['excldeids'])
替换代码中的第一行时,查询不返回任何内容…我试图在jquery中将字符串作为
'1'、'2'、'3'
而不是
1,2,3
发送,但它仍然不返回任何内容,因为
$\u POST['excldeids']
是逗号分隔的字符串。您需要它是一个数组,每个逗号分隔的值作为一个元素
array($\u POST['excldeids'])
只需使用一个元素创建一个数组,即原始的逗号分隔字符串。如果我使用javascript将ID作为数组推送…有没有办法直接在PHP中使用它,而不必预先拆分?
    $all_id = array(1, 2, 3, 4,5);
    $countArr = count($all_id);
    for($countArr; $countArr > 0; $countArr--)
        $in[]= '?';
    $in = implode(', ', $in);   
    $stmt = $dbh->prepare("
        SELECT ID
        FROM  b_iblock_element 
        WHERE  XML_ID NOT IN  ( ".$in.")
    ");
    if ($stmt->execute($all_id)) {
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo '<pre>'; print_r($row); echo'</pre>';
        }
    }
    $stmt->execute();