5

我有一个$_POST['excludeids']使用以下值调用的 post 变量:

1,2,3,4,5,6,7,8,9

我想将其传递给 SQL 查询,NOT IN因此我使用以下查询:

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

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

4

3 回答 3

9

它不能以这种方式工作,因为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();
于 2013-07-19T13:06:41.190 回答
3

您将不得不遍历 ids(首先将它们分解成一个数组)并在 SQL 字符串和 with 中动态创建新参数bindValue

于 2013-07-19T13:01:23.710 回答
0
    $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();
于 2015-07-17T11:49:00.183 回答