Mysql
 sql >> база данни >  >> RDS >> Mysql

Динамично изградете подготвено изявление с call_user_func_array()

Не разбирам какви начини сте опитвали, но ще се опитам да отговоря:

според bind_param manual :

първи аргумент на bind_param е низ , като 'ssss' .

втори и други аргументи - са стойности, които се вмъкват в заявка.

И така, вашият $a_params масивът трябва да е не

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

Но:

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

Виждаш ли? Всички стойности са низове. И типовете заместители са първият.

Също така вземете под внимание този ред на аргументите в $a_params трябва да е същият като реда на параметрите в bind_param . Това означава, че, т.е., $a_params харесвам

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

не е наред. Тъй като първият елемент от $a_params ще бъде първият аргумент на bind_param и в този случай това не е "ssss" низ.

Така че това означава, че след като сте попълнили $a_params със стойности низът на заместителите трябва да се добави в началото на $a_params , с array_unshift например:

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

В случай, че това не работи, можете да се обърнете към част от отговора, който сте предоставили , където стойностите на $a_params се предават чрез препратка към друг масив $tmp , във вашия случай можете да опитате нещо като:

// 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL комбиниран индекс не се използва

  2. В MySQL възможно ли е да се върнат повече от 1024 знака от GROUP_CONCAT

  3. Защо този пример за избор на актуализация работи?

  4. EXPLAIN и COUNT връщат две различни стойности

  5. Къде безопасно да съхранявате идентификационни данни за база данни в уебсайт на PHP