2012-10-07 46 views
1

我希望能夠從數據庫中刪除多個用戶,但下面的代碼在某些時候會失敗。會發生什麼情況是隻有最後點擊的用戶(即數組$ userIds中的最後一個元素)被刪除。刪除多個字段失敗

我在做什麼錯?

從UserModel.php:

public function RemoveUser(Array $userIds) { 

    $query = 'DELETE FROM Users WHERE id IN (?)'; 

    $stmt = $this->m_db->Prepare($query); 

    foreach ($userIds as $value) { 
     $stmt->bind_param('s', $value); 
    } 

    $ret = $this->m_db->DeleteUsers($stmt); 

    $stmt->Close(); 

    return $ret; 

} 

從database.php中:

public function DeleteUsers(\mysqli_stmt $stmt) { 

    if ($stmt === FALSE) { 
     throw new \Exception($this->mysqli->error); 
    } 

    if ($stmt->execute() == FALSE) { 
     throw new \Exception($this->mysqli->error); 
    } 

    if ($stmt->fetch()) { 
     return true; 
    } else { 
     return false; 
    } 

} 
+0

它看起來像你結合ñPARAMS在查詢''一個插槽,是正常的嗎? – Sebas

+0

您需要動態構建SQL字符串,併爲每個數組元素添加一個「?」。我正在尋找一個解決這個問題的好問題... –

+0

@MichaelBerkowski:啊,我現在看到了問題。但是如何動態創建SQL語句? – holyredbeard

回答

3

正如一些評論建議,你需要爲每個用戶ID的?。目前,您正嘗試將每個用戶標識綁定到相同的參數,因此只有最後一個實際應用。

$c = Array(); 
foreach ($userIds AS $u) { 
    $c[] = "?"; 
} 
$inPart = "(" . implode(",", $c) . ")"; 
$query = "DELETE FROM Users WHERE id IN $inPart"; 

由於bind_param預計每個變量作爲單獨的參數,你就必須做一些PHP魔術整個數組傳遞一次。你將有你結合環更改爲:

call_user_func_array(array($stmt, 'bind_param'), array_unshift($userIds, 's')); 

這基本上要求$stmt->bind_param('s', $userIds[0], $userIds[1]....)

+0

我沒有看到$ u正在foreach循環中使用? – holyredbeard

+0

它不需要,我只是在數組上循環來創建足夠的參數。 –

+0

好的,我現在明白了。但是,我在哪裏通過ID循環我的代碼呢? foreach($ userIds as $ value){$ stmt-> bind_param('s',$ value); } ...?當執行代碼時,這段代碼會產生錯誤(Warning:mysqli_stmt :: bind_param()[mysqli-stmt.bind-param]:變量數量與/ Applications/XAMPP/xamppfiles/htdocs/php-labbar/hp-php/lab3/login/Model/UserHandler.php on line 45) – holyredbeard

2

我修改Dan Simons answer並設法得到這個工作。

此解決方案的一個問題是需要引用call_user_func_array中的第二個參數,其中this question是關於。但是,問題通過使用功能makeValuesReferenced解決。

代碼:

public function RemoveUser(Array $userIds) { 

    $c = Array(); 
    $s = ''; 

    foreach ($userIds AS $u) { 
     $c[] = "?"; 
     $s.= 's'; 
    } 

    $inPart = "(" . implode(",", $c) . ")"; 
    $query = "DELETE FROM Users WHERE id IN $inPart"; 

    $stmt = $this->m_db->Prepare($query); 

    array_unshift($userIds, $s); 

    call_user_func_array(array($stmt, 'bind_param'), $this->makeValuesReferenced($userIds)); 

    $ret = $this->m_db->DeleteUsers($stmt); // Execution and fetching 

    $stmt->Close(); 

    return $ret; 

} 

public function makeValuesReferenced(Array $arr) { 
     $refs = array(); 

     foreach($arr as $key => $value) 
      $refs[$key] = &$arr[$key]; 
     return $refs; 

}