在任何人说之前,我会在修复此错误后立即保护自己免受SQL注入。我正在制作一个将新闻报道提交到数据库的应用程序。此页面用于从数据库中删除报告。
我尝试过: 为SQL和语音标记添加括号的每种可能方法。我和我的ICT老师已经看了将近2个小时,但找不到修复方法。我也搜索了谷歌和Stack Overflow,但我找不到答案。
好的,所以当我回复它时,会显示正确的report_id。当我输入实际ID时,例如5,报告将被删除。但是当我输入$ report_id时,没有删除任何内容。
请有人能告诉我为了让这个工作有什么改进吗?
这是代码(编辑:这是固定代码。我在底部的表单中添加了隐藏字段,以及其他一些小的更改(例如取出额外的表单标记)):
<?php
require_once('authorize.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Football Central - Remove a Report</title>
</head>
<body>
<h2>Football Central - Remove a News Report</h2>
<?php
require_once('img_details_reports.php');
require_once('connect_db_reports.php');
//Assign variables from admin_reports.php using $_GET
$report_id = $_GET['id'];
if (isset($_POST['submit'])) {
if ($_POST['confirm'] == 'Yes') {
$report_id = $_POST['id'];
// Delete the image file from the server
@unlink(IMAGE_UPLOADPATH . $image);
// Connect to the database
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
or die("Unable to connect to the database.");
// Delete the score data from the database
$query = "DELETE FROM news_reports WHERE report_id = '".$report_id."' LIMIT 1"
or die("mysql_query failed - Error: " . mysqli_error());
mysqli_query($dbc, $query) or die("mysql_query failed - Error: " . mysqli_error());
mysqli_close($dbc);
}
}
//Display form to confirm delete
echo '<p>Are you sure you want to delete the news report?</p>';
echo '<form method="post" action="removereport.php">';
echo '<input type="radio" name="confirm" value="Yes" /> Yes ';
echo '<input type="radio" name="confirm" value="No" checked="checked" /> No <br />';
echo '<input type="hidden" name="id" value="' . $report_id . '" />';
echo '<input type="submit" value="Submit" name="submit" />';
echo '</form>';
echo '<p><a href="admin_reports.php"><< Back to admin reports page</a></p>';
?>
</body>
</html>
答案 0 :(得分:3)
你正在混合两个陈述。试试下面的内容。
// Delete the score data from the database
$query = "DELETE FROM news_reports WHERE report_id = ".$report_id;
mysqli_query($dbc, $query) or die("mysql_query failed - Error: " . mysqli_error($dbc));
答案 1 :(得分:0)
您正在使用form
方法发送post
并使用get
进行检索。这可能是问题的根源。
此外,您没有发送id
参数,因此$_get[id]
也不会$_post[id]
答案 2 :(得分:0)
如果ID是数字,则不必将ID包装在单引号中。
$query = "DELETE FROM news_reports WHERE report_id = '".$report_id."' LIMIT 1"
但那不是问题。您未在确认请求中包含该ID,或允许从会话变量中检索该值。在“显示表单以确认删除”部分中添加带有ID的隐藏输入框。
(并且有一个不同的代码分支用于确认!并且测试一个无效的ID!并将其移至POST,至少!)
答案 3 :(得分:0)
你有
$query = "..." or die(...);
为什么?
此外,您还有两个表单开始标记 - 嵌套表单无效。
我将假设id
变量来自除表单之外的某些来源,因为没有表单元素提交它。
最后,请务必在表单中指定get
或post
。我建议您使用post
,然后将$_GET["submit"]
和$_GET["confirm"]
更改为$_POST["submit"]
和$_POST["confirm"]
。
答案 4 :(得分:0)
您需要检查代码中的以下内容。
在mysqli_query语句之后放入mysqli_error。
$query = "DELETE FROM news_reports WHERE report_id = ".$report_id;
mysqli_query($dbc, $query); or die("mysql_query failed - Error: " . mysqli_error());
然后检查mysql中的错误是否无效。
希望,它会帮助您解决问题。