Mysql
 sql >> Database >  >> RDS >> Mysql

Crea dinamicamente un'istruzione preparata con call_user_func_array()

Non capisco in che modo hai provato, ma cercherò di rispondere:

secondo bind_param manual :

primo argomento di bind_param è una stringa , come 'ssss' .

secondo e altri argomenti - sono valori da inserire in una query.

Quindi, il tuo $a_params l'array dovrebbe essere non

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

Ma:

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

Vedere? Tutti i valori sono stringhe. E i tipi di segnaposto sono i primi.

Prendi anche in considerazione l'ordine degli argomenti in $a_params deve essere uguale all'ordine dei parametri in bind_param . Ciò significa che, ad esempio, $a_params come

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

è sbagliato. Perché primo elemento di $a_params sarà il primo argomento di bind_param e in questo caso non è un "ssss" stringa.

Quindi, questo significa che dopo aver compilato $a_params con i valori, la stringa dei segnaposto deve essere aggiunta all'inizio di $a_params , con array_unshift ad esempio:

// 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);

Nel caso in cui non funzionasse, puoi fare riferimento a una parte della risposta che hai fornito , dove i valori di $a_params vengono passati per riferimento a un altro array $tmp , nel tuo caso puoi provare qualcosa come:

// 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);