PHP の call_user_func_array + bind_param で参照渡し
call_user_func_array で mysqli の bind_param を呼び出しをまとめつつ、汎用性をもたせたい
bind_param は 第2引き数以降が参照渡しでなければならないので、渡す配列を作成する段階で参照渡しを入れておく必要があるが、毎回面倒なので配列を再生成することで落ち着く
ここで $params を作成する時に
foreach($data as $key => $value){ $params[] = &$value }
の様に行ってはいけません
上記は $value 参照を代入することになり、次のループで $value が書き換えられ、結果的に配列の最後の値を全てが参照することになります
foreach($data as $key => $value){ $params[] = &$data[$key] }
であれば、元の $dataが書き換えられない限り、データの変動は起こりません
bind_param は 第2引き数以降が参照渡しでなければならないので、渡す配列を作成する段階で参照渡しを入れておく必要があるが、毎回面倒なので配列を再生成することで落ち着く
// 警告が出るパターン
// Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in
$params = array('i', 2);
call_user_func_array(array($stmt, 'bind_param'), $params);
// 引き数を意識するパターン
$id = 2;
$params = array();
$params[] = 'i';
$params[] = &$id; // パラメータは参照渡し
call_user_func_array(array($stmt, 'bind_param'), $params);
// お手軽なパターン
$params = array('i', 2);
for($i = 1; $i < count($params); $i++){ // 2番目以降を参照渡しに書き換え
$params[$i] = &$params[$i];
}
call_user_func_array(array($stmt, 'bind_param'), $params);
ここで $params を作成する時に
foreach($data as $key => $value){ $params[] = &$value }
の様に行ってはいけません
上記は $value 参照を代入することになり、次のループで $value が書き換えられ、結果的に配列の最後の値を全てが参照することになります
foreach($data as $key => $value){ $params[] = &$data[$key] }
であれば、元の $dataが書き換えられない限り、データの変動は起こりません
コメント