-3

ユーザーがページを更新したときに、フォームが複数回送信されないようにしようとしています。これが私のコードです:

<form action="#" method="post">

                    <table border="0">
                        <tr>
                            <td id="tb-w_a"><p>Kategori</p></td>
                            <td>:</td>
                            <td>
                            <select name="kategori">
                            <?php
                            $query = "SELECT id, title FROM forum_kategorier";
                            $result = $mysqli->query($query);
                            while(list($id, $title) = $result->fetch_row())
                            {
                                echo "<option value=\"$id\">$title</option>";  
                            }
                            ?>
                            </select>
                            </td>
                        </tr>
                        <tr>
                            <td id="tb-w_a"><p>Title</p></td>
                            <td>:</td>
                            <td><input type="text" name="title"></td>
                        </tr>
                    </table>
                <textarea name="tekst_indhold" style="width:716px; height:170px;"></textarea><br />
                <input type="hidden" value="<?php echo $_SERVER['PHP_SELF'] ?>" name="return_page">
                <input type="submit" value="Opret indhold" name="godkendt">
            </form>
            <?php
            if ($stmt = $mysqli->prepare('INSERT INTO `forum_traede` (`kategori_id`, `bruger_id`, `tekst`, `dato`, `titel`) VALUES (?, ?, ?, NOW(), ?)')) { 
                $stmt->bind_param('ssss', $katgori_id, $bruger_id, $tekst, $titel);
                $katgori_id = $_POST["kategori"];
                $bruger_id = $_SESSION["user_id"];
                $tekst = $_POST["tekst_indhold"];
                $titel = $_POST["title"];

                $stmt->execute();
                $stmt->close();

                if (isset($_POST['return_page'])) {
                    $return_page = $_POST["return_page"];
                } else {
                    header('Location: http://xxxx.dk/bruger-forum-opret/');
                }

            } else {
                echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
            }
        ?>

フォームを送信した後、次のエラーが表示されます。

警告: ヘッダー情報を変更できません - 78 行目の /home/jesperbo/public_html/xxx.dk/xxx.php で既に送信されたヘッダー (/home/jesperbo/public_html/xxx.dk/xxx.php:27 で開始された出力)

これはページの上部に表示されます。

また、フォーム処理コードを別の .php ファイルに移動しようとしましたが、次のエラーが発生します。

致命的なエラー: 2 行目の /home/jesperbo/public_html/xxx.dk/bruger_forum-indhold-godkendt.php の非オブジェクトに対するメンバー関数 prepare() の呼び出し

フォームの送信後にブラウザーを新しいページにリダイレクトするにはどうすればよいですか?

4

2 に答える 2

2

簡単な答え: すべての PHP コードをすべての HTML コードの前に置きます。

于 2012-06-07T18:58:13.583 に答える
0

最初に2番目の問題に対処するには:

致命的なエラー:2行目の/home/jesperbo/public_html/xxx.dk/bruger_forum-indhold-godkendt.phpの非オブジェクトでメンバー関数prepare()を呼び出す

スクリプトには、投稿したコードよりも多くのコードが含まれているようです。$mysqli質問に初期化が見られない変数への参照がいくつかあります。

フォーム処理コードのみを別のファイルに移動し、$mysqli変数を定義するコードを含めない場合、上記のエラーが発生します。を呼び出そうとしています$mysqli->prepare()が、$mysqliまだ定義されていません。


さて、最初の問題について:

警告:ヘッダー情報を変更できません-78行目の/home/jesperbo/public_html/xxx.dk/xxx.phpで(/home/jesperbo/public_html/xxx.dk/xxx.php:27で開始された出力)によって既に送信されたヘッダー

問題の原因となっている問題がいくつかあります。一度に1つずつ取り組みます。

1.フォームが送信されていない場合でも、フォーム処理コードが実行されます。

少なくとも、フォームの処理を開始する前に、フォームが送信されていることを確認する必要があります。次のようなものを考えてみましょう。

<form action="#" method="post">
  ...
</form>

<?php
  /* Check if the form was submitted. */
  if( $_POST ) {
    /* @todo Validate incoming values. */

    /* If all values are valid, insert into the database. */
    if ($stmt = $mysqli->prepare('INSERT INTO `forum_traede` (`kategori_id`, `bruger_id`, `tekst`, `dato`, `titel`) VALUES (?, ?, ?, NOW(), ?)')) {
      ...
    } else {
      ...
    }
  }

2.フォームがすでに送信されている場合でも、フォームHTMLが出力されます。

同様に、フォームがまだ送信されていない場合にのみ、スクリプトはフォームHTMLを出力する必要があります。これが、スクリプトがブラウザを正しくリダイレ​​クトするのを妨げている原因です。

スクリプトがブラウザに送り返すHTTP応答は、ヘッダーと本文の2つの部分で構成されます。ヘッダーを最初に送信する必要があります。つまり、スクリプトが何かを出力するとすぐに、PHPはその時点であるヘッダーをブラウザーに送信して、本文を送信できるようにします。

スクリプトはヘッダーを設定する前にフォームHTMLを出力しようとするlocationため、リダイレクトを実行できなくなります(PHPがheader()コード内のステートメントを評価するまでに、HTTPヘッダーは既にブラウザーに送信されています)。

これを修正するには、フォーム処理コードをスクリプトの先頭に移動する必要があります。

<?php
  /* Check if the form was submitted. */
  if( $_POST ) {
    /* @todo Validate incoming values. */

    /* If all values are valid, insert into the database. */
    if ($stmt = $mysqli->prepare('INSERT INTO `forum_traede` (`kategori_id`, `bruger_id`, `tekst`, `dato`, `titel`) VALUES (?, ?, ?, NOW(), ?)')) {
      ...
      $stmt->close();

      $return_page = (
        isset($_POST['return_page'])
          ? $_POST['return_page']
          : 'http://xxxx.dk/bruger-forum-opret/'
      );

      header(sprintf('Location: %s', $return_page));
      exit;
    } else {
      ...
    }
  }
?>

<!-- If we get to this point, either the form has not been submitted yet,
      or there is an error, so we should display the form HTML.
  -->
<form action="#" method="post">
  ...
</form>

通話exit;後に追加したことにも注意してください。header()ブラウザは新しいURLにリダイレクトされるため、フォームを表示しても意味がありません。

また、$return_page変数の目的についても少しわかりませんでした。フォームが処理された後にブラウザがリダイレクトされるURLをフォームで指定することが目的だと思います。これを反映するために、回答のコードを更新しました。

于 2012-06-07T20:13:19.027 に答える