Сессия потеряна после перенаправления страницы в php - PullRequest
9 голосов
/ 11 июня 2010

Когда я использую перенаправление заголовка php, все переменные сеанса теряются ... Некоторые люди говорят, что добавление exit (); сразу после заголовка (""); решит проблему, но, похоже, это не решение ...

Может кто-нибудь помочь, пожалуйста?

Вот как я храню переменную в сеансе:

include 'dbc.php';

$err = array();

foreach($_GET as $key => $value) {
    $get[$key] = filter($value); //get variables are filtered.
}

if ($_POST['doLogin']=='Login')
{

foreach($_POST as $key => $value) {
    $data[$key] = filter($value); // post variables are filtered
}


$user_email = $data['usr_email'];
$pass = $data['pwd'];


if (strpos($user_email,'@') === false) {
    $user_cond = "user_name='$user_email'";
} else {
      $user_cond = "user_email='$user_email'";

}


$result = mysql_query("SELECT `id`,`pwd`,`full_name`,`approved`,`user_level` FROM users WHERE 
           $user_cond
            AND `banned` = '0'
            ") or die (mysql_error()); 
$num = mysql_num_rows($result);

  // Match row found with more than 1 results  - the user is authenticated. 
    if ( $num > 0 ) { 

    list($id,$pwd,$full_name,$approved,$user_level) = mysql_fetch_row($result);

    if(!$approved) {
    //$msg = urlencode("Account not activated. Please check your email for activation code");
    $err[] = "Account not activated. Please check your email for activation code";

    //header("Location: login.php?msg=$msg");
     //exit();
     }

        //check against salt
    if ($pwd === PwdHash($pass,substr($pwd,0,9))) { 
     // this sets session and logs user in  
       session_start();
       session_regenerate_id (true); //prevent against session fixation attacks.

       // this sets variables in the session 
        $_SESSION['user_id']= $id;  
        $_SESSION['user_name'] = $full_name;
        $_SESSION['user_level'] = $user_level;
        $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

        //update the timestamp and key for cookie
        $stamp = time();
        $ckey = GenKey();
        mysql_query("update users set `ctime`='$stamp', `ckey` = '$ckey' where id='$id'") or die(mysql_error());

        //set a cookie 

       if(isset($_POST['remember'])){
                  setcookie("user_id", $_SESSION['user_id'], time()+60*60*24*COOKIE_TIME_OUT, "/");
                  setcookie("user_key", sha1($ckey), time()+60*60*24*COOKIE_TIME_OUT, "/");
                  setcookie("user_name",$_SESSION['user_name'], time()+60*60*24*COOKIE_TIME_OUT, "/");
                   }
        if(empty($err)){            
          header("Location: myaccount.php");
         }
        }
        else
        {
        //$msg = urlencode("Invalid Login. Please try again with correct user email and password. ");
        $err[] = "Invalid Login. Please try again with correct user email and password.";
        //header("Location: login.php?msg=$msg");
        }
    } else {
        $err[] = "Error - Invalid login. No such user exists";
      }     
}

Код перенаправления:

//connect database
    require_once 'dbc.php';

    page_protect();

    $authorID = $_SESSION['user_id'];
    if ( !empty($_POST["answ_content"]) && $authorID != 0 ) {
            //vaqciot html chveulebriv texad
            $content = htmlentities($_POST["answ_content"],ENT_COMPAT,'UTF-8');
            $dro = date('Y-m-d H:i:s');
            $qID = $_POST["question_ID"];
            $author = $_SESSION["user_name"];


            $sql="INSERT INTO wp_comments (comment_ID, comment_post_ID, comment_author, comment_author_IP, comment_date, comment_content, user_id) 
                VALUES
              (NULL, '$qID', '$author', '123.123.123.123', '$dro', '$content', '$authorID')";

            $result = mysql_query($sql);

            //pasuxebis raodenobis ertit gazrda
            $increase = "UPDATE wp_posts SET comment_count = comment_count+1 WHERE ID = $qID";
            mysql_query($increase);

            //gadamisamarteba shekitxvis gverdze  
            $url = 'Location:http://example.com/site/answ/question.php?ID=' .$qID;
            header($url);
    } else {
        echo 'error';
    }

Ответы [ 7 ]

11 голосов
/ 11 июня 2010

Вам нужно поставить exit(); после перенаправления заголовка, в противном случае вы только что загрузили две страницы контента на 1 страницу.

Также убедитесь, что у вас session_start(); в верхней части всех ваших скриптов.

4 голосов
/ 11 июня 2010

Вы не начинаете сеанс. Чтобы использовать переменные сеанса и чтобы они передавались по страницам, вам нужно поставить

session_start();

вверху каждой страницы, прежде чем что-либо еще.

2 голосов
/ 10 июня 2015

Я пытался установить собственный идентификатор сессии, используя:

session_id('own_generated_session_id_string');

Но, как говорится в документации , вы должны использовать это до

session_start();

Использование его после session_start () очищает параметры сеанса.

1 голос
/ 11 апреля 2012

Simples! убедитесь, что страница, с которой вы пришли (например, www.example.com), перенаправляет на (например, www.example.com/redirect.php) уведомление www в начале. Если вы меняете это со страницы на страницу, то да, дела идут не так, как надо.

0 голосов
/ 12 марта 2018

Вам просто нужно проверить права доступа к файлу в каталоге / var / lib / php , чтобы дать публичное разрешение yje для каталога / var / lib / php / session .

и все готово.

0 голосов
/ 26 октября 2016

выход; должен быть помещен после перенаправления заголовка или session_regenerate_id (true); можно использовать

0 голосов
/ 02 июля 2012

Эти сессии не всегда работают, как мы иногда ожидаем.У меня была похожая проблема с моим сайтом, использующим сессии, которые теряются.Я в основном решил эту проблему, введя значение, которое я хочу сохранить в сеансе, в поле скрытого текста при первой загрузке страницы.Затем во второй раз, когда я вызываю страницу (отправка страницы), я просто читаю значение из скрытого текстового поля и продолжаю работу с остальным кодом.

Это проще и чище, чем использовать сеансы в этом случае!

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