項目3 會員管理系統(tǒng)用戶注冊_第1頁
項目3 會員管理系統(tǒng)用戶注冊_第2頁
項目3 會員管理系統(tǒng)用戶注冊_第3頁
項目3 會員管理系統(tǒng)用戶注冊_第4頁
項目3 會員管理系統(tǒng)用戶注冊_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

牟奇春主編PHP動態(tài)網(wǎng)站開發(fā)項目教程(微課版)任務3會員管理系統(tǒng)用戶注冊子任務3.1獲取表單數(shù)據(jù)【任務實施】3.1.1從后端獲取前端表單數(shù)據(jù)

如果前端使用“GET”方式提交數(shù)據(jù),則使用“$_GET”;如果前端使用“POST”方式提交數(shù)據(jù),則使用“$_POST”。當然,也可以使用“$_REQUEST”全局數(shù)組來讀取前端表單提交的數(shù)據(jù),這種方式就不區(qū)分GET和POST了,均可以讀取前端表單提交的數(shù)據(jù)。圖3.1.1

后端文件讀取前端表單數(shù)據(jù)3.1.2書寫PHP代碼

PHP代碼必須放在一對特殊的標簽中,即以“<?php”開始,以“?>”結(jié)束。PHP代碼可以和HTML代碼混合書寫。若文件中包含PHP代碼,則文件名必須用“.php”作為擴展名。因為PHP文件可以輸出HTML內(nèi)容,而HTML文件卻不能包含PHP的相關(guān)內(nèi)容。其根源在于,HTML文件是瀏覽器可以直接解析的,而PHP文件是后端Apache等服務器調(diào)用PHP解釋器輸出的HTML內(nèi)容,瀏覽器并不能直接解析PHP文件及其內(nèi)容。3.1.3輸出數(shù)據(jù)子任務3.2創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表【任務實施】3.2.1開啟數(shù)據(jù)庫服務

要使用數(shù)據(jù)庫必須先開啟數(shù)據(jù)庫服務,或者說必須先啟動數(shù)據(jù)庫。小皮面板安裝好以后,即可支持創(chuàng)建MySQL數(shù)據(jù)庫。在小皮面板左側(cè)單擊“數(shù)據(jù)庫”,在其右側(cè)可以查看數(shù)據(jù)庫管理員的用戶名和密碼,如圖3.2.1所示。

單擊“+創(chuàng)建數(shù)據(jù)庫”按鈕,可以創(chuàng)建新的數(shù)據(jù)庫,并設置訪問的用戶名和密碼。管理員用戶名默認是“root”,密碼也是“root”,此賬號可以訪問和管理當前服務器中的所有數(shù)據(jù)庫,是最高權(quán)限的用戶。圖3.2.1

小皮面板數(shù)據(jù)庫管理3.2.2安裝可視化數(shù)據(jù)庫管理工具

小王同學在查詢資料時從網(wǎng)絡上看到,MySQL數(shù)據(jù)庫可以使用命令行方式來進行相關(guān)操作。但這種方式對初學者極不友好,難度太大。

與命令行方式相對應,還有一種可視化的操作方式,這種方式就好理解多了。在小皮面板中就可以安裝和使用可視化數(shù)據(jù)庫管理工具。

進入“軟件管理”面板,單擊上方的“工具”→“數(shù)據(jù)庫工具(客戶端)”按鈕,可以安裝第三方工具軟件來管理MySQL數(shù)據(jù)庫,如圖3.2.2所示。圖3.2.2

數(shù)據(jù)庫工具(客戶端)

除了使用工具軟件來管理MySQL數(shù)據(jù)庫,更常見的是使用Web工具來管理數(shù)據(jù)庫,這樣更簡便。在上方工具欄中單擊“網(wǎng)站程序”→

“數(shù)據(jù)庫工具(web)”按鈕,可以看到有一個名為“phpMyAdmin4.8.5”的工具,如圖3.2.3所示,這是純網(wǎng)頁版的MySQL數(shù)據(jù)庫管理工具,單擊即可安裝。在安裝時,需要選擇安裝的位置,一般選擇安裝在默認的localhost網(wǎng)站中。圖3.2.3

