2011-05-08 32 views
0
<?php 
$id = $_POST['dr']; 
$dbhost = 'star***.***.edu'; 
$dbuser = '***4123'; 
$dbpass = '*****'; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
$sql = "DELETE FROM address 
     WHERE idnum=\"".$id\""; 

mysql_select_db('***4123'); 
$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not delete data: ' . mysql_error()); 
} 
echo "Deleted data successfully\n"; 
mysql_close($conn); 
?> 

所以,只需要一些幫助,找出這是否是句法上正確的。應通過ajax發送的是我希望在表地址中刪除的行的編號這是這個mysql/php正確刪除一行嗎?

+5

它容易受到[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)的影響。使用類似'intval()'或'is_int'來確保參數是一個數字 – 2011-05-08 19:18:42

回答

3

您的查詢語法看起來不正確,特別是因爲您的轉義"完全關閉。以及你應該在你的查詢中使用單引號作爲字符串分隔符,而不是你正在使用的雙引號。

$sql = "DELETE FROM address WHERE idnum = " . $id; 

這應該有效。這是假定id是數字的(即整數,浮點數,小數等)。您應該始終驗證提供的數據,或者至少在數據庫附近的任何位置進行清理,否則有人可以輕鬆地將SQL注入您的網站。應該可用的快速清理是將發佈的值作爲int進行投射。

$id = (int) $_POST [ 'dr' ]; 
+0

謝謝=]我跳進和跳出字符串時總會遇到問題,例如 – Alen 2011-05-08 19:31:02

-1
<?php 
$id = mysql_real_escape_string($_POST['dr']); 
$dbhost = 'star***.***.edu'; 
$dbuser = '***4123'; 
$dbpass = '*****'; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
$sql = "DELETE FROM address 
     WHERE idnum= '$id' "; 

mysql_select_db('***4123'); 
$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not delete data: ' . mysql_error()); 
} 
echo "Deleted data successfully\n"; 
mysql_close($conn); 
?> 

嘗試使用庫MySQLi,準備語句和永遠不要相信輸入

+0

這很容易被SQL注入 - mysql_real_escape_string在這裏不保護你 – 2011-05-08 19:47:02

+0

編輯了修復剩餘SQL注入漏洞的代碼。您還需要在查詢字符串中用'''單引號來轉義@var。 – Johan 2011-05-08 20:38:03

1

使用PDO。更簡單的錯誤處理和更好的方式來清理數據:

<?php 
    try { 
    $db = new PDO ('mysql:host=star***.***.edu;dbname=***4123', '***4123', '*****'); 
    } 

    catch (Exception $e) 
    { 
    die('Could not connect: ' . $e->getMessage()); 
    } 

    $statement = $db->prepare('DELETE FROM address WHERE idnum=?'); 

    $statement->bindParam(1, $_POST['dr']); 

    if (false === $statement->execute()) 
    { 
    die('Could not delete data: ' . print_r($pdo->errorInfo(),true)); 
    } 

PDO自動關閉連接,所以沒有什麼更多的事情要做。

+1

是的,但它與被問到的問題無關。 – judda 2011-05-08 20:01:16

+0

你說得對。我的第一本能是防止OP的SQL注入漏洞。 – 2011-05-09 01:03:52