Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Construa dinamicamente uma instrução preparada com call_user_func_array()


Eu não entendo de que maneiras você tentou, mas vou tentar responder:

de acordo com bind_param manual :

primeiro argumento de bind_param é uma sequência , como 'ssss' .

segundo e outros argumentos - são valores a serem inseridos em uma consulta.

Então, seu $a_params matriz deve ser não
0:"New Zealand"
1:"Grey Lynn"
2:"Auckland"
3:"Auckland"
4:array(4)
0:"s"
1:"s"
2:"s"
3:"s"

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

Ver? Todos os valores são strings. E os tipos de placeholders são os primeiros.

Também leve em consideração a ordem dos argumentos em $a_params deve ser igual à ordem dos parâmetros em bind_param . Isso significa que, ou seja, $a_params Curti
0:"New Zealand"
1:"Grey Lynn"
2:"Auckland"
3:"Auckland"
4:"ssss"

está errado. Porque o primeiro elemento de $a_params será o primeiro argumento de bind_param e neste caso não é um "ssss" corda.

Então, isso significa que depois de preencher $a_params com valores, a string dos placeholders deve ser adicionada ao início de $a_params , com array_unshift por exemplo:
// 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);

Caso isso não funcione, você pode consultar uma parte da resposta fornecida , onde os valores de $a_params são passados ​​por referência a outro array $tmp , no seu caso você pode tentar 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);