(Improved version) It took me a while to find out how to use PHP sessions to prevent HTML form re-submits. A user can re-submit a form via the backspace key/back arrow and/or the F5/refresh key. I needed to control if/when a HTML form could be resubmitted. Here's what I came up with:
<?php
$SID = session_id();
if(empty($SID)) session_start() or exit(basename(__FILE__).'(): Could not start session');
$_SESSION['err'] = ''; $exit = false;
do {
// check if form was previously submitted
if(isset($_POST['submit']) and isset($_POST['SID']) and ($_POST['SID'] !== session_id())) {
$ret = null; $exit = true; break; }
// break out of do-while if form has not been submitted yet
if(empty($_POST['submit'])) break;
// process form data if user hit form "submit" button
if(isset($_POST['submit'])) {
$ret = validate_form();
// ret will be error message if form validation failed
if(is_string($ret)) { $_SESSION['err'] = $ret; break; }
// ret will be array of cleaned form values if validation passed
if(is_array($ret)) { session_regenerate_id(true); $exit = true; break; }
}
} while(false);
if($exit) display_receipt($ret);
$exit and exit;
function validate_form() {
$tmp = htmlspecialchars(strtoupper($_POST['name'])); // clean POST data
if(stripos($_POST['great'], 'yes') !== false) return array('name' => $tmp, 'great' => 'YES!');
return 'Wrong answer!';
}
function display_receipt($msg) {
if($msg === null) echo 'You already answered the question!';
if(is_array($msg)) echo 'Your answer of '.$msg['great'].' is right '.$msg['name'];
return;
}
?>
<html><body>
<?php echo $_SESSION['err']; ?>
<form name="form1" action="http://<?php echo $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF']; ?>" method="post">
Name: <input type="text" name="name" value="<?php isset($_SESSION["name"]) and print $_SESSION["name"]; ?>">
Is PHP great? <input type="text" name="great" value="<?php isset($_SESSION["great"]) and print $_SESSION["great"]; ?>">
<input type="hidden" name="SID" value="<?php echo session_id(); ?>">
<input type="submit" name="submit" value="Submit">
</form></body></html>
----
Server IP: 64.71.164.2
Probable Submitter: 65.41.147.195
----
Manual Page -- http://www.php.net/manual/en/session.examples.php
Edit -- https://master.php.net/note/edit/102301
Del: integrated -- https://master.php.net/note/delete/102301/integrated
Del: useless -- https://master.php.net/note/delete/102301/useless
Del: bad code -- https://master.php.net/note/delete/102301/bad+code
Del: spam -- https://master.php.net/note/delete/102301/spam
Del: non-english -- https://master.php.net/note/delete/102301/non-english
Del: in docs -- https://master.php.net/note/delete/102301/in+docs
Del: other reasons-- https://master.php.net/note/delete/102301
Reject -- https://master.php.net/note/reject/102301
Search -- https://master.php.net/manage/user-notes.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.