本篇內(nèi)容主要講解“怎么解決php無(wú)法傳遞session問(wèn)題”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么解決php無(wú)法傳遞session問(wèn)題”吧!
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),單縣網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:單縣等地區(qū)。單縣做網(wǎng)站價(jià)格咨詢:18982081108
php無(wú)法傳遞session的解決辦法:1、在客戶端中開啟cookie;2、檢查瀏覽器問(wèn)題并實(shí)現(xiàn)存取cookie;3、開啟php.ini中的session.use_trans_sid即可。
本文操作環(huán)境:windows7系統(tǒng)、PHP7.1版、DELL G3電腦
PHP中SESSION不能跨頁(yè)傳遞問(wèn)題的解決辦法
在PHP中使用過(guò)SESSION的朋友可能會(huì)碰到這么一個(gè)問(wèn)題,SESSION變量不能跨頁(yè)傳遞。這令我苦惱了好些日子,最終通過(guò)查資料思考并解決了這個(gè)問(wèn)題。我認(rèn)為,出現(xiàn)這個(gè)問(wèn)題的原因有以下幾點(diǎn):
1、客戶端禁用了cookie
2、瀏覽器出現(xiàn)問(wèn)題,暫時(shí)無(wú)法存取cookie
3、php.ini中的session.use_trans_sid = 0或者編譯時(shí)沒(méi)有打開--enable-trans-sid選項(xiàng)
為什么會(huì)這樣呢?下面我解釋一下:
Session儲(chǔ)存于服務(wù)器端(默認(rèn)以文件方式存儲(chǔ)session),根據(jù)客戶端提供的session id來(lái)得到用戶的文件,取得變量的值,session id可以使用客戶端的Cookie或者Http1.1協(xié)議的Query_String(就是訪問(wèn)的URL的“?”后面的部分)來(lái)傳送給服務(wù)器,然后服務(wù)器讀取Session的目錄。也就是說(shuō),session id是取得存儲(chǔ)在服務(wù)上的session變量的身份證。當(dāng)代碼session_start();運(yùn)行的時(shí)候,就在服務(wù)器上產(chǎn)生了一個(gè)session文件,隨之也產(chǎn)生了與之唯一對(duì)應(yīng)的一個(gè)session id,定義session變量以一定形式存儲(chǔ)在剛才產(chǎn)生的session文件中。通過(guò)session id,可以取出定義的變量。跨頁(yè)后,為了使用session,你必須又執(zhí)行session_start();將又會(huì)產(chǎn)生一個(gè)session文件,與之對(duì)應(yīng)產(chǎn)生相應(yīng)的session id,用這個(gè)session id是取不出前面提到的第一個(gè)session文件中的變量的,因?yàn)檫@個(gè)session id不是打開它的“鑰匙”。如果在session_start();之前加代碼session_id($session id);將不產(chǎn)生新的session文件,直接讀取與這個(gè)id對(duì)應(yīng)的session文件。
PHP中的session在默認(rèn)情況下是使用客戶端的Cookie來(lái)保存session id的,所以當(dāng)客戶端的cookie出現(xiàn)問(wèn)題的時(shí)候就會(huì)影響session了。必須注意的是:session不一定必須依賴cookie,這也是session相比cookie的高明之處。當(dāng)客戶端的Cookie被禁用或出現(xiàn)問(wèn)題時(shí),PHP會(huì)自動(dòng)把session id附著在URL中,這樣再通過(guò)session id就能跨頁(yè)使用session變量了。但這種附著也是有一定條件的,即“php.ini中的session.use_trans_sid = 1或者編譯時(shí)打開打開了--enable-trans-sid選項(xiàng)”。
明白了以上的道理,現(xiàn)在我們來(lái)拋開cookie使用session,主要途徑有三條:
1、設(shè)置php.ini中的session.use_trans_sid = 1或者編譯時(shí)打開打開了--enable-trans-sid選項(xiàng),讓PHP自動(dòng)跨頁(yè)傳遞session id。
2、手動(dòng)通過(guò)URL傳值、隱藏表單傳遞session id。
3、用文件、數(shù)據(jù)庫(kù)等形式保存session_id,在跨頁(yè)過(guò)程中手動(dòng)調(diào)用。
通過(guò)例子來(lái)說(shuō)明吧:
s1.phps2.php
<? php
session_start ();
$_SESSION [ ' var1 ' ] = " 中華人民共和國(guó) " ;
$url = " <a href= " . " "s2.php">下一頁(yè)</a> " ;
echo $url ;
?>
<? php
session_start ();
echo " 傳遞的session變量var1的值為: " . $_SESSION [ ' var1 ' ];
?>
運(yùn)行以上代碼,在客戶端cookie正常的情況下,應(yīng)該可以在得到結(jié)果“中華人民共和國(guó)”。
現(xiàn)在你手動(dòng)關(guān)閉客戶端的cookie,再運(yùn)行,可能得不到結(jié)果了吧。如果得不到結(jié)果,再“設(shè)置php.ini中的session.use_trans_sid = 1或者編譯時(shí)打開打開了--enable-trans-sid選項(xiàng)”,又得到結(jié)果“中華人民共和國(guó)”
這也就是上面所說(shuō)的途徑1。
下面再說(shuō)途徑2:
修改的代碼如下:
s1.php
<? php
session_start ();
$_SESSION [ ' var1 ' ] = " 中華人民共和國(guó) " ;
$sn = session_id ();
$url = " <a href= " . " "s2.php?s= " . $sn . " ">下一頁(yè)</a> " ;
echo $url ;
?>
s2.php辦法3:
login.html
<? php
session_id ( $_GET [ ' s ' ]);
session_start ();
echo " 傳遞的session變量var1的值為: " . $_SESSION [ ' var1 ' ];
?>
<! DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.01 Transitional//EN " >
< html >< head >
< title > Login </ title >
< meta http - equiv = " Content-Type " content = " text/html; charset=GB2312 " >
</ head >
< body > 請(qǐng)登錄:
< form name = " login " method = " post "
action = " mylogin1.php " >
用戶名 :< input type = " text " name = " name " >< br >
口 令 :< input type = " password " name = " pass " >< br >
< input type = " submit " value = " 登錄 " >
</ form >
</ body >
</ html >
mylogin1.php
<? php $name = $_POST [ ' name ' ]; $pass = $_POST [ ' pass ' ]; if ( ! $name || ! $pass ) { echo " 用戶名或密碼為空,請(qǐng)<a href="login.html">重新登錄</a> " ; die (); } if ( ! ( $name == " laogong " && $pass == " 123 " )) { echo " 用戶名或密碼不正確,請(qǐng)<a href="login.html">重新登錄</a> " ; die (); } // 注冊(cè)用戶 ob_start (); session_start (); $_SESSION [ ' user ' ] = $name ; $psid = session_id (); $fp = fopen ( " e:/tmp/phpsid.txt " , " w+ " ); fwrite ( $fp , $psid ); fclose ( $fp ); // 身份驗(yàn)證成功,進(jìn)行相關(guān)操作 echo " 已登錄<br> " ; echo " <a href="mylogin2.php">下一頁(yè)</a> " ; ?>
mylogin2.php
<? php
$fp = fopen ( " e:/tmp/phpsid.txt " , " r " );
$sid = fread ( $fp , 1024 );
fclose ( $fp );
session_id ( $sid );
session_start ();
if ( isset ( $_SESSION [ ' user ' ]) && $_SESSION [ ' user ' ] = " laogong " ) {
echo " 已登錄! " ;
}
else {
// 成功登錄進(jìn)行相關(guān)操作
echo " 未登錄,無(wú)權(quán)訪問(wèn) " ;
echo " 請(qǐng)<a href="login.html">登錄</a>后瀏覽 " ;
die ();
}
?>
![]()
同樣請(qǐng)關(guān)閉cookie測(cè)試,用戶名:laogong 密碼:123 這是通過(guò)文件保存session id的,文件是:e:/tmp/phpsid.txt,請(qǐng)根據(jù)自己的系統(tǒng)決定文件名或路徑。
至于用數(shù)據(jù)庫(kù)的方法,我就不舉例子了,與文件的方法類似。
總結(jié)一下,上面的方法有一個(gè)共同點(diǎn),就是在前一頁(yè)取得session id,然后想辦法傳到下一頁(yè),在下一頁(yè)的session_start();代碼之前加代碼session_id(傳過(guò)來(lái)的session id);
到此,相信大家對(duì)“怎么解決php無(wú)法傳遞session問(wèn)題”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前標(biāo)題:怎么解決php無(wú)法傳遞session問(wèn)題
分享鏈接:http://m.newbst.com/article44/isgehe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)站設(shè)計(jì)、做網(wǎng)站、ChatGPT、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)