先日、PDOを使ってPostgreSQLにデータを書き込む処理を書いていたところ、INSERT文を実行した時に以下のエラーが発生した。

Fatal error: Cannot pass parameter 2 by reference

問題のコードがこちら。

$sql = "INSERT INTO table_name (name) VALUES (:param)";

$stmt = $pdo->prepare($sql);
$stmt->bindParam(':param', 'value');

PDOのプリペアドステートメントを使った単純な処理だが、4行目のbindParamの第2引数に値を直接入れてしまっていることがエラーの原因のようだ。

第2引数には変数を入れる必要がある。

先ほどのコードを修正。

$sql = "INSERT INTO table_name (name) VALUES (:param)";

$stmt = $pdo->prepare($sql);

$value = 'value';
$stmt->bindParam(':param', $value);

一度値を変数化してからbindParamに設定することで、今回のエラーは解消する。