關於(yú)PHP編程中session的(de)問題集錦及解決方法
PHP的session功能,一直為(wéi)許多的初學者為(wéi)難。就連(lián)有些老手,有(yǒu)時都(dōu)被(bèi)搞(gǎo)得莫名(míng)其妙。本文,將這些問題,做(zuò)一個(gè)簡(jiǎn)單(dān)的匯總(zǒng),以便大(dà)家查閱(yuè)。
1、錯誤提示:
Warning: Cannot send session cookie - headers already sent Warning: Cannot send session cache limiter - headers already sent |
分析及解決辦法(fǎ)
這(zhè)一類問(wèn)題(tí),的(de)原(yuán)因是你在程序(xù)中使用session_start()時,之前已經有實(shí)際的(de)html內(nèi)容(róng)輸出了(le)。或許你說,我沒有(yǒu)啊,我隻不過是(shì)echo或print一條消息了。很抱歉,你的(de)echo或print語句所產(chǎn)生的輸(shū)出,就是實際的html內容輸出。解決此類問題的辦法是,將你(nǐ)的session_start()調到程序的第一行。
2、錯(cuò)誤提示
Warning: open(F:/689\php\sessiondata\sess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed |
分析及解決(jué)方法:
出現這樣的(de)錯誤語句一般是因為你(nǐ)的php.ini中關於session.save_path一(yī)項沒有(yǒu)設置好,解決的方法是(shì)將(jiāng)session.save_path和session.cookie_path 設置置為
session_save_path = c:\temp session.cookie_path = \ |
然後在c:\目錄下(xià)建立(lì)一(yī)個temp目錄即可。
3、錯誤提示
Warning: Trying to destroy uninitialized session in |
分析及解決方法出類這樣(yàng)的提示(shì),一(yī)般情況(kuàng)都是你直接調session_destroy()函數(shù)造成的。很多的(de)朋友認為session_destroy()函數可(kě)以獨立(lì)的運行,其實(shí)不(bú)然(rán)。解決的(de)方法(fǎ)是(shì)在你調session_destroy()函數之前,要(yào)用session_start()開(kāi)啟session的功能。
4、問題:怎麽獲得當前session的id值呢?
最簡單的(de)方(fāng)法(fǎ)是:
echo SID; |
5、問(wèn)題:
我的程序,在調用header函數之前沒(méi)有任(rèn)何的輸出(chū),雖(suī)然我(wǒ)include了一個config.php文件,但在config.php文件中也沒有任何的(de)輸出(chū),為什麽session還是會報出與問題1同樣的錯誤呢,是不是因為我在header之前用(yòng)了session_start()的緣(yuán)故呢?
答:或(huò)許你確實認(rèn)真的檢查了(le)你的php程序,在引用header()之前(qián)確實也沒有(yǒu)任何的輸出,並且在你的include文件中也沒有任何的輸出!但是你(nǐ)是(shì)否用光標鍵在?>這個PHP代(dài)碼結束語句(jù)後移動檢查呢?那麽你會發現在?>這個(gè)後麵(miàn),有一個空行或幾個空格,你(nǐ)刪除了這幾個空行或空格,那麽問題就解決了。
注(zhù):此問題,會出PHP4.1.2中,更高版本,沒有測試過。
6、問:用session做登錄主頁麵後,其它頁麵怎麽用session限製登(dēng)錄?
答:最簡單(dān)的方法是
session_start(); if(!session_registered('login') ││ $login != true) { echo "你(nǐ)沒有登陸"; exit; } |
7、問(wèn):我用(yòng)session_register()注冊了(le)session變量(liàng),可是當(dāng)我用header或(huò)用javascript的重定向語(yǔ)句,那麽在(zài)一下頁(yè)麵中,我卻訪問不到session所注冊的變量值(zhí)。請問如何解決?
問題的(de)程序片段:
<? session_start(); $ok = 'love you'; session_register('ok'); header("locations : next.php"); ?> |
next.php
<? session_start(); echo $ok; ?> |
解(jiě)決的方法:
當你(nǐ)用header函數或window.locations這樣(yàng)的功能後,你上一個頁麵所(suǒ)注冊(cè)的session變量,就會容(róng)易的(de)丟失,關於這個問(wèn)題的原因,至今仍(réng)沒有一(yī)個詳(xiáng)細的回答。
不過有解決的方法。如下所示
header("locations: next.php" ."?" . SID); |
在跳轉到下一頁麵的時候(hòu),將(jiāng)session的當(dāng)前(qián)id做為一個參數(shù),傳(chuán)到後一個(gè)頁麵。
8、session如(rú)何(hé)傳數組
session_register('data'); $data=array(1,2,3,4); |
方法是先注冊後賦值
9、我是(shì)不是可(kě)以用像$HTTP_GET_VARS['**']方(fāng)式(shì)來訪問session值呢?
回答:可以,你可以使(shǐ)用如下global數組來訪(fǎng)問session,以加(jiā)強網頁的安全性
$HTTP_SESSION_VARS $_SESSION |
例程: