sql >> Base de Datos >  >> RDS >> Mysql

Cree dinámicamente una declaración preparada con call_user_func_array()

No entiendo de qué formas lo has intentado, pero intentaré responder:

según bind_param manual :

primer argumento de bind_param es una cadena , como 'ssss' .

segundo y otros argumentos - son valores que se insertarán en una consulta.

Entonces, su $a_params la matriz debe ser no

0:"New Zealand"
1:"Grey Lynn"
2:"Auckland"
3:"Auckland"
4:array(4)
0:"s"
1:"s"
2:"s"
3:"s"

Pero:

0:"ssss"
1:"New Zealand"
2:"Grey Lynn"
3:"Auckland"
4:"Auckland"

¿Ver? Todos los valores son cadenas. Y los tipos de marcadores de posición son los primeros.

También tenga en cuenta el orden de los argumentos en $a_params debe ser el mismo que el orden de los parámetros en bind_param . Esto significa que, es decir, $a_params Me gusta

0:"New Zealand"
1:"Grey Lynn"
2:"Auckland"
3:"Auckland"
4:"ssss"

Está Mal. Porque el primer elemento de $a_params será el primer argumento de bind_param y en este caso no es un "ssss" cadena.

Entonces, esto significa que después de completar $a_params con valores, la cadena de marcadores de posición debe agregarse al comienzo de $a_params , con array_unshift por ejemplo:

// make $a_param_type a string
$str_param_type = implode('', $a_param_type);

// add this string as a first element of array
array_unshift($a_params, $str_param_type);

// try to call
call_user_func_array(array($stmt, 'bind_param'), $a_params);

En caso de que esto no funcione, puede consultar una parte de la respuesta que proporcionó , donde los valores de $a_params se pasan por referencia a otra matriz $tmp , en tu caso puedes intentar algo como:

// make $a_param_type a string
$str_param_type = implode('', $a_param_type);

// add this string as a first element of array
array_unshift($a_params, $str_param_type);

$tmp = array();
foreach ($a_params as $key => $value) {
    // each value of tmp is a reference to `$a_params` values
    $tmp[$key] = &$a_params[$key];  
}

// try to call, note - with $tmp, not with $a_params
call_user_func_array(array($stmt, 'bind_param'), $tmp);