2014-08-29 57 views
0

刪除多值我使用這個文件從服務器從數據庫

<?php 

$dbhandle = mysql_connect("localhost", "admin", "admin") or die(mysql_error()) ; 
$selected = mysql_select_db("dbname" ,$dbhandle) or die(mysql_error()) ; 


$id=$_POST['id']; 

foreach($id as $value) 
{ 

$query = mysql_query("DELETE FROM `record` WHERE `id`=$value"); 
} 
mysql_close($dbhandle); 
?> 

刪除記錄,但我無法從數據庫中刪除記錄。查詢是沒有任何錯誤執行,但它不能從表

+0

'$ id'是一個數組嗎? – anna 2014-08-29 12:09:58

+1

一定要逃避$價值,因爲它是用戶提供的並且需要注射。更好的是,在PDO中使用準備好的語句。 – user1032531 2014-08-29 12:12:08

+1

顯然'$ id'返回錯誤的值,因爲語法很好 – younis 2014-08-29 12:21:53

回答

3
$query = mysql_query('DELETE FROM `record` WHERE `id` IN (' . implode(',', array_map('intval', $id)) . ')'); 
+0

這也解決了OP的SQL注入漏洞。請詳細說明這裏發生的事情,即刪除'foreach'來代替這個,數組值的轉換/消毒以及不運行多個查詢的性能改進。 – zamnuts 2014-08-29 12:13:37

+0

MySQL擴展從PHP 5.5.0開始已棄用。您應該考慮使用MySQLi或PDO_MySQL擴展。 – anna 2014-08-29 12:15:36

+0

這隻會在$ id包含整數時才起作用。 – user1032531 2014-08-29 12:19:05

0

刪除記錄這會工作,即使$id數組不包含整數。

class db { 
    private static $instance = NULL; 
    private function __construct() {} //Make private 
    private function __clone(){} //Make private 
    public static function db() //Get instance of DB 
    { 
     if (!self::$instance) 
     { 
      self::$instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_EMULATE_PREPARES=>false,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC)); 
     } 
     return self::$instance; 
    } 
} 

if(count($ids)) { //Make sure you don't have an empty data set. 
    $qMarks = str_repeat('?,', count($ids)-1) . '?'; 
    $sql ="DELETE FROM `record` WHERE `id` IN ({$qMarks})"; 
    $stmt = $db::db->prepare($sql); 
    $stmt->execute($id); 
}