在軟件管理中安裝phpMyAdmin

安裝好phpMyAdmin以后,單擊“管理”按鈕,即可在網(wǎng)頁中打開phpMyAdmin,如圖3.2.4所示。圖3.2.4

在phpMyAdmin中管理數(shù)據(jù)庫3.2.3創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表

圖3.2.4左側(cè)區(qū)域顯示的是系統(tǒng)中已經(jīng)有的數(shù)據(jù)庫。接下來,單擊左側(cè)的“新建”,然后在右側(cè)輸入數(shù)據(jù)庫的名稱“member”,并單擊“創(chuàng)建”按鈕,即可創(chuàng)建數(shù)據(jù)庫member。創(chuàng)建好的數(shù)據(jù)庫member如圖3.2.5所示。圖3.2.5

創(chuàng)建好的數(shù)據(jù)庫member

有了數(shù)據(jù)庫以后,接下來就要創(chuàng)建數(shù)據(jù)表“info”(會員信息表),并在“info”中創(chuàng)建7個數(shù)據(jù)字段,分別是“id”(id字段,用于唯一標識一行數(shù)據(jù))、“username”(用戶名)、“pw”(密碼)、“email”(郵箱)、“sex”(性別)、“fav”(愛好)、“createTime”(創(chuàng)建時間),如圖3.2.6所示。圖3.2.6

創(chuàng)建info數(shù)據(jù)表3.2.4數(shù)據(jù)表字段類型說明(1)id:在創(chuàng)建數(shù)據(jù)表字段時,每一張表都要求有一個id字段,這是表的主鍵,用于唯一標識一行數(shù)據(jù)。其類型為INT,并勾選后面的“A_I”標識列,將其設置成自增(AUTO_INCREMENT)字段。這個字段在以后使用的過程中,創(chuàng)建記錄時不需要提供值,系統(tǒng)會自動按照順序從1開始,依次提供值。(2)username:VARCHAR類型,長度為50。這里要注意單位。在MySQL4.0及以下的版本中,這里的單位是字節(jié)。(3)pw:CHAR類型,長度為32。在數(shù)據(jù)庫中保存密碼時,不能直接保存明文,需要加密后保存為密文。一般可使用MD5方式進行數(shù)據(jù)加密,常用的MD5加密數(shù)據(jù)是32字節(jié)的固定長度,因此,密碼字段選擇CHAR類型,長度固定為32字節(jié)。(4)email:VARCHAR類型,長度為256。(5)sex:TINYINT類型,長度為1。TINYINT也是INT的一種,TINYINT占用1字節(jié)。(6)fav:VARCHAR類型,長度為300。(7)createTime:INT類型,長度為10。創(chuàng)建時間,可以選擇DATETIME類型,也可以選擇INT類型。在DATETIME類型中,將直接保存“年月日時分秒”類型的時間。在INT類型中,保存的是時間戳。時間戳是一個10位的整型數(shù)據(jù),具體是指格林尼治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)至現(xiàn)在的總秒數(shù)。子任務3.3將注冊信息寫入數(shù)據(jù)庫【任務實施】第一步是“連接數(shù)據(jù)庫服務器”第二步是“設置字符集”第三步是“設置SQL語句”第四步是“執(zhí)行SQL查詢語句”3.3.1連接數(shù)據(jù)庫服務器

上述代碼的第2行用于連接數(shù)據(jù)庫服務器。在PHP中,連接不同的數(shù)據(jù)庫服務器需要使用不同的連接函數(shù)。由于小王同學已經(jīng)確定了在會員管理系統(tǒng)中使用MySQL數(shù)據(jù)庫,因此,后面所有的內(nèi)容均以MySQL數(shù)據(jù)庫為例進行編碼。在上面的代碼中,第2行使用了mysqli_connect()函數(shù),該函數(shù)將打開一個到MySQL數(shù)據(jù)庫服務器的新連接,其語法規(guī)則為:mysqli_connect(host,username,password,dbname,port,socket);

