Я использую $_SESSION
для хранения данных из многостраничной формы. Все работало прекрасно, пока я не завершил отправку и не завершил сеанс, чтобы предотвратить репликацию одних и тех же данных формы, если человек попытается повторно ввести форму. Когда форма заполнена и отправлена, завершите сеанс и сотрите данные сеанса:
$_SESSION = array();
setcookie(session_name(), '', time() - 42000);
session_destroy();
Далее следует следующее:
<?php
session_start();
include "connect-moo.php";
$learning = true;
//get any post variables and save them to the session
foreach ($_POST as $key => $val) {
$_SESSION[$key] = $val;
}
sessionDump(); //dumps session to db
//check to see if step is set (in the post eg ?step=getaquote). If not, set it to current session step
if(!isset($_POST["step"])) {
if(isset($_SESSION['step'])) {
$_POST['step'] = $_SESSION['step'];
}
}
//show the page appropriate to the current step
if ($_SESSION['mode'] == 'edit' && $_SESSION['lastpage'] != "review" && $_SESSION['step'] != "session") {
$_SESSION['lastpage'] = 'review';
getReview();
}
else {
if($_SESSION['step'] != 'session') $_SESSION['lastpage'] = $_SESSION['step'];
switch ($_POST["step"])
{
case "session":
foreach($_SESSION as $key => $val){
echo $key.": ".$val."<br>";
//phpinfo();
}
echo "Post Data<br>";
foreach($_POST as $key => $val) {
$sval = mysql_real_escape_string($val);
$skey = mysql_real_escape_string($key);
echo $skey.": ".$sval."<br>";
}
break;
case "getaquote":
getAQuote();
break;
// and so on...
default:
start();
}
}
... (all of the abovementioned functions)
?>
Я подтвердил, что создается новый файл cookie сеанса, но $_POST
и $_SESSION
пусты после перезапуска сеанса. Благодаря недавнему исправлению (спасибо!) я могу программно передавать данные в массивы $_POST и $_SESION (например, $_POST['foo'] = 'bar';), но переменные, переданные через URI, игнорируются.
Решения:
re session_destroy см. ответ Alex B.
ре. проблема $_POST - оказывается, что при прямом вводе информации через URL-адрес сервер интерпретировал ее (правильно) как GET, а не POST. Я изменил свой код, чтобы получить все данные GET и POST, но в производстве мне понадобится только POST. Вот новый код:
//get any submitted variables and save them to the session
foreach ($_GET as $key => $val) {
$_SESSION[$key] = $val;
}
foreach ($_POST as $key => $val) {
$_SESSION[$key] = $val;
}