2013-05-08 74 views
3

我知道這可能是一個重複的問題,但我似乎無法找到我的具體問題的答案。頁面間沒有保存的PHP會話變量

我有3個PHP文件。 signin.php獲取用戶數據並將其傳遞給signin_auth.php。

signin.php然後重定向在成功註冊後mytoolkit.php

signin_auth.php使用下面的代碼在PHP腳本的末尾:

<? 
session_start(); 

$_SESSION['sessionID'] = $id; 
$_SESSION['time'] = time(); 

header ("Location: mytoolkit.php"); 
exit; 

?> 

然後,用戶是重定向到mytoolkit.php,它使用此代碼:

<? 

session_start(); 

if (!isset($_SESSION['sessionID'])) { 

    header('Location: signin.php?message=4'); 
     exit; 

} 

$inactive = 5400; 
$session_life = time() - $_SESSION['time']; 

if ($session_life > $inactive) { 

    session_destroy(); 
    header("Location: signin.php?message=5"); 
    exit; 

} 

?> 

會話變量不存儲和mytoolkit.php不斷改向我signin.php消息= 4

可能是一個愚蠢的錯誤。我剛剛看了太久。

UPDATE -

所以我有幾臺服務器。在iPage上。我將整個文件夾移到了不​​同​​的服務器上(abc.com/toolkit現在已經複製到xyz.com/toolkit)該應用程序在xyz.com上運行得非常好......它是第一個爲我提供了問題的服務器。

這兩個都運行在同一託管公司。我不知道該怎麼做。

+0

爲什麼您使用session_life和非活動破壞的會話,你沒有讓PHP殺它本身當它是無效的X時間,你可以在php.ini中設置?? – CodeBird 2013-05-08 21:09:11

+0

你說在sign auth的最後是會話代碼,你是在輸出html還是空白行之前? – 2013-05-08 21:11:00

+0

@on_,我會問同樣的事情;代碼到頁面的最後,'session_start()'不能一起走,和前面的空格一起走。 – 2013-05-08 21:13:45

回答

0

我覺得這是你的問題

$inactive = 5400; 
    $session_life = time() - $_SESSION['time']; 
    if ($session_life > $inactive) { 
     session_destroy(); 
     header("Location: signin.php?message=5"); 
     exit; 
    } 
+0

我完全拿出來,仍然失敗。儘管感謝您的幫助! – 2013-05-08 22:09:07

0

如果您在腳本中使用header('location: example.com')它發送302重定向到瀏覽器。現在這不是永久的,但有些瀏覽器仍然緩存這個結果。只需google it

因此,它很可能是您的瀏覽器在您訪問您的代碼之前重定向您的請求。嘗試更改signin_auth.phpheader ("Location: mytoolkit.php?t=".time());,然後使用附加的一些隨機參數調用頁面,以防止第一頁緩存。 EG:/signin_auth.php?t=random

+0

感謝雨果 - 我認爲這樣會工作,但仍然失敗 – 2013-05-08 22:09:25

1

如果您沒有在if (!isset($_SESSION['sessionID'])) {聲明之前銷燬與session_destroy();的會話,那麼原因可能是$id具有空值。

+0

'session_destroy();'不是一個好主意,除非你確定你在做什麼。 – 2014-04-06 22:20:24

4

我終於明白了......這是iPage服務器上我的php.ini文件的問題。出於某種原因,他們將其設置爲

session.save_path = "/var/php_sessions" 

它應該是我的文檔根目錄。這不是他們第一次搞砸了。

+1

如果我正確地閱讀了這個[php文檔頁面](http://www.php.net/session.configuration),'session.save_path'應該默認爲'「」'我的本地計算機上的'' – dsdsdsdsd 2013-12-10 16:57:26

+0

(php 5.3), 'session.save_path =「C:\ SERVER \ tmp」',但在我的虛擬主機上它和Sean的一樣:'session.save_path =「/ var/php_sessions」'......將它改爲'「」 '工作。 – dsdsdsdsd 2013-12-10 16:59:11

+1

這是錯誤信息!您不希望將您的會話存儲在文檔根目錄中。除非文件權限正確,否則它會公開公開所有會話。 – geekdenz 2016-12-02 08:06:32

0

我正在運行httpd作爲另一個用戶(不是apache)。在檢查/etc/php.ini時,我發現「會話目錄必須由進程所有者擁有」。因此,在/etc/httpd/conf.d/php.conf我改變了以下內容:

php_value session.save_path "/var/lib/php/session" 
php_value soap.wsdl_cache_dir "/var/lib/php/wsdlcache" 

php_value session.save_path "/home/[httpduser]/php/session" 
php_value soap.wsdl_cache_dir "/home/[httpduser]/php/wsdlcache" 

並重新加載的httpd。

不知道,如果它是一個更好的主意來改變的/ var/lib中/ PHP的店主[httpduser]