0

这是我的 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 给了我我期望的整数序列。所以,应该是绑定的问题

请帮忙 :)

4

2 回答 2

1

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

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

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

foreach($defaults as $key => $default) {
    $stmt->bindParam($i++, $defaults[$key]);
    $stmt->bindparam($i++, $userId);
}
于 2013-01-03T19:39:36.563 回答
1

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
}
于 2013-01-03T19:50:34.480 回答