2017/11/27

PHP の call_user_func_array + bind_param で参照渡し

call_user_func_array で mysqli の bind_param を呼び出しをまとめつつ、汎用性をもたせたい

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が書き換えられない限り、データの変動は起こりません

0 件のコメント: