Php PDO多重插入的问题

Php PDO多重插入的问题,php,pdo,Php,Pdo,下面是我的php脚本的一部分,其中肯定缺少一些内容: $startIndex = 7; $endIndex = 303; $defaults = range($startIndex, $endIndex); $sql = "INSERT INTO items (itemId, userId) VALUES "; $part = array_fill(0, count($defaults), "(?, ?)"); $sql .= implode(",", $part); try { $db

下面是我的php脚本的一部分,其中肯定缺少一些内容:

$startIndex = 7;
$endIndex = 303;
$defaults = range($startIndex, $endIndex);

$sql = "INSERT INTO items (itemId, userId) VALUES ";
$part = array_fill(0, count($defaults), "(?, ?)");
$sql .= implode(",", $part);
try {
  $db = DB::getInstance();
  $stmt = $db->dbh->prepare($sql);
  $i = 1;
  foreach($defaults as $default) {
    $stmt->bindParam($i++, $default);
    $stmt->bindparam($i++, $userId);
  }
  if ($stmt->execute()) {
    echo "result=ok";
  }else {
    echo 'invalid query';
  }

}catch(PDOException $e) {
  echo $e->getMessage();
}
多个插入正在发生,一切似乎都很好,除了所有的itemId字段都以303($defaults数组中的最后一个元素)的形式出现。foreach循环似乎如我所期望的那样工作,因为$default的回声给出了我所期望的int序列。所以,这一定是绑定的问题


请帮助:)

这里发生的是将参数绑定到
$default
变量,而不是它的值

循环
$defaults
数组时,
$defaults
的值会发生变化。绑定参数正在使用引用,而不是副本

您可以更改循环和绑定参数以引用数组项:

foreach($defaults as $key => $default) {
    $stmt->bindParam($i++, $defaults[$key]);
    $stmt->bindparam($i++, $userId);
}

bindParam
需要引用。它将变量而不是值绑定到语句

您可以通过引用传递来解决此问题:

foreach($defaults as &$default) {          //pass $default as a reference (&)
    $stmt->bindParam($i++, $default);     // bind the variable to the statement
}
或者通过传递值并使用bindValue而不是bindParam:

foreach($defaults as &$default) {  
    $stmt->bindValue($i++, $default);     // bind the value to the statement
}