PHPのbindParamをforeachするときの注意(foreachのvalueを参照渡しにする)

変数が多い場合、PDOのbindParamをforeachで書きたいとします。

$stmt->bindParam( ':name', $name, PDO::PARAM_STR );
$stmt->bindParam( ':title', $title, PDO::PARAM_STR );
$stmt->bindParam( ':tag', $tag, PDO::PARAM_STR );

このときforeachは下のようになります。

$array = array( ':name' => $name, ':title' => $title, ':tag' => $tag );
foreach ( $array as $key => &$value ) {
  $stmt->bindParam( $key, $value, PDO::PARAM_STR );
}
unset( $array );
  • foreachのvalueにアンパサンド(&)をつける
  • foreachの後、foreachで用いた配列をunsetする

&記号をつけると、その変数はC言語と同じく参照渡しになります。配列のポインタはforeachで回すとずれていくため、最後はunsetでポインタを戻します。&をつけない場合、foreachの最後の変数(上ではtag)のみがbindParamに渡され、nameとtitleのカラムにtagの値が入ってしまいます。

unset
(PHP 4, PHP 5, PHP 7)
unset — 指定した変数の割当を解除するvoid unset ( mixed $var [, mixed $... ] )

広告