我正在尝试删除mysql数据库中的一行。要删除的行由_GET标记定义。因此,如果页面URL是deletePage.php?id = 5,它将删除ID = 5的行。
到目前为止,这是我的代码:
<?php
if (empty($_GET)) {echo "Error!";}
else {
include "../../includes/dke390d-ko.php";
$pageID = $_GET['id'];;
$conn = mysql_connect($dbhost, $dbuser, $dbpasswd);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'DELETE FROM page
WHERE id="$pageID"';
mysql_select_db($dbname);
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not delete data: ' . mysql_error());
}
echo "Deleted data successfully\n";
mysql_close($conn);
header("Location: index.php");
}
?>
我的问题是,当我执行代码时,我收到一条错误消息:无法删除数据:'where子句'中的未知列'id'
我应该将ID放在会话中。但那会晚些。
祝你好运!
答案 0 :(得分:3)
您在由单引号分隔的字符串中有一个变量。结果,变量不是插值的。交换你的报价来解决这个问题:
$sql = "DELETE FROM page
WHERE id='$pageID'";
就像我在上面的评论中所说,你的代码已经过时且不安全。你应该把它固定在一个高优先级。
答案 1 :(得分:1)
如果还没有PHP系列的PHP已被弃用,其支持将消失。请查看PDO或MySQLi。
现在针对更大的问题,从不信任用户输入。您的SQL对SQL注入不安全,也不对$_GET
参数进行任何检查。这是非常危险和充满灾难的灾难!
在PDO中,有一个prepare
语句可以为您清理输入。
$sql = $dbh->prepare('DELETE FROM page WHERE id=?');
$sql->execute(array($id));
execute
函数采用数组,并将安全地替换代码中的任何?
。
如上所述,我还会检查$_GET
参数;请记住,即使您的表单不允许,用户也可以提供他想要的任何内容(同样适用于$_POST
)。
我会建议像:
if(!isset($_GET['id']) || !is_scalar($_GET['id']) || !is_numeric($_GET['id']))
die('Invalid id!');
假设您希望自己的ID为is_numeric()
支票的数字。检查is_scalar()
有助于防止在用户访问delete.php?id[]=t
之类的内容时出现的警告,这些警告非常容易。