Archive
關於 setcookie() 及 session_start() 的錯誤
PHP 設計人員都知道,使用 setcookie() 或 session_start() 函式之前不能有任何輸出,否則就會出現錯誤。這是因為這兩個函式呼叫後會將資訊加入 HTML 的標頭(Header),而標頭都應該在 HTML 本體(body)輸出之前,如果呼叫這兩個函式時前面已經有東西輸出了,PHP 直譯器就會出現錯誤訊息。然而要檢查函式呼叫之前有沒有輸出是件非常麻煩的事情,因為 include 檔案內容裡的輸出都有可能造成錯誤,如果檔案數龐大,那檢查起來可是非常麻煩的,在此提供一個可以一勞永逸的方法:
開啟組態設定檔 php.ini ,將底下這項改為 On
output_buffering = On
這樣 Web Server 在處理檔案時會將標頭全部處理完後,再輸出網頁內容,這樣網頁速度需多等千分之一秒,但卻可省去檢查程式碼的數千數萬秒,算是值得使用的功能囉!
[PHP] 取得使用者真實 IP
一般在取得使用者 IP 都是利用 $_SERVER['REMOTE_ADDR'] 這個環境變數,但是此變數只會紀錄最後一個主機 IP,所以當使用者瀏覽器有設定 Proxy 時,就無法取得他的真實 IP。
這時可以使用另一個環境變數 $_SERVER['HTTP_X_FORWARDED_FOR'] ,它會紀錄所經過的主機 IP,但是只有在使用者有透過 Proxy 時才會產生,所以可以像以下這樣寫來取得使用者真實 IP。
<?php
if (empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$myip = $_SERVER['REMOTE_ADDR'];
} else {
$myip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$myip = $myip[0];
}
echo $myip;
?>
[PHP] 隱藏 IP 的寫法
經常我們為了保護客戶端的 IP 資訊,不會將完整 IP 顯示出來,變成像「210.240.xxx.xxx」這樣。在 PHP 上可用 explode() 這個函式來達到目的。explode() 可將字串依指定的字串或字元 separator 切開並存回一陣列。所以 IP 可依「.」切開,再分別顯示出來即可。
<?php
function ip_hide($ip, $n=0)
{
$iphide = explode(".", $ip);
switch($n) {
// 不隱藏IP
case '0': $ip; break;
// 隱藏最末位
case '1': $ip = $iphide[0].".".$iphide[1].".".$iphide[2].".X"; break;
// 隱藏末兩位
case '2': $ip = $iphide[0].".".$iphide[1].".X.X"; break;
// 全部隱藏
case '3': $ip = "IP已經隱藏"; break;
}
echo $ip;
}
?>
近期迴響