【问题标题】:PHP PDO for NOT IN query in MYSQLMYSQL 中 NOT IN 查询的 PHP PDO
【发布时间】:2013-07-18 18:33:30
【问题描述】:

我有一个名为 $_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();

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

【问题讨论】:

标签: php mysql sql pdo


【解决方案1】:

这种方式不起作用,因为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();

【讨论】:

  • 现在我面临另一个问题...我想使用 $STH->bindValue(':test', $_POST['test']); 绑定另一个变量,但我收到以下错误:Invalid parameter number: mixed named and positional parameters
  • @MichaelSamuel 您需要在整个查询中使用问号样式的占位符才能使上述代码正常工作 - 但您可以在适当的位置轻松地进行更多操作。如果您的额外参数需要放在IN() 子句之前,只需在循环之前bindValue(1, 'Your value') 并将$index + 1 更改为$index + 2
  • 好的解决了,但还有另一个问题......为什么我必须做 preg_split?当我尝试用$ids = array($_POST['excldeids']) 替换代码中的第一行时,查询什么也不返回...我试图在jquery 中将字符串发送为'1','2','3' 而不是1,2,3,但它仍然没有返回任何内容
  • 因为$_POST['excldeids'] 是逗号分隔的字符串。您需要它是一个数组,每个以逗号分隔的值作为一个元素。 array($_POST['excldeids']) 只会创建一个包含一个元素的数组,即原始的逗号分隔字符串。
  • 如果我使用 javascript 将 id 作为数组推送...有没有办法直接在 PHP 中使用它而不必 preg_split?
【解决方案2】:

您必须循环遍历 id(首先将它们分解成一个数组)并在 SQL 字符串和 bindValue 中动态创建新参数。

【讨论】:

  • 我认为它们是字符串,而不是数组
  • 我使用 jquery 将其作为字符串传递
  • 你能给我举个例子吗,因为我听不懂你……谢谢:)
  • 我发布了一个问题供您参考。往上看
  • 现在我面临另一个问题...我想使用 $STH->bindValue(':test', $_POST['test']); 绑定另一个变量,但我收到以下错误:Invalid parameter number: mixed named and positional parameters
【解决方案3】:
    $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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2023-03-21
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多