aandroidtest
aandroidtest

Reputation: 1503

PHP how to clear memory when refreshing

I am facing the following issue. I have a simple textarea where user will use to submit text which is subsequently written to a text file in the server. This is working.

But when I refresh the page it adds in the last added text into the text file again causing duplicate entries.

Any idea what I must do to prevent this? Below is the code I used for the textarea portion.

<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);
    }
?>

Upvotes: 1

Views: 653

Answers (3)

Kerem
Kerem

Reputation: 11586

As John said, you need to redirect user after form submit.

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

Note: Your redirection won't work unless ob_start is not called before, cos your page contains html outputs.

// form.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;
    }
?>

Upvotes: 0

Danilo Kobold
Danilo Kobold

Reputation: 2581

A simpler so You can just store a simple hash on session and regenerate it every time. When the user reloads the page the php wont be executed.

<?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: the order of the blocks will matter, so you need to invert em.

Upvotes: 0

John Conde
John Conde

Reputation: 219924

Pages that are loaded via POST will cause the browser to ask the user to resubmit the information to view the page resulting in the actions performed by that page happening again. If the pages is requested via GET and has variables in the querystring the same thing happens but silently (without the user being prompted to d it again).

The best to work around this is to use the POST/REDIRECT/GET pattern. I used it in an example about processing payments that I wrote for Authorize.Net. Hopefully that points you in the right direction.

Upvotes: 1

Related Questions