2017-08-30 139 views
-1

正在試圖刪除重複的條目在數據庫中似乎不正確的部分。所以我想我會問在這個例子中,做什麼是正確的方法。我對PHP並不完全陌生,但這超出了我的想象。如果你能告訴我什麼是錯的,以及如何解決這將不勝感激。條件PDO Delete語句可能無法正常工作

現在到什麼,我試圖完成。我有一個多維數組填充由函數生成的值。我想要做的是,如果在數據庫中已經存在的數組中有一個值將其刪除。代碼: 輸入代碼在這裏

if(is_array($items)){ 

$values = array(); 

foreach($items as $row => $value){ 

    $rsn = mysqli_real_escape_string($connect, $value[0]); 
    $rank = mysqli_real_escape_string($connect, $value[1]); 
    $values[] = "('', '$rsn', '$rank', '')"; 

    $sql = "SELECT id FROM users WHERE rsn = :rsn"; 

    $query = $conn->prepare($sql); 

    $query->execute(array(":rsn" => $value[0])); 

    $results = $query->rowCount(); 

    while($deleted = $query->fetch(PDO::FETCH_ASSOC)){ 

     $sql = "DELETE FROM users WHERE id = :id"; 

     $query = $conn->prepare($sql); 

     foreach($deleted as $delete){ 

     $query->execute(array(':id' => $delete)); 

     } 

    } 

} 

//user_exists_delete($conn, $rsn); 

$sql = "INSERT INTO users(id, rsn, rank, points) VALUES "; 

$sql .= implode(', ', $values); 


if(!empty($rank)&& !empty($rsn)){ 

    if(mysqli_query($connect, $sql)){ 

     echo "success"; 

    }else{ 

     die(mysqli_error($connect)); 

    } 

} 

}

編輯:我已完成了部分工作現在,只需要它刪除,而不是隻有一個所有受騙者。我編輯了代碼以反映更改。

+3

請勿混用'mysqli_'和'PDO',只需用'PDO'。如果你綁定你不必逃跑。 – Rasclatt

+0

哦,我忘了提到我使用兩種不同擴展的原因是因爲我不知道如何執行pdo中的mysqli部分。我做過這樣的嘗試,並沒有執行 –

+0

'PDO'自動淨化輸入,防止SQLI,你並不需要使用'mysqli_real_escape_string()'或類似的東西,在執行'()'和'bindParam()'方法爲你做那個。 –

回答

2

有幾個問題,如果你沒有剝奪了你很多的原代碼,如果你不需要做的比你出正是更多爲什麼不只是發送刪除指令到你的數據庫,而不是檢查有效性第一?

你有

//Retrieve ID according to rsn. 
$sql = "SELECT id FROM users WHERE rsn = :rsn "; 
//Then retrieve rsn using rsn??? Useless 
$sql = "SELECT rsn FROM users WHERE rsn = :rsn "; 
//Then delete using ID, retrieved by rsn. 
$sql = "DELETE FROM users WHERE id = :id"; 

所有這些可以簡單地用刪除使用RSN做...

$sql = "DELETE FROM users WHERE rsn = :rsn"; 

,如果沒有行刪除的行不會被刪除,你不需要事先檢查。如果您之後需要執行某些操作,那麼您可能需要先取得信息,但是如果沒有,您可以在檢查受影響的行時查看是否刪除了某些內容。現在

,我們甚至可以只用一個查詢,而不是每個用戶一個簡化的劇本......我們可以得到陣列中的所有RSN,然後把它傳遞給DELETE。

$sql = "DELETE FROM users WHERE rsn in :rsn"; 
//Sorry not exactly sure how to do that in PDO, been a while. 
+0

不必檢查是否只希望刪除查詢刪除dups?但我同意許多選擇語句 –

+0

如果您只想刪除愚蠢,那麼您需要統計多少愚蠢,並根據該數量限制刪除,以確保剩餘的一個。但是這個在你的問題中沒有被強調。而國際海事組織,刪除愚蠢的最好辦法是不要先創建它們:) – Salketer

+0

在我的數據庫中,rsn行被設置爲唯一以阻止欺騙。刪除語句是這樣的插入語句繼續進行,沒有重複的鍵錯誤。 –

-1

我定了,我只是省略DELETE語句的WHERE子句,以便在此之前,插入被再次運行的所有記錄都被刪除。

+0

我真的懷疑它甚至接近成爲你的問題的答案......你會失去一切,每次你添加一個新用戶...... – Salketer