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配列の最後の要素)として入力されていることを除いて、すべてが良好に見えます。$ defaultをエコーすると、期待するintのシーケンスが得られるため、foreachループは期待どおりに機能しているようです。だから、それはバインディングに問題があるに違いありません

助けてください :)

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
}

または、値を渡し、bindParam の代わりに bindValue を使用します。

foreach($defaults as &$default) {  
    $stmt->bindValue($i++, $default);     // bind the value to the statement
}
于 2013-01-03T19:50:34.480 に答える