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

Проблем при обвързването на имплодиран масив в подготвено изявление на mysql

Позволете ми да ви спестя малко проблеми и да ви кажа, че това, което се опитвате да направите, така или иначе няма да работи. Обвързвате само един параметър към вашия IN() извикване на функция. Вие мислите предавате разделен със запетая списък, но всъщност предавате само разделен със запетая низ, който се третира като една стойност . Това означава, че ще търсите един запис със стойност "'[email protected] ', '[email protected] "" вместо записи, които съответстват на "[email protected] " или "[email protected] ".

За да преодолеете това, трябва:

  1. Динамично генерирайте низовете си с типове
  2. Използвайте call_user_func_array() за да обвържете параметрите си

Можете да генерирате низовете за типове по следния начин:

$types = str_repeat('s', count($selected));

Всичко това прави е да създаде низ от s Това е толкова символа, колкото броят на елементите в масива.

След това ще свържете параметрите си с помощта на call_user_func_array() така (забележете, че върнах скобите за IN() функция):

if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
    call_user_func_array(array($stmt, "bind_param"), array_merge($types, $selected));

Но ако опитате това, ще получите грешка за mysqli_stmt::bind_param() очаква се параметър два да бъде предаден чрез препратка:

Това е малко досадно, но достатъчно лесно за заобикаляне. За да заобиколите това, можете да използвате следната функция:

function refValues($arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
        $refs[$key] = &$arr[$key]; 
    return $refs; 
} 

Той просто създава масив от стойности, които са препратки към стойностите в $selected масив. Това е достатъчно, за да направите mysqli_stmt::bind_param() щастлив:

if ($stmt = $mysqli->prepare("DELETE FROM email_addresses WHERE email_addresses IN (?)")) {
    call_user_func_array(array($stmt, "bind_param"), array_merge($types, refValues($selected)));

Редактиране

От PHP 5.6 вече можете да използвате ... оператор, за да направи това още по-лесно:

$stmt->bind_param($types, ...$selected);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP - Направете ключа на масива на моята заявка в ID

  2. Как да вмъкна няколко реда в един израз за вмъкване?

  3. Специални символи в MySQL Име на таблица

  4. Поддържане на реда в MySQL IN заявка

  5. Емотиконите за iPhone се вмъкват в MySQL, но стават празна стойност