foldrr's weblog

旧ブログ http://d.hatena.ne.jp/foldrr/

PDOStatement::bindParam() で一時変数を割り当ててはダメ

PDO パラメータライズド クエリーを利用する場合、bindParam() でパラメータをバインドする。
下記のコードではバインドが意図したようにできないので注意。

<?php
$sql = "insert into users(user_id, user_name) values(:user_id, :user_name)";
$st = $pdo->prepare($sql);

$params = array(
    ":user_id" => "1",
    ":user_name" => "foo",
);
foreach($params as $k => $v){
    $st->bindParam($k, $v);
}
?>

問題は foreach の一時変数 $v を bindParam() に渡しても、変数の参照カウントが増えないため、foreach を抜けた途端 bindParam が参照しているパラメータが無効になってしまう。