php cookie 作用范圍–不要在當前頁面使用你的cookie
更新時間:2009年03月24日 00:26:47 作者:
這兩天在調(diào)試bug的時候遇到了一個問題,就是頁面莫名其妙的會跳轉到登陸頁面
因為在本地測試完全沒有問題,所以ssh到遠程服務器上(不是發(fā)布服務器,建議不要直接在Publish Server上直接改東西),進行了一下斷點的測試,最后發(fā)現(xiàn)是一個比較復雜的邏輯中有個函數(shù)在構造函數(shù)中調(diào)用了登陸驗證。沒有驗證通過所以就跳走了。
下面我們通過程序來看一下php cookie的使用,也許你看完上面那段還納悶,這個和cookie有什么聯(lián)系呢?
大體說一下在我們的MVC結構中所用的登陸驗證:
在controller中的構造函數(shù)用有一個專門驗證登陸的函數(shù),根據(jù)模塊是否需要登陸驗證來加如此函數(shù)。
bug程序:在setcookie后,當前頁面進行了登陸驗證。
bug原因:當前頁面是獲得不了在此頁剛剛設置的cookie的
下面我們來用程序測試一下:
這里是一個設置cookie的函數(shù),我們現(xiàn)在用的,偷懶了 呵呵
function dsetcookie($var, $value, $life = 0) {
global $_cookie_domain, $_cookie_path, $_timestamp, $_SERVER;
setcookie($var, escape($value), $life ? $_timestamp + $life : 0,
$_cookie_path, $_cookie_domain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);
}
然后建立test1.php,內(nèi)容如下:
<?php
$td = date('d');
dsetcookie("testvar",$td,30*24*60*60);
print_r($_COOKIE);
?>
將會得到一個空的數(shù)組array();
那我們在設置完后什么時候才能第一次使用這個$_COOKIE變量呢?
現(xiàn)在我們把test1.php這個程序稍微改動一下:
<?php
$td = date('d');
dsetcookie("testvar",$td,30*24*60*60);
print_r($_COOKIE);//這個要注釋掉 要不然會報header警告
$location = "test2.php";
header("Location: ".$location);
?>
然后我們在test2.php中來顯示$_COOKIE看一下
<?php
print_r($_COOKIE);
?>
這里我們將會得到:
Array
(
[testvar] =10
)
這里就能夠獲得并使用這個cookie值了。
為什么呢?
你可以這么理解:當前設置的Cookie不是立即生效的,而是要等到下一個頁面時才能看到.
這是由于在設置的這個頁面里Cookie由服務器傳遞給客戶瀏覽器,在下一個頁面瀏覽器才能把Cookie從
客戶的機器里取出傳回服務器的原因。
下面我們通過程序來看一下php cookie的使用,也許你看完上面那段還納悶,這個和cookie有什么聯(lián)系呢?
大體說一下在我們的MVC結構中所用的登陸驗證:
在controller中的構造函數(shù)用有一個專門驗證登陸的函數(shù),根據(jù)模塊是否需要登陸驗證來加如此函數(shù)。
bug程序:在setcookie后,當前頁面進行了登陸驗證。
bug原因:當前頁面是獲得不了在此頁剛剛設置的cookie的
下面我們來用程序測試一下:
這里是一個設置cookie的函數(shù),我們現(xiàn)在用的,偷懶了 呵呵
復制代碼 代碼如下:
function dsetcookie($var, $value, $life = 0) {
global $_cookie_domain, $_cookie_path, $_timestamp, $_SERVER;
setcookie($var, escape($value), $life ? $_timestamp + $life : 0,
$_cookie_path, $_cookie_domain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);
}
然后建立test1.php,內(nèi)容如下:
復制代碼 代碼如下:
<?php
$td = date('d');
dsetcookie("testvar",$td,30*24*60*60);
print_r($_COOKIE);
?>
將會得到一個空的數(shù)組array();
那我們在設置完后什么時候才能第一次使用這個$_COOKIE變量呢?
現(xiàn)在我們把test1.php這個程序稍微改動一下:
復制代碼 代碼如下:
<?php
$td = date('d');
dsetcookie("testvar",$td,30*24*60*60);
print_r($_COOKIE);//這個要注釋掉 要不然會報header警告
$location = "test2.php";
header("Location: ".$location);
?>
然后我們在test2.php中來顯示$_COOKIE看一下
復制代碼 代碼如下:
<?php
print_r($_COOKIE);
?>
這里我們將會得到:
Array
(
[testvar] =10
)
這里就能夠獲得并使用這個cookie值了。
為什么呢?
你可以這么理解:當前設置的Cookie不是立即生效的,而是要等到下一個頁面時才能看到.
這是由于在設置的這個頁面里Cookie由服務器傳遞給客戶瀏覽器,在下一個頁面瀏覽器才能把Cookie從
客戶的機器里取出傳回服務器的原因。
先寫到這里:
你可以通過下面的幾個鏈接更加深入的了解一下COOKIE
Netscape公司關于Cookie的官方原始定義的網(wǎng)址:http://www.netscape.com/newsref/std/cookie_spec.html
相關文章
PHP 自定義錯誤處理函數(shù)trigger_error()
trigger_error() 用于在用戶指定的條件下觸發(fā)一個錯誤消息。它與內(nèi)建的錯誤處理器一同使用,也可以與由 set_error_handler() 函數(shù)創(chuàng)建的用戶自定義函數(shù)使用2013-03-03
PHP 雜談《重構-改善既有代碼的設計》之四 簡化條件表達式
條件邏輯有可能十分復雜,因此本章提供一些重構的手法,專門用來簡化它們2012-04-04

