2

誰かが言う前に、私はこのエラーを修正した直後に、SQL インジェクションから身を守ります。ニュース レポートがデータベースに送信されるアプリを作成しています。このページは、データベースからレポートを削除するものです。

私が試したこと:SQLとスピーチマークに括弧を追加するすべての可能な方法。私の ICT 教師と私はこれを 2 時間近く調べましたが、修正が見つかりません。Google と Stack Overflow も検索しましたが、答えが見つかりません。

OK、エコーすると正しい report_id が表示されます。5 などの実際の ID を入力すると、レポートが削除されます。しかし、$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

あなたは2つのステートメントを混在させています。以下で試してみてください。

  // 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

You are sending the form with post method and retrieving it with get. That can be the source of the problem.

Also you are not sending the id parameter so, there won't be any value for $_get[id] nor $_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(...);

なんで?

また、フォームの開始タグが 2 つあるため、フォームをネストすることはできません。

id変数を送信するフォーム要素がないため、フォーム以外のソースから変数が入ってくると仮定します。

最後に、必ずgetorpostをフォームに指定してください。を使用し、とをとpostに変更することをお勧めします。$_GET["submit"]$_GET["confirm"]$_POST["submit"]$_POST["confirm"]

于 2013-05-17T16:53:21.303 に答える
0

コードで次のことを確認する必要があります。

  • フォーム内の ID 要素の場所
  • POST メソッドをフォームに配置しましたが、 $_GETからデータを取得するため、 $_POSTに変更する必要があります。
  • 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 からのエラーを確認します。

問題の解決に役立つことを願っています。

于 2013-05-17T16:54:41.153 に答える