Erreur de référence de paramètre mysqli bind_param() : résolution avec la fonction RefValues
Pourquoi est-ce que je reçois l'erreur "mysqli_stmt::bind_param() attendue être une référence, valeur donnée" ?
L'erreur "mysqli_stmt::bind_param() devrait être une référence, valeur donnée" se produit lorsque vous essayez de transmettre une variable ou une valeur par valeur à la méthode bind_param(), qui attend une référence. Ce problème peut survenir lors de l'utilisation de call_user_func_array() pour transmettre plusieurs paramètres à bind_param().
Comprendre le problème
Les fonctions MySQL, y compris bind_param(), nécessitent que les variables soient transmises comme références pour des performances optimales. Cependant, call_user_func_array() attend des paramètres comme valeurs. Cette inadéquation des attentes conduit à l'erreur.
Solution : Utilisation de la fonction RefValues()
Pour résoudre ce problème, vous pouvez utiliser la fonction refValues(), qui convertit un tableau de valeurs dans un tableau de références. Voici un exemple :
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);
Solution alternative : utilisation de l'opérateur Spread
Dans les versions plus récentes de PHP, vous pouvez utiliser l'opérateur spread (...) pour convertir un tableau de valeurs dans un tableau de références. Voici un exemple :
$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);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!