-1

チュートリアルを使用して独自のフォーラムを作成しようとしています。私はすでにかなりの数のエラーを修正しており、あと 1 つやるべきことが残っています。

スレッドに返信を投稿すると、返信が MySQL データベースに保存されます。返信には、返信したスレッド ID (question_id) と一致する int が含まれます。

URL バーからスレッド ID を取得するコードを取得できません。

これらは、作業を行う必要がある 2 行のコードです。

$id = $_GET['id'];

$sql2="INSERT INTO $tbl_name(question_id, a_id, a_name, a_email, a_answer, a_datetime)VALUES('$id', '$Max_id', '$a_name', '$a_email', '$a_answer', '$datetime')";

そして、これは add_answer.php ファイル全体です

<?php

$host="XXXXXX"; // Host name
$username="XXXXXX"; // Mysql username
$password="XXXXXX"; // Mysql password
$db_name="XXXXXX"; // Database name
$tbl_name="XXXXXX"; // Table name

// Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// Get value of id that sent from hidden field
$id = $_GET['id'];
var_dump($id);

// Find highest answer number.
$sql="SELECT MAX(a_id) AS Maxa_id FROM $tbl_name WHERE question_id='$id'";
$result=mysql_query($sql);
$rows=mysql_fetch_array($result);

// $result=mysql_query($sql) or die(mysql_error());

// add + 1 to highest answer number and keep it in variable name "$Max_id". if there no answer yet set it = 1
if ($rows) {
    $Max_id = $rows['Maxa_id']+1;
}
else {
    $Max_id = 1;
}

// get values that sent from form
$a_name=$_POST['a_name'];
$a_email=$_POST['a_email'];
$a_answer=$_POST['a_answer'];

$datetime=date("d/m/y H:i:s"); // create date and time

// Insert answer
$sql2="INSERT INTO $tbl_name(question_id, a_id, a_name, a_email, a_answer, a_datetime)VALUES('$id', '$Max_id', '$a_name', '$a_email', '$a_answer', '$datetime')";
$result2=mysql_query($sql2) or die(mysql_error());

if($result2)
{
    echo "Successful<BR>";
    echo "<meta http-equiv='refresh' content='4;url=index.php?content=main_forum' />";

    // If added new answer, add value +1 in reply column
    $tbl_name2="forum_question";
    $sql3="UPDATE $tbl_name2 SET reply='$Max_id' WHERE id='$id'";
    $result3=mysql_query($sql3);

}
else {
    echo "An error as occured. Please report this to administrator. ID: FAA01.";
}

mysql_close();
?>
4

4 に答える 4

2

$_GET[id] は、mysql に触れる前にサニタイズする必要があります。現状では、データベースへの攻撃の非常に現実的な危険にさらされています。PDOの使用をお勧めします

何かを再学習するのは面倒ですが、学習している場合は、正しく行う方がよいでしょう。

あなたの質問は…わかりません。echo $sql2; を試してみます。クエリが正しく表示されることを確認します。get 配列を表示するには、print_r($_GET) も使用します。

于 2011-11-14T13:16:22.113 に答える
2
  1. $_GET['id']存在しますか?のように、それは実際に URL に存在しますか? 使用されている正確な URL は何ですか? 大文字と小文字が混在しているように見えるので、途中で大文字がないことを再確認してください (ヒント: コードでは小文字のみを使用してください)。

  2. とについて学んでください。そうしないaddslashesmysql_real_escape_string、誰かがあなたのサーバーを崩壊させてしまいます。

  3. 冗長なエラー チェックがあります。

    $result2=mysql_query($sql2) or die(mysql_error());
    // ...
    if( $result2) {...} else {...}
    

最後のビットは冗長です。if$result2が false の場合、既に死んでいるからです。

于 2011-11-14T13:17:18.530 に答える
2

一度に 1 つずつデバッグする必要があります。あなたは言う:

URL バーからスレッド ID を取得するためのコードを取得できません。

したがって、最初に確認する場所は、URL があるブラウザのロケーション バーです。最初のコードが正しくないのに、次の 100 行のコードを気にする必要はありません。スレッド ID が 999 で、このコードでその ID をフェッチする場合:

$id = $_GET['id'];

... id=999URL で、?記号 (必須)の後と#記号 (オプション) の前に表示する必要があります。

ID がここにない場合は、次の通知が表示されます。

注意: 未定義のインデックス: id

そうしないと、PHP が正しく構成されていません。最も簡単な方法は、php.iniファイルを見つけて、次のディレクティブを設定することです。

error_reporting = E_ALL
display_errors = On

...そしてウェブサーバーを再起動します。

最後に、var_dump()の使い方を学びます。

于 2011-11-14T13:21:52.543 に答える
1

フォームが送信されたpost場合は、次の ID を取得する必要があります。

$id = $_POST['id'];
于 2011-11-14T13:15:19.633 に答える