0

このコードの何が問題になっていますか? 同じ映画 ID と異なる俳優 ID を持つ複数の行を挿入したい。これを $actors = array(1,2,3,4); で実行すると (または任意の値) で $movid = 1 の場合、4 行すべてが値 (1, 4) として挿入されます。

$create_query = "INSERT INTO `tableName`(`movId`, `actId`) VALUES";
$comma = "";
foreach ($actors as $key=>$value) {
    $create_query .= $comma . "(:movie" . $key . ", :actor" . $key . ")";
    $comma = ", ";
}
$query = $db->prepare($create_query);
foreach ($actors as $key=>$value) {
    echo $movid . ', ' . $value //correct output (1, 1), (1, 2) ...
    $query->bindParam(":movie" . $key, $movid, PDO::PARAM_INT);
    $query->bindParam(":actor" . $key, $value, PDO::PARAM_INT);
}
print_r($query);
//output is
/*INSERT INTO `tableName`(`movId`, `actId`) VALUES(:movie0, :actor0), (:movie1, :actor1), (:movie2, :actor2), (:movie3, :actor3)*/
if ($query->execute()) {
    $return = $query->rowCount();
    $query->closeCursor();
}

挿入に別のクエリを使用すると、正しく機能します。

4

1 に答える 1

1

PDOStatement::bindValue()の代わりに使用してくださいPDOStatement::bindParam()。後者は参照によってバインドされます。ループの反復ごとに変化する変数を使用しているため、すべてを同じものにバインドしようとすることになります。

ドキュメントからPDOStatement::bindParam()

PDOStatement :: bindValue()とは異なり、変数は参照としてバインドされ、PDOStatement :: execute()が呼び出されたときにのみ評価されます。

于 2012-08-26T14:39:59.037 に答える