Archive

Posts Tagged ‘Programming’

[PHP] 解決 substr 擷取中文字時出現問號

三月 4th, 2006

PHP 有個擷取字串的函式 substr(),但是遇到中文字可就沒辦法正確擷取了,因為一個中文字在 BIG5 編碼是 2 byte,在 UTF-8 要 3 byte,如果擷取的字串剛好不到一個中文,那就會出現「?」之類的符號。所以提供一個解決方法,就是使用 mb_substr(),使用時必須先正確載入 PHP 的 mbstring 模組。

Example:


<?php
$string = '這是中文字';
$string = mb_substr($string, 0, 4, 'BIG-5');
echo $string;
?>

這樣就會正確擷取到「這是中文」了。

PHP, 程式筆記 ,

關於 setcookie() 及 session_start() 的錯誤

八月 31st, 2005

PHP 設計人員都知道,使用 setcookie() 或 session_start() 函式之前不能有任何輸出,否則就會出現錯誤。這是因為這兩個函式呼叫後會將資訊加入 HTML 的標頭(Header),而標頭都應該在 HTML 本體(body)輸出之前,如果呼叫這兩個函式時前面已經有東西輸出了,PHP 直譯器就會出現錯誤訊息。然而要檢查函式呼叫之前有沒有輸出是件非常麻煩的事情,因為 include 檔案內容裡的輸出都有可能造成錯誤,如果檔案數龐大,那檢查起來可是非常麻煩的,在此提供一個可以一勞永逸的方法:

開啟組態設定檔 php.ini ,將底下這項改為 On
output_buffering = On

這樣 Web Server 在處理檔案時會將標頭全部處理完後,再輸出網頁內容,這樣網頁速度需多等千分之一秒,但卻可省去檢查程式碼的數千數萬秒,算是值得使用的功能囉!

PHP, 程式筆記 , , ,

[PHP] 取得使用者真實 IP

五月 12th, 2005

一般在取得使用者 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, 程式筆記 ,

[PHP] 隱藏 IP 的寫法

十二月 19th, 2004

經常我們為了保護客戶端的 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;
}
?>

PHP, 程式筆記 ,