PHP实用功能分享

Author: 陌小雨Date: 2016-08-20View: 72

陌小雨不喜欢废话,直接上菜!

1、PHP 使用 JSON

PHP 要使用 JSON 很方便, 只要用內建的 json_encode() 及 json_decode() 函式就可以, 以下簡單例子是在 PHP 用 json_encode() 輸出 JSON 資料:

<?php
$lang = array('PHP', 'Perl', 'Python');
?>
 
<script type="text/javascript">
// pass PHP variable declared above to JavaScript variable
var lang = <?php echo json_encode($lang); ?>;
</script>

上面的第 7 行, 用 json_encode() 函式输出$lang 的 JSON 資料, 然後放到 JavaScript 的變數。

如果反過來的話, 要將 JSON 資料傳送給 PHP, 那麼可以用 json_decode() 函就, 例如:

<?php
$lang = array('PHP', 'Perl', 'Python');
 
### $json_lang 會變成 ["PHP","Perl","Python"]
$json_lang = json_encode($lang);
 
### $original_lang 會變回跟 $lang 一樣
$original_lang = json_decode($json_lang);
?>

 2、PHP 用 CURL 传送 POST 及 GET 表单

PHP 要擷取遠端網頁或者傳送 GET 請求可以用 file_get_contents() 函式做, 但如果要發送 POST 請求, 例如自動填寫表單等, 就可以用 CURL 實現。以下 PHP 的 CURL 模組發送 POST 及 GET 的方法:

PHP 傳送 GET 請求

如果只是傳送 GET 請求, 用 file_get_contents() 會較簡單, 只需在網址後面加上 GET 的名稱及值就可以, 例如:

<?php
$url = "http://localhost/path.php?get_var=test";
echo file_get_contents($url);
>

上面會用 file_get_contents() 函式傳送 GET 請求到 http://localhost/path.php, 名稱是 get_var, 值是 test.

如果用 CURL 是這樣做:

<?php
$url = "http://localhost/path.phpget_var=test";
 
$ch = curl_init();
 
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
 
curl_close($ch);
 
echo $output;
?>

PHP 傳送 POST 請求

要用 CURL 多數因為要傳送 POST, 例如自動傳送表單, 以下是簡單例子:

<?php
$url = "http://localhost/path.php";
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array("abc"=>"123", "def"=>"456"))); 
$output = curl_exec($ch); 
curl_close($ch);
 
echo $output;
?>

上面第 6 行用 CURLOPT_POST 宣告啟用 POST 內容, 而第 7 行用到 http_build_query 函式, 將陣列內容轉換成類似 GET 變數的格式, 即 abc=123&def=456。

有種情況是表單禁止用 PHP 等程式傳送, 那便需要用 CURL 自訂 user agent, 只要在 curl_exec 前入這行就可以了:

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0');

 3、PHP 判斷字串是否有中文

<?php
$string = '中文測試';
 
if (mb_strlen($string, mb_detect_encoding($string)) == strlen($string)) {
    echo "有中文";
} else {
    echo "沒有中文";
}
?>

 4、PHP 檢查 Email 及 URL 格式

要檢查 Email 及 URL 格式可以用正規表達式來做, 以下兩個正規表達式分別可以檢查 Email 及 URL 的格式是否正確。但要留意, 以下程式碼只會檢查格式, 而不會檢查兩者的有效性, 要檢查有效性及真實性需要用其他方法。

PHP 檢查 Email 格式

<?php
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $_POST["email"])) {
    echo "Wrong Email Format!"; 
}
?>

PHP 檢查 URL 格式

<?php
if (!preg_match("/\b(:(:https|ftp):\/\/|www\.)[-a-z0-9+&@#\/%=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $_POST['url'])) {
    echo "Wrong URL"; 
}
?>

5、PHP 取得用戶真實 IP

要用 PHP 取得用戶的 IP 十分容易,只要用 $_SERVER[‘REMOTE_ADDR’] 變數就可以知道用戶的 IP,但如果用戶使用了 proxy server 上網的話,$_SERVER[‘REMOTE_ADDR’] 只會得到 proxy 的 IP 地址。

以下方法會使用 $_SERVER[“HTTP_CLIENT_IP”] 及 $_SERVER[“HTTP_X_FORWARDED_FOR”] 解決這個問題:

<?php
if (!empty($_SERVER["HTTP_CLIENT_IP"])){
    $ip = $_SERVER["HTTP_CLIENT_IP"];
}elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
    $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}else{
    $ip = $_SERVER["REMOTE_ADDR"];
}
     