該函數(shù)支持6個參數(shù),參數(shù)詳情如表3.3.1所示。參數(shù)描述host可選。規(guī)定主機名或IP地址username可選。規(guī)定MySQL用戶名password可選。規(guī)定MySQL密碼dbname可選。規(guī)定默認使用的數(shù)據(jù)庫port可選。規(guī)定嘗試連接到MySQL服務器的端口號socket可選。規(guī)定套接字(socket)文件表3.3.1

mysqli_connect()函數(shù)參數(shù)詳情

該函數(shù)的返回值是一個連接到MySQL服務器的對象,這里使用的是“$conn”。如果該函數(shù)執(zhí)行出錯,則返回false。

在實際使用時,一般來說,主機名都使用“l(fā)ocalhost”,代表本地主機,也就是當前運行PHP文件的服務器。用戶名和密碼都使用的是“root”,這是默認的最高權(quán)限的賬戶。第4個參數(shù)是默認使用的數(shù)據(jù)庫,在這里使用的是“member”。最后兩個參數(shù)可以不用填寫,直接使用默認值。

因為此函數(shù)執(zhí)行失敗會返回false,所以接下來在代碼的第3行中用if語句來判斷“$conn”的真假,如果返回值為false,則通過“!”取反,其結(jié)果會變成true,程序進入if分支,會通過die()函數(shù)輸出錯誤提示信息,即“連接數(shù)據(jù)庫服務器失敗”,同時,此函數(shù)會中止整個程序的運行。3.3.2設置字符集

上述代碼的第7行用于設置字符集,使用到了PHP中的函數(shù)mysqli_query(),這個函數(shù)的作用是執(zhí)行針對數(shù)據(jù)庫的查詢,其語法規(guī)則如下。mysqli_query(connection,query,resultmode);

該函數(shù)的參數(shù)詳情如表3.3.2所示。參數(shù)描述connection必需。規(guī)定要使用的MySQL連接query必需。規(guī)定查詢字符串resultmode可選。一個常量,可以是下列值中的任意一個:(1)MYSQLI_USE_RESULT(如果需要檢索大量數(shù)據(jù),則使用這個);(2)MYSQLI_STORE_RESULT(默認)表3.3.2

mysqli_query()函數(shù)參數(shù)詳情

針對成功的SELECT、SHOW、DESCRIBE或EXPLAIN查詢,該函數(shù)將返回一個mysqli_result對象。針對其他成功的查詢,將返回TRUE。如果失敗,則返回FALSE。

在上述代碼的第7行中,第一個參數(shù)是$conn,表示上面第一步生成的數(shù)據(jù)庫連接對象。第二個參數(shù)是“setnamesutf8”,表示將字符集設置成UTF-8,這個字符集要和數(shù)據(jù)庫的字符集保持一致,否則在顯示中文等特殊內(nèi)容時會出現(xiàn)亂碼。3.3.3設置SQL查詢語句

上述代碼的第9行使用結(jié)構(gòu)化查詢語言(StructuredQueryLanguage,SQL)設置了一個查詢語句。SQL是一種具有特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設計語言,用于存取數(shù)據(jù),以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。

在這里,小王同學使用INSERTINTO語句向數(shù)據(jù)表中插入新記錄。INSERTINTO語句有兩種編寫形式。

第一種形式無須指定要插入數(shù)據(jù)的列名,只需提供被插入的值。INSERTINTO

table_nameVALUES(value1,value2,value3,...);

第二種形式需要指定列名及被插入的值:INSERTINTO

table_name

(column1,column2,column3,...)VALUES(value1,value2,value3,...);3.3.4執(zhí)行SQL查詢語句

上述代碼的第11行用于執(zhí)行SQL查詢語句。執(zhí)行SQL查詢語句使用的還是mysqli_query()函數(shù),其返回值是$result。如果系統(tǒng)成功執(zhí)行了給定的SQL語句,則$result將為真,否則為假。上述代碼的第12~第16行用于通過判斷$result的真假,彈出注冊成功或失敗的提示。

