2011-05-08 95 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