echo $ip;
?>

6、PHP實現阻擋 ip

如果發現某些 ip 的用戶在網站上搗亂,可以將他/她的 ip 封殺,這不但可以停止搗亂行為,也可以減少主機的資源浪費及頻寬,以下介紹透過 PHP 及 Apache 的 .htaccess 的實現方法。

如果要阻擋的 ip 不多,可以直接加上以下一行到程式頂端:

<?php
if($_SERVER['REMOTE_ADDR'] == "192.168.1.101"){
    exit();
}
?>

以上程式碼很簡單,只要檢查訪客的 ip 是否 192.168.1.101,如果正確則結束程式罷了,但這樣的問題是當要阻擋的 ip 數量增多時,需要每次都在以上程式碼上加上 ip,要維護很不方便。以下的方法是使用文字檔儲存了要阻擋的 ip,每一行一筆資料,檔案為 ban_ip_list.dat,實現方法如下:

<?php
$banned = file("ban_ip_list.dat");
if(in_array($_SERVER['REMOTE_ADDR'], $banned)){
    echo "You have been banned.";
    exit();
}
?>

以上第一行是從 ban_ip_list.dat 讀入每一行資料,並儲存到 $banned 陣列內,然後用 in_array() 檢查訪客的 ip 如果在陣列內,則印出 “You have been banned.”,並且結束程式。

7、PHP 建立 Excel 檔案

有時需要將資料庫內的資料或 PHP 的動態內容儲存成 excel 檔,本文會介紹一個概簡單又實用的方法。

如果需要用 PHP 建立 Excel 檔案,只需用一般的檔案處理函式,而檔案名稱儲存成 .xls 副檔名即可,例如:

<?php
$fp = fopen("excel/filename.xls", "w");
fputs($fp, "Mon\tTue\tWed\tThu\tFri\tSat\tSun");
fclose($fp);
?>

以上程式碼會在 excel 目錄建立一個名為 filename.xls 的檔案,內容是在第一行寫入一星期七天的英文簡寫,每一欄一天。

實際上與建立一般文字檔的方法一樣,只是如果要跳到下一個欄位,就用 \t 字元,而要跳到下一行,則用 \n 字元。

顯示下載窗口:如果電腦內有安裝 Excel 的話,在預設情況下當在 IE 按了 .xls 副檔名的文件時,IE 不會彈出下載窗口,而是直接顯示內容,以下兩個例子可避免這情況:

直接將內容輸出給瀏覽器下載:

<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=php_excel.xls");
 
echo "Mon\tTue\tWed\tThu\tFri\tSat\tSun"
?>

讀取已存在的檔案給瀏覽器下載:

<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=php_excel.xls");
 
readfile("excel/filename.xls");
?>

上面使用了 header() 傳送檔頭資訊給瀏覽器,可使瀏覽器出現下載窗口,而預設儲存的檔案名稱是 php_excel.xls。

8、PHP 判斷智能手機及平板電腦

判斷用戶是否用手機訪問網站後, 可以根據用戶的系統, 決定顯示一般大小的網頁, 或者手機及平板電腦的專屬網頁。

用 PHP 要判斷用戶是否用流動裝置訪問, 最簡單的方法是通過 $_SERVER[‘HTTP_USER_AGENT’] 檢查。每部電腦或者每個瀏覽器都有不同的 User Agent, 而 $_SERVER[‘HTTP_USER_AGENT’] 就是紀錄了用戶的 User Agent, 下面是常用手機的 User Agent 會出現的字串:

iPhone: 用 “iPhone” 作為判斷字串.

iPad: 用 “iPad” 作為判斷字串.

Android: 用 “Android” 作為判斷字串.

Windows Phone: 用 “Windows Phone” 作為判斷字串.

Black Berry: 用 “BlackBerry” 作為判斷字串.

然後用以下程式碼判斷用戶的裝置:

<?php
$iphone        = strstr($_SERVER['HTTP_USER_AGENT'], "iPhone");
$ipad          = strstr($_SERVER['HTTP_USER_AGENT'], "iPad");
$android       = strstr($_SERVER['HTTP_USER_AGENT'], "Android");
$windows_phone = strstr($_SERVER['HTTP_USER_AGENT'], "Windows Phone");
$black_berry   = strstr($_SERVER['HTTP_USER_AGENT'], "BlackBerry");
 
if ($iphone) {
    // iPhone 網頁
} elseif ($ipad) {
    // iPad 網頁
} elseif ($android) {
    // Android 網頁
} elseif ($windows_phone) {
    // Windows Phone 網頁
} elseif ($black_berry) {
    // Black Berry 網頁
} else {
    // 一般網頁
}
?>