回到注冊頁面,輸入各項數(shù)據(jù),如圖3.3.1所示。單擊“提交”按鈕,然后順利看到了“數(shù)據(jù)插入成功”的提示。接下來,如果進入phpMyAdmin,重新刷新info數(shù)據(jù)表,就可以在其中看到新插入的一條數(shù)據(jù)記錄。圖3.3.1

輸入信息進行會員注冊

在PHP程序中,如果執(zhí)行代碼時出現(xiàn)錯誤,則會在頁面中根據(jù)錯誤的級別進行相應的錯誤提示。PHP中的典型錯誤有以下幾種。(1)E_ERROR:這是一種致命的錯誤,遇到這種錯誤時,程序?qū)⑦M行錯誤提示,并終止腳本繼續(xù)運行。(2)E_WARNING:這是一種非致命的錯誤,遇到這種錯誤時,程序?qū)⑦M行錯誤提示,但是不會終止腳本繼續(xù)運行。(3)E_PARSE:這是一種腳本語法錯誤,是級別最高的錯誤。當出現(xiàn)這種錯誤時,整個腳本根本不會執(zhí)行。(4)E_NOTICE:這是一種運行時通知消息,表示腳本遇到可能會表現(xiàn)為錯誤的情況,但是在可以正常運行的腳本中也可能會有類似的通知。

在上面將注冊信息寫入數(shù)據(jù)庫的代碼中,如果故意將mysqli_

connect()函數(shù)中的數(shù)據(jù)庫用戶名輸入錯誤,則運行程序時,在頁面中會顯示出錯誤提示,如圖3.3.2所示。從這個提示來看,系統(tǒng)產(chǎn)生了一個警告(Warning)信息,提示用戶root訪問數(shù)據(jù)庫失敗。這時需要檢查數(shù)據(jù)庫用戶名和密碼是否正確。

重新修改為正確的密碼后,刷新瀏覽器,系統(tǒng)彈出“數(shù)據(jù)插入成功”的提示,如圖3.3.3所示。

圖3.3.2

會員注冊出錯

圖3.3.3

會員注冊成功

此時,進入數(shù)據(jù)庫,查看結(jié)果,可以看到新插入的一條數(shù)據(jù)記錄,如圖3.3.4所示。3.3.5項目階段性成果

圖3.3.4

新插入的數(shù)據(jù)記錄子任務3.4判斷用戶名是否被占用【任務實施】

由于每一個會員的用戶名是唯一的,就好比人的身份證號碼一樣,不能重復。因此,在插入新的記錄時,需要先判斷當前用戶名是否在數(shù)據(jù)表中已經(jīng)存在。如果已經(jīng)存在,則應該彈出提示,讓用戶重新輸入不同的用戶名。如果用戶名在數(shù)據(jù)表中不存在,則說明是一個全新的用戶名,可以直接寫入數(shù)據(jù)庫。3.4.1通過SQL語句判斷用戶名是否被占用

3.4.2使用SQL中的SELECT語句

參數(shù)描述result必需。規(guī)定由

mysqli_query()、mysqli_store_result()或

mysqli_use_result()返回的結(jié)果集標識符表3.4.1

mysqli_num_rows()函數(shù)參數(shù)詳情

在PHP中,任何非零非空的值均表示true。因此,只要結(jié)果集中有記錄,$num就是一個大于0的數(shù)字,其結(jié)果為真,表示查詢到了此用戶名(當然,根據(jù)info數(shù)據(jù)表的設計原則,如果找到了數(shù)據(jù),則一定只能找到一條數(shù)據(jù),也就是$num要么為0,要么為1)。如果查詢到了此用戶名,則通過echo函數(shù)顯示JavaScript彈窗提示該用戶名已經(jīng)被占用。參數(shù)描述string必需。規(guī)定要檢查的字符串表3.4.2

strlen()函數(shù)參數(shù)詳情

該函數(shù)如果執(zhí)行成功,則返回字符串的長度,如果字符串為空,則返回0。如果返回0,對于if條件語句而言,結(jié)果就是false,因此,用“!”運算符取反就得到true。一旦用戶名為空,或者密碼為空,系統(tǒng)都會顯示彈窗。exit()函數(shù)可以輸出一條消息,并退出當前腳本(中止當前程序的執(zhí)行)。該函數(shù)是

