query example ejemplos consulta conexion reference mysqli php

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 :)