15
Chapter 註冊及登入驗證模組 範例程式位置:光碟\mr\05\ 從動態網站開始之初,登入註冊模組就成為了網站必不可少的組成部分,因 為功能單一,實現簡單而成為入門級的模組。隨著 Web 2.0 的發展,人機互動成 為主流趨勢,登入註冊模組也順應了時代的發展,變得更加有『親和力』。像過 去那種花了許久時間填寫註冊表單,提交後發現資訊填寫錯誤,需要重新填寫的 慘痛經歷愈來愈少。隨著 Ajax 技術的興起,這種情況就更少發生了。本章將開 發一個功能齊全並有良好互動性的登入註冊模組。透過本章的學習,讀者能夠學 到以下內容。 註冊資訊即時提示 E-mail 啟動技術 GD2 驗證碼 更換驗證碼 Ajax 無刷新驗證技術 找回密碼 SQL 隱碼技術

Chapter - 碁峰資訊epaper.gotop.com.tw/pdf/ACL029200.pdfChapter 5 註冊及登入驗證模組 5-5 入的帳號是否可用,使用者登入也不必擔心因為輸錯登入資訊而得重新整理整個

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Chapter註冊及登入驗證模組

範例程式位置:光碟\mr\05\

從動態網站開始之初,登入註冊模組就成為了網站必不可少的組成部分,因

為功能單一,實現簡單而成為入門級的模組。隨著 Web 2.0的發展,人機互動成

為主流趨勢,登入註冊模組也順應了時代的發展,變得更加有『親和力』。像過

去那種花了許久時間填寫註冊表單,提交後發現資訊填寫錯誤,需要重新填寫的

慘痛經歷愈來愈少。隨著 Ajax 技術的興起,這種情況就更少發生了。本章將開

發一個功能齊全並有良好互動性的登入註冊模組。透過本章的學習,讀者能夠學

到以下內容。

註冊資訊即時提示 E-mail啟動技術

GD2驗證碼 更換驗證碼

Ajax無刷新驗證技術 找回密碼

防 SQL隱碼技術

PHP案例模組開發講座

5-2

5.1 註冊及登入驗證模組概觀 登入及註冊驗證模組的功能比較單一,除了要有效驗證使用者資訊和一些必

要的安全設定外,更要提高使用者操作程式的便利性。登入及註冊驗證模組由使

用者註冊、使用者登入和找回密碼三部分組成。

5.1.1 使用者註冊流程 使用者註冊的資訊可分成必填資料及非必填資料。必填資料預設是可見的,

而非必填資料預設是隱藏的,在必填資料不完整的時候,『註冊』按鈕不能使用。

對於非必填資料,使用者可以選擇填寫或不填寫,如果填寫了,就需要對資訊的正

確性進行檢驗。當使用者註冊成功後,系統會向使用者所填寫的 E-mail 傳送一封啟動郵

件,使用者只有啟動後,才可使用該帳號進行登入。使用者註冊的流程圖如圖

5.1所示。

圖 5.1 使用者註冊流程圖

5.1.2 使用者登入流程 使用者登入時,除了使用者名稱和密碼外,還需要填寫隨機產生的驗證碼。

當驗證碼顯示不清楚時,可以透過超連結進行更換,無需重新刷新版面。登入處

理對登入進行了一些限制。例如,輸入三次無效的使用者名稱後,將使用 Cookie

技術禁止該使用者繼續登入;當使用者輸入錯誤密碼連續三次後,該帳號將被凍

結。使用者登入流程圖如圖 5.2所示。

Chapter 5 註冊及登入驗證模組

5-3

圖 5.2 使用者登入流程圖

5.1.3 找回密碼流程 當使用者因為個別原因忘記密碼時,可以透過密碼保護問題及答案來找回密

碼。如果使用者輸入正確,那麼系統將密碼透過電子郵件的形式傳送到使用者註

冊的電子信箱中。如果沒有填寫密碼保護的問題及答案或者回答錯誤,則無法找

回。找回密碼的流程圖如圖 5.3所示。

