thinkphp session 驗證碼
//查詢驗證碼
function checklogin(){
$data=$_SESSION['verifyCode'];
echo $data;
}
//產生驗證碼
public function verify(){
import("@.ORG.Image");
$image=new Image();
$image->buildImageVerify(6, 5);
}
驗證碼產生了,但是控制器裡面session就是取不到驗證碼
static function showAdvVerify($type='png', $width=180, $height=40, $verifyName='verifyCode') {
$rand = range('a', 'z');
shuffle($rand);
$verifyCode = array_slice($rand, 0, 10);
$letter = implode(" ", $verifyCode);
$_SESSION[$verifyName] = $verifyCode;
略。。。。。。。
回複討論(解決方案)
你沒加 session_start(); 吧
1、確認程式檔案沒有 BOM 頭
2、操作 session 應該用 TP 提供的方法
3、確認你的代碼和工作過程與 TP 約定的一致
TP 提供了驗證碼產生類,也提供了表單驗證。並不需要自己寫代碼,只需填寫參數就可以了
1、BOM已經用專門方法去除了。
2、操作session是用的$_SESSION['']進行賦值和讀取的,這個應該沒錯。
3、驗證碼產生的方法,是調用的thinkphp提供的方法。
xuzuning提的這個工作過程,我也覺得有點問題。
這個是我的項目結構
下面是index.php的內容
define('APP_NAME','Myapp');
define('APP_PATH','./Myapp/');
require 'ThinkPHP/ThinkPHP.php';
?>
訪問的時候http://localhost:8080/huhaoweb/index.php/進行訪問,由於重寫了url所以index.php就不用寫了
還有就是如果在一個方法裡面進行 session的賦值和擷取是可以列印出來的,但是跳到其他方法就擷取不到。就像是重新進入伺服器一樣。session裡面是空的。
19.1 Session支援
系統提供了Session管理和操作的完善支援,全部操作可以通過一個內建的session函數完成。
Session 用於Session 設定、擷取、刪除和管理操作
用法
session($name, $value='')
參數
name(必須):如果傳入數組 則表示進行session初始化,如果傳入null表示清空當前session,如果是字串則表示session賦值、擷取或者操作。
Value(可選):要設定的session值,如果傳入null表示刪除session,預設為空白字串
傳回值
見詳(根據具體的用法返回不同的值)
session函數是一個多元化操作函數,傳入不同的參數調用可以完成不同的功能操作,包括下面一些功能。
session初始化設定
如果session方法的name參數傳入數組則表示進行session初始化設定,例如:
session(array('name'=>'session_id','expire'=>3600));
支援傳入的session參數包括:
參數名
說明
id
session_id值
name
session_name 值
path
session_save_path 值
prefix
session 本地化空間首碼
expire
session.gc_maxlifetime 設定值
domain
session.cookie_domain 設定值
use_cookies
session.use_cookies 設定值
use_trans_sid
session.use_trans_sid 設定值
type
session hander類型,可以使用hander驅動擴充
Session初始化設定方法 無需手動調用,在App類的初始化工作結束後會自動調用,通常項目只需要配置SESSION_OPTIONS參數即可,SESSION_OPTIONS參數的設定是一個數組,支援的索引名和前面的session初始化參數相同。
預設情況下,初始化之後系統會自動啟動session,如果不希望系統自動啟動session的話,可以設定SESSION_AUTO_START為false,例如:
'SESSION_AUTO_START' =>false
關閉自動啟動後可以項目的公用檔案或者在控制器中通過手動調用session_start或者session('[start]') 啟動session。
session賦值
Session賦值比較簡單,直接使用:
session('name','value'); //設定session
session取值
Session取值使用:
$value = session('name');
session刪除
session('name',null); // 刪除name
要刪除所有的session,可以使用:
session(null); // 清空當前的session
session判斷
要判斷一個session值是否已經設定,可以使用
session('?name');
用於判斷名稱為name的session值是否已經設定
session管理
session方法支援一些簡單的session管理操作,用法如下:
session('[操作名]');
支援的操作名包括:
操作名
含義
start
啟動session
pause
暫停session寫入
destroy
銷毀session
regenerate
重建session id
使用樣本如下:
session('[pause]'); // 暫停session寫入
session('[start]'); // 啟動session
session('[destroy]'); // 銷毀session
session('[regenerate]'); // 重建session id
本地化支援
如果在初始化session設定的時候傳入prefix參數或者單獨設定了SESSION_PREFIX參數的話,就可以啟用本地化session管理支援。啟動本地化session後,所有的賦值、取值、刪除以及判斷操作都會自動支援本地化session。
本地化session支援開啟後,產生的session資料格式由原來的
$_SESSION['name'] 變成 $_SESSION['首碼'] ['name']
session hander支援
是初始化session設定的時候,如果傳入了type參數,則會自動引入對應的hander驅動,驅動擴充目錄位於Extend/Driver/Session目錄下面(詳見擴充部分)。
這個可能是關鍵
每次產生驗證碼的時候,就會通過SESSION記錄本次的驗證碼的md5後的字串資訊,所以,要檢查驗證碼是否正確,我們只需要在Action中使用下面的代碼就行了:
if($_SESSION['verify'] != md5($_POST['verify'])) {
$this->error('驗證碼錯誤!');
}
注意,這裡的verify名稱取決於你的驗證碼的verifyName參數的值。
session_start();
session_start(); 在php+mysql還有用,在thinkphp裡面就沒什麼用的,預設的是自動開啟。
終於解決了,以前別人用的這台電腦,使用php mysql 。。自己配置的。而我是用的wamp整合的開發環境,所以session的儲存的路徑在php5下面,導致session的讀取產生錯誤。所以我刪除掉php5,重啟伺服器session終於可以傳值了