顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2010年3月22日 星期一

在javascript中抓取陣列資料

記錄在javascript中如何取得在HTML中的陣列資料
以及如何將之讀取出來


一般來說,我們在javascript裡使用的陣列型態的方法如下
例:

//宣告
var url_arr=new Array('software.sopili.net','dev.sopili.net');
//讀取
for(var i in url_arr){document.write(url_arr[i]+'
');}

那,如果想要像php一樣,array的key值是用字串
例:

$url_arr=Array('software'=>'software.sopili.net','dev'=>'dev.sopili.net');
foreach($url_arr as $key=>$value){
echo $key."
";
//重點是 key,有時候非常的需要key這個值,然後是字串型態
}


這時候要用JSON的格式
例:

//宣告
var url_arr={'software':'software.sopili.net','dev':'dev.sopili.net'};
//讀取
for(var key in url_arr){
//這裡面的key值,就真的是字串了!
document.write(url_arr[key]+'
');
}

接下來,要如何從html裡面讀取陣列的值呢?
假使資料來源如下:

<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />

PHP的用法很簡單,直接使用"education"這個名稱就好
例:

foreach($_POST['education'] as $key=>$value) echo $key.' '.$value;

javascript的麻煩一點,但差不多的用法
例:

var mutli_education = document.form_name.elements["education[]"];
for(i=0;i < mutli_education.length;i++){ alert(mutli_education[i].value);}


參考資料:
1.http://dev.sopili.net/2008/11/javascriptarraykey_6376.html
2.http://roshanbh.com.np/2008/08/handling-array-html-form-elements-javascript-php.html
記錄在javascript中如何取得在HTML中的陣列資料
以及如何將之讀取出來


一般來說,我們在javascript裡使用的陣列型態的方法如下
例:

//宣告
var url_arr=new Array('software.sopili.net','dev.sopili.net');
//讀取
for(var i in url_arr){document.write(url_arr[i]+'
');}

那,如果想要像php一樣,array的key值是用字串
例:

$url_arr=Array('software'=>'software.sopili.net','dev'=>'dev.sopili.net');
foreach($url_arr as $key=>$value){
echo $key."
";
//重點是 key,有時候非常的需要key這個值,然後是字串型態
}


這時候要用JSON的格式
例:

//宣告
var url_arr={'software':'software.sopili.net','dev':'dev.sopili.net'};
//讀取
for(var key in url_arr){
//這裡面的key值,就真的是字串了!
document.write(url_arr[key]+'
');
}

接下來,要如何從html裡面讀取陣列的值呢?
假使資料來源如下:

<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />

PHP的用法很簡單,直接使用"education"這個名稱就好
例:

foreach($_POST['education'] as $key=>$value) echo $key.' '.$value;

javascript的麻煩一點,但差不多的用法
例:

var mutli_education = document.form_name.elements["education[]"];
for(i=0;i < mutli_education.length;i++){ alert(mutli_education[i].value);}


參考資料:
1.http://dev.sopili.net/2008/11/javascriptarraykey_6376.html
2.http://roshanbh.com.np/2008/08/handling-array-html-form-elements-javascript-php.html

2009年3月2日 星期一

php的serialize與unserialize

今天遇到一個小問題...
用serialize記下來的資料,在用unserialize轉回原本的型態時..
若有遇到 " (雙引號[double question mark]) 會無法解析回原本的php變數型態

可以在使用serialized轉換前,用 htmlspecialchars()urlencode() 來解決這個問題
但較好的方式是用htmlspecialchars(),這樣的好處是不用再用urldecode()來把它轉換回正常的文字
==========================================================

2010.01.11更新
由於要顯示在textbox裡,用上述方法還是會有漏洞
試了很久,下面這順序應該是比較理想
1.寫入資料庫時,只做urlencode(若要使用addslashes,則在這之前)
  例:$a=urlencode(addslashes($text));
2.前端顯示時,則先解開,然後將slashes去掉,再用htmlspecialchars
  例:$a=htmlspecialchars(stripslashes(urldecode($dbValue)));


稍微記載一下這二者的說明


serialize --- 產生一個可儲存的值的表示
語法 : string serialize (mixed value)
說明 :
serialize( )傳回一個包含由value所表示的byte-stream字串,它能儲存在任何地方。
這可用來儲存或傳遞PHP的值,而不失去它們的型態和結構。
使用unserialize( )能使serialized字串再次成為原來PHP的值。
serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized,但方法則會lose)

unserialize --- 從儲存的值中建立PHP的值
語法 : mixed unserialize (string str)
說明 :
unserialize( )取一個serialized變數,並且將它轉換回PHP的值,傳回轉換後的值,
可以是integer、double、string、array、object。
如果物件有serialized,則它的方法不會保存在所傳回的值之中。


今天遇到一個小問題...
用serialize記下來的資料,在用unserialize轉回原本的型態時..
若有遇到 " (雙引號[double question mark]) 會無法解析回原本的php變數型態

可以在使用serialized轉換前,用 htmlspecialchars()urlencode() 來解決這個問題
但較好的方式是用htmlspecialchars(),這樣的好處是不用再用urldecode()來把它轉換回正常的文字
==========================================================

2010.01.11更新
由於要顯示在textbox裡,用上述方法還是會有漏洞
試了很久,下面這順序應該是比較理想
1.寫入資料庫時,只做urlencode(若要使用addslashes,則在這之前)
  例:$a=urlencode(addslashes($text));
2.前端顯示時,則先解開,然後將slashes去掉,再用htmlspecialchars
  例:$a=htmlspecialchars(stripslashes(urldecode($dbValue)));


稍微記載一下這二者的說明


serialize --- 產生一個可儲存的值的表示
語法 : string serialize (mixed value)
說明 :
serialize( )傳回一個包含由value所表示的byte-stream字串,它能儲存在任何地方。
這可用來儲存或傳遞PHP的值,而不失去它們的型態和結構。
使用unserialize( )能使serialized字串再次成為原來PHP的值。
serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized,但方法則會lose)

unserialize --- 從儲存的值中建立PHP的值
語法 : mixed unserialize (string str)
說明 :
unserialize( )取一個serialized變數,並且將它轉換回PHP的值,傳回轉換後的值,
可以是integer、double、string、array、object。
如果物件有serialized,則它的方法不會保存在所傳回的值之中。


2008年5月14日 星期三

PHP週報-摘錄

剛好發現這一系列年代久遠的PHP週報
做些連結的記錄
以後有時間再把它備份起來


第1期
PHP-專欄:PHP 深度歷險(一) - 初試啼聲(羅文辰)
PHP-專欄:PostgreSQL 與 PHP (1) - 概念篇(生猛海鮮 mooncake)
PHP-模組:Python in PHP (PiP)(小企鵝)
PHP-生活:職業婦女-一位女工程師的生活經驗談(王宣懿)
PHP-工具:Dev-PHP 1.0.1 (黃子豪)

第2期 (要等久一點才會有反應)
PHP-專欄:PHP 深度歷險(二) - Regular Expression in PHP(羅文辰)
PHP-專欄:PostgreSQL 與 PHP (2) - 從基本開始(生猛海鮮 mooncake)
PHP-模組:Win32 API(小企鵝)
PHP-工具:QaDRAM Studio PR1 build 0.1.0.933(黃子豪)

第3期
PHP-特輯:PHP-GTK介紹與入門(無敵鐵金剛 Robins)
PHP-專欄:PHP 深度歷險(三) - Regular Expression in PHP之二(羅文辰)
PHP-專欄:PostgreSQL 與 PHP (3) - 正規表示法(生猛海鮮 mooncake)
PHP-實做:PHP 檔案上傳講座(劉永之 ulyssesliu)
PHP-模組:Simple DirectMedia Layer (SDL) (首部曲) - 圖片展示撥放(小企鵝 noon)
PHP-工具 - phpEd v2.95.1.5 (昨日 Yesterday)

第4期
PHP-專欄:PHP 深度歷險(四) - Regular Expression in PHP之三(羅文辰)
PHP-模組:Simple DirectMedia Layer (SDL) (二部曲) - 影片撥放(小企鵝 noon)
PHP-新訊:PHP-GTK,New CHM format of the PHP Manual(小企鵝 noon)

第5期
PHP-模組:php_gtk_libglade(小企鵝 noon)

第6期
PHP-專欄:session,使用資料庫(無敵鐵金剛 Robins)

第7期
模組:PHP加密編碼--bcompile類別(大大忠仔 linccg@msn.com)

第8期
Just for fun 用中文寫PHP(小企鵝 大大忠仔)
軟體推薦:HAPedit v2.4.6.82(昨日 yesterday@mail2000.com.tw)
寫一個PHP程式來下載檔案(rocet rocet@mail2.fcsh.khc.edu.tw)
小小MIS週記(旅途 jazzray@gigigaga.com)

第9期
我的 PHP 程式設計的風格與技巧(羅文辰)
TGB-Takor GuestBook 軟體發表(Takol Liu)
PHP-GTK 0.52 釋出了(PHP週報特派記者 大大忠仔)

第10期
PHP ADODB 1.99版手冊中文翻譯(Tripc)

第11期
小小MIS週記 II(旅途 jazzray@gigigaga.com)
Jargon File 字典查詢器(小企鵝 noon@ms8.url.com.tw)
檢視原始碼的方法(大大忠仔 linccg@msm.com)

第12期
專欄:使用 Gopher 通訊協定看文章 (上) - 小企鵝
函數:Output Control Functions - 無敵鐵金剛
實務:圖解任務計劃程序在 PHP的妙用(WIN篇) - Ptker
軟件:n@board + n@log EasyPack 輕鬆架站包 v1.0tc (繁體中文版) - 驚直

第13期
專欄:使用 Gopher 通訊協定看文章 (下) - 小企鵝
實務:Output Control - 我的templet - H2O
模組:PHP 程式碼的加解密 - SCREW - 小忠忠
新書:PHP 之戀 - 小企鵝 & 小忠忠

第14期
專欄:舞動奇蹟 - 小企鵝
實務:DBShow - JEAN
實務:利用php_gettext來實現PHP的國際化編程 - Ptker
實務:WHOIS - mooncake

剛好發現這一系列年代久遠的PHP週報
做些連結的記錄
以後有時間再把它備份起來


第1期
PHP-專欄:PHP 深度歷險(一) - 初試啼聲(羅文辰)
PHP-專欄:PostgreSQL 與 PHP (1) - 概念篇(生猛海鮮 mooncake)
PHP-模組:Python in PHP (PiP)(小企鵝)
PHP-生活:職業婦女-一位女工程師的生活經驗談(王宣懿)
PHP-工具:Dev-PHP 1.0.1 (黃子豪)

第2期 (要等久一點才會有反應)
PHP-專欄:PHP 深度歷險(二) - Regular Expression in PHP(羅文辰)
PHP-專欄:PostgreSQL 與 PHP (2) - 從基本開始(生猛海鮮 mooncake)
PHP-模組:Win32 API(小企鵝)
PHP-工具:QaDRAM Studio PR1 build 0.1.0.933(黃子豪)

第3期
PHP-特輯:PHP-GTK介紹與入門(無敵鐵金剛 Robins)
PHP-專欄:PHP 深度歷險(三) - Regular Expression in PHP之二(羅文辰)
PHP-專欄:PostgreSQL 與 PHP (3) - 正規表示法(生猛海鮮 mooncake)
PHP-實做:PHP 檔案上傳講座(劉永之 ulyssesliu)
PHP-模組:Simple DirectMedia Layer (SDL) (首部曲) - 圖片展示撥放(小企鵝 noon)
PHP-工具 - phpEd v2.95.1.5 (昨日 Yesterday)

第4期
PHP-專欄:PHP 深度歷險(四) - Regular Expression in PHP之三(羅文辰)
PHP-模組:Simple DirectMedia Layer (SDL) (二部曲) - 影片撥放(小企鵝 noon)
PHP-新訊:PHP-GTK,New CHM format of the PHP Manual(小企鵝 noon)

第5期
PHP-模組:php_gtk_libglade(小企鵝 noon)

第6期
PHP-專欄:session,使用資料庫(無敵鐵金剛 Robins)

第7期
模組:PHP加密編碼--bcompile類別(大大忠仔 linccg@msn.com)

第8期
Just for fun 用中文寫PHP(小企鵝 大大忠仔)
軟體推薦:HAPedit v2.4.6.82(昨日 yesterday@mail2000.com.tw)
寫一個PHP程式來下載檔案(rocet rocet@mail2.fcsh.khc.edu.tw)
小小MIS週記(旅途 jazzray@gigigaga.com)

第9期
我的 PHP 程式設計的風格與技巧(羅文辰)
TGB-Takor GuestBook 軟體發表(Takol Liu)
PHP-GTK 0.52 釋出了(PHP週報特派記者 大大忠仔)

第10期
PHP ADODB 1.99版手冊中文翻譯(Tripc)

第11期
小小MIS週記 II(旅途 jazzray@gigigaga.com)
Jargon File 字典查詢器(小企鵝 noon@ms8.url.com.tw)
檢視原始碼的方法(大大忠仔 linccg@msm.com)

第12期
專欄:使用 Gopher 通訊協定看文章 (上) - 小企鵝
函數:Output Control Functions - 無敵鐵金剛
實務:圖解任務計劃程序在 PHP的妙用(WIN篇) - Ptker
軟件:n@board + n@log EasyPack 輕鬆架站包 v1.0tc (繁體中文版) - 驚直

第13期
專欄:使用 Gopher 通訊協定看文章 (下) - 小企鵝
實務:Output Control - 我的templet - H2O
模組:PHP 程式碼的加解密 - SCREW - 小忠忠
新書:PHP 之戀 - 小企鵝 & 小忠忠

第14期
專欄:舞動奇蹟 - 小企鵝
實務:DBShow - JEAN
實務:利用php_gettext來實現PHP的國際化編程 - Ptker
實務:WHOIS - mooncake

2008年2月29日 星期五

用PHP函數解決SQL injection

轉錄自
用PHP函数解决SQL injection

SQL injection問題在ASP上可是鬧得沸沸揚揚當然還有不少國內外著名的PHP程式“遇難”。
如果你網站空間的php.ini文件的magic_quotes_gpc設成了off,
那麽PHP就不會自動在敏感字元前加上反斜符號(\),由於表單提交的內容可能含有敏感字元,
如單引號('),就導致了SQL injection的漏洞。
在這種情況下,我們可以用addslashes()來解決問題,它會自動在敏感字元前添加反斜符號。
但是,上面的方法只適用於magic_quotes_gpc=Off的情況。
作爲一個開發者,你不知道每個用戶的magic_quotes_gpc是On還是Off,
如果把全部的資料都用上addslashes(),那不是“濫殺無辜”了?
假如magic_quotes_gpc=On,並且又用了addslashes()函數,那讓我們來看看:


//如果從表單提交一個變數$_POST['message'],內容爲 Tom's book
//這此加入連接MySQL資料庫的代碼,自己寫吧
//在$_POST['message']的敏感字元前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由於magic_quotes_gpc=On,所以又一次在敏感字元前加反斜杠
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";

//發送請求,把內容保存到資料庫內
$query = mysql_query($sql);

//如果你再從資料庫內提取這個記錄並輸出,就會看到 Tom\'s book
?>

這樣的話,在magic_quotes_gpc=On的環境,所有輸入的單引號(')都會變成(\')……
其實我們可以用get_magic_quotes_gpc()函數輕易地解決這個問題。
當magic_quotes_gpc=On時,該函數返回TRUE;當magic_quotes_gpc=Off時,返回FALSE。
至此,肯定已經有不少人意識到:問題已經解決。請看

//如果magic_quotes_gpc=Off,那就爲提單提交的$_POST['message']的敏感字元加反斜杠
//magic_quotes_gpc=On的情況下,則不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

其實說到這,問題已經解決。下面再說一個小技巧。
有時表單提交的變數不止一個,可能有十幾個,幾十個。
那麽一次一次地複製/粘帖addslashes(),是否麻煩了一點?
由於從表單或URL獲取的資料都是以陣列形式出現的,如$_POST、$_GET
那就自定義一個可以“橫掃千軍”的函數:

function quotes($content)
{
//如果magic_quotes_gpc=Off,那麽就開始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否爲陣列
if (is_array($content)) {
//如果$content是陣列,那麽就處理它的每一個單無
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是陣列,那麽就僅處理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那麽就不處理
}
//返回$content
return $content;
}
?>



轉錄自
用PHP函数解决SQL injection

SQL injection問題在ASP上可是鬧得沸沸揚揚當然還有不少國內外著名的PHP程式“遇難”。
如果你網站空間的php.ini文件的magic_quotes_gpc設成了off,
那麽PHP就不會自動在敏感字元前加上反斜符號(\),由於表單提交的內容可能含有敏感字元,
如單引號('),就導致了SQL injection的漏洞。
在這種情況下,我們可以用addslashes()來解決問題,它會自動在敏感字元前添加反斜符號。
但是,上面的方法只適用於magic_quotes_gpc=Off的情況。
作爲一個開發者,你不知道每個用戶的magic_quotes_gpc是On還是Off,
如果把全部的資料都用上addslashes(),那不是“濫殺無辜”了?
假如magic_quotes_gpc=On,並且又用了addslashes()函數,那讓我們來看看:


//如果從表單提交一個變數$_POST['message'],內容爲 Tom's book
//這此加入連接MySQL資料庫的代碼,自己寫吧
//在$_POST['message']的敏感字元前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由於magic_quotes_gpc=On,所以又一次在敏感字元前加反斜杠
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";

//發送請求,把內容保存到資料庫內
$query = mysql_query($sql);

//如果你再從資料庫內提取這個記錄並輸出,就會看到 Tom\'s book
?>

這樣的話,在magic_quotes_gpc=On的環境,所有輸入的單引號(')都會變成(\')……
其實我們可以用get_magic_quotes_gpc()函數輕易地解決這個問題。
當magic_quotes_gpc=On時,該函數返回TRUE;當magic_quotes_gpc=Off時,返回FALSE。
至此,肯定已經有不少人意識到:問題已經解決。請看

//如果magic_quotes_gpc=Off,那就爲提單提交的$_POST['message']的敏感字元加反斜杠
//magic_quotes_gpc=On的情況下,則不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

其實說到這,問題已經解決。下面再說一個小技巧。
有時表單提交的變數不止一個,可能有十幾個,幾十個。
那麽一次一次地複製/粘帖addslashes(),是否麻煩了一點?
由於從表單或URL獲取的資料都是以陣列形式出現的,如$_POST、$_GET
那就自定義一個可以“橫掃千軍”的函數:

function quotes($content)
{
//如果magic_quotes_gpc=Off,那麽就開始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否爲陣列
if (is_array($content)) {
//如果$content是陣列,那麽就處理它的每一個單無
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是陣列,那麽就僅處理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那麽就不處理
}
//返回$content
return $content;
}
?>



2008年2月13日 星期三

PHP 程式效能優化的 40 條建議

引用自 PHP 程式效能優化的 40 條建議
使用 str_replace > preg_replace, 但是 strstr 又比 str_replace 快, $row['id'] 比 $row[id] 快 7 倍, 雖然有些龜毛了點, 偶爾注意一下也不錯~ :)

原文: 40 Tips for optimizing your php code

轉載自翻譯: 優化PHP程式的40條建議

  1. 如果一個方法可靜態化,就對它做靜態聲明。速率可提升至4倍
  2. echo 比 print 快
  3. 使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接
  4. 在執行for循環之前確定最大循環數,不要每循環一次都計算最大值
  5. 註銷那些不用的變量尤其是大數組,以便釋放內存
  6. 盡量避免使用__get,__set,__autoload
  7. require_once()代價昂貴
  8. 在包含文件時使用完整路徑,解析操作系統路徑所需的時間會更少
  9. 如果你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER['REQUEST_TIME']要好於time()
  10. 函數代替正則表達式完成相同功能
  11. str_replace函數比preg_replace函數快,但strstr函數的效率是str_replace函數的四倍
  12. 如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換程式,使得每次傳遞參數是一個字元,而不是只寫一行程式接受數組作為查詢和替換的參數
  13. 使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句
  14. 用@屏蔽錯誤消息的做法非常慢
  15. 打開apache的mod_deflate模塊
  16. 資料庫連接當使用完畢時應關掉
  17. $row['id']的效率是$row[id]的7倍
  18. 錯誤訊息代價昂貴
  19. 盡量不要在for循環中使用函數,比如for ($x=0; $x <>
  20. 在function中遞增局部變量,速度是最快的。幾乎與在函數中調用局部變量的速度相當
  21. 遞增一個全局變量要比遞增一個局部變量慢2倍
  22. 遞增一個物件屬性(如:$this->prop++)要比遞增一個局部變量慢3倍
  23. 遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍
  24. 僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變量)。PHP大概會檢查看是否存在全局變量
  25. 方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化
  26. 派生類中的方法運行起來要快於在基類中定義的同樣的方法
  27. 調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變量遞增操作。類似的方法調用所花費的時間接近於15次的局部變量遞增操作
  28. 用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變量,單引號則不會。當然,只有當你不需要在字元串中包含變量時才可以這麼做
  29. 輸出多個字元串時,用逗號代替句點來分隔字元串,速度更快。注意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)
  30. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本
  31. 除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷
  32. 盡量做緩存,可使用memcached。memcached是一款高性能的內存物件緩存系統,可用來加速動態Web應用程式,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯
  33. 當操作字元串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字元串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫),會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的程式
    舉例如下:
    if (strlen($foo) <>
  34. 當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的網際網路服務提供商(ISPs)和服務器
  35. 並不是所有都要使用OOP,面向物件往往開銷很大,每個方法和物件調用都會消耗很多Memory
  36. 並非要用 class 實現所有的數據結構,數組也很有用
  37. 不要把方法細分得過多,仔細想想你真正打算重用的是哪些程式?
  38. 當你需要時,你總能把程式分解成方法
  39. 盡量採用大量的PHP內置函數
  40. 如果在程式中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們
  41. 評估檢驗(profile)你的程式。檢驗器會告訴你,程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式,評估檢驗總體上可以顯示出程式的瓶頸
  42. mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%
  43. 另一篇優化PHP的精彩文章,由John Lim撰寫

引用自 PHP 程式效能優化的 40 條建議
使用 str_replace > preg_replace, 但是 strstr 又比 str_replace 快, $row['id'] 比 $row[id] 快 7 倍, 雖然有些龜毛了點, 偶爾注意一下也不錯~ :)

原文: 40 Tips for optimizing your php code

轉載自翻譯: 優化PHP程式的40條建議

  1. 如果一個方法可靜態化,就對它做靜態聲明。速率可提升至4倍
  2. echo 比 print 快
  3. 使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接
  4. 在執行for循環之前確定最大循環數,不要每循環一次都計算最大值
  5. 註銷那些不用的變量尤其是大數組,以便釋放內存
  6. 盡量避免使用__get,__set,__autoload
  7. require_once()代價昂貴
  8. 在包含文件時使用完整路徑,解析操作系統路徑所需的時間會更少
  9. 如果你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER['REQUEST_TIME']要好於time()
  10. 函數代替正則表達式完成相同功能
  11. str_replace函數比preg_replace函數快,但strstr函數的效率是str_replace函數的四倍
  12. 如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換程式,使得每次傳遞參數是一個字元,而不是只寫一行程式接受數組作為查詢和替換的參數
  13. 使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句
  14. 用@屏蔽錯誤消息的做法非常慢
  15. 打開apache的mod_deflate模塊
  16. 資料庫連接當使用完畢時應關掉
  17. $row['id']的效率是$row[id]的7倍
  18. 錯誤訊息代價昂貴
  19. 盡量不要在for循環中使用函數,比如for ($x=0; $x <>
  20. 在function中遞增局部變量,速度是最快的。幾乎與在函數中調用局部變量的速度相當
  21. 遞增一個全局變量要比遞增一個局部變量慢2倍
  22. 遞增一個物件屬性(如:$this->prop++)要比遞增一個局部變量慢3倍
  23. 遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍
  24. 僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變量)。PHP大概會檢查看是否存在全局變量
  25. 方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化
  26. 派生類中的方法運行起來要快於在基類中定義的同樣的方法
  27. 調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變量遞增操作。類似的方法調用所花費的時間接近於15次的局部變量遞增操作
  28. 用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變量,單引號則不會。當然,只有當你不需要在字元串中包含變量時才可以這麼做
  29. 輸出多個字元串時,用逗號代替句點來分隔字元串,速度更快。注意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)
  30. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本
  31. 除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷
  32. 盡量做緩存,可使用memcached。memcached是一款高性能的內存物件緩存系統,可用來加速動態Web應用程式,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯
  33. 當操作字元串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字元串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫),會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的程式
    舉例如下:
    if (strlen($foo) <>
  34. 當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的網際網路服務提供商(ISPs)和服務器
  35. 並不是所有都要使用OOP,面向物件往往開銷很大,每個方法和物件調用都會消耗很多Memory
  36. 並非要用 class 實現所有的數據結構,數組也很有用
  37. 不要把方法細分得過多,仔細想想你真正打算重用的是哪些程式?
  38. 當你需要時,你總能把程式分解成方法
  39. 盡量採用大量的PHP內置函數
  40. 如果在程式中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們
  41. 評估檢驗(profile)你的程式。檢驗器會告訴你,程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式,評估檢驗總體上可以顯示出程式的瓶頸
  42. mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%
  43. 另一篇優化PHP的精彩文章,由John Lim撰寫

PHPMailer郵件函式庫

參考資料來源:實作PHPMailer郵件函式庫


PHPMailer是一個提供電子郵件相關功能的PHP函式庫,功能相當完整,可以讓你很輕鬆的發送郵件。它提供的功能包括:

  • 在發送郵時指定多個收件人,寄送副本,寄送密件副本和回復Email
  • 支援多種郵件編碼包括:8bit,base64,binary和quoted-printable
  • 支持SMTP驗證
  • 支援冗餘SMTP伺服器
  • 支援帶附件的郵件和Html格式的郵件
  • 自定義郵件頭
  • 支援在郵件中嵌入圖片
  • 調試靈活
  • 經測試相容的SMTP伺服器包括:Sendmail,qmail,Postfix,Imail,Exchange等
  • 可運行在任何平臺之上


官方網站
http://phpmailer.sourceforge.net/

下載位址
http://sourceforge.net/project/showfiles.php?group_id=26031

下載下來後,只要引入就可以使用。

以下是一簡單範例及說明:

< ? php //引入文件 require_once("phpmailer/class.phpmailer.php"); //宣告一個PHPMailer物件 $mail = new PHPMailer(); //設定使用SMTP發送 $mail->IsSMTP();
//指定SMTP的服務器位址
$mail->Host = "so-net.net.tw";
//設定SMTP服務的POST
$mail->Port = 25;
//設定為安全驗證方式
$mail->SMTPAuth = true;
//SMTP的帳號
$mail->Username = "xuhao";
//SMTP的密碼
$mail->assword = "********";
//寄件人Email
$mail->From = "xuhao@so-net.net.tw";
//寄件人名稱
$mail->FromName = "大鼻子";
//收件人Email
$mail->AddAddress("bignostriltao@yahoo.com.tw");
//設定收件人的另一種格式("Email","收件人名稱")
$mail->AddAddress("justin@recyclesources.com","阿豪");
//設定密件副本
$mail->AddBCC("bignostriltao@gmail.com");
//回信Email及名稱
$mail->AddReplyTo("xuhao@so-net.net.tw", "大鼻子");
//設定信件字元編碼
$mail->CharSet="utf-8";
//設定信件編碼,大部分郵件工具都支援此編碼方式
$mail->Encoding = "base64";
//設置郵件格式為HTML
$mail->IsHTML(true);
//每50自斷行
$mail->WordWrap = 50;
//傳送附檔
$mail->AddAttachment("upload/temp/filename.zip");
//傳送附檔的另一種格式,可替附檔重新命名
$mail->AddAttachment("upload/temp/filename.zip", "newname.zip");
//郵件標題
$mail->Subject="測試郵件";
//郵件內容
$mail->Body ="這是一封HTML格式的測試信。";
//附加內容
$mail->AltBody = '這是附加的信件內容';
//寄送郵件
if(!$mail->Send()){
echo "郵件無法順利寄出!";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "郵件已經順利寄出!";
?>

參考資料來源:實作PHPMailer郵件函式庫


PHPMailer是一個提供電子郵件相關功能的PHP函式庫,功能相當完整,可以讓你很輕鬆的發送郵件。它提供的功能包括:

  • 在發送郵時指定多個收件人,寄送副本,寄送密件副本和回復Email
  • 支援多種郵件編碼包括:8bit,base64,binary和quoted-printable
  • 支持SMTP驗證
  • 支援冗餘SMTP伺服器
  • 支援帶附件的郵件和Html格式的郵件
  • 自定義郵件頭
  • 支援在郵件中嵌入圖片
  • 調試靈活
  • 經測試相容的SMTP伺服器包括:Sendmail,qmail,Postfix,Imail,Exchange等
  • 可運行在任何平臺之上


官方網站
http://phpmailer.sourceforge.net/

下載位址
http://sourceforge.net/project/showfiles.php?group_id=26031

下載下來後,只要引入就可以使用。

以下是一簡單範例及說明:

< ? php //引入文件 require_once("phpmailer/class.phpmailer.php"); //宣告一個PHPMailer物件 $mail = new PHPMailer(); //設定使用SMTP發送 $mail->IsSMTP();
//指定SMTP的服務器位址
$mail->Host = "so-net.net.tw";
//設定SMTP服務的POST
$mail->Port = 25;
//設定為安全驗證方式
$mail->SMTPAuth = true;
//SMTP的帳號
$mail->Username = "xuhao";
//SMTP的密碼
$mail->assword = "********";
//寄件人Email
$mail->From = "xuhao@so-net.net.tw";
//寄件人名稱
$mail->FromName = "大鼻子";
//收件人Email
$mail->AddAddress("bignostriltao@yahoo.com.tw");
//設定收件人的另一種格式("Email","收件人名稱")
$mail->AddAddress("justin@recyclesources.com","阿豪");
//設定密件副本
$mail->AddBCC("bignostriltao@gmail.com");
//回信Email及名稱
$mail->AddReplyTo("xuhao@so-net.net.tw", "大鼻子");
//設定信件字元編碼
$mail->CharSet="utf-8";
//設定信件編碼,大部分郵件工具都支援此編碼方式
$mail->Encoding = "base64";
//設置郵件格式為HTML
$mail->IsHTML(true);
//每50自斷行
$mail->WordWrap = 50;
//傳送附檔
$mail->AddAttachment("upload/temp/filename.zip");
//傳送附檔的另一種格式,可替附檔重新命名
$mail->AddAttachment("upload/temp/filename.zip", "newname.zip");
//郵件標題
$mail->Subject="測試郵件";
//郵件內容
$mail->Body ="這是一封HTML格式的測試信。";
//附加內容
$mail->AltBody = '這是附加的信件內容';
//寄送郵件
if(!$mail->Send()){
echo "郵件無法順利寄出!";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "郵件已經順利寄出!";
?>

2008年1月22日 星期二

用 PHP 寫 RS232 串列通訊程式

用 PHP 寫 RS232 串列通訊程式 抄來的~~
相信經常在翻 PHP 手冊的人應該都有察覺,PHP 不只是可以用來開發網頁程式而已,很多其他語言能完成的工作 PHP 也都做的到,例如透過 PHP 的 Direct IO Functions 就可以對 Serial port 溝通,而且可以在 Windows 下執行,一般在 Windows 要實做 com port 通訊程式,大多是透過像 VB/VC++/C++ Builder 這類程式所提供的元件來撰寫,不過用 PHP 就可以很快實做出一般的功能囉!
在開始之前要先讓 PHP 支援 dio 才行,5.1.0 版之後已經將 dio 移至 PECL 了,可以到 PHP 官網下載編譯好的 PECL,解壓縮後將裡面的 php_dio.dll 放到 PHP 目錄的 ext 底下,接著修改 php.ini 加入 extension=php_dio.dll 即可。
(上述連結裡已無編釋好的php_dio.dll可供下載,須自行編釋)
可至http://cn.php.net/get/pecl-5.2.6-Win32.zip/from/a/mirror這裡下載

在 Windows 底下讀取 COM1 的例子:

<?php
exec('mode COM1: baud=19200 data=8 stop=1 parity=n');
$fd = dio_open('COM1:', O_RDWR);
while (1) {
$data = dio_read($fd, 1);
if ($data) {
echo $data;
}
}
dio_close($fd);
?>

寫法跟在 Linux 用 C 寫 serial 通訊程式差不多,其中 mode 是 Windows 命令列一個設定 serial port 組態的工具(類似 Linux 的 stty),可以打 mode /? 看詳細說明,設定好傳輸率等,接著用 dio_open 開啟裝置,然後就可以做存取的動作囉!

這裡是公司在用的範例
<?php
import_request_variables("gpc", "");
exec('mode COM1: baud=9600 data=8 stop=1 parity=n');
$fd = dio_open('COM1:', O_RDWR);
date_default_timezone_set( "Asia/Taipei" );
$echoData.="\r\n\r\n\r\n\r\n"; //先空4行
$echoData.=$company_name."\r\n"; //第5行
$echoData.="#".$company_no." ".$company_tel."\r\n"; //第6行
$echoData.=$company_addr."\r\n"; //第7行
$echoData.="\r\n"; //第8行
$echoData.="    ".date("Y/m/d H:i:s")."\r\n"; //日期,買受人,統編
$echoData.="    ".$user_title."\r\n";
$echoData.="    "."統編:".$user_no."\n\r\r\n";
//第12~第27行
$echoData.="網路服務費\r\n";
$echoData.="總共".$totalMoney."元\r\n";
$echoData.="-----------------\r\n";
$echoData.="付款方式:".$pay_method."\r\n";
$echoData.="物件編號:".$object_no."\r\n";
$echoData.="備  註:\r\n"; //1
$echoData.=$line2."\r\n"; //2
$echoData.=$line3."\r\n"; //3
$echoData.=$line4."\r\n"; //4
$echoData.=$line5."\r\n"; //5
$echoData.=$line6."\r\n"; //6
$echoData.=$line7."\r\n"; //7
$echoData.=$line8."\r\n"; //8
$echoData.="-----------------"."\r\n"; //9
//第28,29,30(銷售額,營業稅,總計)
$tax=$totalMoney*0.05;
$no_tax=$totalMoney-$tax;
$echoData.="    ".$no_tax."\r\n";
$echoData.="    ".$tax."\r\n";
$echoData.="    ".$totalMoney."\r\n";
//最後再空四行,以利下一頁再重新列印
$echoData.="\r\n";
$echoData.="\r\n";
$echoData.="\r\n";
$echoData.="\r\n";
dio_write($fd,$echoData);
dio_close($fd);
?>


參考資料:
http://blog.linym.net/archives/187
http://sakerlin.pixnet.net/blog/post/25466334
http://www.chinaunix.net/jh/27/771726.html
http://www.xspace.idv.tw/bo_blog/122
http://www.php.net/manual/zh/ref.dio.php
http://php.mirrors.ilisys.com.au/manual/en/install.pecl.phpize.php
用 PHP 寫 RS232 串列通訊程式 抄來的~~
相信經常在翻 PHP 手冊的人應該都有察覺,PHP 不只是可以用來開發網頁程式而已,很多其他語言能完成的工作 PHP 也都做的到,例如透過 PHP 的 Direct IO Functions 就可以對 Serial port 溝通,而且可以在 Windows 下執行,一般在 Windows 要實做 com port 通訊程式,大多是透過像 VB/VC++/C++ Builder 這類程式所提供的元件來撰寫,不過用 PHP 就可以很快實做出一般的功能囉!
在開始之前要先讓 PHP 支援 dio 才行,5.1.0 版之後已經將 dio 移至 PECL 了,可以到 PHP 官網下載編譯好的 PECL,解壓縮後將裡面的 php_dio.dll 放到 PHP 目錄的 ext 底下,接著修改 php.ini 加入 extension=php_dio.dll 即可。
(上述連結裡已無編釋好的php_dio.dll可供下載,須自行編釋)
可至http://cn.php.net/get/pecl-5.2.6-Win32.zip/from/a/mirror這裡下載

在 Windows 底下讀取 COM1 的例子:

<?php
exec('mode COM1: baud=19200 data=8 stop=1 parity=n');
$fd = dio_open('COM1:', O_RDWR);
while (1) {
$data = dio_read($fd, 1);
if ($data) {
echo $data;
}
}
dio_close($fd);
?>

寫法跟在 Linux 用 C 寫 serial 通訊程式差不多,其中 mode 是 Windows 命令列一個設定 serial port 組態的工具(類似 Linux 的 stty),可以打 mode /? 看詳細說明,設定好傳輸率等,接著用 dio_open 開啟裝置,然後就可以做存取的動作囉!

這裡是公司在用的範例
<?php
import_request_variables("gpc", "");
exec('mode COM1: baud=9600 data=8 stop=1 parity=n');
$fd = dio_open('COM1:', O_RDWR);
date_default_timezone_set( "Asia/Taipei" );
$echoData.="\r\n\r\n\r\n\r\n"; //先空4行
$echoData.=$company_name."\r\n"; //第5行
$echoData.="#".$company_no." ".$company_tel."\r\n"; //第6行
$echoData.=$company_addr."\r\n"; //第7行
$echoData.="\r\n"; //第8行
$echoData.="    ".date("Y/m/d H:i:s")."\r\n"; //日期,買受人,統編
$echoData.="    ".$user_title."\r\n";
$echoData.="    "."統編:".$user_no."\n\r\r\n";
//第12~第27行
$echoData.="網路服務費\r\n";
$echoData.="總共".$totalMoney."元\r\n";
$echoData.="-----------------\r\n";
$echoData.="付款方式:".$pay_method."\r\n";
$echoData.="物件編號:".$object_no."\r\n";
$echoData.="備  註:\r\n"; //1
$echoData.=$line2."\r\n"; //2
$echoData.=$line3."\r\n"; //3
$echoData.=$line4."\r\n"; //4
$echoData.=$line5."\r\n"; //5
$echoData.=$line6."\r\n"; //6
$echoData.=$line7."\r\n"; //7
$echoData.=$line8."\r\n"; //8
$echoData.="-----------------"."\r\n"; //9
//第28,29,30(銷售額,營業稅,總計)
$tax=$totalMoney*0.05;
$no_tax=$totalMoney-$tax;
$echoData.="    ".$no_tax."\r\n";
$echoData.="    ".$tax."\r\n";
$echoData.="    ".$totalMoney."\r\n";
//最後再空四行,以利下一頁再重新列印
$echoData.="\r\n";
$echoData.="\r\n";
$echoData.="\r\n";
$echoData.="\r\n";
dio_write($fd,$echoData);
dio_close($fd);
?>


參考資料:
http://blog.linym.net/archives/187
http://sakerlin.pixnet.net/blog/post/25466334
http://www.chinaunix.net/jh/27/771726.html
http://www.xspace.idv.tw/bo_blog/122
http://www.php.net/manual/zh/ref.dio.php
http://php.mirrors.ilisys.com.au/manual/en/install.pecl.phpize.php

2007年11月29日 星期四

在UltraEdit中作PHP語法檢查

參考自 Dabinn的筆記文章
可以直接在UltraEdit中檢查php語法是否正確的設定
很好用的東東
記下來免得又忘了


Advanced-->Tool Configuration
按Insert

[Command]
Manu Item Name: PHP syntax Check
(PHP5)
Command Line: C:\php\php-win.exe -l -f %F
Working Directory: C:\php\
(PHP4)
Command Line: C:\php\cli\php.exe -l -f %F
Working Directory: C:\php\cli\

[Options]
Program Type: Dos program
v Save active File

[Output]
Command Output: Output to List Box
v Capture Output
Replace select text with: No Replace


設到這樣就已經可以用了
不過去設一下快速鍵會更順手
Advanced-->Configuration-->Key Mapping
找到AdvancedUserTool1
內定快速鍵是Ctrl+Shit+0
改為Alt+S

設定完了
平常按Ctrl+S是存檔
按Alt+S就是存檔並作語法檢查了
語法檢查結果會顯示在UltraEdit底下的視窗中
參考自 Dabinn的筆記文章
可以直接在UltraEdit中檢查php語法是否正確的設定
很好用的東東
記下來免得又忘了


Advanced-->Tool Configuration
按Insert

[Command]
Manu Item Name: PHP syntax Check
(PHP5)
Command Line: C:\php\php-win.exe -l -f %F
Working Directory: C:\php\
(PHP4)
Command Line: C:\php\cli\php.exe -l -f %F
Working Directory: C:\php\cli\

[Options]
Program Type: Dos program
v Save active File

[Output]
Command Output: Output to List Box
v Capture Output
Replace select text with: No Replace


設到這樣就已經可以用了
不過去設一下快速鍵會更順手
Advanced-->Configuration-->Key Mapping
找到AdvancedUserTool1
內定快速鍵是Ctrl+Shit+0
改為Alt+S

設定完了
平常按Ctrl+S是存檔
按Alt+S就是存檔並作語法檢查了
語法檢查結果會顯示在UltraEdit底下的視窗中

2007年9月17日 星期一

PHP 檢查信用卡號碼

以前寫過身份證字號的驗證程式...
自從有信用卡後...就常在想怎麼驗證信用卡號..
今天總算看到了...特別摘錄一下
參考資料來源:PHP 檢查信用卡號碼



PHP:
/* luhn_checker(): This is a small PHP function for checking valid *
* credit card with LUHN algorithm *
* *
* Last updated: 26 August 2007 *
* This is a free PHP script under GNU GPL version 2.0 or above *
* Copyright (C) 2007 Sam Tang *
* Feedback/comment/suggestions : http://www.real-blog.com/ */

function luhn_checker($card_num){
// 將非數字的字串移除
$card_num = preg_replace("/\D|\s/", "", $card_num);

$sum = 0;
for($i=0; $i $digit = substr($card_num, $i, 1);
if(($i % 2) == 0){
// 在單數位置的數值乘 2
$digit = $digit * 2;
}

if ($digit> 9) $digit = $digit - 9;
$sum += $digit;
}

if(($sum % 10) == 0 && strlen($card_num) == 16){
return TRUE;
}else{
return FALSE;
}
}

/* Example
if(luhn_checker("1234567812345678")){
echo "Correct!";
}else{
echo "Wrong card number!";
}
*/
?>

以前寫過身份證字號的驗證程式...
自從有信用卡後...就常在想怎麼驗證信用卡號..
今天總算看到了...特別摘錄一下
參考資料來源:PHP 檢查信用卡號碼



PHP:
/* luhn_checker(): This is a small PHP function for checking valid *
* credit card with LUHN algorithm *
* *
* Last updated: 26 August 2007 *
* This is a free PHP script under GNU GPL version 2.0 or above *
* Copyright (C) 2007 Sam Tang *
* Feedback/comment/suggestions : http://www.real-blog.com/ */

function luhn_checker($card_num){
// 將非數字的字串移除
$card_num = preg_replace("/\D|\s/", "", $card_num);

$sum = 0;
for($i=0; $i $digit = substr($card_num, $i, 1);
if(($i % 2) == 0){
// 在單數位置的數值乘 2
$digit = $digit * 2;
}

if ($digit> 9) $digit = $digit - 9;
$sum += $digit;
}

if(($sum % 10) == 0 && strlen($card_num) == 16){
return TRUE;
}else{
return FALSE;
}
}

/* Example
if(luhn_checker("1234567812345678")){
echo "Correct!";
}else{
echo "Wrong card number!";
}
*/
?>

2007年9月4日 星期二

PHP function: 亂數密碼產生

最近發現我很常在Tsung's Blog那邊挖寶

今天又看到PHP function: 亂數密碼產生這篇~

僅節錄程式部份及其說明

程式有兩個地方可以設定:
  $password_len: 設定密碼長度要多長
  $word: 設定密碼要包含那些字元(密碼會由這些字元去湊, 並產生出來)
  PS:照理說要符合上述所說的安全性, 最好是把符號, 英數字大小寫, 都另外存

    Array 來拼湊(確定一定產生出大小寫和符號), 這個以後再說吧. :P
程式執行方法:
  直接呼叫 generatorPassword(), 接收回傳值就是了.
  ex: $passwd = generatorPassword()

程式碼
<?php
function generatorPassword()
{
$password_len = 7;
$password = '';

// remove o,0,1,l
$word = 'abcdefghijkmnpqrstuvwxyz!@#$%^&*()-=ABCDEFGHIJKLMNPQRSTUVWXYZ<>;{}[]23456789';
$len = strlen($word);

for (
$i = 0; $i < $password_len; $i++) {
$password .= $word[rand() % $len];
}

return
$password;
}

// USAGE:
// echo generatorPassword() . "\n";
?>

最近發現我很常在Tsung's Blog那邊挖寶

今天又看到PHP function: 亂數密碼產生這篇~

僅節錄程式部份及其說明

程式有兩個地方可以設定:
  $password_len: 設定密碼長度要多長
  $word: 設定密碼要包含那些字元(密碼會由這些字元去湊, 並產生出來)
  PS:照理說要符合上述所說的安全性, 最好是把符號, 英數字大小寫, 都另外存

    Array 來拼湊(確定一定產生出大小寫和符號), 這個以後再說吧. :P
程式執行方法:
  直接呼叫 generatorPassword(), 接收回傳值就是了.
  ex: $passwd = generatorPassword()

程式碼
<?php
function generatorPassword()
{
$password_len = 7;
$password = '';

// remove o,0,1,l
$word = 'abcdefghijkmnpqrstuvwxyz!@#$%^&*()-=ABCDEFGHIJKLMNPQRSTUVWXYZ<>;{}[]23456789';
$len = strlen($word);

for (
$i = 0; $i < $password_len; $i++) {
$password .= $word[rand() % $len];
}

return
$password;
}

// USAGE:
// echo generatorPassword() . "\n";
?>

2007年9月3日 星期一

unix-like底下 apache2+php5+mysql5安裝方式

節錄自[分享] unix-like底下 apache2+php5+mysql5安裝方式
感謝acman's 便利地毯的分享

紅字部份為輸入之指令
切換目錄至/usr/local/src ;準備自行編譯
cd /usr/local/src

到以下的官方網站下載需要的版本
MySQL官方網站:http://www.mysql.com
Apache官方網站:http://www.apache.org
PHP官方網站:http://www.php.net

安裝mysqld:mysql-5.0.37
解開tarball
tar -zxvf mysql-5.0.37.tar.gz
切換到解開的目錄下
cd mysql-5.0.37
1.組態:(編譯參數參考原廠doc或是google找其它人的經驗或是依之前經驗)
./configure --prefix=/usr/local/mysql --localstatedir=/home/mysql --with-mysqld-user=mysql --enable-large-files
2.編譯
make
3.安裝
make install
4.複製系統設定檔至指定位置:
cp support-files/my-medium.cnf /etc/my.cnf
5.增加mysqld要使用的user跟group
vi /etc/group
新增一行內容為:mysql:x:60:
vi /etc/passwd
新增一行內容為:mysql:x:60:60:mysql:/home/mysql:/bin/false
6.切換資料夾
cd /usr/local/mysql
7.安裝系統資料庫
bin/mysql_install_db --user=mysql
8.更改目錄權限
chown -R root:mysql /home/mysql
9.啟動 MySql Server
bin/mysqld_safe --user=mysql &
10.更改資料庫管理者的管理密碼("new-password"部分請自行輸入):
bin/mysqladmin -u root password new-password

安裝apache:httpd-2.2.4
切換目錄
cd /usr/local/src
解開tarball
tar -zxvf httpd-2.2.4.tar.gz
切換到解開的目錄下
cd httpd-2.2.4
1.組態:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most --enable-so
祝註:因為我偷懶的原因,所以apache的module是直接掛載,不在httpd.conf中一個一個自行選定是否載入
有空再做自行選擇的部份
2.編譯:
make
3.安裝:
make install

安裝php:php-5.2.1
安裝php前:為讓php support更多模組,以下部份先安裝(常用的)
指令:
gentoo適用:
emerge zlib
emerge libpng
emerge freetype
emerge jpeg
emerge gd
emerge libxml2

自行編譯者:自行找到tarball後(問google),直接組態->編譯->安裝,無需加任何參數
安裝php:php-5.2.1
切換目錄
cd /usr/local/src
解開tarball
tar -jxvf php-5.2.1.tar.bz2
切換到解開的目錄下
cd php-5.2.1

1.組態:
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2.2.4/bin/apxs --with-config-file-path=/usr/local/php --with-mysql=/usr/local/mysql --with-gd --with-jpeg --with-zlib --with-libxml --enable-socket --with-iconv --with-pear --enable-zend-multibyte
這部份同apache,php可以把許多功能都編成extensions,僅載入需要的部份,這也是我偏愛的方式.....不過在這邊也偷懶
2.編譯
make
3.安裝
make install
4. 檢查是否有生成apache需要的php module
ls -al /usr/local/apache2.2.4/modules/libphp5.so
5. 複制php的設定檔
cp /usr/local/src/php-5.2.1/php.ini-dist /usr/local/php/

設定apache的httpd.conf
1. 查看是否有增加這一行
LoadModule php5_module modules/libphp5.so
2.更改admin信箱:
ServerAdmin 你的emailaddress
3.設定伺服器名稱(可以使用dmian:www.ooo.net:80 或 192.168.1.1:80)
ServerName 192.168.1.1:80(用你自己機器的ip address啊)
4.找到DirectoryIndex敘述,設定首頁名稱加上 index.php
DirectoryIndex index.htm index.html index.php
5.找到AddType部份,增加一行:
AddType application/x-httpd-php .php
6.啟動apache
/usr/local/apache2.2.4/bin/apachectl start
7.檢查php是否有正常運作
在/usr/local/apache2.2.4/htdocs/底下新增一個檔案:info.php,內容如下:
<?
phpinfo();
?>

8.用瀏覽器看 http://你的ip/info.php
有phpinfo畫面生成的話就ok啦 節錄自[分享] unix-like底下 apache2+php5+mysql5安裝方式
感謝acman's 便利地毯的分享

紅字部份為輸入之指令
切換目錄至/usr/local/src ;準備自行編譯
cd /usr/local/src

到以下的官方網站下載需要的版本
MySQL官方網站:http://www.mysql.com
Apache官方網站:http://www.apache.org
PHP官方網站:http://www.php.net

安裝mysqld:mysql-5.0.37
解開tarball
tar -zxvf mysql-5.0.37.tar.gz
切換到解開的目錄下
cd mysql-5.0.37
1.組態:(編譯參數參考原廠doc或是google找其它人的經驗或是依之前經驗)
./configure --prefix=/usr/local/mysql --localstatedir=/home/mysql --with-mysqld-user=mysql --enable-large-files
2.編譯
make
3.安裝
make install
4.複製系統設定檔至指定位置:
cp support-files/my-medium.cnf /etc/my.cnf
5.增加mysqld要使用的user跟group
vi /etc/group
新增一行內容為:mysql:x:60:
vi /etc/passwd
新增一行內容為:mysql:x:60:60:mysql:/home/mysql:/bin/false
6.切換資料夾
cd /usr/local/mysql
7.安裝系統資料庫
bin/mysql_install_db --user=mysql
8.更改目錄權限
chown -R root:mysql /home/mysql
9.啟動 MySql Server
bin/mysqld_safe --user=mysql &
10.更改資料庫管理者的管理密碼("new-password"部分請自行輸入):
bin/mysqladmin -u root password new-password

安裝apache:httpd-2.2.4
切換目錄
cd /usr/local/src
解開tarball
tar -zxvf httpd-2.2.4.tar.gz
切換到解開的目錄下
cd httpd-2.2.4
1.組態:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most --enable-so
祝註:因為我偷懶的原因,所以apache的module是直接掛載,不在httpd.conf中一個一個自行選定是否載入
有空再做自行選擇的部份
2.編譯:
make
3.安裝:
make install

安裝php:php-5.2.1
安裝php前:為讓php support更多模組,以下部份先安裝(常用的)
指令:
gentoo適用:
emerge zlib
emerge libpng
emerge freetype
emerge jpeg
emerge gd
emerge libxml2

自行編譯者:自行找到tarball後(問google),直接組態->編譯->安裝,無需加任何參數
安裝php:php-5.2.1
切換目錄
cd /usr/local/src
解開tarball
tar -jxvf php-5.2.1.tar.bz2
切換到解開的目錄下
cd php-5.2.1

1.組態:
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2.2.4/bin/apxs --with-config-file-path=/usr/local/php --with-mysql=/usr/local/mysql --with-gd --with-jpeg --with-zlib --with-libxml --enable-socket --with-iconv --with-pear --enable-zend-multibyte
這部份同apache,php可以把許多功能都編成extensions,僅載入需要的部份,這也是我偏愛的方式.....不過在這邊也偷懶
2.編譯
make
3.安裝
make install
4. 檢查是否有生成apache需要的php module
ls -al /usr/local/apache2.2.4/modules/libphp5.so
5. 複制php的設定檔
cp /usr/local/src/php-5.2.1/php.ini-dist /usr/local/php/

設定apache的httpd.conf
1. 查看是否有增加這一行
LoadModule php5_module modules/libphp5.so
2.更改admin信箱:
ServerAdmin 你的emailaddress
3.設定伺服器名稱(可以使用dmian:www.ooo.net:80 或 192.168.1.1:80)
ServerName 192.168.1.1:80(用你自己機器的ip address啊)
4.找到DirectoryIndex敘述,設定首頁名稱加上 index.php
DirectoryIndex index.htm index.html index.php
5.找到AddType部份,增加一行:
AddType application/x-httpd-php .php
6.啟動apache
/usr/local/apache2.2.4/bin/apachectl start
7.檢查php是否有正常運作
在/usr/local/apache2.2.4/htdocs/底下新增一個檔案:info.php,內容如下:
<?
phpinfo();
?>

8.用瀏覽器看 http://你的ip/info.php
有phpinfo畫面生成的話就ok啦

2007年8月15日 星期三

讓 crontab 自動排程執行 php

前一陣公司的網站改了很多東西...
寫了很多需要利用 crontab 去跑的php
當時利用的方法是
寫一支程式,讓crontab去跑..
內容是

lnyx http://myweb/test.php > /dev/null
2>&2

剛剛在Real-Blog看到這篇文章--讓 crontab 自動排程執行 php

才發現也有這樣的方式可以寫...記錄一下~~

要用 crontab 自動執行 php 程式,可以這樣做:
方法一
1. 在 php 程式的第一行加入:

#!/usr/local/php/bin/php -q
例如:

#!/usr/local/php/bin/php -q
< ? php $foo = 123; ? >
請留意,我的 php 是安裝在 /usr/local/php,請根據你的 php 執行檔位置作出修改。

2. 將 php 程式給予可執行權限:

chmod +x testing.php

3. 執行 crontab -e,然後加入以下內容:

00 00 * * * /path/to/testing.php > /dev/null 2>&2
以上語法會在每天的零時零分執行 /path/to/testing.php

方法二
另一個方法是不用在 php 程式的第一行加入 "#!/usr/local/php/bin/php -q",
可以省略第一步及第二步
直接執行 crontab -e,並輸入以下內容:
00 00 * * * usr/local/php/bin/php -q /path/to/testing.php > /dev/null 2>&2

這個方法的結果跟方法一的結果相同。 前一陣公司的網站改了很多東西...
寫了很多需要利用 crontab 去跑的php
當時利用的方法是
寫一支程式,讓crontab去跑..
內容是

lnyx http://myweb/test.php > /dev/null
2>&2

剛剛在Real-Blog看到這篇文章--讓 crontab 自動排程執行 php

才發現也有這樣的方式可以寫...記錄一下~~

要用 crontab 自動執行 php 程式,可以這樣做:
方法一
1. 在 php 程式的第一行加入:

#!/usr/local/php/bin/php -q
例如:

#!/usr/local/php/bin/php -q
< ? php $foo = 123; ? >
請留意,我的 php 是安裝在 /usr/local/php,請根據你的 php 執行檔位置作出修改。

2. 將 php 程式給予可執行權限:

chmod +x testing.php

3. 執行 crontab -e,然後加入以下內容:

00 00 * * * /path/to/testing.php > /dev/null 2>&2
以上語法會在每天的零時零分執行 /path/to/testing.php

方法二
另一個方法是不用在 php 程式的第一行加入 "#!/usr/local/php/bin/php -q",
可以省略第一步及第二步
直接執行 crontab -e,並輸入以下內容:
00 00 * * * usr/local/php/bin/php -q /path/to/testing.php > /dev/null 2>&2

這個方法的結果跟方法一的結果相同。

2007年8月7日 星期二

[PHP] 用 "變數" 來指定 變數名稱

$refresh_value="refresh_set1".$no; //用傳入的$no來設定一新字串
if(${$refresh_value}!="") //用上面那一個變數來設定另一個變數名稱
{
 notifyPage('點閱指數更新完成(2)!','f4modify_house_2.php3');
 exit();
}
else
{
 //若該變數不存在,則用此名稱,去設定一個cookie變數!
 setcookie($refresh_value,1,time()+3600*8,"/",$_SERVER['HTTP_POST']);
}

$refresh_value="refresh_set1".$no; //用傳入的$no來設定一新字串
if(${$refresh_value}!="") //用上面那一個變數來設定另一個變數名稱
{
 notifyPage('點閱指數更新完成(2)!','f4modify_house_2.php3');
 exit();
}
else
{
 //若該變數不存在,則用此名稱,去設定一個cookie變數!
 setcookie($refresh_value,1,time()+3600*8,"/",$_SERVER['HTTP_POST']);
}

2007年7月27日 星期五

[免費] 用 PHP 畫出 Flash 統計圖表

Neo's Blog 看到的,實在是太讚了~~

畫出來的是 Flash 檔案,非常美觀喔!
免費版本在使用者點畫面時,會連到他們的官方網站,而且沒有任何技術支援。
以這種高水準的圖表品質,卻只有這種限制,已經可以算是慈善家了。
http://www.maani.us/charts/index.php


網站上寫的很清楚~
照著做就可以做出來了~
套參數的方式也很明瞭...

唯獨好像不支援中文...
試了幾次,都無法正常顯示...
也許要改什麼地方吧...有找到再來修改 Neo's Blog 看到的,實在是太讚了~~

畫出來的是 Flash 檔案,非常美觀喔!
免費版本在使用者點畫面時,會連到他們的官方網站,而且沒有任何技術支援。
以這種高水準的圖表品質,卻只有這種限制,已經可以算是慈善家了。
http://www.maani.us/charts/index.php


網站上寫的很清楚~
照著做就可以做出來了~
套參數的方式也很明瞭...

唯獨好像不支援中文...
試了幾次,都無法正常顯示...
也許要改什麼地方吧...有找到再來修改

2007年7月24日 星期二

[Google] 用 Gmail 寄信

轉貼自 [Google] 用 Gmail 寄信
靠,用 gmail 寄信有什麼了不起?
嘿嘿,我說的可是利用 php 裡面的 libcurl 方式,把資料傳到 gmail 去,
讓 gmail 當你的 smtp 呢!這裡下載 libgmailer
以下是範例程式:
require("libgmailer.php");
$gmail_acc = "帳號@gmail.com";
$gmail_pwd =
"密碼";
$my_timezone = "GMT +08:00";
$gmailer = new GMailer();
if
($gmailer->created) {
$gmailer->setLoginInfo($gmail_acc, $gmail_pwd,
$my_timezone);
// $gmailer->setProxy("proxy.company.com");
if
($gmailer->connect()) {
// GMailer connected to Gmail successfully.
// Do something with it.
$to = "收件人@gmail.com";
$subj = "主題";
$body = "測試";

$gmailer->send($to, $subj, $body, $cc="", $bcc="",
$mid="", $tid="", $files=0, $draft=false, $orig_df="", $is_html=0, $from="",
$attachments = array());
} else {
die("Fail to connect because:
".$gmailer->lastActionStatus()."\n");
}
} else {
die("Failed to
create GMailer because: ".$gmailer->lastActionStatus()."\n");
}
轉貼自 [Google] 用 Gmail 寄信
靠,用 gmail 寄信有什麼了不起?
嘿嘿,我說的可是利用 php 裡面的 libcurl 方式,把資料傳到 gmail 去,
讓 gmail 當你的 smtp 呢!這裡下載 libgmailer
以下是範例程式:
require("libgmailer.php");
$gmail_acc = "帳號@gmail.com";
$gmail_pwd =
"密碼";
$my_timezone = "GMT +08:00";
$gmailer = new GMailer();
if
($gmailer->created) {
$gmailer->setLoginInfo($gmail_acc, $gmail_pwd,
$my_timezone);
// $gmailer->setProxy("proxy.company.com");
if
($gmailer->connect()) {
// GMailer connected to Gmail successfully.
// Do something with it.
$to = "收件人@gmail.com";
$subj = "主題";
$body = "測試";

$gmailer->send($to, $subj, $body, $cc="", $bcc="",
$mid="", $tid="", $files=0, $draft=false, $orig_df="", $is_html=0, $from="",
$attachments = array());
} else {
die("Fail to connect because:
".$gmailer->lastActionStatus()."\n");
}
} else {
die("Failed to
create GMailer because: ".$gmailer->lastActionStatus()."\n");
}

2007年7月20日 星期五

用 PHP 擷取遠端網頁資訊

轉錄自用 PHP 擷取遠端網頁資訊
以下程式碼會介紹如何擷取遠端網頁資訊,包括 HTML tag 裡面的 Title, Description 及 Keywords:

PHP:
< ? php
//----- 定義要擷取的網頁地址
$url = "http://web-address";

//----- 讀取網頁源始碼
$fp = file_get_contents($url);
//highlight_string($fp); // 顯示html

//----- 擷取 title 資訊
preg_match("/< t i t l e >(.*)< \/ t i t l e >/s", $fp, $match);
$title = $match[1];

//----- 擷取 Description 及 Keywords
$metatag = get_meta_tags($url);
$description = $metatag["description"];
$keywords = $metatag["keywords"];

//----- 印出結果
echo "URL: $url\n";
echo "Title: $title\n";
echo "Description: $description\n";
echo "Keywords: $keywords\n";
? > 轉錄自用 PHP 擷取遠端網頁資訊
以下程式碼會介紹如何擷取遠端網頁資訊,包括 HTML tag 裡面的 Title, Description 及 Keywords:

PHP:
< ? php
//----- 定義要擷取的網頁地址
$url = "http://web-address";

//----- 讀取網頁源始碼
$fp = file_get_contents($url);
//highlight_string($fp); // 顯示html

//----- 擷取 title 資訊
preg_match("/< t i t l e >(.*)< \/ t i t l e >/s", $fp, $match);
$title = $match[1];

//----- 擷取 Description 及 Keywords
$metatag = get_meta_tags($url);
$description = $metatag["description"];
$keywords = $metatag["keywords"];

//----- 印出結果
echo "URL: $url\n";
echo "Title: $title\n";
echo "Description: $description\n";
echo "Keywords: $keywords\n";
? >

2007年7月13日 星期五

PHP function: 壓縮 CSS file

Tsung's Blog 那看到的
PHP function: 壓縮 CSS file

真是獲益良多啊~~

透過此 function 可在吐 CSS 時, 或者在版本 Release 時, 自動壓縮 還是比較方便點~ :)
以下轉載自: PHP-function to optimize a CSS-file
PS: 我對此檔案加了作者, 原始連結資訊 和 簡單排版.


<?php
/**
* Converts a CSS-file contents into one string
* Source Code: http://snippets.dzone.com/posts/show/4137
* @Author: Dmitry-Sh http://snippets.dzone.com/user/Dmitry-Sh
*
* @param string $t Text data
* @param int $is_debug Skip convertion
* @return string Optimized string
*/
function text_smooth_css($t, $is_debug = 0)
{
 if ($is_debug)
 {
  return $t;
 }

 /* Remove comments */
 $t = preg_replace("/\/\*(.*?)\*\//s", ' ', $t);

 /* Remove new lines, spaces */
 $t = preg_replace("/(\s{2,}|[\r\n|\n|\t|\r])/", ' ', $t);

 /* Join rules */
 $t = preg_replace('/([,|;|:|{|}]) /', '\\1', $t);
 $t = str_replace(' {', '{', $t);

 /* Remove ; for the last attribute */
 $t = str_replace(';}', '}', $t);
 $t = str_replace(' }', '}', $t);

 return $t;
}
?> Tsung's Blog 那看到的
PHP function: 壓縮 CSS file

真是獲益良多啊~~

透過此 function 可在吐 CSS 時, 或者在版本 Release 時, 自動壓縮 還是比較方便點~ :)
以下轉載自: PHP-function to optimize a CSS-file
PS: 我對此檔案加了作者, 原始連結資訊 和 簡單排版.


<?php
/**
* Converts a CSS-file contents into one string
* Source Code: http://snippets.dzone.com/posts/show/4137
* @Author: Dmitry-Sh http://snippets.dzone.com/user/Dmitry-Sh
*
* @param string $t Text data
* @param int $is_debug Skip convertion
* @return string Optimized string
*/
function text_smooth_css($t, $is_debug = 0)
{
 if ($is_debug)
 {
  return $t;
 }

 /* Remove comments */
 $t = preg_replace("/\/\*(.*?)\*\//s", ' ', $t);

 /* Remove new lines, spaces */
 $t = preg_replace("/(\s{2,}|[\r\n|\n|\t|\r])/", ' ', $t);

 /* Join rules */
 $t = preg_replace('/([,|;|:|{|}]) /', '\\1', $t);
 $t = str_replace(' {', '{', $t);

 /* Remove ; for the last attribute */
 $t = str_replace(';}', '}', $t);
 $t = str_replace(' }', '}', $t);

 return $t;
}
?>

2007年7月12日 星期四

foreach的用法

參考自
http://linux.tnc.edu.tw/techdoc/banic/add.html

在 PHP4中,新增了一個迴圈 foreach,它很像是 perl和其它的語言,你可以給它一個陣列,讓它來取出陣列的值。它有下列這二個語法,第二個語法是較次要的,但是可用來作為第一個語法的延伸。

foreach(array_expression as $value) statement

foreach(array_expression as $key => $value) statement

第一個形式的迴圈,它會在每個迴圈上,將目前元素的值分配給 $value,並且向後移動陣列的內部指標,
所以在下一個迴圈的時候,你就會看到下一個元素了。

第二個形式的迴圈和第一個是相同的,不同的是它會在每個迴圈將目前元素的索引值分配給變數 $key。



注意 : 當 foreach第一次開始執行的時候,它會把陣列的內部指標重新設定到陣列的第一個元素,意思是說,在使用 foreach之前,你不必再去呼叫
reset( )。
注意 : foreach是運作在陣列的複製,而不是陣列它本身,因此並不會改變陣列指標

下面範例的功能都是相同的 :
<? php
 reset ($arr);
 while (list(, $value) = each ($arr)) {
  echo "Value: $value";
 }
 foreach ($arr as $value) {
  echo "Value: $value";
 }
?>
下面範例的功能也都是相同的 :
<?php
 reset ($arr);
 while (list($key, $value) = each ($arr)) {
  echo "Key: $key; Value: $value";
 }
 foreach ($arr as $key => $value) {
  echo "Key: $key; Value: $value";
 }
?>
以下的範例將說明 foreach的用法 :
<?php
 /* foreach example 1: value only */
 $a = array (1, 2, 3, 17);
 foreach ($a as $v) {
  print "Current value of \$a: $v";
 }
 /* foreach example 2: value (with key printed for illustration) */
 $a = array (1, 2, 3, 17);
 $i = 0;
 /* for illustrative purposes only */
 foreach($a as $v) {
  print "\$a[$i] => $k";
 }
 /* foreach example 3: key and value */
 $a = array (
  "one" => 1,
  "two" => 2,
  "three" => 3,
  "seventeen" => 17
 );
 foreach($a as $k => $v) {
  print "\$a[$k] => $v";
 }
?> 參考自
http://linux.tnc.edu.tw/techdoc/banic/add.html

在 PHP4中,新增了一個迴圈 foreach,它很像是 perl和其它的語言,你可以給它一個陣列,讓它來取出陣列的值。它有下列這二個語法,第二個語法是較次要的,但是可用來作為第一個語法的延伸。

foreach(array_expression as $value) statement

foreach(array_expression as $key => $value) statement

第一個形式的迴圈,它會在每個迴圈上,將目前元素的值分配給 $value,並且向後移動陣列的內部指標,
所以在下一個迴圈的時候,你就會看到下一個元素了。

第二個形式的迴圈和第一個是相同的,不同的是它會在每個迴圈將目前元素的索引值分配給變數 $key。



注意 : 當 foreach第一次開始執行的時候,它會把陣列的內部指標重新設定到陣列的第一個元素,意思是說,在使用 foreach之前,你不必再去呼叫
reset( )。
注意 : foreach是運作在陣列的複製,而不是陣列它本身,因此並不會改變陣列指標

下面範例的功能都是相同的 :
<? php
 reset ($arr);
 while (list(, $value) = each ($arr)) {
  echo "Value: $value";
 }
 foreach ($arr as $value) {
  echo "Value: $value";
 }
?>
下面範例的功能也都是相同的 :
<?php
 reset ($arr);
 while (list($key, $value) = each ($arr)) {
  echo "Key: $key; Value: $value";
 }
 foreach ($arr as $key => $value) {
  echo "Key: $key; Value: $value";
 }
?>
以下的範例將說明 foreach的用法 :
<?php
 /* foreach example 1: value only */
 $a = array (1, 2, 3, 17);
 foreach ($a as $v) {
  print "Current value of \$a: $v";
 }
 /* foreach example 2: value (with key printed for illustration) */
 $a = array (1, 2, 3, 17);
 $i = 0;
 /* for illustrative purposes only */
 foreach($a as $v) {
  print "\$a[$i] => $k";
 }
 /* foreach example 3: key and value */
 $a = array (
  "one" => 1,
  "two" => 2,
  "three" => 3,
  "seventeen" => 17
 );
 foreach($a as $k => $v) {
  print "\$a[$k] => $v";
 }
?>

2007年6月25日 星期一

用header送出編碼格式

常要用到~
便記下來了~

參考自Setting the HTTP charset parameter

PHP. Use the header() function before generating any content, e.g.:
header('Content-type: text/html; charset=utf-8'); 常要用到~
便記下來了~

參考自Setting the HTTP charset parameter

PHP. Use the header() function before generating any content, e.g.:
header('Content-type: text/html; charset=utf-8');

2007年5月17日 星期四

php auth 套件

資料來源:幾隻不可不知的php auth 套件!!想省很多工快抄回家用!!!
Auth: Creating an authentication system.
Auth_HTTP: HTTP authentication
Auth_PrefManager: Preferences management class
Auth_PrefManager2: Preferences management class
Auth_RADIUS: Wrapper Classes for the RADIUS PECL.
Auth_SASL: Abstraction of various SASL mechanism responses
LiveUser: User authentication and permission management framework
LiveUser_Admin: User authentication and permission management framework 資料來源:幾隻不可不知的php auth 套件!!想省很多工快抄回家用!!!
Auth: Creating an authentication system.
Auth_HTTP: HTTP authentication
Auth_PrefManager: Preferences management class
Auth_PrefManager2: Preferences management class
Auth_RADIUS: Wrapper Classes for the RADIUS PECL.
Auth_SASL: Abstraction of various SASL mechanism responses
LiveUser: User authentication and permission management framework
LiveUser_Admin: User authentication and permission management framework