sql >> Database >  >> RDS >> Mysql

Bouw dynamisch een voorbereid statement met call_user_func_array()

Ik begrijp niet welke manieren je hebt geprobeerd, maar ik zal proberen te antwoorden:

volgens de bind_param manual :

eerste argument van bind_param is een tekenreeks , zoals 'ssss' .

tweede en andere argumenten - zijn waarden die in een query moeten worden ingevoegd.

Dus je $a_params array moet niet . zijn

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

Maar:

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

Zien? Alle waarden zijn strings. En de typen tijdelijke aanduidingen zijn de eerste.

Houd ook rekening met die volgorde van argumenten in $a_params moet hetzelfde zijn als de volgorde van de parameters in bind_param . Dit betekent dat, d.w.z. $a_params leuk vinden

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

is fout. Omdat het eerste element van $a_params zal het eerste argument zijn van bind_param en in dit geval is het geen "ssss" tekenreeks.

Dit betekent dus dat nadat u $a_params . heeft ingevuld met waarden, moet de tekenreeks van tijdelijke aanduidingen worden toegevoegd aan het begin van $a_params , met array_unshift bijvoorbeeld:

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

Als dit niet werkt, kun je een deel van het antwoord dat je hebt gegeven raadplegen. , waarbij waarden van $a_params worden doorgegeven door verwijzing naar een andere array $tmp , in jouw geval kun je iets proberen als:

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


  1. VERTALEN (... GEBRUIKEN) Functie in Oracle

  2. SQL:de doeltabel gebruiken in een UPDATE-instructie in een geneste FROM-component

  3. Print de eigenlijke query die MySQLdb uitvoert?

  4. DATE formatteren in orakel