Mysql
 sql >> Base de données >  >> RDS >> Mysql

Construire dynamiquement une instruction préparée avec call_user_func_array()

Je ne comprends pas ce que vous avez essayé, mais je vais essayer de répondre :

selon bind_param manual :

premier argument de bind_param est une chaîne , comme 'ssss' .

second et d'autres arguments - sont des valeurs à insérer dans une requête.

Donc, vos $a_params le tableau ne doit pas être

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

Mais :

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

Voir? Toutes les valeurs sont des chaînes. Et les types d'espaces réservés sont les premiers.

Tenez également compte de cet ordre des arguments dans $a_params doit être le même que l'ordre des paramètres dans bind_param . Cela signifie que, c'est-à-dire $a_params j'aime

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

est faux. Parce que le premier élément de $a_params sera le premier argument de bind_param et dans ce cas ce n'est pas un "ssss" chaîne.

Donc, cela signifie qu'après avoir rempli $a_params avec des valeurs, la chaîne des espaces réservés doit être ajoutée au début de $a_params , avec array_unshift par exemple :

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

Si cela ne fonctionne pas, vous pouvez vous référer à une partie de la réponse que vous avez fournie , où les valeurs de $a_params sont passés par référence à un autre tableau $tmp , dans votre cas, vous pouvez essayer quelque chose comme :

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