陌小雨不喜欢废话,直接上菜!
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 行以後的內容就是顯示人數的地程式碼,需放到想要顯示的地方。