Sessions
在线手册:中文  英文

范例

Table of Contents


Sessions
在线手册:中文  英文

用户评论:

epuk_epicnospam at hotmail dot com (2013-04-27 09:17:11)

Another option that prevents form resubmit using the back button, and one that does not require sessions or predefined get parameters, is redirecting to a different url after the form is submitted.

Anonymous (2011-12-16 02:01:05)

To avoid re-submits I add a random-number $rand to the form by "GET".
(action='file.php?rand= $rand').
Further, the $rand is stored in a SESSION-variable.
Everytime the file ist called, the functions will only be processed if the $rand that comes by "GET" is not identical to the $rand in the SESSION-variable.
If someone comes there by pressing the "back" key of his browser, the 2 $rand will be identical and nothing will happen.
That works perfect.

Chris (2011-02-07 08:52:29)

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(
$exitdisplay_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>

ranc at mobixell dot com (2009-04-07 04:24:56)

I have wrote this following piece of code that shows how to work with global sessions (global to all clients) and private sessions (private per browser instance i.e. session cookie). 

This code is usefull to store some read-only complex configuration and store it once (per server) and save the performance penatly for doing the same thing over each new private session...

Enjoy:
<?php
    
// Get the private context
    
session_name('Private');
    
session_start();
    
$private_id session_id();
    
$b $_SESSION['pr_key'];
    
session_write_close();
    
    
// Get the global context
    
session_name('Global');
    
session_id('TEST');
    
session_start();
    
    
$a $_SESSION['key'];
    
session_write_close();

    
// Work & modify the global & private context (be ware of changing the global context!)
 
?>
 <html>
    <body>
        <h1>Test 2: Global Count is: <?=++$a?></h1>
        <h1>Test 2: Your Count is: <?=++$b?></h1>
        <h1>Private ID is <?=$private_id?></h1>
        <h1>Gloabl ID is <?=session_id()?></h1>
        <pre>
        <?php print_r($_SESSION); ?>
        </pre>
    </body>
 </html>
 <?php
    
// Store it back
    
session_name('Private');
    
session_id($private_id);
    
session_start();
    
$_SESSION['pr_key'] = $b;
    
session_write_close();

    
session_name('Global');
    
session_id('TEST');
    
session_start();
    
$_SESSION['key']=$a;
    
session_write_close();
?>

[EDIT BY danbrown AT php DOT net: Contains a bugfix provided by (lveillette AT silexmultimedia DOT com) on 19-NOV-09.]

易百教程