2017-09-04 196 views
1

我在我的網站上有90k註冊用戶,我想刪除所有具有「ze5fze56f4」作爲密碼的用戶。刪除密碼= ze5fze56f4的所有行

我做了這個腳本,但它總是在沒有刪除任何行的情況下完成的,因此說「刪除了0個用戶」。

<?php 

require "includes/db.php"; 

$x = 0; 

for($i = 0; $i < 91000; $i++){ 

    $SQLcheckPassword = $odb -> prepare("SELECT password FROM users WHERE ID = :i"); 
    $SQLcheckPassword -> execute(array(":i" => $i)); 
    $SQLgetPassword = $SQLcheckPassword -> fetchColumn(); 

    if(strpos($SQLgetPassword, "ze5fze56f4")){ 

     $x++; 

     $SQLdeleteUser = $odb -> prepare("DELETE FROM users WHERE ID = :i"); 
     $SQLdeleteUser -> execute(array(":i" => $i)); 

    } 

} 

die("$x users removed"); 

?> 

我不明白爲什麼它不工作,但我知道我不是由simpliest方式做這件事。

在此先感謝您的幫助。

+2

你真的存儲密碼清楚嗎?什麼是你的網站,所以我可以遠離它,因爲它不尊重基本的安全做法...... –

+0

爲什麼不從用戶那裏刪除密碼LIKE'%ze5fze56f4%'?並且絕不要將密碼存儲清楚!使用散列來存儲密碼。 –

+0

'if(strpos($ SQLgetPassword,「ze5fze56f4」)!== false){' –

回答

0

如果$SQLgetPassword"ze5fze56f4"strpos($SQLgetPassword, "ze5fze56f4")將返回0(字符串的開頭)。 0在布爾上下文中被解釋爲FALSE,因此將不會輸入if語句。用簡單的舊平等檢查代替strpos應該可行,但坦率地說,我認爲這不是正確的做法。相反,重新發明輪子的,只是讓數據庫完成繁重的你:

$SQLdeleteUser = $odb -> prepare("DELETE FROM users WHERE password = :s"); 
$SQLdeleteUser -> execute(array(":s" => "ze5fze56f4")); 
+0

謝謝,我用'if(strpos($ SQLgetPassword,「ze5fze56f4」)!== false)'它工作。 –

0

忘記了腳本,只需運行一個SQL語句:

DELETE FROM users WHERE password="ze5fze56f4"; 

(注:始終運行如此之大的命令我顯然不具備訪問您的數據庫之前,備份並不能測試或提前確認這一點,所以在你覈對你的用戶之前,至少把它作爲SELECT或其他東西運行。)

你應該做的下一件事是停止存儲密碼。用鹽代替哈希。否則,默認情況下,您的網站不安全,您的不良安全做法會在您的網站和其他網站上造成帳戶泄密。

0

也許你應該簡單地嘗試

DELETE FROM用戶WHERE密碼= 「ze5fze56f4」

0

你可以試試只需遵循

$SQLdeleteUser = $odb -> prepare("DELETE FROM users WHERE password = :s"); 
$SQLdeleteUser -> execute(array(":s" => "ze5fze56f4")); 
+0

它應該是'WHERE password =:s' –

+0

yes ..謝謝 – KMS

0

謝謝,我用if(strpos($SQLgetPassword, "ze5fze56f4") !== false)和它的工作。