2011-07-19 45 views
0

我在理解下面這個程序的行爲有問題,很簡單的代碼中使用IN操作符刪除的電子郵件地址如何刪除在MySQL的PHP​​中使用IN操作符的所有行

$emails = $_POST['ids']; 
    $sql = "DELETE FROM newsletter where email "; 
    $condition = sprintf('IN ("%s")',implode(' "," ',$_POST['ids'])); 
    $sql = $sql.$condition; 
    include '../includes/db.php'; 
    $r = mysql_query($sql); 

    echo $sql; 

只刪除一個電子郵件ID並返回true。我怎樣才能讓它運行在刪除所有電子郵件的方式。

下面是使用上述代碼構建的查詢。

DELETE FROM通訊,其中電子郵件IN( 「[email protected]」, 「 [email protected]」, 「[email protected]」, 「[email protected]」,」 某些其它@ gmail.com「)

它是否是錯誤的刪除方式?

+0

我希望我的電子郵件地址是'狗屎@ gshit.com' ... –

+0

@ todda.speot.is - 您可以隨時問[域名所有者(http://whois.domaintools.com/ gshit.com):) –

回答

1

相反的:

$condition = sprintf('IN ("%s")',implode(' "," ',$_POST['ids'])); 

做:

$condition = sprintf('IN ("%s")',implode('", "',$_POST['ids'])); 

IN操作符匹配字段的內容與準確的值。值的開始和結束處的空格可能會導致您的問題。

0

此代碼將很容易受到SQL注入式攻擊,我可以使後像

"); delete from newsletter; delete from newsletter where email in (" 

的「但是,除了你的代碼的關鍵問題是可能的空間(你的字符串包括數據庫中的空格嗎?)和雙引號的使用。我是我的後期字符串的一部分,這將擦你的時事通訊表。

我不是100%肯定的,但我確定「可以用作字段指示符而不是字符串,因此您可能需要單引號。然後

$emails = $_POST['ids']; 
$sql = "DELETE FROM newsletter where email "; 
$condition = sprintf("IN ('%s')",implode("','",$_POST['ids'])); 
$sql = $sql.$condition; 
include '../includes/db.php'; 
$r = mysql_query($sql); 
echo $sql; 

輸出應該是

DELETE FROM newsletter where email IN ('[email protected]','[email protected]','[email protected]','[email protected]','[email protected]') 
+0

另外我剪切並粘貼了代碼,所以它有相同的錯誤,但是您已將$ email分配給$ _POST ['ids'],但是您重複使用了$ _POST ['ids'] $電子郵件是故意的? –

+0

我想知道爲什麼SQL注入新手很難理解。傳統Mysql擴展不支持多個語句,但我相信您可以構建精心設計的參數來組成多表刪除命令並清除任意數據。 –

+0

或只是'')或電子郵件=電子郵件或電子郵件在(「 –

0

如果你需要在你的SQL查詢字符串插入單引號他們,防止SQL注入。此外,應引用IN子句中的逗號分隔符而不是

$safe_emails = array(); 
foreach($_POST['ids'] as $i){ 
    $safe_emails[] = "'" . mysql_real_escape_string($i) . "'"; 
} 
$sql = 'DELETE FROM newsletter WHERE email IN (' . implode(', ', $safe_emails) . ')'; 
相關問題