sql >> Databáze >  >> RDS >> Mysql

Problém s navázáním implodovaného pole do příkazu připraveného v mysql

Dovolte mi, abych vám ušetřil problémy a řekl vám, že to, o co se snažíte, stejně nebude fungovat. Ke svému IN() vážete pouze jeden parametr volání funkce. Vy myslíte předáváte seznam oddělený čárkami, ale ve skutečnosti předáváte pouze čárkami oddělený řetězec, který je považován za jednu hodnotu . To znamená, že budete hledat jeden záznam s hodnotou "'[email protected] ', '[email protected] „“ namísto záznamů, které odpovídají „[email protected] " nebo "[email protected] ".

."

Chcete-li to překonat, musíte:

  1. Dynamicky generujte řetězec typů
  2. Použijte call_user_func_array() svázat vaše parametry

Řetězec typů můžete vygenerovat takto:

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

Vše, co to udělá, je vytvořit řetězec s 's to je tolik znaků, jako je počet prvků v poli.

Své parametry byste pak svázali pomocí call_user_func_array() takto (všimněte si, že jsem vrátil závorku pro IN() funkce):

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

Ale pokud to zkusíte, dostanete chybu o mysqli_stmt::bind_param() očekává se, že parametr dva bude předán odkazem:

Je to trochu otravné, ale dost snadné to obejít. Chcete-li to obejít, můžete použít následující funkci:

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

Pouze vytvoří pole hodnot, které jsou odkazy na hodnoty v $selected pole. To stačí k vytvoření mysqli_stmt::bind_param() šťastný:

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

Upravit

Od PHP 5.6 nyní můžete používat ... operátora, aby to bylo ještě jednodušší:

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



  1. PostgreSQL:paralelní dotazování v akci

  2. OSX ld:knihovna nebyla nalezena pro -lssl

  3. SQL Server:Úniky úrovně izolace mezi sdruženými připojeními

  4. Jak spustit uloženou proceduru ve vývojáři Oracle SQL?