$Setime = $Date->dateAdd(...); // 返回 Date 對象
session('time', $Setime); // 存入 Session
// 後續讀取
$diff = $Date->dateDiff("$Setime", "s"); // 隱式轉換為字符串,邏輯錯亂
類型不匹配:存入的是 Date 對象,取出後直接用於字符串比較/日期運算,導致邏輯判斷失效。
public function myses() {
import("ORG.Util.Date");
$Setime = session('time');
$Date = new Date;
if ($Setime !== null) {
// 關鍵修正:Session 存儲格式化字符串
$diff = $Date->dateDiff($Setime, "s");
if ($diff <= 0) { // 過期判斷:差值 <= 0 表示已過期
$Setime = $Date->dateAdd(60, "s"); // 60 秒有效期
session('time', $Setime->format()); // 存字符串
session('rand', rand(11111, 99999));
return session('rand');
} else {
return session('rand'); // 未過期直接返回
}
} else {
$Setime = $Date->dateAdd(60, "s");
session('time', $Setime->format()); // 存字符串
session('rand', rand(11111, 99999));
return session('rand');
}
}
format():統一存儲「YYYY-MM-DD HH:II:SS」格式字符串dateDiff 返回剩餘秒數,<=0 表示過期return session('rand'),調用者直接獲取驗證碼// 控制器
public function verify() {
$config = ['length' => 4, 'expire' => 300]; // 5 分鐘過期
$verify = new \Think\Verify($config);
$verify->entry();
}
// 模板
<img src="__CONTROLLER__/verify" onclick="this.src='__CONTROLLER__/verify?'+Math.random()" />
// 驗證
$verify = new \Think\Verify();
if (!$verify->check($_POST['verify_code'])) {
$this->error('驗證碼錯誤');
}
框架內置組件經過大量生產驗證,優先使用而非手寫 Session 邏輯。若必須自定義,嚴格統一「存字符串、取字符串、運算轉對象」類型紀律。