上面程式碼會判斷用戶的上網裝置, 然後可以按需要顯示不同的網頁, 但上面只列出部份常用流動裝置的 User Agent。

9、PHP 發送 HTML 電郵

用 PHP 發送純文字 Email 很簡單, 但如果要發送一封 HTML 格式的 Email, 只需要在 mail() 裡面加入 MIME 版本及 Content-type header 就可以完成, 要注意的是如果發送的是中文電郵, 需要指定使用的 charset, 以下是發送 HTML Email 簡單的例子:

<?php
### 使用 UTF-8 編碼
$charset = 'UTF-8';
 
### 收件電郵
$to = 'to@email.com';
 
### 寄件電郵
$from = 'me@email.com'
 
### 主旨
$subject = 'HTML format email';
 
### 電郵內容
$message = '<h1>This is a HTML email</h1>';
 
$headers = "From: $from\r\n" .
           "MIME-Version: 1.0\r\n" .
           "Content-type: text/html; charset=$charset\r\n";
 
### 傳送 email
mail($to, $subject, $message, $headers);
?>

以上用的方法是直接使用 mail() 函式, 再定義 MIME 及 Content-type 來傳送 HTML 電郵, 如果用 PHPMailer 的話會更簡單:

<?php
$mail->Subject = $Subject;
$mail->Body    = $Body;
$mail->IsHTML(true);  
?>

10、PHP解決 UTF-8 網頁亂碼

用 PHP 的 header() 向瀏覽器宣告使用 UTF-8 編碼, 但這行要放在程式開端, 輸出內容前插入:

<?php
header("Content-Type:text/html; charset=utf-8");
?>

11、製作簡單 PHP 計數器
在網站上其中一樣最常見的程式是計數器,本文將會講述如何製作一個簡單的 PHP 計數器,包括文字及圖形兩種顯示模式。

準備工作
計數器的原理十分簡單,只要使用資料庫或文字檔儲存瀏覽人數,當有新訪客時便將人數加 1。因為只要單純紀錄瀏覽人數,所以會介紹使用使用文字檔,這樣即使沒有 MySQL 資料庫也可以做到。

首先建立一個文字檔,例如 “counter.dat”,裡面只包含一個數目字 “0”,記得要將它 chmod 777,這樣 php 才可更新人數。

文字計數器

現在開始了,以下是紀錄人數的例子:

<?php
$counter = intval(file_get_contents("counter.dat"));
 
if (!isset($_COOKIE['visitor'])) {
    $counter++;
    $fp = fopen("counter.dat", "w");
    flock($fp, LOCK_EX);   // do an exclusive lock
    fwrite($fp, $counter);
    flock($fp, LOCK_UN);   // release the lock
    fclose($fp);
    setcookie("visitor", 1, time()+3600);
}
echo "Visitors: " . $counter;
?>

以上的 if(!isset($_COOKIE[‘visitor’])) 這句會檢查是否存在 $_COOKIE[‘visitor’] 變數,如果不存在的話才寫入紀錄。flock($fp, LOCK_EX); 是將 counter.dat 鎖定,避免其他程式寫入檔案。flock($fp, LOCK_UN); 就是解除先前的鎖定。

圖形計數器

上面的程式碼已經可以製作一個簡單的計數器,但只是文字,如果想改由圖片顯示的話,先要用圖像編輯軟件製作 0 至 9 的圖片,名稱分別是 0.gif, 1.gif, 2.gif …… 9.gif。然後將檔案放到 images 目錄,並將以上程式碼改成:

<?php
$counter = intval(file_get_contents("counter.dat"));
 
if (!isset($_COOKIE['visitor'])) {
    $counter++;
    $fp = fopen("counter.dat", "w");
    flock($fp, LOCK_EX);   // do an exclusive lock
    fwrite($fp, $counter);
    flock($fp, LOCK_UN);   // release the lock
    fclose($fp);
    setcookie("visitor", 1, time()+3600);
}
 
// display image counter
strval($counter);
for ($i=0; $i<strlen($counter); $i++) {
    echo "<img src='images/" . substr($counter, $i, 1) . ".gif' border='0'>";
}
?>

注意事項:不論是文字顯示或圖片顯示,以上的程式碼由第 1 行到第 12 到均需放置在頁面的最頂部,不然會發生錯誤。而第 12 行以後的內容就是顯示人數的地程式碼,需放到想要顯示的地方。