2

在任何人说之前,我会保护自己免受 SQL 注入,就在我修复这个错误之后。我正在制作一个将新闻报道提交到数据库的应用程序。此页面用于从数据库中删除报告。

我尝试过的:在 SQL 和语音标记中添加括号的所有可能方法。我和我的 ICT 老师已经研究了将近 2 个小时,但找不到解决方法。我也搜索过 Google 和 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">&lt;&lt; Back to admin reports page</a></p>';
?>

</body>
</html>
4

5 回答 5

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));
于 2013-05-17T16:46:16.103 回答
0

您正在发送formwithpost方法并使用 检索它get。这可能是问题的根源。

此外,您没有发送参数,因此也不id会有任何价值$_get[id]$_post[id]

于 2013-05-17T16:48:32.240 回答
0

如果 ID 是数字,则不必将 ID 用单引号括起来。

$query = "DELETE FROM news_reports WHERE report_id = '".$report_id."' LIMIT 1"

但这不是问题。您没有在确认请求中包含 ID,或允许从会话变量中检索值。在“显示表单以确认删除”部分添加一个带有 id 的隐藏输入框。

(并且有一个不同的代码分支进行确认!以及对无效 ID 的测试!并将其移至 POST,至少!)

于 2013-05-17T16:52:45.960 回答
0

你有

$query = "..." or die(...);

为什么?

此外,您有两个表单开始标签——嵌套表单无效。

我将假设该id变量来自表单以外的其他来源,因为没有提交它的表单元素。

最后,请确保在您的表格中指定get或。post我建议使用post, 然后将$_GET["submit"]and更改$_GET["confirm"]$_POST["submit"]and $_POST["confirm"]

于 2013-05-17T16:53:21.303 回答
0

您需要检查代码中的以下内容。

  • 表单中的 ID 元素在哪里
  • 您已将 POST 方法放入表单但从$_GET检索数据,您应该将其更改为$_POST
  • 将 mysqli_error 放在 mysqli_query 语句之后。

    $query = "DELETE FROM news_reports WHERE report_id = ".$report_id;
    
    mysqli_query($dbc, $query);  or die("mysql_query failed - Error: " . mysqli_error());
    

然后检查mysql的错误,如果它不起作用。

希望,它将帮助您解决您的问题。

于 2013-05-17T16:54:41.153 回答