講到Dreamweaver MX 2004的內建伺服器行為,應該沒有人不認識「使用者驗證」這一組吧?!這一篇的主題就是帶各位來簡單瞭解一下這個伺服器行為骨子裡到底賣的是什麼藥,當然,各位可能需要有一點點PHP的閱讀能力,並對Dreamweaver MX 2004的邏輯有一點概念。
瞭解了這些有什麼好處?這需要看個人了,如果你只是簡單的要用內建伺服器行為「兜」出一些程式,或著只是看書講的就照著作,那或許幫助不大,實質上的幫助則是,如果能有這樣的感覺(當然各位也能有自己一套的方法和感覺)去閱讀程式,在需要自己Coding的部分就能夠與Dreamweaver MX 2004互相搭配,就像悟空和達爾合體以後變成超級賽亞人第四階,可以玩弄終極的一星龍一樣!(雖然又是同樣一套到最後玩過頭XD),簡單的來說就是可以讓Dreamweaver MX 2004幫你作苦力,我們再來撿現成的就是了!雖然還要先學會怎麼檢。
資料庫設置
首先先來看資料庫裡的欄位長怎樣,應該很容易瞭解吧,這跟書裡的設置是一樣的,Level是使用者層級,其他的不再廢話!
前置作業
網站定義了一個MySQL連線叫cnauth,資料庫是search,資料表也叫search,欄位則如上。
左邊看到的是往站內的檔案,有很多後!這裡用到的只有userauth資料夾下面的三個檔案,其他則是路人可以略過不管!login.php作「使用者登入」的動作,fail.php是驗證失敗時轉向的頁面,main.php則是驗證成功轉向的頁面。
(好啦!我知道Study我拼錯了!)
login.php
直接來看login.php,在這邊有一個表單、兩個文字欄位、一個按鈕,文字欄位上面的就叫「User」,下面的就叫「Pass」,所以在這頁中這兩個文字欄位的值就叫做$_POST[‘User’]、$_POST[‘Pass’]($_GET[‘XXX’]在這邊不管),網頁中有一項伺服器行為,就是「登入使用者」。
在這個伺服器行為中,Dreamweaver MX 2004 所產生的原始程式碼大約分四個部分,分別是「初始化」、「驗證」、「驗證成功註冊Session變數」、「轉向」。
下面第21、22列程式長這樣
$LoginRS__query=sprintf("SELECT User, Pass, Level FROM search WHERE User=’%s’ AND Pass=’%s‘",
get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));
這裡就是抓資料庫中的「User 」、「Pass」、「Level」(限制存取準則選擇「使用者名稱、密碼、使用者層級)才會多拉這個)去用兩個%s篩,這兩個%s代表的事後面的$loginUsername和 $password ,而這兩個變數在「初始化」部分Dreamweaver MX 2004所敘述的則是:
$loginUsername=$_POST[‘User’];
$password=$_POST[‘Pass’];
這下子好了!前面有講過那兩個文字欄位的值怎麼表示,所以簡單的說就是當User文字欄位的值 AND Pass文字欄位的值,都符合資料庫中某一筆記錄中的值時,才會有紀錄篩選出來!
有沒有疑問?既然是篩選記錄,那會不會有重複的紀錄?答案是會!不然怎麼會有「重複區域」這個東西讓你用,所以我們才會需要「檢查新使用者」這個伺服器行為,這樣子才能保證在這邊篩出來的記錄是唯一且正確的那筆,若是有重複則會先用第一筆。
先來看看上面的變數$LoginFoundUser,他等於mysql_num_rows($LoginRS),$LoginRS是上面做的資料庫記錄篩選,mysql_num_rows可以從名稱上看出代表所篩出資料集的列數(筆數),很簡單,有資料就是1(只會有一筆紀錄篩選出來)、沒資料就是0(空的資料集),有就代表驗證成功、沒有就是驗證失敗。
再來看看下面的26列,if ( $loginFoundUser),當if中出現這樣的敘述時可能有些人會覺得很奇怪,因為刮號內一般好像是個判斷式如$a>$b,若出現這樣則是解釋為「如$loginFoundUser為真」,為真?真不是應該叫True?也是,但0(false)、1(true)也可拿來這樣用就是。
總而言之,當驗證通過時,這邊Dreamweaver MX 2004會註冊兩個Session變數,分別是「MM_Username」以及「MM_UserGroup」,「MM_Username」代表的是使用者名稱、「MM_UserGroup」代表的是使用者的層級,這可以從後面兩個圖裡所敘述的程式碼看出端倪。
MM_Username
MM_UserGroup
main.php
再來來看main.php,在這邊作了一個資料集,放了四個文字欄位,一個「登出」的超連結,在「Dreamweaver MX 2004 & 網頁資料庫」這本書中,蚊子的測試環境是「Display ALL errors」,因此當時沒發現Dreamweaver MX 2
004在這裡有個小小的算Bug,在這邊一併爆出來。
首先左邊兩個文字欄位擺Session變數Username與UserGroup,這兩個變數在上面已經講解過了,相信各位都瞭解他的由來!所以不要再有疑問為什麼不用其他變數名稱?這在書上已經有講過,「因為Dreamweaver MX 2004就是這樣用,沒有為什麼…」。
右邊兩個文字欄位則是擺資料集裡面的欄位值,這是我們用前面登錄成功DW所註冊的Session變數MM_Username所篩選出來的資料集,因為這個Session變數 絕對等於 登錄頁面的User文字欄位所填上的使用者名稱,也絕對是資料庫中某一筆記錄所使用的使用者名稱,也絕對是經過檢查使用者名稱及核對密碼確認正確無誤的,所以我們可以用它來篩選資料庫中登錄者其所屬的個人記錄。
利用Session變數MM_Username於資料庫中篩選個人紀錄
main.php中所做之伺服器行為
先來看這個,這邊的程式碼長這樣:
$colname_rsuser = "1";
if (isset($_SESSION[‘MM_Username’])) {
$colname_rsuser = (get_magic_quotes_gpc()) ? $_SESSION[‘MM_Username’] : addslashes($_SESSION[‘MM_Username’]);
}
mysql_select_db($database_cnauth, $cnauth);
$query_rsuser = sprintf("SELECT * FROM `search` WHERE `User` = ‘%s’", $colname_rsuser);
SELECT * FROM `search` WHERE `User` = ‘%s’ 是這裡的SQL敘述,跟我們在上面做的動作一樣吧,篩選User欄位 = Session變數MM_Username,別說這裡沒看到MM_Username,其實他藏在上面,看到%s了吧,聰明的各位應該就知道他是代表後面的$colname_rsuser,這個變數怎麼來的?看一下 下下面的圖各位應該就清楚了。
24列$colname_rsuser = "1", 有沒有看到!跟下面的colname變數預設值是1一樣,而執行階段值對應到上面的程式碼,就是上面25列說的,所以當這個時候沒有這個Session變數時,Dreamweaver MX 2004的邏輯會將預設值"1"套進去用。
剛剛講的 $colname_rsuse 就是「$變數名稱_資料集名稱」囉!
登出使用者
再來我們來看登出使用者,當網頁上套用過「登出使用者」後,Dreamweaver MX 2004所產生的程式碼如下,我們可以看到第12列的程式碼,是isset($_GET[‘doLogout’]) &&($_GET[‘doLogout’]=="true"),各位應該都瞭解$_GET是用來取「URL變數」,因此後面13-21列程式碼只有在URL變數doLogout=true的時候,才會動作,
看到這邊若各位有一個慾望,那就代表你成功了!什麼慾望?查一下作「登出使用者」伺服器作用時,Dreamweaver MX 2004到底對我們所選取的文字作了什麼把戲。
就是這個光!就是這個光!果然!看到了沒有!這個超連結是連到自己,並且帶一個URL變數、值為true!
限制存取頁面、使用者驗證還有進步的空間
上面我們沒有對main.php作「限制存取」,但一般我們都會去作,所以來看看當作了的話,會發生什麼慘事…
這是「限制存取頁面」伺服器行為在網頁中加的原始程式碼中一段,下圖中圈起來的session_start()有什麼問題嗎?沒~有~~,但錯就錯在他比較笨,不懂的一山不容二虎的道理,往下看下去。
有沒有看到圓圓的盤子?(我瘋了,一直在耍白癡XD),在這邊也有一個session_start(),如果是一般按照預設值設置的伺服器跑起來就會出現問題。
一般瀏覽時
直接欲瀏覽main.php而應該被轉向fail.php時
這時候就必須下面的seesion_start()手動給撇掉,有點小麻煩,另外,如果這裡什麼都沒做直接拿Seesion變數來篩資料,也是不行的…,因為Dreamweaver MX 2004一樣笨笨的不會幫你加上seesion_start(),這時候反而變成要自己手動加上 = =,所以說勒,當遇上會用到Session的伺服器行為, 可是網頁不靈光時,先別罵自己,因為很有可能是Dreamweaver MX 2004本身的問題。
Cttlee 2004/06/09 AM 07:16

在〈解析伺服器行為-使用者驗證〉中有 1 則留言