sql >> Database >  >> RDS >> Mysql

Problemen met het binden van een geïmplodeerde array in een door mysql voorbereide instructie

Laat me je wat moeite besparen en je vertellen dat wat je probeert te doen toch niet zal werken. U bindt slechts één parameter aan uw IN() functie oproep. Jij denkt je geeft een door komma's gescheiden lijst door, maar je geeft eigenlijk alleen een door komma's gescheiden tekenreeks door die als één waarde wordt behandeld . Dit betekent dat u zoekt naar één record met een waarde van "'[email protected] ', '[email protected] '" in plaats van records die overeenkomen met "[email protected] " of "[email protected] ".

Om dit te verhelpen moet je:

  1. Dynamisch uw typen string genereren
  2. Gebruik call_user_func_array() om uw parameters te binden

U kunt de typen string als volgt genereren:

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

Het enige dat dit doet, is een reeks s . maken 's dat is net zoveel tekens als het aantal elementen in de array.

U zou dan uw parameters binden met behulp van call_user_func_array() zoals dit (merk op dat ik de haakjes weer heb geplaatst voor de IN() functie):

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

Maar als je dit probeert, krijg je een foutmelding over mysqli_stmt::bind_param() verwacht dat parameter twee wordt doorgegeven door verwijzing:

Dit is een beetje vervelend, maar gemakkelijk genoeg om te omzeilen. Om dit te omzeilen kun je de volgende functie gebruiken:

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

Het creëert gewoon een reeks waarden die verwijzingen zijn naar de waarden in de $selected reeks. Dit is voldoende om mysqli_stmt::bind_param() . te maken blij:

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

Bewerken

Vanaf PHP 5.6 kun je nu de ... operator om dit nog eenvoudiger te maken:

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



  1. 10 feiten over het monitoren van databaseprestaties die u misschien zullen verbazen

  2. Laad xml in mysql-tabel met element

  3. php categorie, subcategorie boom

  4. Mac + virtualenv + pip + postgresql =Fout:pg_config uitvoerbaar bestand niet gevonden