Posted at

PDO の bindParam() で1時間悩まされた話

More than 1 year has passed since last update.

PDObindParam() でつまずいたのでメモがてら記事おこします。


bindParam() は参照渡し

PDO プリペアドステートメントで bindParam()bindValue() という2つのメソッドがあります。

bindParam() の場合、引数で渡している変数が参照渡しでバインドされるそうです。

PHP: PDOStatement::bindParam - Manual


準備された SQL ステートメント中で、 対応する名前もしくは疑問符プレースホルダにパラメータをバインドします。 PDOStatement::bindValue() と異なり、 変数は参照としてバインドされ、PDOStatement::execute() がコールされたときのみ評価されます。


参照渡しの為、↓みたいな感じで bindParam() を実行した後に引数で渡してる変数を変更すると、最後の変更結果が DB に保存されます。

<?php

...

$sth = $dbh->prepare('INSERT INTO users SET firstName = :firstName, lastName = :lastName');

$firstName = 'firstName';
$lastName = 'lastName';

$sth->bindParam(':firstName', $firstName, PDO::PARAM_STR);
$sth->bindParam(':lastName', $lastName, PDO::PARAM_STR);

$firstName = 'ruka';
$lastName = 'pachory';

$sth->execute();


実行結果

bindParam() 実行直後に変更した変数の内容が insert されてますね。

知らなかった。

そもそも bindValue() でいいやんって思いますが、どのタイミングで bindParam() 使うんでしょうかね。。

誰か優しい人教えてください。