Странная проблема сессии в PHP - PullRequest
2 голосов
/ 01 октября 2010

У меня странная проблема с сессиями в PHP. По сути, когда пользователь отправляет контактную форму, сценарий обработки устанавливает сеанс по завершении ($_SESSION['action']='sent';). Затем пользователь отправляется обратно на страницу, с которой он отправил форму, и отображается сообщение с использованием следующего кода:

$action = $_SESSION['action'];

if ( $action == 'sent' )
{
echo '<p>Thank you for contacting us, we will be in touch with you ASAP.</p>';
unset($_SESSION['action']);
}

Сеанс не установлен, поэтому, если они обновят страницу или уйдут и вернутся, сообщение больше не будет отображаться.

В основном проблема в том, что когда сеанс не установлен, он, кажется, сбрасывает его с самого начала сценария, чтобы сообщение не отображалось. Оператор if явно выполняется, поскольку сеанс не установлен, но сообщение не отображается.

Я много раз использовал этот один и тот же скрипт, и он отлично работает на других сайтах (на том же сервере, с теми же настройками).

Буду признателен за любую помощь / совет!

Ответы [ 5 ]

0 голосов
/ 13 июля 2011

Старый поток, но я добавлю, что я бы предпочел isset () в этой ситуации:

<?php
session_start();
if(isset($_SESSION['sent'])){
    echo "Successfully submitted form!";
    $_SESSION = array();
    session_regenerate_id();
    session_unset();
    session_destroy();
    exit;
}
if(isset($_POST['submit'])){
    //validate input & process form
    $_SESSION['sent'] = 1;
    header("location:form.php"); // name of this file
    exit;
}
echo "Enter your email<br />
<form action='' method='post'>
<input type='text' name='email' />
<input type='submit' name='submit' />
</form>";
exit;
?>
0 голосов
/ 13 января 2011

Код у вас правильный.А поскольку сеанс не установлен, мы знаем, что выполняются операторы в блоке if.Может быть, результат на самом деле отображается echo, но просто не отображается браузером (это может произойти, если ваш код CSS настроен так).Итак, просто проверьте источник страницы вывода и проверьте, содержит ли источник сообщение out out.

Другими словами, вы можете поместить в эхо-окно предупреждение javascript и посмотреть, отображает ли оно окно предупреждения.

echo "<script type='text/javascript'> alert('Hi'); </script>";

Это должно переопределить любой скрытый код CSS.

0 голосов
/ 01 октября 2010

Попробуйте сделать session_destroy (); вместо неустановленного ($ _ SESSION); Не могли бы вы дать нам часть, где вы начинаете сеанс и где для "действия" установлено "отправлено"?

0 голосов
/ 02 октября 2010

Привет, Том, вы уверены, что скрипт, который запускает сеанс, находится в том же каталоге - например, команды, обращающиеся к одному и тому же сеансу - может быть включен в один из них под https, а другой в http ИЛИ, если один в /другой находится в / dir1, и / dir1 был запущен первым.Файл cookie, созданный сеансом, предназначен для / dir1 и глубже, поэтому другой сценарий не может его прочитать;он не видит сессии, поэтому он начинает новую.

Я не бриллиант на этих сессиях, но это может стоить проверить.- папа

0 голосов
/ 01 октября 2010

Вы инициализировали сеанс? session_start(); перед выводом чего-либо в браузер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...