圖 5.3 找回密碼流程圖

PHP案例模組開發講座

5-4

5.2 熱門關鍵技術

5.2.1 防範 SQL隱碼技術 SQL 隱碼,是指一些精通 SQL 陳述式的使用者,透過在表單或瀏覽器位址

欄中輸入 SQL陳述式來繞過系統檢驗的一種技術。一般防範 SQL隱碼的手段是

過濾敏感字元,例如引號等。

PHP相對於 ASP來說,要安全得多。但這不代表 PHP網站就不會出現 SQL

隱碼的情況。幸運的是,在 PHP上防範 SQL隱碼,要比 ASP簡單、方便,不須

要寫一大段的轉換陳述式,只要幾個函式就可以。

在 PHP中,還可以透過對 php.ini檔案的修改來達到這個目的。這裡對程式碼

部分進行介紹。

1. intval()函式

intval()函式的作用是傳回變數的整數值,函式語法如下: int intval ( mixed var [, int base] )

2. addslashes()函式

addslashes()函式就是在運算資料庫時,對其中的特殊字元進行自動轉譯,

即在特殊字元前加上反斜(\),包括單引號( ')、雙引號(")、NULL,

但是不包括『%』和『_』。函式語法如下: string addslashes ( string str )

此外,還可以使用 mysql_real_escape_string()來進行轉譯,效果和 addslashes()

函式是一樣的。

5.2.2 Ajax技術實作無重新整理驗證 Ajax(Asynchronous JavaScript and XML,非同步 JavaScript和 XML),是

時下最流行的技術。Ajax 不是新的技術,而是原有技術的集合,這從它的名字

上就能夠看出來。

Ajax 的核心技術是 xmlHttpRequest。透過 xmlHttpRequest 中的 open 方法和

send 方法,可以在不重新整理目前頁面的情況下,向處理頁面傳送資料;透過

xmlHttpRequest中的 responseText屬性和 responseXML屬性,可以得到處理頁面

的輸出結果。

Ajax能夠流行的原因,是因為它能為使用者提供良好的互動性,這個特性在

本模組中被充分的發揮出來。使用者註冊無需經過『漫長』的等待就可以知道輸

Chapter 5 註冊及登入驗證模組

5-5

入的帳號是否可用,使用者登入也不必擔心因為輸錯登入資訊而得重新整理整個

頁面。

使用 Ajax,一般分為下面幾步:

1. 首先要建立 xmlHttpRequest 物件。不同的瀏覽器,建立 xmlHttpRequest 物

件及使用的方法有一些差別,這裡只針對 IE瀏覽器進行建立。程式碼如下:

範例程式 01 程式碼位置:光碟 \mr\05\01\js\xmlhttprequest.js

var xmlhttp = false; //初始化變數 //如果 ActiveXObject存在,說明是 IE 5.0以上的版本,否則使用 XMLHttpRequest建立 if(window.ActiveXObject){ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }else if(window.XMLHttpReuqest){ xmlhttp = new XMLHttpRequest(); }

2. 物件建立成功後,就可以使用物件中 open()的方法建立新的請求。方法格

式如下: xmlhttp.open(rmethod,rurl,isAsync);

rmethod參數指定請求的方法,如 get()或 post()。

rurl參數指定請求的版面。可以是絕對位址,也可以是相對位址。

isAsync參數指明請求是否為非同步。預設為 True,即非同步。

3. 如 果 isAsync 等 於 True , 那 麼 當 請 求 的 狀 態 改 變 時 , 將 呼 叫

onreadystatechange屬性,該屬性指定了一個回呼函式。格式如下: xmlhttp.onreadystatechange = reabackfunc;

或者

xmlhttp.onreadystatechange = function(){…}

4. 在回呼函式中,首先需要判斷 http 的請求狀態和 http 狀態碼。這是透過

readyState屬性和 status屬性來判斷的。readyState屬性有五種狀態值,常用的是

4,表示資料接收完畢。status屬性的值比較多,常用的是 200,表示請求成功。

一般這兩個屬性一起來判斷。格式如下: xmlhttp.onreadystatechange = function(){ if(readysate == 4 and statues == 200){ … } }

5. 當回應頁面處理結束後,即滿足了『readystate==4 and status == 200』這個

條件,就可以使用 xmlhttprequest物件的屬性取得回應頁面的值了。常用的

有 responseText、responesXML、responseStream 等,這裡以 responseText

為例進行介紹。

PHP案例模組開發講座

5-6

responesText屬性是將回應頁面的輸出資訊做為字串傳回。格式如下: str = xmlhttp.responseText;

不同的屬性取得不同回應頁面的值。例如 responseText 屬性可以取得 HTML

頁面的內容,responseXML屬性可以取得 XML檔案的內容,兩者不可混用。

6. 最後使用 send()方法來接收回應。send()方法可以傳遞資料,但這取決於

open()方法中的 rmethod參數,當參數為 get時,資料是附在 URL中進行傳

遞的。當參數為 post時,資料只能使用 send()方法進行傳遞。Send()方法的

語法如下: xmlhttp.send([rdate]);

關於 Ajax功能的具體實現,請看本章的第 5.3.3節和第 5.3.4節。

5.2.3 驗證碼技術 驗證碼技術,是為了防止使用者名稱和密碼被破解,在登入頁面上產生一組

亂數,每次重新整理版面時,亂數都會改變。一般是四位,也有更多位的。

取得驗證碼

PHP中的驗證碼可以透過 rand()函式產生亂數的方式得到。rand()函式可以取

得指定範圍內的亂數。該函式語法如下:

int rand([int min, int max])

如果省略兩個參數,那麼將傳回 0到 RAND_MAX之間的隨機整數。否則,

傳回 min 和 max 之間的整數。例如本例中要取得四位十六進位的整數,程式碼

如下:

<?php for($i=0;$i<4;$i++){ $num .= dechex(rand(0,15)); //產生亂數 } … ?>

函式 dechex()可以將參數轉為十六進位表示。

不同的平台,RAND_MAX 的值也不相同,Windows 系統上的值是 32 768。

如果想指定更大的值,就需要使用參數了。

使用 JavaScript也可以產生十六進位亂數,但是稍微複雜。JavaScript中不能

直接將十進位數字轉為十六進位,需要手動進行轉換。首先使用 Math.random()

函式產生 0~15 之間的亂數,然後使用Math.ceil()函式將亂數取整,接下來就要逐次

Chapter 5 註冊及登入驗證模組

5-7

判斷該數值,如果該數值大於 9,那麼將 10~15 的數一一對應轉換為 a、b…,一直

到 f。轉換完成後,將數值累加,最後傳給 valcode.php頁。

使用 JavaScript產生十六進位亂數的完整程式碼如下:

範例程式 02 程式碼位置:光碟 \mr\05\01\js\login.js

//產生亂數 function showval(){ num = ''; for(i=0;i<4;i++){ //迴圈輸出四位驗證碼 tmp = Math.ceil((Math.random() * 15)); //取得一位元十六進位的整數 if(tmp > 9){ //依次判斷亂數 switch(tmp){ case(10): //如果亂數等於 10,換為a num += 'a'; break; case(11): num += 'b'; //如果亂數等於 11,換為 b break; case(12): num += 'c'; //如果亂數等於 12,換為 c break; case(13): //如果亂數等於 13,換為 d num += 'd'; break; case(14): //如果亂數等於 14,換為 e num += 'e'; break; case(15): //如果亂數等於 15,換為 f num += 'f'; break; } }else{ num += tmp; } } $('chkid').src='valcode.php?num='+num; //將產生的亂數傳給圖像產生頁面 $('chknm').value = num; //將亂數的值儲存到頁面的隱藏域中 }

顯示亂數圖片

顯示亂數的方式很多,將亂數寫入一個圖片中再顯示是目前常用的方法。在

PHP中,可以使用 GD函式庫來實現。使用到的函式主要有 imagecreate()函式、

imagecolorallocate()函式、imagestring()函式、imagesetpixel()函式、imagepng()函

式和 imagedestroy()函式。

1. imagecreate()函式

imagecreate()函式用來建立一個基於調色板的空白圖像源,這是產生圖片的

第一步。函式語法如下: resource imagecreate ( int width, int height )

PHP案例模組開發講座

5-8

參數 width和 height分別指定了圖像的寬和高。

2. imagecolorallocate()函式

imagecolorallocate()函式可以為建立後的圖像分配色彩。函式語法如下: int imagecolorallocate ( resource image, int red, int green, int blue )

參數 image是一個圖像來源。

參數 red、green 和 blue 表示紅、綠、藍三元素的成分。每種色彩的取值範

圍在 1~255之間。

3. imagestring()函式

圖像建立完成後,就可以使用 imagestring()函式來加入圖像文字了。該函式

的語法如下: bool imagestring ( resource image, int font, int x, int y, string s, int col )

參數 image是一個圖像來源。

參數 font可以設定字型,如果使用系統預設字型,可以使用 1~5的數字。

參數 x 和 y 分別表示文字相對於整幅圖像的 x 軸和 y 軸座標,即所輸入的字串左上角座標。

參數 s是要顯示的字串。

參數 col為字型色彩,也是使用 imagecolorallocate()函式來分配。

4. imagesetpixel()函式

使用 imagecolorallocate()建立的是一個單一背景色的圖像,如果希望在圖像

中加入干擾碼,可以使用 imagesetpixel()函式,該函式的作用是畫一個圖元

點。函式語法如下: bool imagesetpixel ( resource image, int x, int y, int color )

參數說明和 imagestring()函式相似,這裡不再贅述。

5. imagepng()函式

該函式將建立完成的圖片以 png的格式輸出。函式語法如下: bool imagepng ( resource image [, string filename] )

參數 image是要儲存的圖像來源。

參數 filename是要儲存的圖像名稱。如果省略,則直接輸出到瀏覽器。

如果希望直接在瀏覽器中顯示,那麼需要在檔案的開頭設定型態。如果輸出

的是 png格式的圖片,那麼開頭應該加入如下陳述式:

header("Content-type: image/png");

gif、jpg等其他格式的圖片,也要做對應設定。如果是在<img>頁籤中引入的,

則可以省略該陳述式。

Chapter 5 註冊及登入驗證模組

5-9

6. imagedestroy()函式

圖像儲存完畢後,使用 imagedestroy()函式來釋放記憶體。函式語法如下: bool imagedestroy ( resource image )

關於驗證碼實作的完整程式碼,請閱讀本章第 5.3.5節。

5.2.4 E-mail啟動技術 為了防止惡意註冊,現在很多網站採用了 E-mail啟動技術。當使用者註冊成

功後,並不是馬上就可以使用,而是需要先登入信箱。透過系統發出 E-mail中的連結

進行啟動,只有啟動後,帳號才可以使用。對於找回密碼的使用者,系統會將新

密碼傳送到信箱中,這在一定程度上提高了安全性。

本模組使用 imap函式庫中的 imap_mail_compose()和 imap_mail()函式來傳送

郵件。要使用 imap 函式庫,必需要先載入 imap,否則在 PHP 中不支援 imap 函

式庫。該函式庫是 PHP本身自帶的,只是預設的情況下沒有載入。載入 imap的

方法是:找到 PHP的組態檔案 php.ihni,一般該檔案在系統磁碟下的 windows目錄

中,如果使用的是 xampp,則在 xampp目錄下的 apache/bin目錄中。找到該檔案後,

將前面的『;』去掉,再重新啟動 Apache伺服器即可。

;extension=php_imap.dll

在這裡,使用者只要按照書中的程式碼,就可以完成傳送郵件的基本功能。

關於 imap函式庫的使用,請參見本書的第二十章電子郵件模組,該章節會對 imap

函式庫進行詳細的介紹。

5.2.5 應用鍵盤回應事件驗證資訊是否合法 新使用者註冊時,隨著資訊輸入,系統即時顯示資訊的正確性;使用者登入

時,無需使用滑鼠來選取文字方塊,只要按下<Enter>鍵,游標就自動下移……

這些功能,都是透過 JavaScript 指令碼中的鍵盤回應事件來實作的。隨著 Ajax

技術的流行,JavaScript 已經成為一個開發人員必需要掌握的技術。以下就來簡

單瞭解一下鍵盤事件。

使用者透過 onkeydown和 onkeyup事件來觸發回應事件。使用方法和 onclick

事件類似。onkeydown表示當鍵盤上的鍵被按下時觸發,onkeyup和它正好相反,

當鍵盤上的鍵被按下又抬起時觸發。在頁面中載入事件的方式有多種,這裡介紹

兩種最常用的方式。

1. 將事件直接加入到頁面元素中。

這種方法最直接、簡單。格式如下: <script type="text/javascript"> … function refer(){ …

PHP案例模組開發講座

5-10

} </script> <input type="text" onkeydown="refer()" />

當該使用者輸入完資訊後,單擊任意鍵,onkeydown 事件被觸發,並呼叫

refer()函式。

2. 透過 window.onload載入。當頁面載入時,事件也被載入。格式如下: <script> window.onload = function(){ document.getElementById('lgname').onkeydown = function(){ … }` } </script> … <input id="lgname" type="text" /> …

使用第二種方法時,如果在版面中找不到 id="lgname"的元素,js將回報錯誤。

當使用者輸入資訊時,每輸入一個字母,都將觸發該事件,在該事件呼叫的

函式中,對使用者輸入資訊進行判斷。例如使用者名稱必需大於等於 2,密碼最

短 6位,E-mail必需合法等。以下是一種驗證使用者名稱的程式碼:

範例程式 03 程式碼位置:光碟 \mr\05\01\js\register.js

//驗證使用者名稱 //為 id等於 regname的版面元素加入 onkeyup事件 //使用者按鍵每按一次鍵,都會呼叫一次該函式 $('regname').onkeyup = function (){ name = $('regname').value; //取得輸入內容 cname2 = ''; if(name.match(/^[a-zA-Z_]*/) == ''){ //判斷輸入字元是否在有效範圍之內 $('namediv').innerHTML = '<font color=red>必需以字母或底線開頭</font>'; cname1 = ''; }else if(name.length < 2){ //判斷輸入的字元的長度 $('namediv').innerHTML = '<font color=red>註冊名稱必需大於等於 2位</font>'; cname1 = ''; }else{ $('namediv').innerHTML = '<font color=green>註冊名稱符合標準</font>'; cname1 = 'yes'; } chkreg(); } …

該段程式碼的執行結果如圖 5.4所示。

Chapter 5 註冊及登入驗證模組

5-11

圖 5.4 驗證資訊合法性

使用 onkeydown 事件還可以實現對特定鍵的控制,包括<Enter>鍵、<Ctrl>

鍵、<Alt>鍵等所有的按鍵,這是透過在 onkeydown 事件中使用 keyCode 屬性來

實現的。keyCode屬性能夠知道使用者按下的是哪個鍵,例如<Enter>鍵等於 13,

空白鍵等於 32等等。使用 keyCode屬性的一般格式如下:

<script> window.onload = function(){ document.getElementById('lgname') = function(){ if(event.keyCode == 13){ //判斷使用者是否按下了<Enter>鍵 … } }` } </script>

在本模組中,實現了游標自動下移功能。當使用者按下<Enter>鍵時,頁面

的游標自動移到下一個文字方塊中。實現後的效果如圖 5.5所示。

圖 5.5 游標自動下移的執行效果

關於驗證資訊和游標自動下移的完整程式碼,將會在本章中的第 5.3.3 節做

詳細介紹。

5.2.6 應用 Cookie技術實現自動登入 Cookie的作用是當使用者第一次存取某伺服器時,伺服器將一些資訊儲存到

使用者端電腦內。之後,在一段時間內當使用者再次存取這個伺服器時,伺服器

透過 Cookie 資訊,就能夠識別該使用者。有很長一段時間,Cookie 都被當作一

個不安全的因素,而很少被使用,轉而使用 Session。但是,Cookie 的功能確實

很方便。自動登入、網站統計等等,都要比其他的實現方式要簡單、快捷得多。

Cookie只是一個文字文件,不能存取本機硬碟,無法傳播病毒木馬程式。唯一要

注意的地方是:Cookie只能識別電腦,無法識別不同使用者。

PHP案例模組開發講座

5-12

PHP中操作 Cookie

在 PHP 中操作 Cookie 使用 setcookie()函式和$_COOKIE 預定義變數。

setcookie()函式的語法格式如下:

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

參數 name設定了 Cookie的名字。

參數 value是 Cookie的值,即參數 name的值。

參數 expire 用來設定 Cookie 的過期時間。該參數以時間戳記的形式存在。

一般設定 Cookie 過期時間的時候,透過 time()+秒數來實現。如 time()+60×10,

表示 Cookie 將在 10 分鐘後失效。設定 Cookie 馬上失效,可以將時間設為目前

日期之前,如:time()−1,那麼 Cookie會立即失效。

參數 path表示 Cookie在伺服器伺服端的有效範圍。如果 path設為『/』,那

麼 Cookie在整個伺服器內都有效,如果 Cookie為/05/,那麼 Cookie只在伺服器

下的 05目錄有效。

參數 domain 指定了 Cookie 有效的功能變數名稱範圍。以 www.mrbccd.com

為例,如果 domain設為『.mrbccd.com』,那麼 Cookie在該網域的所有子網域都

有效;如果 domain為『www.mrbccd.com』,那麼 Cookie只在 www.mrbccd.com

網域內有效。

參數 secure 表明是否在 https 傳送。如果是 True,Cookie 僅在 https 連結中

被設定,預設是 False。

如果要在 Cookie中儲存 True值和 False值,那麼應該使用 1和 0來表示。因

為當 Cookie的值為 False時,用戶端會將 Cookie刪除。

在 JavaScript中操作 Cookie

在 JavaScript 中可以透過 document 物件中的 Cookie 屬性對 Cookie 進行建

立、讀取、刪除等操作。先來看一下建立 Cookie 的格式(程式碼中加粗的部分

是需要使用者設定的)。

documen.cookie = "Name=Value; expires=time; path=URL; domain= Domain"

其中各個參數的含義和 PHP中的基本相同,這裡不再介紹了。

在 JavaScript中讀取 Cookie有一點複雜。在 JavaScript看來,Cookie就是一

個字串。例如一個名字為『Count』、值是『10』的 Cookie,在 JavaScript 中的

格式是:

count=10

Chapter 5 註冊及登入驗證模組

5-13

如果有多個 Cookie,那麼它的格式如下:

count=10; name=mr; …

而真正需要的值,其實只有 10而已。所以,要取得 Cookie的值,就要使用

split()函式將 Cookie進行切割。取得 count值的程式碼為:

<script> if(document.cookie==''){ //Cookie等於空時 document.write('no cookie'); }else{ cookiearr = document.cookie.split('; '); //以分號為分隔符號,對 Cookie進行分割 leng = cookiearr.length; //取得陣列長度 for(i=0; i<leng; i++){ if(cookiearr[i].split('=')[0] == 'count'){ //判斷哪一個 cookie等於 count document.write(cookiearr[i].split('=')[1]); //輸出 count的值 } } } </script>

實現自動登入

自動登入的原理是:當使用者開啟登入頁面時,登入頁面首先判斷使用者用

戶端機器中的 Cookie值。如果該值不存在,說明使用者沒有登入,或 Cookie已

失效,這時,將顯示登入表單;如果 Cookie值存在,則直接使用 Cookie中所儲

存的使用者名稱進行登入。

本例中,使用者首先開啟的是 index.php頁,該頁判斷 Cookie值,如果沒有,

則跳轉到 login.PHP 進行登入;如果 Cookie 有值,則將 Cookie 中的使用者名稱

儲存到 Session,直接進入主版面。實作程式碼如下。

範例程式 04 程式碼位置:光碟 \mr\05\01\index.php

<?php session_start(); //開啟 Session支援 header('Content-Type:text/html;charset=gb2312'); //設定頁面編碼 if(!empty($_COOKIE['name']) and !is_null($_COOKIE['name'])){ //判斷 Cookie是否為空 $_SESSION['name'] = $_COOKIE['name']; //將 Cookie儲存到 Session中 header('location:http://localhost/model/05/01/main.php'); //跳轉到 main.php頁面 }else{ //Cookie為空,說明沒有登入 header('location:http://localhost/model/05/01/login.php'); //跳轉到 login.php頁面 } ?>

這裡$_COOKIE['name']的值是在登入成功時設定的,相關程式碼如下:

範例程式 05 程式碼位置:光碟 \mr\05\01\login_chk.php

<?php … //如果登入成功 setcookie('name',$name,time()+60*10); //儲存$name的同時設定時間

PHP案例模組開發講座

5-14

… ?>

5.3 註冊及登入驗證模組

5.3.1 資料庫設計 註冊及登入驗證模組使用的資料庫是 db_reglog,其中包含資料表

tb_member。該表中有十二個欄位。tb_member表結構及說明如圖 5.6所示。

圖 5.6 tb_member資料表結構及說明

5.3.2 資料庫類別 為了便於維護,減少程式碼冗餘,本模組使用了一個簡單的自訂資料庫類

別。以下提供類別中主要的程式碼。

首先列出的是類別中的成員變數,其中$host、$name、$pwd 和$dBase 變數

是類別初始化時所使用的,有預設值,其他變數都是相關的資料資訊。程式碼如

下:

範例程式 06 程式碼位置:光碟 \mr\05\01\conn\conn.php

<?php class opmysql{ private $host = 'localhost'; //伺服器位址 private $name = 'root'; //登入帳號 private $pwd = 'root'; //登入密碼 private $dBase = 'db_reglog'; //資料庫名稱 private $conn = ''; //資料庫連結資源 private $result = ''; //結果集 private $msg = ''; //傳回結果 private $fields; //傳回欄位 private $fieldsNum = 0; //傳回欄位數 private $rowsNum = 0; //傳回結果數

Chapter 5 註冊及登入驗證模組

5-15

private $rowsRst = ''; //傳回單筆記錄的欄位陣列 private $filesArray = array(); //傳回欄位陣列 private $rowsArray = array(); //傳回結果陣列

接下來列出的是構造函式。該構造函式有四個參數,這四個參數都可以省略

而使用預設值。參數處理後,呼叫 init_conn()函式。程式碼如下:

function __construct($host='',$name='',$pwd='',$dBase=''){ if($host != '') $this->host = $host; if($name != '') $this->name = $name; if($pwd != '') $this->pwd = $pwd; if($dBase != '') $this->dBase = $dBase; $this->init_conn(); }

init_conn()函式根據成員變數中的值來建立資料庫連接源。程式碼如下:

//連接資料庫 function init_conn(){ $this->conn=@mysql_connect($this->host,$this->name,$this->pwd); @mysql_select_db($this->dBase,$this->conn); mysql_query("set names gb2312"); //設定編碼 }

下面開始就是類別中的操作函式了。先來看查詢函式。查詢函式根據回傳的 SQL

陳述式進行查詢,並將查詢結果儲存到成員變數$result 中。符號『@』的作用是

遮罩錯誤資訊。程式碼如下:

//查詢結果 function mysql_query_rst($sql){ if($this->conn == ''){ $this->init_conn(); } $this->result = @mysql_query($sql,$this->conn); }

傳回查詢記錄數函式。根據查詢結果,回傳記錄數。程式碼如下:

function getRowsN5um($sql){ $this->mysql_query_rst($sql); if(mysql_errno() == 0){ return @mysql_num_rows($this->result); }else{ return ''; } }

取得記錄陣列函式。將查詢結果輸出成一個陣列並回傳。該函式處理的是單

筆記錄。程式碼如下:

function getRowsRst($sql){ $this->mysql_query_rst($sql);