1

次の問題に直面しています。ユーザーがテキストを送信するために使用する単純なテキストエリアがあり、その後サーバーのテキストファイルに書き込まれます。これは機能しています。

しかし、ページを更新すると、最後に追加されたテキストがテキスト ファイルに再度追加され、エントリが重複します。

これを防ぐために私がしなければならないことはありますか?以下は、テキストエリア部分に使用したコードです。

<html>
    <body>
        <form name="form" method="post">
            <input type="text" name="text_box" size="50"/>
            <input type="submit" id="search-submit" value="submit" />
        </form>
    </body>
</html>
<?php
    if(isset($_POST['text_box'])) { 
        $a = $_POST['text_box'];
        $myFile = "textfile.txt";
        $fh = fopen($myFile, 'a+') or die("can't open file");
        fwrite($fh, $a."\r\n");
        fclose($fh);
    }
?>
4

3 に答える 3

1

POSTを介して読み込まれたページにより、ブラウザはユーザーに情報を再送信してページを表示するように求め、そのページによって実行されるアクションが再度発生します。ページがGETを介して要求され、クエリ文字列に変数がある場合、同じことが起こりますが、サイレントになります(ユーザーに再度入力するように求められることはありません)。

これを回避する最善の方法は、POST / REDIRECT/GETパターンを使用することです。Authorize.Net用に作成した支払いの処理に関する例で使用しました。うまくいけば、それはあなたを正しい方向に向けます。

于 2013-02-01T02:41:25.687 に答える
0

単純なので、単純なハッシュをセッションに保存し、毎回再生成できます。ユーザーがページをリロードすると、php は実行されません。

<?php
    if(isset($_POST['text_box']) && $_SESSION['formFix'] == $_POST['fix']) { 
        $a = $_POST['text_box'];
        $myFile = "textfile.txt";
        $fh = fopen($myFile, 'a+') or die("can't open file");
        fwrite($fh, $a."\r\n");
        fclose($fh);
    }
?>
<html>
    <body>
        <form name="form" method="post">
            <input type="text" name="text_box" size="50"/>
            <?php 
                $value = md5(rand(1,999999));
                $_SESSION['formFix'] = $value;
            ?>
            <input type="hidden" name="fix" value="<?= $value; ?>" />
            <input type="submit" id="search-submit" value="submit" />
        </form>
    </body>
</html>

ps: ブロックの順序が重要になるため、em を反転する必要があります。

于 2013-02-01T02:51:54.157 に答える
0

ジョンが言ったように、フォーム送信後にユーザーをリダイレクトする必要があります。

fclose($fh);
// and
header("Location: success.php or where else");
exit;

注:ob_startページに html 出力が含まれているため、 が呼び出されない限り、リダイレクトは機能しません。

// フォーム.php

<?php ob_start(); ?>
<html>
    <body>
        <? if (isset($_GET['success'])): ?>
        Submit OK! <a href="form.php">New submit</a>
        <? else: ?>
        <form name="form" method="post" action="form.php">
            <input type="text" name="text_box" size="50"/>
            <input type="submit" id="search-submit" value="submit" />
        </form>
        <? endif; ?>
    </body>
</html>
<?php
    if(isset($_POST['text_box'])) { 
        $a = $_POST['text_box'];
        $myFile = "textfile.txt";
        $fh = fopen($myFile, 'a+') or die("can't open file");
        fwrite($fh, $a."\r\n");
        fclose($fh);
        // send user
        header("Location: form.php?success=1");
        exit;
    }
?>
于 2013-02-01T02:55:42.300 に答える