die()

函數(shù)的別名。3.4.3在PhpStorm中配置數(shù)據(jù)源

注冊功能已經(jīng)完成了,可是,小王同學突然注意到,他在PhpStorm中所寫的SQL語句被標記有黃色底紋。同時,把鼠標指針移至底紋上,系統(tǒng)還出現(xiàn)了一些提示信息,如圖3.4.1所示。圖3.4.1

未配置數(shù)據(jù)源和SQLDialect的提示圖3.4.2

配置SQLDialect圖3.4.3

未配置數(shù)據(jù)源的提示

注意觀察,數(shù)據(jù)源配置界面下面有一個提示,即“missingdriverfiles”,表示系統(tǒng)缺少驅(qū)動文件。單擊前面的“Download”,系統(tǒng)會自動下載當前驅(qū)動程序。最后單擊“TestConnection”按鈕,測試是否能正常連接數(shù)據(jù)庫。由于PhpStorm的版本不同,此時可能會出現(xiàn)圖3.4.5所示的錯誤提示信息。此信息表明當前Web服務器時區(qū)配置錯誤,單擊“Settimezone”,將默認的UTC時區(qū)修改成PRC時區(qū)即可,如圖3.4.6所示。這個時區(qū)非常重要,關(guān)系到系統(tǒng)時間是否正確。圖3.4.4

配置數(shù)據(jù)源和驅(qū)動圖3.4.5

服務器時區(qū)配置錯誤圖3.4.6

配置服務器時區(qū)

配置好上述內(nèi)容后,在PhpStorm的右側(cè)出現(xiàn)一個Database標簽,單擊可以展開,在其中可以看到當前member數(shù)據(jù)庫的詳細情況,如圖3.4.7所示。圖3.4.7

配置好的數(shù)據(jù)源子任務3.5表單驗證【任務實施】3.5.1重視數(shù)據(jù)驗證

數(shù)據(jù)驗證需要在前端和后端同時進行,這樣做的目的是保證系統(tǒng)安全,以及減輕服務器的壓力。比如,用戶明明沒有填寫用戶名,還去單擊“提交”按鈕,這顯然是沒有意義的。如果在前端不進行判斷和處理,那么這一次無效的交互仍然要占用服務器的資源。另外,本系統(tǒng)的后端主要是使用SQL語句和數(shù)據(jù)庫進行交互,如果在前端不加以限制,則可能會輸入一些危險字符,帶來SQL注入風險。3.5.2在前端驗證表單數(shù)據(jù)

前端數(shù)據(jù)驗證一般是使用JavaScript來進行的。為了避免前端繞過數(shù)據(jù)驗證,在后端接收到數(shù)據(jù)后,還需要再一次進行數(shù)據(jù)驗證。

在會員注冊表單中,需要驗證的內(nèi)容如下。(1)用戶名。必填,內(nèi)容只能是大小寫字母、數(shù)字,長度為3~10個字符。(2)密碼。必填,內(nèi)容只能是大小寫字母、數(shù)字、“_”、“*”,長度為6~10個字符。(3)確認密碼。必填,且必須和密碼保持一致。(4)信箱。格式必須正確,可以不填。(5)愛好??梢圆贿x。

在單擊“提交”按鈕時,要攔截系統(tǒng)提交,即先驗證數(shù)據(jù),合格后再提交表單。只需要在<form>標簽中添加一個onsubmit事件,即可實現(xiàn)提交攔截。3.5.3在前端驗證數(shù)據(jù)

解讀一下小王同學寫的代碼。在代碼的第3行,document.

getElementsByName()讀取名字為“username”的元素,這樣就可以得到一個數(shù)組。但在整個注冊頁面中,只有一個username元素,因此,取此數(shù)組的第一個元素,然后讀取其value屬性,即可得到用戶輸入的用戶名,再使用“trim()”方法刪去其前后用戶可能不小心輸入的空格。3.5.4在后端驗證表單數(shù)據(jù)

在前端完成了數(shù)據(jù)驗證,為了提高安全性與可靠性,在后端也必須完成表單數(shù)據(jù)驗證。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論