mysqli bind_param() Ralat Rujukan Parameter: Menyelesaikan dengan Fungsi RefValues
Mengapa saya menerima ralat "mysqli_stmt::bind_param menjadi rujukan, nilai diberikan"?
Ralat "mysqli_stmt::bind_param() dijangka menjadi rujukan, nilai diberikan" berlaku apabila anda cuba menghantar pembolehubah atau nilai mengikut nilai kepada kaedah bind_param() yang menjangkakan rujukan . Isu ini boleh timbul apabila menggunakan call_user_func_array() untuk menghantar berbilang parameter kepada bind_param().
Memahami Isu
Fungsi MySQL, termasuk bind_param(), memerlukan pembolehubah diluluskan sebagai rujukan untuk prestasi optimum. Walau bagaimanapun, call_user_func_array() menjangkakan parameter sebagai nilai. Ketidakpadanan dalam jangkaan ini membawa kepada ralat.
Penyelesaian: Menggunakan fungsi RefValues()
Untuk menyelesaikan isu ini, anda boleh menggunakan fungsi refValues(), yang menukar tatasusunan nilai menjadi tatasusunan rujukan. Berikut ialah contoh:
function refValues($arr){ if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ { $refs = array(); foreach($arr as $key => $value) $refs[$key] = &$arr[$key]; return $refs; } return $arr; } $query = "INSERT INTO test (id,row1,row2,row3) VALUES (?,?,?,?)"; $params = array(1,"2","3","4"); $param_type = "isss"; $sql_stmt = mysqli_prepare ($mysqli, $query); call_user_func_array('mysqli_stmt_bind_param', array_merge(array($sql_stmt, $param_type), refValues($params))); mysqli_stmt_execute($sql_stmt);
Penyelesaian Alternatif: Menggunakan Operator Spread
Dalam versi PHP yang lebih baharu, anda boleh menggunakan operator spread (...) untuk menukar tatasusunan nilai menjadi tatasusunan rujukan. Berikut ialah contoh:
$query = "INSERT INTO test (id,row1,row2,row3) VALUES (?,?,?,?)"; $params = array(1,"2","3","4"); $param_type = "isss"; $sql_stmt = mysqli_prepare ($mysqli, $query); call_user_func_array([$sql_stmt, 'bind_param'], [$param_type, ...$params]); mysqli_stmt_execute($sql_stmt);
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'mysqli_stmt::bind_param() Dijangka sebagai Rujukan, Nilai Diberi'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!