Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen Sie dynamisch eine vorbereitete Anweisung mit call_user_func_array()

Ich verstehe nicht, wie Sie es versucht haben, aber ich werde versuchen zu antworten:

gemäß bind_param manual :

erstes Argument von bind_param ist eine Zeichenfolge , wie 'ssss' .

zweite und andere Argumente - sind Werte, die in eine Abfrage eingefügt werden sollen.

Also, Ihre $a_params array sollte nicht sein

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

Aber:

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

Sehen? Alle Werte sind Zeichenfolgen. Und Platzhaltertypen sind die ersten.

Berücksichtigen Sie auch diese Reihenfolge der Argumente in $a_params muss mit der Reihenfolge der Parameter in bind_param übereinstimmen . Das heißt, also $a_params wie

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

ist falsch. Weil erstes Element von $a_params wird das erste Argument von bind_param sein und in diesem Fall ist es kein "ssss" Zeichenfolge.

Das bedeutet also, nachdem Sie $a_params ausgefüllt haben Bei Werten sollte die Zeichenkette der Platzhalter am Anfang von $a_params hinzugefügt werden , mit array_unshift zum Beispiel:

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

Falls dies nicht funktioniert hat, können Sie sich auf einen Teil der von Ihnen bereitgestellten Antwort beziehen , wobei Werte von $a_params werden per Referenz an ein anderes Array $tmp übergeben , in Ihrem Fall können Sie Folgendes versuchen:

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