reference - example - Pasa por problema de referencia con PHP 5.3.1
php mysqli example (9)
Acabo de experimentar el mismo problema, llamando bind_param a través de call_user_func_array y pasando una matriz de parámetros. La solución es modificar los valores en la matriz a la que se hará referencia. No es elegante, pero funciona.
call_user_func_array(array($stmt, ''bind_param''), makeValuesReferenced($passArray));
function makeValuesReferenced($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
Ok, este es un problema extraño, así que por favor ten paciencia conmigo mientras te explico.
Actualizamos nuestros servidores de desarrollo de PHP 5.2.5 a 5.3.1.
Cargando nuestro código después del cambio, empezamos a recibir errores como:
Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in /home/spot/trunk/system/core/Database.class.php on line 105
la línea mencionada (105) es la siguiente:
call_user_func_array(Array($stmt, ''bind_param''), $passArray);
cambiamos la línea a lo siguiente:
call_user_func_array(Array($stmt, ''bind_param''), &$passArray);
en este punto (porque allow_call_time_pass_reference
) está desactivado, php arroja esto:
Deprecated: Call-time pass-by-reference has been deprecated in /home/spot/trunk/system/core/Database.class.php on line 105
Después de tratar de solucionar esto durante un tiempo, me rompí y establecí allow_call_time_pass_reference
en on.
Eso Deprecated
advertencia Deprecated
, pero ahora la Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference
advertencia de Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference
cada vez, con o sin la referencia.
No tengo ni idea de cómo solucionar esto. Si el método de destino fuera mío, simplemente haría referencia a los vars entrantes en la declaración de func, pero es un método (relativamente) nativo (mysqli).
Alguien ha experimentado esto? ¿Cómo puedo evitarlo?
Gracias.
Creo que las mysqli_bind_param()
y mysqli_bind_result()
son muy difíciles de usar. He encontrado la misma dificultad que describe al usarlos en combinación con call_user_func_array()
Mi solución fue dejar de usar mysqli y en su lugar usar PDO_mysql. Tiene un uso mucho más fácil:
$pdoStmt->execute( $passArray );
Creo que lo que está en desuso es pasar una referencia a través de una función. En la definición de la función, haces algo como:
function(&$arg) {
}
Esto no te ayuda mucho, pero probablemente no necesites pasar la referencia de todos modos. Supongo que podrías probar una función de envoltura.
function wrapper($stmt, &$passArray) {
call_user_func_array($stmt, $passArray);
}
El segundo parador debe ser una matriz. aparentemente esto solo se aplicó en 5.3
En realidad, tenga en cuenta que hay un error con PHP 5.3.1 con respecto a las referencias y a todas las funciones de la familia de funciones:
Errores PHP # 50394: argumento de referencia convertido a valor en __call
El comportamiento que está viendo puede ser el resultado de este error y cualquier intento de corregirlo puede causar problemas a largo plazo.
El problema ha sido resuelto en la versión SVN de PHP. Hasta que se publique 5.3.2, puede compilar una nueva versión para usarla o degradarla a una versión anterior.
Está pasando una matriz de elementos ($ passArray). El segundo elemento dentro de la matriz pasada debe ser una referencia, ya que esa es realmente la lista de elementos que está pasando a la función.
Estábamos experimentando este mismo problema con este código:
call_user_func(array($strCartHandler, ''CartPurchaseEvent''), $strCartEvent, $objToUser, null, $this);
Mi solución fue omitir call_user_func
completo y hacer esto:
$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);
Esto ayudará:
<?php
call_user_func_array(Array($stmt, ''bind_param''), array(&$passArray));
function bind_param ($val)
{
$val = (is_array($val)) ? $val[0] : $val;
// operations...
}
?>
Tengo un problema similar, el código actual no funcionó:
$query="Select id,name FROM mytable LIMIT ?,?";
$params=Array(''ii'');
array_push($params,$from_var);
array_push($params,$to_var);
...
$stmt=$link->prepare("$query");
$ref=new ReflectionClass(''mysqli_stmt'');
$method=$ref->getMethod("bind_param");
$method->invokeArgs($stmt,$params);
...
Dijo que "Parámetro 2 a mysqli_stmt :: bind_param () espera ser una referencia, valor dado"
Y luego, desesperado, he intentado tomar $ from_var y $ to_var entre comillas. ¡Y funcionó!
$params=Array(''ii'');
array_push($params,"$from_var");
array_push($params,"$to_var");
Espero, ayudará a alguien, buena suerte :)