Сессия потеряна после перенаправления страницы в php

Когда я использую перенаправление заголовка 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('Ymd 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'; } 

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

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

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

 session_start(); 

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

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

 session_id('own_generated_session_id_string'); 

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

 session_start(); 

Используя его после session_start (), удаляются параметры сеанса.

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

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

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

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