stmt statement sentencias prepared preparadas bind_param php mysql orm mysqli

statement - sentencias preparadas php mysqli



PHP+MYSQLI: enlace de parĂ¡metros/resultados variables con declaraciones preparadas (4)

En PHP, puede pasar una cantidad variable de argumentos a una función o método utilizando call_user_func_array . Un ejemplo para un método sería:

call_user_func_array(array(&$stmt, ''bindparams''), $array_of_params);

Se llamará a la función con cada miembro de la matriz pasado como su propio argumento.

En un proyecto que estoy a punto de concluir, escribí e implementé una solución de mapeo relacional de objetos para PHP. Antes de que los escépticos y los soñadores griten "¿cómo demonios?", Relájate, no he encontrado la manera de hacer un trabajo de encuadernación estático tardío, estoy trabajando en ello de la mejor manera que puedo.

De todos modos, actualmente no estoy usando declaraciones preparadas para realizar consultas, porque no pude encontrar una manera de pasar una cantidad variable de argumentos a los métodos bind_params() o bind_result() .

¿Por qué necesito admitir una cantidad variable de argumentos, usted pregunta? Debido a que la superclase de mis modelos (piense en mi solución como un wannabe PHP ActiveRecord hackeado) es donde se define la consulta, y por lo tanto, el método find (), por ejemplo, no sabe cuántos parámetros necesitaría enlazar. .

Ahora, ya he pensado en construir una lista de argumentos y pasar una cadena a eval (), pero no me gusta mucho esa solución. Prefiero implementar mis propias comprobaciones de seguridad y transmitir las declaraciones.

¿Alguien tiene alguna sugerencia (o historias de éxito) sobre cómo hacer esto? Si puede ayudarme a resolver este primer problema, quizás podamos abordar el enlace del conjunto de resultados (algo que sospecho será más difícil, o al menos más intensivo en recursos si implica una consulta inicial para determinar la estructura de la tabla).


No puedo editar, pero creo en el código

call_user_func_array(array(&$stmt, ''bindparams''), $array_of_params);

La referencia delante de $ stmt no es necesaria. Como $stmt es el objeto y bindparams es el método en ese objeto, la referencia no es necesaria. Debería ser:

call_user_func_array(array($stmt, ''bindparams''), $array_of_params);

Para obtener más información, consulte el manual de PHP sobre Funciones de devolución de llamada .


call_user_func_array(array(&$stmt, ''bindparams''), $array_of_params);

No funcionó para mí en mi entorno, pero esta respuesta me puso en el camino correcto. Lo que realmente funcionó fue:

$sitesql = ''''; $array_of_params = array(); foreach($_POST[''multiselect''] as $value){ if($sitesql!=''''){ $sitesql .= "OR siteID=? "; $array_of_params[0] .= ''i''; $array_of_params[] = $value; }else{ $sitesql = " siteID=? "; $array_of_params[0] .= ''i''; $array_of_params[] = $value; } } $stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!=''0000-00-00''"); call_user_func_array(array(&$stmt, ''bind_param''), $array_of_params); $stmt->execute();


Debes asegurarte de que $ array_of_params sea una matriz de enlaces a variables , no a valores en sí mismos. Debiera ser:

$array_of_params[0] = &$param_string; //link to variable that stores types

Y entonces...

$param_string .= "i"; $user_id_var = $_GET[''user_id''];// $array_of_params[] = &$user_id_var; //link to variable that stores value

De lo contrario (si es una matriz de valores) obtendrás:

Advertencia de PHP: se espera que el parámetro 2 a mysqli_stmt :: bind_param () sea una referencia

Un ejemplo más:

$bind_names[] = implode($types); //putting types of parameters in a string for ($i = 0; $i < count($params); $i++) { $bind_name = ''bind''.$i; //generate a name for variable bind1, bind2, bind3... $$bind_name = $params[$i]; //create a variable with this name and put value in it $bind_names[] = & $$bind_name; //put a link to this variable in array }

y BOOOOOM:

call_user_func_array( array ($stmt, ''bind_param''), $bind_names);