版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
牟奇春主編PHP動(dòng)態(tài)網(wǎng)站開(kāi)發(fā)項(xiàng)目教程(微課版)任務(wù)3會(huì)員管理系統(tǒng)用戶(hù)注冊(cè)子任務(wù)3.1獲取表單數(shù)據(jù)【任務(wù)實(shí)施】3.1.1從后端獲取前端表單數(shù)據(jù)
如果前端使用“GET”方式提交數(shù)據(jù),則使用“$_GET”;如果前端使用“POST”方式提交數(shù)據(jù),則使用“$_POST”。當(dāng)然,也可以使用“$_REQUEST”全局?jǐn)?shù)組來(lái)讀取前端表單提交的數(shù)據(jù),這種方式就不區(qū)分GET和POST了,均可以讀取前端表單提交的數(shù)據(jù)。圖3.1.1
后端文件讀取前端表單數(shù)據(jù)3.1.2書(shū)寫(xiě)PHP代碼
PHP代碼必須放在一對(duì)特殊的標(biāo)簽中,即以“<?php”開(kāi)始,以“?>”結(jié)束。PHP代碼可以和HTML代碼混合書(shū)寫(xiě)。若文件中包含PHP代碼,則文件名必須用“.php”作為擴(kuò)展名。因?yàn)镻HP文件可以輸出HTML內(nèi)容,而HTML文件卻不能包含PHP的相關(guān)內(nèi)容。其根源在于,HTML文件是瀏覽器可以直接解析的,而PHP文件是后端Apache等服務(wù)器調(diào)用PHP解釋器輸出的HTML內(nèi)容,瀏覽器并不能直接解析PHP文件及其內(nèi)容。3.1.3輸出數(shù)據(jù)子任務(wù)3.2創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表【任務(wù)實(shí)施】3.2.1開(kāi)啟數(shù)據(jù)庫(kù)服務(wù)
要使用數(shù)據(jù)庫(kù)必須先開(kāi)啟數(shù)據(jù)庫(kù)服務(wù),或者說(shuō)必須先啟動(dòng)數(shù)據(jù)庫(kù)。小皮面板安裝好以后,即可支持創(chuàng)建MySQL數(shù)據(jù)庫(kù)。在小皮面板左側(cè)單擊“數(shù)據(jù)庫(kù)”,在其右側(cè)可以查看數(shù)據(jù)庫(kù)管理員的用戶(hù)名和密碼,如圖3.2.1所示。
單擊“+創(chuàng)建數(shù)據(jù)庫(kù)”按鈕,可以創(chuàng)建新的數(shù)據(jù)庫(kù),并設(shè)置訪問(wèn)的用戶(hù)名和密碼。管理員用戶(hù)名默認(rèn)是“root”,密碼也是“root”,此賬號(hào)可以訪問(wèn)和管理當(dāng)前服務(wù)器中的所有數(shù)據(jù)庫(kù),是最高權(quán)限的用戶(hù)。圖3.2.1
小皮面板數(shù)據(jù)庫(kù)管理3.2.2安裝可視化數(shù)據(jù)庫(kù)管理工具
小王同學(xué)在查詢(xún)資料時(shí)從網(wǎng)絡(luò)上看到,MySQL數(shù)據(jù)庫(kù)可以使用命令行方式來(lái)進(jìn)行相關(guān)操作。但這種方式對(duì)初學(xué)者極不友好,難度太大。
與命令行方式相對(duì)應(yīng),還有一種可視化的操作方式,這種方式就好理解多了。在小皮面板中就可以安裝和使用可視化數(shù)據(jù)庫(kù)管理工具。
進(jìn)入“軟件管理”面板,單擊上方的“工具”→“數(shù)據(jù)庫(kù)工具(客戶(hù)端)”按鈕,可以安裝第三方工具軟件來(lái)管理MySQL數(shù)據(jù)庫(kù),如圖3.2.2所示。圖3.2.2
數(shù)據(jù)庫(kù)工具(客戶(hù)端)
除了使用工具軟件來(lái)管理MySQL數(shù)據(jù)庫(kù),更常見(jiàn)的是使用Web工具來(lái)管理數(shù)據(jù)庫(kù),這樣更簡(jiǎn)便。在上方工具欄中單擊“網(wǎng)站程序”→
“數(shù)據(jù)庫(kù)工具(web)”按鈕,可以看到有一個(gè)名為“phpMyAdmin4.8.5”的工具,如圖3.2.3所示,這是純網(wǎng)頁(yè)版的MySQL數(shù)據(jù)庫(kù)管理工具,單擊即可安裝。在安裝時(shí),需要選擇安裝的位置,一般選擇安裝在默認(rèn)的localhost網(wǎng)站中。圖3.2.3
在軟件管理中安裝phpMyAdmin
安裝好phpMyAdmin以后,單擊“管理”按鈕,即可在網(wǎng)頁(yè)中打開(kāi)phpMyAdmin,如圖3.2.4所示。圖3.2.4
在phpMyAdmin中管理數(shù)據(jù)庫(kù)3.2.3創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表
圖3.2.4左側(cè)區(qū)域顯示的是系統(tǒng)中已經(jīng)有的數(shù)據(jù)庫(kù)。接下來(lái),單擊左側(cè)的“新建”,然后在右側(cè)輸入數(shù)據(jù)庫(kù)的名稱(chēng)“member”,并單擊“創(chuàng)建”按鈕,即可創(chuàng)建數(shù)據(jù)庫(kù)member。創(chuàng)建好的數(shù)據(jù)庫(kù)member如圖3.2.5所示。圖3.2.5
創(chuàng)建好的數(shù)據(jù)庫(kù)member
有了數(shù)據(jù)庫(kù)以后,接下來(lái)就要?jiǎng)?chuàng)建數(shù)據(jù)表“info”(會(huì)員信息表),并在“info”中創(chuàng)建7個(gè)數(shù)據(jù)字段,分別是“id”(id字段,用于唯一標(biāo)識(shí)一行數(shù)據(jù))、“username”(用戶(hù)名)、“pw”(密碼)、“email”(郵箱)、“sex”(性別)、“fav”(愛(ài)好)、“createTime”(創(chuàng)建時(shí)間),如圖3.2.6所示。圖3.2.6
創(chuàng)建info數(shù)據(jù)表3.2.4數(shù)據(jù)表字段類(lèi)型說(shuō)明(1)id:在創(chuàng)建數(shù)據(jù)表字段時(shí),每一張表都要求有一個(gè)id字段,這是表的主鍵,用于唯一標(biāo)識(shí)一行數(shù)據(jù)。其類(lèi)型為INT,并勾選后面的“A_I”標(biāo)識(shí)列,將其設(shè)置成自增(AUTO_INCREMENT)字段。這個(gè)字段在以后使用的過(guò)程中,創(chuàng)建記錄時(shí)不需要提供值,系統(tǒng)會(huì)自動(dòng)按照順序從1開(kāi)始,依次提供值。(2)username:VARCHAR類(lèi)型,長(zhǎng)度為50。這里要注意單位。在MySQL4.0及以下的版本中,這里的單位是字節(jié)。(3)pw:CHAR類(lèi)型,長(zhǎng)度為32。在數(shù)據(jù)庫(kù)中保存密碼時(shí),不能直接保存明文,需要加密后保存為密文。一般可使用MD5方式進(jìn)行數(shù)據(jù)加密,常用的MD5加密數(shù)據(jù)是32字節(jié)的固定長(zhǎng)度,因此,密碼字段選擇CHAR類(lèi)型,長(zhǎng)度固定為32字節(jié)。(4)email:VARCHAR類(lèi)型,長(zhǎng)度為256。(5)sex:TINYINT類(lèi)型,長(zhǎng)度為1。TINYINT也是INT的一種,TINYINT占用1字節(jié)。(6)fav:VARCHAR類(lèi)型,長(zhǎng)度為300。(7)createTime:INT類(lèi)型,長(zhǎng)度為10。創(chuàng)建時(shí)間,可以選擇DATETIME類(lèi)型,也可以選擇INT類(lèi)型。在DATETIME類(lèi)型中,將直接保存“年月日時(shí)分秒”類(lèi)型的時(shí)間。在INT類(lèi)型中,保存的是時(shí)間戳。時(shí)間戳是一個(gè)10位的整型數(shù)據(jù),具體是指格林尼治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)至現(xiàn)在的總秒數(shù)。子任務(wù)3.3將注冊(cè)信息寫(xiě)入數(shù)據(jù)庫(kù)【任務(wù)實(shí)施】第一步是“連接數(shù)據(jù)庫(kù)服務(wù)器”第二步是“設(shè)置字符集”第三步是“設(shè)置SQL語(yǔ)句”第四步是“執(zhí)行SQL查詢(xún)語(yǔ)句”3.3.1連接數(shù)據(jù)庫(kù)服務(wù)器
上述代碼的第2行用于連接數(shù)據(jù)庫(kù)服務(wù)器。在PHP中,連接不同的數(shù)據(jù)庫(kù)服務(wù)器需要使用不同的連接函數(shù)。由于小王同學(xué)已經(jīng)確定了在會(huì)員管理系統(tǒng)中使用MySQL數(shù)據(jù)庫(kù),因此,后面所有的內(nèi)容均以MySQL數(shù)據(jù)庫(kù)為例進(jìn)行編碼。在上面的代碼中,第2行使用了mysqli_connect()函數(shù),該函數(shù)將打開(kāi)一個(gè)到MySQL數(shù)據(jù)庫(kù)服務(wù)器的新連接,其語(yǔ)法規(guī)則為:mysqli_connect(host,username,password,dbname,port,socket);
該函數(shù)支持6個(gè)參數(shù),參數(shù)詳情如表3.3.1所示。參數(shù)描述host可選。規(guī)定主機(jī)名或IP地址username可選。規(guī)定MySQL用戶(hù)名password可選。規(guī)定MySQL密碼dbname可選。規(guī)定默認(rèn)使用的數(shù)據(jù)庫(kù)port可選。規(guī)定嘗試連接到MySQL服務(wù)器的端口號(hào)socket可選。規(guī)定套接字(socket)文件表3.3.1
mysqli_connect()函數(shù)參數(shù)詳情
該函數(shù)的返回值是一個(gè)連接到MySQL服務(wù)器的對(duì)象,這里使用的是“$conn”。如果該函數(shù)執(zhí)行出錯(cuò),則返回false。
在實(shí)際使用時(shí),一般來(lái)說(shuō),主機(jī)名都使用“l(fā)ocalhost”,代表本地主機(jī),也就是當(dāng)前運(yùn)行PHP文件的服務(wù)器。用戶(hù)名和密碼都使用的是“root”,這是默認(rèn)的最高權(quán)限的賬戶(hù)。第4個(gè)參數(shù)是默認(rèn)使用的數(shù)據(jù)庫(kù),在這里使用的是“member”。最后兩個(gè)參數(shù)可以不用填寫(xiě),直接使用默認(rèn)值。
因?yàn)榇撕瘮?shù)執(zhí)行失敗會(huì)返回false,所以接下來(lái)在代碼的第3行中用if語(yǔ)句來(lái)判斷“$conn”的真假,如果返回值為false,則通過(guò)“!”取反,其結(jié)果會(huì)變成true,程序進(jìn)入if分支,會(huì)通過(guò)die()函數(shù)輸出錯(cuò)誤提示信息,即“連接數(shù)據(jù)庫(kù)服務(wù)器失敗”,同時(shí),此函數(shù)會(huì)中止整個(gè)程序的運(yùn)行。3.3.2設(shè)置字符集
上述代碼的第7行用于設(shè)置字符集,使用到了PHP中的函數(shù)mysqli_query(),這個(gè)函數(shù)的作用是執(zhí)行針對(duì)數(shù)據(jù)庫(kù)的查詢(xún),其語(yǔ)法規(guī)則如下。mysqli_query(connection,query,resultmode);
該函數(shù)的參數(shù)詳情如表3.3.2所示。參數(shù)描述connection必需。規(guī)定要使用的MySQL連接query必需。規(guī)定查詢(xún)字符串resultmode可選。一個(gè)常量,可以是下列值中的任意一個(gè):(1)MYSQLI_USE_RESULT(如果需要檢索大量數(shù)據(jù),則使用這個(gè));(2)MYSQLI_STORE_RESULT(默認(rèn))表3.3.2
mysqli_query()函數(shù)參數(shù)詳情
針對(duì)成功的SELECT、SHOW、DESCRIBE或EXPLAIN查詢(xún),該函數(shù)將返回一個(gè)mysqli_result對(duì)象。針對(duì)其他成功的查詢(xún),將返回TRUE。如果失敗,則返回FALSE。
在上述代碼的第7行中,第一個(gè)參數(shù)是$conn,表示上面第一步生成的數(shù)據(jù)庫(kù)連接對(duì)象。第二個(gè)參數(shù)是“setnamesutf8”,表示將字符集設(shè)置成UTF-8,這個(gè)字符集要和數(shù)據(jù)庫(kù)的字符集保持一致,否則在顯示中文等特殊內(nèi)容時(shí)會(huì)出現(xiàn)亂碼。3.3.3設(shè)置SQL查詢(xún)語(yǔ)句
上述代碼的第9行使用結(jié)構(gòu)化查詢(xún)語(yǔ)言(StructuredQueryLanguage,SQL)設(shè)置了一個(gè)查詢(xún)語(yǔ)句。SQL是一種具有特殊目的的編程語(yǔ)言,是一種數(shù)據(jù)庫(kù)查詢(xún)和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù),以及查詢(xún)、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。
在這里,小王同學(xué)使用INSERTINTO語(yǔ)句向數(shù)據(jù)表中插入新記錄。INSERTINTO語(yǔ)句有兩種編寫(xiě)形式。
第一種形式無(wú)須指定要插入數(shù)據(jù)的列名,只需提供被插入的值。INSERTINTO
table_nameVALUES(value1,value2,value3,...);
第二種形式需要指定列名及被插入的值:INSERTINTO
table_name
(column1,column2,column3,...)VALUES(value1,value2,value3,...);3.3.4執(zhí)行SQL查詢(xún)語(yǔ)句
上述代碼的第11行用于執(zhí)行SQL查詢(xún)語(yǔ)句。執(zhí)行SQL查詢(xún)語(yǔ)句使用的還是mysqli_query()函數(shù),其返回值是$result。如果系統(tǒng)成功執(zhí)行了給定的SQL語(yǔ)句,則$result將為真,否則為假。上述代碼的第12~第16行用于通過(guò)判斷$result的真假,彈出注冊(cè)成功或失敗的提示。
回到注冊(cè)頁(yè)面,輸入各項(xiàng)數(shù)據(jù),如圖3.3.1所示。單擊“提交”按鈕,然后順利看到了“數(shù)據(jù)插入成功”的提示。接下來(lái),如果進(jìn)入phpMyAdmin,重新刷新info數(shù)據(jù)表,就可以在其中看到新插入的一條數(shù)據(jù)記錄。圖3.3.1
輸入信息進(jìn)行會(huì)員注冊(cè)
在PHP程序中,如果執(zhí)行代碼時(shí)出現(xiàn)錯(cuò)誤,則會(huì)在頁(yè)面中根據(jù)錯(cuò)誤的級(jí)別進(jìn)行相應(yīng)的錯(cuò)誤提示。PHP中的典型錯(cuò)誤有以下幾種。(1)E_ERROR:這是一種致命的錯(cuò)誤,遇到這種錯(cuò)誤時(shí),程序?qū)⑦M(jìn)行錯(cuò)誤提示,并終止腳本繼續(xù)運(yùn)行。(2)E_WARNING:這是一種非致命的錯(cuò)誤,遇到這種錯(cuò)誤時(shí),程序?qū)⑦M(jìn)行錯(cuò)誤提示,但是不會(huì)終止腳本繼續(xù)運(yùn)行。(3)E_PARSE:這是一種腳本語(yǔ)法錯(cuò)誤,是級(jí)別最高的錯(cuò)誤。當(dāng)出現(xiàn)這種錯(cuò)誤時(shí),整個(gè)腳本根本不會(huì)執(zhí)行。(4)E_NOTICE:這是一種運(yùn)行時(shí)通知消息,表示腳本遇到可能會(huì)表現(xiàn)為錯(cuò)誤的情況,但是在可以正常運(yùn)行的腳本中也可能會(huì)有類(lèi)似的通知。
在上面將注冊(cè)信息寫(xiě)入數(shù)據(jù)庫(kù)的代碼中,如果故意將mysqli_
connect()函數(shù)中的數(shù)據(jù)庫(kù)用戶(hù)名輸入錯(cuò)誤,則運(yùn)行程序時(shí),在頁(yè)面中會(huì)顯示出錯(cuò)誤提示,如圖3.3.2所示。從這個(gè)提示來(lái)看,系統(tǒng)產(chǎn)生了一個(gè)警告(Warning)信息,提示用戶(hù)root訪問(wèn)數(shù)據(jù)庫(kù)失敗。這時(shí)需要檢查數(shù)據(jù)庫(kù)用戶(hù)名和密碼是否正確。
重新修改為正確的密碼后,刷新瀏覽器,系統(tǒng)彈出“數(shù)據(jù)插入成功”的提示,如圖3.3.3所示。
圖3.3.2
會(huì)員注冊(cè)出錯(cuò)
圖3.3.3
會(huì)員注冊(cè)成功
此時(shí),進(jìn)入數(shù)據(jù)庫(kù),查看結(jié)果,可以看到新插入的一條數(shù)據(jù)記錄,如圖3.3.4所示。3.3.5項(xiàng)目階段性成果
圖3.3.4
新插入的數(shù)據(jù)記錄子任務(wù)3.4判斷用戶(hù)名是否被占用【任務(wù)實(shí)施】
由于每一個(gè)會(huì)員的用戶(hù)名是唯一的,就好比人的身份證號(hào)碼一樣,不能重復(fù)。因此,在插入新的記錄時(shí),需要先判斷當(dāng)前用戶(hù)名是否在數(shù)據(jù)表中已經(jīng)存在。如果已經(jīng)存在,則應(yīng)該彈出提示,讓用戶(hù)重新輸入不同的用戶(hù)名。如果用戶(hù)名在數(shù)據(jù)表中不存在,則說(shuō)明是一個(gè)全新的用戶(hù)名,可以直接寫(xiě)入數(shù)據(jù)庫(kù)。3.4.1通過(guò)SQL語(yǔ)句判斷用戶(hù)名是否被占用
3.4.2使用SQL中的SELECT語(yǔ)句
參數(shù)描述result必需。規(guī)定由
mysqli_query()、mysqli_store_result()或
mysqli_use_result()返回的結(jié)果集標(biāo)識(shí)符表3.4.1
mysqli_num_rows()函數(shù)參數(shù)詳情
在PHP中,任何非零非空的值均表示true。因此,只要結(jié)果集中有記錄,$num就是一個(gè)大于0的數(shù)字,其結(jié)果為真,表示查詢(xún)到了此用戶(hù)名(當(dāng)然,根據(jù)info數(shù)據(jù)表的設(shè)計(jì)原則,如果找到了數(shù)據(jù),則一定只能找到一條數(shù)據(jù),也就是$num要么為0,要么為1)。如果查詢(xún)到了此用戶(hù)名,則通過(guò)echo函數(shù)顯示JavaScript彈窗提示該用戶(hù)名已經(jīng)被占用。參數(shù)描述string必需。規(guī)定要檢查的字符串表3.4.2
strlen()函數(shù)參數(shù)詳情
該函數(shù)如果執(zhí)行成功,則返回字符串的長(zhǎng)度,如果字符串為空,則返回0。如果返回0,對(duì)于if條件語(yǔ)句而言,結(jié)果就是false,因此,用“!”運(yùn)算符取反就得到true。一旦用戶(hù)名為空,或者密碼為空,系統(tǒng)都會(huì)顯示彈窗。exit()函數(shù)可以輸出一條消息,并退出當(dāng)前腳本(中止當(dāng)前程序的執(zhí)行)。該函數(shù)是
die()
函數(shù)的別名。3.4.3在PhpStorm中配置數(shù)據(jù)源
注冊(cè)功能已經(jīng)完成了,可是,小王同學(xué)突然注意到,他在PhpStorm中所寫(xiě)的SQL語(yǔ)句被標(biāo)記有黃色底紋。同時(shí),把鼠標(biāo)指針移至底紋上,系統(tǒng)還出現(xiàn)了一些提示信息,如圖3.4.1所示。圖3.4.1
未配置數(shù)據(jù)源和SQLDialect的提示圖3.4.2
配置SQLDialect圖3.4.3
未配置數(shù)據(jù)源的提示
注意觀察,數(shù)據(jù)源配置界面下面有一個(gè)提示,即“missingdriverfiles”,表示系統(tǒng)缺少驅(qū)動(dòng)文件。單擊前面的“Download”,系統(tǒng)會(huì)自動(dòng)下載當(dāng)前驅(qū)動(dòng)程序。最后單擊“TestConnection”按鈕,測(cè)試是否能正常連接數(shù)據(jù)庫(kù)。由于PhpStorm的版本不同,此時(shí)可能會(huì)出現(xiàn)圖3.4.5所示的錯(cuò)誤提示信息。此信息表明當(dāng)前Web服務(wù)器時(shí)區(qū)配置錯(cuò)誤,單擊“Settimezone”,將默認(rèn)的UTC時(shí)區(qū)修改成PRC時(shí)區(qū)即可,如圖3.4.6所示。這個(gè)時(shí)區(qū)非常重要,關(guān)系到系統(tǒng)時(shí)間是否正確。圖3.4.4
配置數(shù)據(jù)源和驅(qū)動(dòng)圖3.4.5
服務(wù)器時(shí)區(qū)配置錯(cuò)誤圖3.4.6
配置服務(wù)器時(shí)區(qū)
配置好上述內(nèi)容后,在PhpStorm的右側(cè)出現(xiàn)一個(gè)Database標(biāo)簽,單擊可以展開(kāi),在其中可以看到當(dāng)前member數(shù)據(jù)庫(kù)的詳細(xì)情況,如圖3.4.7所示。圖3.4.7
配置好的數(shù)據(jù)源子任務(wù)3.5表單驗(yàn)證【任務(wù)實(shí)施】3.5.1重視數(shù)據(jù)驗(yàn)證
數(shù)據(jù)驗(yàn)證需要在前端和后端同時(shí)進(jìn)行,這樣做的目的是保證系統(tǒng)安全,以及減輕服務(wù)器的壓力。比如,用戶(hù)明明沒(méi)有填寫(xiě)用戶(hù)名,還去單擊“提交”按鈕,這顯然是沒(méi)有意義的。如果在前端不進(jìn)行判斷和處理,那么這一次無(wú)效的交互仍然要占用服務(wù)器的資源。另外,本系統(tǒng)的后端主要是使用SQL語(yǔ)句和數(shù)據(jù)庫(kù)進(jìn)行交互,如果在前端不加以限制,則可能會(huì)輸入一些危險(xiǎn)字符,帶來(lái)SQL注入風(fēng)險(xiǎn)。3.5.2在前端驗(yàn)證表單數(shù)據(jù)
前端數(shù)據(jù)驗(yàn)證一般是使用JavaScript來(lái)進(jìn)行的。為了避免前端繞過(guò)數(shù)據(jù)驗(yàn)證,在后端接收到數(shù)據(jù)后,還需要再一次進(jìn)行數(shù)據(jù)驗(yàn)證。
在會(huì)員注冊(cè)表單中,需要驗(yàn)證的內(nèi)容如下。(1)用戶(hù)名。必填,內(nèi)容只能是大小寫(xiě)字母、數(shù)字,長(zhǎng)度為3~10個(gè)字符。(2)密碼。必填,內(nèi)容只能是大小寫(xiě)字母、數(shù)字、“_”、“*”,長(zhǎng)度為6~10個(gè)字符。(3)確認(rèn)密碼。必填,且必須和密碼保持一致。(4)信箱。格式必須正確,可以不填。(5)愛(ài)好。可以不選。
在單擊“提交”按鈕時(shí),要攔截系統(tǒng)提交,即先驗(yàn)證數(shù)據(jù),合格后再提交表單。只需要在<form>標(biāo)簽中添加一個(gè)onsubmit事件,即可實(shí)現(xiàn)提交攔截。3.5.3在前端驗(yàn)證數(shù)據(jù)
解讀一下小王同學(xué)寫(xiě)的代碼。在代碼的第3行,document.
getElementsByName()讀取名字為“username”的元素,這樣就可以得到一個(gè)數(shù)組。但在整個(gè)注冊(cè)頁(yè)面中,只有一個(gè)username元素,因此,取此數(shù)組的第一個(gè)元素,然后讀取其value屬性,即可得到用戶(hù)輸入的用戶(hù)名,再使用“trim()”方法刪去其前后用戶(hù)可能不小心輸入的空格。3.5.4在后端驗(yàn)證表單數(shù)據(jù)
在前端完成了數(shù)據(jù)驗(yàn)證,為了提高安全性與可靠性,在后端也必須完成表單數(shù)據(jù)驗(yàn)證。
在前端使用JavaScript來(lái)完成表單驗(yàn)證,主要使用正則表達(dá)式來(lái)完成驗(yàn)證。在后端同樣可以使用正則表達(dá)式來(lái)完成驗(yàn)證,只是使用的方法有點(diǎn)不同。參數(shù)描述pattern要搜索的模式,為字符串形式subject輸入字符串matches如果提供了參數(shù)matches,則它將被填充為搜索結(jié)果。$matches[0]將包含完整模式匹配到的文本,$matches[1]將包含第一個(gè)捕獲子組匹配到的文本,以此類(lèi)推flagsflags可以被設(shè)置為以下標(biāo)記值。PREG_OFFSET_CAPTURE:如果傳遞了這個(gè)標(biāo)記,則對(duì)于每一個(gè)出現(xiàn)的匹配返回時(shí)會(huì)附加字符串偏移量(相對(duì)于目標(biāo)字符串)offset通常,搜索從目標(biāo)字符串的開(kāi)始位置開(kāi)始??蛇x參數(shù)offset用于指定從目標(biāo)字符串的某個(gè)位置開(kāi)始搜索(單位是字節(jié))表3.5.1
preg_match()函數(shù)參數(shù)詳情
作為計(jì)算機(jī)軟件從業(yè)人員,應(yīng)當(dāng)具備和遵守嚴(yán)格的職業(yè)道德規(guī)范,包括但不限于以下方面。(1)尊重客戶(hù)隱私。在工作中,不可避免地會(huì)接觸到客戶(hù)的各種信息。這些信息是客戶(hù)的隱私,僅限于工作過(guò)程中使用,不得泄露、傳播。(2)保護(hù)知識(shí)產(chǎn)權(quán)。在從事軟件開(kāi)發(fā)的過(guò)程中,會(huì)涉及不同硬件、軟件的使用。這要求從業(yè)人員能夠保護(hù)知識(shí)產(chǎn)權(quán),切不可侵權(quán),否則要承擔(dān)相應(yīng)的法律責(zé)任。(3)培養(yǎng)誠(chéng)信、守時(shí)的意識(shí)和習(xí)慣。在工作崗位中,要重視合同、協(xié)議和指定的責(zé)任,要按照規(guī)定的時(shí)間,認(rèn)真完成各項(xiàng)工作?!救蝿?wù)小結(jié)】
在任務(wù)3中,我們創(chuàng)建了數(shù)據(jù)庫(kù),并完成了用戶(hù)注冊(cè)的功能。在用戶(hù)注冊(cè)時(shí),還需要判斷用戶(hù)名是否重復(fù)。同時(shí),為了保證數(shù)據(jù)的安全性和合法性,我們?cè)谇岸撕秃蠖硕歼M(jìn)行了數(shù)據(jù)驗(yàn)證,驗(yàn)證的方法主要是使用正則表達(dá)式。正則表達(dá)式本身也較為復(fù)雜,有很多的語(yǔ)法規(guī)則,大家如果想全面了解正則表達(dá)式的相關(guān)內(nèi)容,可以去網(wǎng)上查詢(xún)相關(guān)資料。牟奇春主編PHP動(dòng)態(tài)網(wǎng)站開(kāi)發(fā)項(xiàng)目教程(微課版)任務(wù)4會(huì)員管理系統(tǒng)用戶(hù)登錄、資料修改及注銷(xiāo)子任務(wù)4.1用戶(hù)登錄4.1.1創(chuàng)建用戶(hù)登錄文件
根據(jù)項(xiàng)目開(kāi)始前完成的詳細(xì)需求分析,現(xiàn)在需要完成登錄頁(yè)面的制作。(1)選中member目錄并單擊鼠標(biāo)右鍵,在快捷菜單中選擇“New”
→“PHPFile”命令,創(chuàng)建新文件login.php。(2)打開(kāi)signup.php文件,把其中的內(nèi)容復(fù)制到login.php中。因?yàn)榈卿涰?yè)面和注冊(cè)頁(yè)面的靜態(tài)內(nèi)容有一定的相似之處,所以可以直接把注冊(cè)頁(yè)面的內(nèi)容復(fù)制過(guò)來(lái),然后進(jìn)行修改。(3)在login.php文件中修改導(dǎo)航欄中的當(dāng)前欄目,在“會(huì)員登錄”鏈接上添加class樣式“current”。在表單中只保留用戶(hù)名和密碼控件,刪除其他控件。同理,在JavaScript方法check()中只保留用戶(hù)名和密碼的相關(guān)驗(yàn)證內(nèi)容。(4)選中member目錄并單擊鼠標(biāo)右鍵,在快捷菜單中選擇“New”
→“PHPFile”命令,創(chuàng)建新文件postLogin.php。(5)在login.php文件中修改<form>標(biāo)簽中的action屬性,將其值改成postLogin.php即可。4.1.2制作用戶(hù)登錄后端文件
在SQL語(yǔ)句中,通過(guò)select關(guān)鍵字來(lái)實(shí)現(xiàn)查詢(xún),通過(guò)where子句來(lái)實(shí)現(xiàn)數(shù)據(jù)記錄的篩選。篩選的依據(jù)是,判斷username這一列是否存在數(shù)據(jù)等于用戶(hù)輸入的用戶(hù)名,pw這一列是否存在數(shù)據(jù)等于用戶(hù)輸入的密碼經(jīng)過(guò)MD5加密后的結(jié)果。4.1.3通過(guò)Session變量保存登錄標(biāo)志
PHP中的Session變量用于存儲(chǔ)關(guān)于用戶(hù)會(huì)話(huà)(Session)的信息,或者更改用戶(hù)會(huì)話(huà)的設(shè)置。Session變量存儲(chǔ)單一用戶(hù)的信息,并且對(duì)于應(yīng)用程序中的所有頁(yè)面都是可用的。
存儲(chǔ)和取出Session變量的正確方法是使用PHP中的$_SESSION全局變量。如果要?jiǎng)h除某些Session變量,則可以使用unset()或session_destroy()函數(shù)。unset()函數(shù)用于釋放指定的Session變量,而session_destroy()可以刪除所有的Session變量。
需要注意,Session是有生命周期的,長(zhǎng)時(shí)間不操作該網(wǎng)站,Session將會(huì)過(guò)期,過(guò)期的Session會(huì)被自動(dòng)刪除。Session的默認(rèn)生命周期是1440s,可以在php.ini配置文件中修改和設(shè)置,或者直接在PHP文件中使用代碼來(lái)重新設(shè)置生命周期。子任務(wù)4.2注銷(xiāo)登錄4.2.1在導(dǎo)航欄中使用文件包含
項(xiàng)目制作到這里,小王同學(xué)發(fā)現(xiàn),頁(yè)面頂部的導(dǎo)航欄會(huì)在每一個(gè)頁(yè)面中顯示,這些代碼在每一個(gè)文件中重復(fù)出現(xiàn),借鑒前面完成conn.php文件的經(jīng)驗(yàn),應(yīng)該也可以用同樣的方法,即將導(dǎo)航欄代碼放到一個(gè)單獨(dú)的文件中,以?xún)?yōu)化代碼。
選中member目錄并單擊鼠標(biāo)右鍵,創(chuàng)建新文件nav.php,并將原來(lái)導(dǎo)航欄相關(guān)的CSS、HTML代碼移植過(guò)來(lái)。
修改index.php、signup.php、login.php文件,在原來(lái)導(dǎo)航欄代碼的位置用include_once()包含nav.php文件。需要注意的是,由于在nav.php文件中使用了Session,因此,在其他文件中引用此文件之前,都需要先開(kāi)啟會(huì)話(huà)。
可以看到,小王同學(xué)在導(dǎo)航欄中添加了當(dāng)前登錄者的用戶(hù)名和注銷(xiāo)登錄的鏈接。其中使用了一個(gè)函數(shù)isset(),這個(gè)函數(shù)用于判斷變量是否存在。if(isset($_SESSION['loggedUsername'])&&$_SESSION['loggedUsername']<>'')的作用是,首先判斷$_SESSION['loggedUsername']是否存在,如果不存在,則直接返回false;如果存在,則判斷$_SESSION['loggedUsername']是否為空。登錄成功后,$_SESSION['loggedUsername']中保存的是當(dāng)前登錄者的用戶(hù)名。如果這兩個(gè)條件均為true,則if條件判斷語(yǔ)句結(jié)果為true,顯示當(dāng)前登錄者的用戶(hù)名和注銷(xiāo)登錄的鏈接。4.2.2實(shí)現(xiàn)導(dǎo)航欄當(dāng)前欄目高亮功能
完成導(dǎo)航欄的文件包含后,小王測(cè)試了一下項(xiàng)目,發(fā)現(xiàn)單擊導(dǎo)航欄中的各個(gè)欄目后,無(wú)法實(shí)現(xiàn)當(dāng)前欄目的高亮顯示。通過(guò)思考他發(fā)現(xiàn)了問(wèn)題,就是當(dāng)前欄目會(huì)在當(dāng)前鏈接的“<a>”標(biāo)簽上添加一個(gè)樣式current?,F(xiàn)在使用的是包含文件,無(wú)法知道當(dāng)前是哪個(gè)欄目,樣式current也就不知道應(yīng)該添加在哪個(gè)鏈接上。
經(jīng)過(guò)反復(fù)研究,小王同學(xué)終于想到了一個(gè)辦法來(lái)解決此難題。他使用的具體方法是,在nav.php文件中的各個(gè)導(dǎo)航鏈接上添加一個(gè)id參數(shù),當(dāng)其他頁(yè)面包含nav.php文件后,在單擊鏈接跳轉(zhuǎn)時(shí),會(huì)同時(shí)傳遞這個(gè)id參數(shù),然后在nav.php中讀取這個(gè)參數(shù),根據(jù)參數(shù)的值來(lái)決定給哪一個(gè)欄目添加當(dāng)前欄目指示。這里就涉及PHP各個(gè)頁(yè)面之間參數(shù)傳遞的方法。一個(gè)簡(jiǎn)單的頁(yè)面間傳參的方式是在URL后面添加參數(shù),使用“?”進(jìn)行地址和參數(shù)的分隔,用等號(hào)連接參數(shù)名和具體的值,如果有多個(gè)參數(shù),則使用“&”連接即可。
其中地址欄傳遞過(guò)來(lái)的參數(shù)在后端頁(yè)面中可以使用$_GET讀取。在讀取之前,應(yīng)該先用isset()函數(shù)判斷id參數(shù)是否存在。比如,當(dāng)用戶(hù)第一次進(jìn)入系統(tǒng),打開(kāi)首頁(yè),這里包含的nav.php文件沒(méi)有id參數(shù),自然也就無(wú)法讀取到id。只有單擊某個(gè)導(dǎo)航鏈接跳轉(zhuǎn)至新的頁(yè)面時(shí),才會(huì)傳遞id參數(shù)。圖4.2.1
系統(tǒng)提示
在PhpStorm的右下角默認(rèn)顯示有一個(gè)“PHP:5.6”鏈接,表示當(dāng)前IDE設(shè)置的PHP版本是5.6,單擊可以設(shè)置PHP的版本,如圖4.2.2所示。根據(jù)前面Web服務(wù)器的配置(請(qǐng)參考圖2.2.1中的“PHP版本”),在這里將PHP的版本設(shè)置成7.3即可。經(jīng)過(guò)重新設(shè)置,紅色波浪線會(huì)自動(dòng)消失。圖4.2.2
設(shè)置PHP版本
session_destroy()函數(shù)的作用是刪除所有會(huì)話(huà)。當(dāng)然需要注意的是,使用session_destroy()之前還是需要先開(kāi)啟會(huì)話(huà)。刪除會(huì)話(huà)后,再使用header()函數(shù)即可直接跳轉(zhuǎn)至index.php文件。
接下來(lái)小王同學(xué)測(cè)試了項(xiàng)目的運(yùn)行,得到了圖4.2.3所示的結(jié)果。圖4.2.3
登錄成功后在導(dǎo)航欄顯示登錄者的用戶(hù)名子任務(wù)4.3會(huì)員資料修改4.3.1優(yōu)化登錄頁(yè)面跳轉(zhuǎn)邏輯
小王同學(xué)查看了已經(jīng)做好的用戶(hù)登錄功能,當(dāng)?shù)卿洺晒?,保存了登錄?biāo)志,就沒(méi)有執(zhí)行其他操作了,頁(yè)面也還是繼續(xù)停留在登錄頁(yè)面,這顯然不太合理。登錄成功后應(yīng)該跳轉(zhuǎn)到首頁(yè)才比較合理。
小王同學(xué)把postLogin.php文件修改了一下,添加了登錄成功后的跳轉(zhuǎn)功能。如果登錄成功,則跳轉(zhuǎn)至首頁(yè)。如果登錄失敗,則返回至上一個(gè)頁(yè)面,讓用戶(hù)重新輸入用戶(hù)名和密碼進(jìn)行登錄。4.3.2創(chuàng)建會(huì)員資料修改頁(yè)面
通過(guò)分析會(huì)員資料修改頁(yè)面的特點(diǎn),小王同學(xué)梳理了制作的思路。(1)在member項(xiàng)目中新建文件modify.php。在制作導(dǎo)航欄時(shí),已經(jīng)在nav.php中的“個(gè)人資料修改”鏈接添加了目標(biāo)鏈接頁(yè)面modify.php,但還未制作此文件,因此需要?jiǎng)?chuàng)建此文件。(2)從signup.php文件中復(fù)制代碼,然后粘貼到modify.php文件中。由于資料修改頁(yè)面和注冊(cè)頁(yè)面有較高的相似性,因此可以直接從signup.php文件中復(fù)制代碼,再進(jìn)行適當(dāng)修改。(3)在表單中顯示已有的各項(xiàng)資料。(4)修改資料后,單擊“提交”按鈕,將各項(xiàng)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 孕期肋骨痛的健康宣教
- 注冊(cè)安全工程師考試課件安全生產(chǎn)管理
- 頂葉腫瘤的健康宣教
- JJF(陜) 065-2021 彎折試驗(yàn)機(jī)校準(zhǔn)規(guī)范
- 《解表藥發(fā)散風(fēng)熱》課件
- 《保險(xiǎn)和證券的區(qū)別》課件
- 逃生自救的正確方法培訓(xùn)
- 倉(cāng)庫(kù)清潔與維護(hù)計(jì)劃
- 特需門(mén)診服務(wù)與患者體驗(yàn)的總結(jié)計(jì)劃
- 生物與技術(shù)結(jié)合的實(shí)踐探索計(jì)劃
- 期末綜合試卷(含答案)2024-2025學(xué)年蘇教版數(shù)學(xué)四年級(jí)上冊(cè)
- 10以?xún)?nèi)加減法練習(xí)題1000題-直接打印版
- 必刷題2024六年級(jí)英語(yǔ)上冊(cè)語(yǔ)法結(jié)構(gòu)專(zhuān)項(xiàng)專(zhuān)題訓(xùn)練(含答案)
- 2024年連云港專(zhuān)業(yè)技術(shù)人員繼續(xù)教育《飲食、運(yùn)動(dòng)和健康的關(guān)系》92分(試卷)
- MOOC 電磁場(chǎng)與電磁波理論-南京郵電大學(xué) 中國(guó)大學(xué)慕課答案
- GA 1809-2022城市供水系統(tǒng)反恐怖防范要求
- DGJ 08-70-2021 建筑物、構(gòu)筑物拆除技術(shù)標(biāo)準(zhǔn)
- 閥芯設(shè)計(jì)計(jì)算
- 百草園項(xiàng)目實(shí)施方案
- 史學(xué)概論考試復(fù)習(xí)資料(共13頁(yè))
- 陳述句改成雙重否定句的方法題目和答案
評(píng)論
0/150
提交評(píng)論