Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dynamicznie zbuduj przygotowaną instrukcję za pomocą call_user_func_array()

Nie rozumiem, jakich sposobów próbowałeś, ale postaram się odpowiedzieć:

zgodnie z bind_param manual :

pierwszy argument bind_param to ciąg , jak 'ssss' .

drugi i inne argumenty — to wartości, które należy wstawić do zapytania.

Więc twoje $a_params tablica powinna być nie

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

Ale:

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

Widzieć? Wszystkie wartości są ciągami. A typy symboli zastępczych są pierwszymi.

Weź również pod uwagę kolejność argumentów w $a_params musi być taka sama jak kolejność parametrów w bind_param . Oznacza to, że np. $a_params lubię

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

jest źle. Ponieważ pierwszy element $a_params będzie pierwszym argumentem bind_param iw tym przypadku nie jest to "ssss" ciąg.

Oznacza to, że po wypełnieniu $a_params z wartościami należy dodać ciąg znaków zastępczych na początku $a_params , z array_unshift na przykład:

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

Jeśli to nie zadziałało, możesz zapoznać się z częścią odpowiedzi, którą podałeś , gdzie wartości $a_params są przekazywane przez odwołanie do innej tablicy $tmp , w Twoim przypadku możesz spróbować czegoś takiego:

// 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. Projekt DB:jedna duża DB dla wszystkich klientów lub wiele małych DB

  2. MySql nie może zrobić kolumny auto_increment

  3. Zamieszanie w strefie czasowej MySQL

  4. Jak zdobyć wszystkie posty ze wszystkimi kategoriami w wordpressie przez mysql?

  5. MySQL wybierz wiersze, w których lewe złącze ma wartość null