- PHP從入門(mén)到精通(微視頻精編版)
- 明日科技
- 6193字
- 2020-11-23 14:41:19
第9章 PHP操作MySQL數(shù)據(jù)庫(kù)
(視頻講解:1小時(shí)35分鐘)
第8章中,我們學(xué)習(xí)了通過(guò)MySQL命令行或視圖管理工具來(lái)操作MySQL,本章將介紹如何使用PHP來(lái)操作MySQL。很長(zhǎng)時(shí)間以來(lái),PHP操作MySQL數(shù)據(jù)庫(kù)使用的是mysql擴(kuò)展庫(kù)提供的相關(guān)函數(shù),但是,隨著MySQL的發(fā)展,mysql擴(kuò)展庫(kù)開(kāi)始出現(xiàn)一些問(wèn)題,逐漸被mysqli擴(kuò)展庫(kù)取代。本章將介紹如何使用mysqli擴(kuò)展庫(kù)來(lái)操作MySQL數(shù)據(jù)庫(kù)。
學(xué)習(xí)摘要:
連接MySQL
選擇數(shù)據(jù)庫(kù)
執(zhí)行SQL語(yǔ)句
返回結(jié)果集
從結(jié)果集中獲取數(shù)據(jù)
釋放內(nèi)存
關(guān)閉MySQL連接
管理數(shù)據(jù)庫(kù)中的記錄
9.1 PHP操作MySQL數(shù)據(jù)庫(kù)的方法

視頻講解
mysqli函數(shù)庫(kù)和mysql函數(shù)庫(kù)的應(yīng)用基本類(lèi)似,而且大部分函數(shù)的使用方法都一樣,唯一的區(qū)別就是mysqli函數(shù)庫(kù)中的函數(shù)名稱(chēng)都是以mysqli開(kāi)始的。
9.1.1 連接MySQL服務(wù)器
PHP操作MySQL數(shù)據(jù)庫(kù),首先要建立與MySQL數(shù)據(jù)庫(kù)的連接。在第8章中,我們使用如下命令連接數(shù)據(jù)庫(kù):

現(xiàn)在,使用mysqli擴(kuò)展提供的mysqli_connect()函數(shù)實(shí)現(xiàn)與MySQL數(shù)據(jù)庫(kù)的連接,函數(shù)語(yǔ)法如下:

mysqli_connect()函數(shù)用于打開(kāi)一個(gè)到MySQL服務(wù)器的連接,如果成功則返回一個(gè)MySQL連接標(biāo)識(shí),失敗則返回false。該函數(shù)的參數(shù)如表9.1所示。
表9.1 mysqli_connect()函數(shù)的參數(shù)說(shuō)明

例如,應(yīng)用mysqli_connect()函數(shù)創(chuàng)建與MySQL服務(wù)器的連接,MySQL數(shù)據(jù)庫(kù)服務(wù)器地址為localhost,用戶名為root,密碼為root,代碼如下:

運(yùn)行上述代碼,如果在本地計(jì)算機(jī)中安裝了MySQL數(shù)據(jù)庫(kù),并且連接數(shù)據(jù)庫(kù)的用戶名為root,密碼為root,則會(huì)彈出如圖9.1所示的對(duì)話框。

圖9.1 數(shù)據(jù)庫(kù)連接成功
說(shuō)明
代碼中使用了JavaScript的alert()方法彈出提示框。
9.1.2 選擇MySQL數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)連接完成以后,需要選擇數(shù)據(jù)庫(kù)。第8章中選擇數(shù)據(jù)庫(kù)命令如下:

現(xiàn)在,使用mysqli擴(kuò)展庫(kù)提供的mysqli_connect()函數(shù)可以創(chuàng)建與MySQL服務(wù)器的連接,同時(shí)也可以指定要選擇的數(shù)據(jù)庫(kù)名稱(chēng),例如,在連接MySQL服務(wù)器的同時(shí)選擇名稱(chēng)為db_users的數(shù)據(jù)庫(kù),代碼如下:

除此之外,mysqli擴(kuò)展庫(kù)還提供了mysqli_select_db()函數(shù)用來(lái)選擇MySQL數(shù)據(jù)庫(kù)。其語(yǔ)法格式如下:

參數(shù)說(shuō)明如下。
link:為必選參數(shù),應(yīng)用mysqli_connect()函數(shù)成功連接MySQL數(shù)據(jù)庫(kù)服務(wù)器后返回的連接標(biāo)識(shí)。
dbname:為必選參數(shù),用戶指定要選擇的數(shù)據(jù)庫(kù)名稱(chēng)。
例如,創(chuàng)建database9數(shù)據(jù)庫(kù),然后使用mysqli_connect()函數(shù)建立與MySQL數(shù)據(jù)庫(kù)的連接,最后使用mysqli_select_db()函數(shù)選擇database9數(shù)據(jù)庫(kù),實(shí)現(xiàn)代碼如下:

運(yùn)行上述代碼,如果本地MySQL數(shù)據(jù)庫(kù)服務(wù)器中存在名為database9的數(shù)據(jù)庫(kù),將在頁(yè)面中輸出如下內(nèi)容:

否則輸出:

說(shuō)明
在實(shí)際的程序開(kāi)發(fā)過(guò)程中,通常將MySQL服務(wù)器的連接和數(shù)據(jù)庫(kù)的選擇存儲(chǔ)于一個(gè)單獨(dú)文件中,在需要使用的腳本中通過(guò)require語(yǔ)句包含這個(gè)文件即可。這樣做既有利于程序的維護(hù),同時(shí)也避免了代碼的冗余。
9.1.3 執(zhí)行SQL語(yǔ)句
在第8章中,使用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行操作。在mysqli擴(kuò)展庫(kù)中,同樣使用SQL語(yǔ)句對(duì)數(shù)據(jù)表進(jìn)行操作,但是需要使用mysqli_query()函數(shù)來(lái)執(zhí)行SQL語(yǔ)句。其語(yǔ)法格式如下:

參數(shù)說(shuō)明如下。
link:為必選參數(shù),mysqli_connect()函數(shù)成功連接MySQL數(shù)據(jù)庫(kù)服務(wù)器后所返回的連接標(biāo)識(shí)。
query:為必選參數(shù),所要執(zhí)行的SQL語(yǔ)句。
resultmode:為可選參數(shù),該參數(shù)取值有MYSQLI_USE_RESULT和MYSQLI_STORE_RESULT。其中MYSQLI_STORE_RESULT為該函數(shù)的默認(rèn)值。如果返回大量數(shù)據(jù)可以應(yīng)用MYSQLI_ USE_RESULT,但應(yīng)用該值時(shí),以后的查詢調(diào)用可能返回一個(gè)commands out of sync錯(cuò)誤,解決辦法是應(yīng)用mysqli_free_result()函數(shù)釋放內(nèi)存。
如果SQL語(yǔ)句是查詢指令select,成功則返回查詢結(jié)果集,否則返回false;如果SQL語(yǔ)句是insert、delete、update等操作指令,成功則返回true,否則返回false。
下面看一下如何通過(guò)mysqli_query()函數(shù)執(zhí)行簡(jiǎn)單的SQL語(yǔ)句。
執(zhí)行一個(gè)添加會(huì)員記錄的SQL語(yǔ)句的代碼如下:

執(zhí)行一個(gè)修改會(huì)員記錄的SQL語(yǔ)句的代碼如下:

執(zhí)行一個(gè)刪除會(huì)員記錄的SQL語(yǔ)句的代碼如下:

執(zhí)行一個(gè)查詢會(huì)員記錄的SQL語(yǔ)句的代碼如下:

mysqli_query()函數(shù)不僅可以執(zhí)行諸如select、update和insert等SQL指令,而且可以選擇數(shù)據(jù)庫(kù)和設(shè)置數(shù)據(jù)庫(kù)編碼格式。選擇數(shù)據(jù)庫(kù)的功能與mysqli_select_db()函數(shù)是相同的,代碼如下:

設(shè)置數(shù)據(jù)庫(kù)編碼格式的代碼如下:

9.1.4 將結(jié)果集返回到數(shù)組
使用mysqli_query()函數(shù)執(zhí)行select語(yǔ)句,如果成功將返回查詢結(jié)果集。下面介紹一個(gè)對(duì)查詢結(jié)果集進(jìn)行操作的函數(shù)mysqli_fetch_array()。它將結(jié)果集返回到數(shù)組中。其語(yǔ)法格式如下:

參數(shù)說(shuō)明如下。
result:資源類(lèi)型的參數(shù),要傳入的是由mysqli_query()函數(shù)返回的數(shù)據(jù)指針。
result_type:可選項(xiàng),設(shè)置結(jié)果集數(shù)組的表述方式。有以下3種取值。
·MYSQLI_ASSOC:返回一個(gè)關(guān)聯(lián)數(shù)組。數(shù)組下標(biāo)由表的字段名組成,如id、name。
·MYSQLI_NUM:返回一個(gè)索引數(shù)組。數(shù)組下標(biāo)由數(shù)字組成,如0、1、2。
·MYSQLI_BOTH:返回一個(gè)同時(shí)包含關(guān)聯(lián)和數(shù)字索引的數(shù)組。默認(rèn)值是MYSQLI_BOTH。
說(shuō)明
本函數(shù)返回的字段名要區(qū)分大小寫(xiě),這是初學(xué)者最容易忽略的問(wèn)題。
到此,PHP操作MySQL數(shù)據(jù)庫(kù)的方法已經(jīng)初露端倪,已經(jīng)可以實(shí)現(xiàn)MySQL服務(wù)器的連接、選擇數(shù)據(jù)庫(kù)、執(zhí)行查詢語(yǔ)句,并且可以將查詢結(jié)果集中的數(shù)據(jù)返回到數(shù)組中。下面編寫(xiě)一個(gè)實(shí)例,通過(guò)PHP操作MySQL數(shù)據(jù)庫(kù),讀取數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)。
【例9.01】 使用mysqli_fetch_array()函數(shù)讀取數(shù)據(jù)。(實(shí)例位置:資源包\源碼\09\9.01)
本例將利用mysqli_fetch_array()函數(shù),讀取database9數(shù)據(jù)庫(kù)中books圖書(shū)表中的數(shù)據(jù)。具體步驟如下。
(1)創(chuàng)建database9數(shù)據(jù)庫(kù),并選擇database9數(shù)據(jù)庫(kù)。SQL語(yǔ)句如下:

(2)創(chuàng)建books數(shù)據(jù)表,并設(shè)置數(shù)據(jù)庫(kù)編碼格式為utf8。SQL語(yǔ)句如下:

上述SQL語(yǔ)句創(chuàng)建了books表,該表共5個(gè)字段。其中,id字段是表的主鍵,并且是自增的;name字段用于保存圖書(shū)名稱(chēng);category字段用于保存圖書(shū)分類(lèi);price字段用于保存圖書(shū)價(jià)格;publish_ time字段用于保存出版時(shí)間。
(3)插入測(cè)試數(shù)據(jù)。為了顯示圖書(shū)信息,我們需要先在books表中插入幾條測(cè)試數(shù)據(jù)。SQL語(yǔ)句如下:

(4)連接數(shù)據(jù)庫(kù),獲取數(shù)據(jù)。創(chuàng)建index.php文件,具體代碼如下:

在上述代碼中,使用mysqli_connect()函數(shù)連接數(shù)據(jù)庫(kù),如果連接失敗,終止程序,并使用mysqli_error()函數(shù)顯示錯(cuò)誤信息。接下來(lái)設(shè)置數(shù)據(jù)庫(kù)編碼格式為UTF-8。代碼第5行使用mysqli_ query()執(zhí)行select語(yǔ)句,從數(shù)據(jù)庫(kù)中查詢獲取結(jié)果集。最后使用include_once()函數(shù),引入模板文件,即HTML頁(yè)面。
注意
為保證數(shù)據(jù)能正確顯示,建議讀者保持以下幾個(gè)編碼格式統(tǒng)一為UTF-8:PHP文件的編碼格式、HTML文件的編碼格式(可以使用PhpStorm編輯器設(shè)置)和數(shù)據(jù)表編碼格式(可以使用圖形化工具設(shè)置)。與PHP中不同的是,MySQL中指定的UTF-8編碼格式使用utf8,而不是utf-8。
(5)顯示圖書(shū)信息。創(chuàng)建lists.html文件,該文件就是HTML模板文件。使用mysqli_fetch_ array(),將結(jié)果集返回到數(shù)組中,通過(guò)while語(yǔ)句循環(huán)遍歷圖書(shū)數(shù)組,將每本圖書(shū)數(shù)據(jù)插入到<table>表格中,具體代碼如下:

運(yùn)行結(jié)果如圖9.2所示。

圖9.2 顯示圖書(shū)列表
9.1.5 從結(jié)果集中獲取一行作為對(duì)象
9.1.4 節(jié)中講解了應(yīng)用mysqli_fetch_array()函數(shù)來(lái)獲取結(jié)果集中的數(shù)據(jù)。除了這個(gè)方法以外,應(yīng)用mysqli_fetch_object()函數(shù)也可以輕松實(shí)現(xiàn)這一功能,下面通過(guò)同一個(gè)實(shí)例的不同方法來(lái)體驗(yàn)一下這兩個(gè)函數(shù)在使用上的區(qū)別。
首先介紹mysqli_fetch_object()函數(shù),其語(yǔ)法格式如下:

mysqli_fetch_object()函數(shù)和mysqli_fetch_array()函數(shù)類(lèi)似,只有一點(diǎn)區(qū)別:它返回的是一個(gè)對(duì)象而不是數(shù)組,即該函數(shù)只能通過(guò)字段名來(lái)訪問(wèn)數(shù)組。訪問(wèn)結(jié)果集中行的元素的語(yǔ)法結(jié)構(gòu)如下:

例如,如果從某數(shù)據(jù)表中檢索id和name值,可以用$row->id和$row->name訪問(wèn)行中的元素值。
注意
本函數(shù)返回的字段名同樣是區(qū)分大小寫(xiě)的。
【例9.02】 使用mysqli_fetch_object()函數(shù)讀取所有圖書(shū)數(shù)據(jù)。(實(shí)例位置:資源包\源碼\09\9.02)
本例中同樣是讀取database9數(shù)據(jù)庫(kù)中books數(shù)據(jù)表中的數(shù)據(jù),不同的是應(yīng)用mysqli_fetch_object()函數(shù)逐行獲取結(jié)果集中的記錄。由于在例9.01中,已經(jīng)創(chuàng)建了數(shù)據(jù)庫(kù)和數(shù)據(jù)表,并且連接了數(shù)據(jù)庫(kù),所以只需修改lists.html文件即可。
在lists.html文件中,使用mysqli_fetch_object()函數(shù)逐行獲取結(jié)果集,該結(jié)果集是一個(gè)對(duì)象,使用while語(yǔ)句循環(huán)遍歷對(duì)象,將每本圖書(shū)數(shù)據(jù)插入到<table>表格中,關(guān)鍵代碼如下:

本實(shí)例的運(yùn)行結(jié)果與例9.01相同,如圖9.2所示。
9.1.6 從結(jié)果集中獲取一行作為枚舉數(shù)組
mysqli_fetch_row()函數(shù)可以從結(jié)果集中取得一行作為枚舉數(shù)組,即數(shù)組的鍵用數(shù)字索引來(lái)表示。其語(yǔ)法格式如下:

mysqli_fetch_row()函數(shù)返回根據(jù)所取得的行生成的數(shù)組,如果沒(méi)有更多行則返回null。返回?cái)?shù)組的偏移量從0開(kāi)始,即以$row[0]的形式訪問(wèn)第一個(gè)元素(只有一個(gè)元素時(shí)也是如此)。
例如,使用mysqli_fetch_row()函數(shù)實(shí)現(xiàn)圖書(shū)列表的功能,只需修改lists.html文件,修改代碼如下:

上述代碼中使用mysqli_fetch_row()函數(shù)逐行獲取結(jié)果集中的記錄時(shí),只能使用數(shù)字索引來(lái)讀取數(shù)組中的數(shù)據(jù),而不能像mysqli_fetch_array()函數(shù)那樣可以使用關(guān)聯(lián)索引獲取數(shù)組中的數(shù)據(jù)。
本實(shí)例的運(yùn)行結(jié)果與例9.01相同,如圖9.2所示。
9.1.7 從結(jié)果集中獲取一行作為關(guān)聯(lián)數(shù)組
mysqli_fetch_assoc()函數(shù)可以從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,即數(shù)組的鍵用字段名來(lái)表示。其語(yǔ)法格式如下:

mysqli_fetch_assoc()函數(shù)返回根據(jù)所取得的行生成的數(shù)組,如果沒(méi)有更多行則返回null。該數(shù)組的下標(biāo)為數(shù)據(jù)表中字段的名稱(chēng)。

等價(jià)于:

9.1.8 獲取查詢結(jié)果集中的記錄數(shù)
使用mysqli_num_rows()函數(shù),可以獲取由select語(yǔ)句查詢到的結(jié)果集中行的數(shù)目。mysqli_num_ rows()函數(shù)的語(yǔ)法格式如下:

mysqli_num_rows()返回結(jié)果集中行的數(shù)目。此函數(shù)僅對(duì)select語(yǔ)句有效。要取得被insert、update或者delete語(yǔ)句所影響到的行的數(shù)目,要使用mysqli_affected_rows()函數(shù)。
【例9.03】 使用mysqli_num_rows()函數(shù)獲取圖書(shū)總數(shù)。(實(shí)例位置:資源包\源碼\09\9.03)
本例中應(yīng)用mysqli_fetch_array()函數(shù)逐行獲取結(jié)果集中的記錄,同時(shí)應(yīng)用mysqli_ num_rows()函數(shù)獲取結(jié)果集中行的數(shù)目,并輸出返回值。具體步驟如下。
由于本例是在例9.01的基礎(chǔ)上進(jìn)行操作,所以這里只給出關(guān)鍵代碼,不再贅述它的創(chuàng)建步驟。
(1)在index.php文件中,增加mysqli_num_rows()函數(shù),獲取結(jié)果集中記錄數(shù)。代碼如下:

(2)在lists.html文件中,新增顯示記錄條數(shù)代碼,關(guān)鍵代碼如下:

運(yùn)行結(jié)果如圖9.3所示。

圖9.3 獲取查詢結(jié)果的記錄數(shù)
9.1.9 釋放內(nèi)存
mysqli_free_result()函數(shù)用于釋放內(nèi)存,數(shù)據(jù)庫(kù)操作完成后,需要關(guān)閉結(jié)果集,以釋放系統(tǒng)資源,該函數(shù)的語(yǔ)法格式如下:

mysqli_free_result()函數(shù)將釋放所有與結(jié)果標(biāo)識(shí)符$result所關(guān)聯(lián)的內(nèi)存。該函數(shù)僅需要在考慮到返回很大的結(jié)果集會(huì)占用較多內(nèi)存時(shí)調(diào)用。在執(zhí)行結(jié)束后所有關(guān)聯(lián)的內(nèi)存都會(huì)被自動(dòng)釋放。
9.1.10 關(guān)閉連接
完成對(duì)數(shù)據(jù)庫(kù)的操作后,需要及時(shí)斷開(kāi)與數(shù)據(jù)庫(kù)的連接并釋放內(nèi)存,否則會(huì)浪費(fèi)大量的內(nèi)存空間,在訪問(wèn)量較大的Web項(xiàng)目中,很可能導(dǎo)致服務(wù)器崩潰。在MySQL函數(shù)庫(kù)中,使用mysqli_close()函數(shù)斷開(kāi)與MySQL服務(wù)器的連接,該函數(shù)的語(yǔ)法格式如下:

參數(shù)link為mysqli_connect()函數(shù)成功連接MySQL數(shù)據(jù)庫(kù)服務(wù)器后所返回的連接標(biāo)識(shí)。如果成功則返回true,失敗則返回false。
例如,讀取database9數(shù)據(jù)庫(kù)中books數(shù)據(jù)表中的數(shù)據(jù),然后使用mysqli_free_result()函數(shù)釋放內(nèi)存并使用mysqli_close()函數(shù)斷開(kāi)與MySQL數(shù)據(jù)庫(kù)的連接。代碼如下:

說(shuō)明
PHP中與數(shù)據(jù)庫(kù)的連接是非持久連接,系統(tǒng)會(huì)自動(dòng)回收內(nèi)存,一般不用設(shè)置關(guān)閉。但如果一次性返回的結(jié)果集比較大,或網(wǎng)站訪問(wèn)量比較多,則最好使用mysqli_close()函數(shù)手動(dòng)進(jìn)行釋放。
9.2 管理MySQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)

視頻講解
在開(kāi)發(fā)網(wǎng)站的后臺(tái)管理系統(tǒng)中,對(duì)數(shù)據(jù)庫(kù)的操作不僅局限于查詢,對(duì)數(shù)據(jù)的添加、修改和刪除等操作也是必不可少的。本節(jié)重點(diǎn)介紹如何在PHP頁(yè)面中對(duì)數(shù)據(jù)庫(kù)進(jìn)行增、改、刪的操作。
9.2.1 添加數(shù)據(jù)
【例9.04】 向圖書(shū)信息表中添加圖書(shū)信息。(實(shí)例位置:資源包\源碼\09\9.04)
本實(shí)例將通過(guò)insert語(yǔ)句和mysqli_query()函數(shù)向圖書(shū)信息表中添加一條記錄。具體步驟如下。
(1)創(chuàng)建<form>表單頁(yè)面add.html,表單中包含name(書(shū)名)、category(分類(lèi))、price(價(jià)格)、publish_time(出版時(shí)間)4個(gè)字段。當(dāng)單擊“提交”按鈕時(shí),將表單提交到addBook.php文件。具體代碼如下:


運(yùn)行結(jié)果如圖9.4所示。

圖9.4 添加圖書(shū)頁(yè)面效果
(2)創(chuàng)建addBook.php文件,用于連接數(shù)據(jù)庫(kù),發(fā)送查詢,最后檢查結(jié)果。此時(shí),發(fā)送的查詢是insert而不是select。在將數(shù)據(jù)插入數(shù)據(jù)庫(kù)時(shí),為避免SQL注入攻擊,使用prepare語(yǔ)句進(jìn)行預(yù)處理,然后使用bind_param()進(jìn)行參數(shù)綁定,最后使用execute()函數(shù)執(zhí)行SQL語(yǔ)句。具體代碼如下:

上述代碼中,使用mysqli_prepare()時(shí),SQL語(yǔ)句中包含了4個(gè)“?”,它們是占位符,沒(méi)有實(shí)際意義,后面會(huì)被mysqli_stmt_bind_param()中的相應(yīng)參數(shù)替換。mysqli_stmt_bind_param()語(yǔ)法格式如下:

參數(shù)說(shuō)明如下。
stmt:statement標(biāo)識(shí)。
types:綁定的變量的數(shù)據(jù)類(lèi)型,它接受的字符種類(lèi)包括4個(gè),如表9.2所示。
表9.2 綁定變量的數(shù)據(jù)類(lèi)型

var:綁定的變量,其數(shù)量必須要與SQL語(yǔ)句中的參數(shù)數(shù)量保持一致。
本實(shí)例中應(yīng)用到的該函數(shù)的代碼如下:

在代碼中,ssds分別表示$name為string類(lèi)型,$category為string類(lèi)型,$price為double類(lèi)型,$publish_time為string類(lèi)型。
mysqli_stmt_affected_rows()函數(shù)獲取受影響的行數(shù),如果返回0,表示沒(méi)有記錄被更新,或者查詢語(yǔ)句條件不匹配,或者沒(méi)有執(zhí)行查詢語(yǔ)句。如果返回-1,則表示查詢返回錯(cuò)誤。
填寫(xiě)表單,單擊“提交”按鈕,運(yùn)行結(jié)果如圖9.5所示。

圖9.5 添加成功頁(yè)面
添加成功后,頁(yè)面跳轉(zhuǎn)到列表頁(yè)。在列表頁(yè)中,會(huì)顯示提交的圖書(shū),如圖9.6所示。

圖9.6 列表頁(yè)數(shù)據(jù)
9.2.2 編輯數(shù)據(jù)
有時(shí)插入數(shù)據(jù)后,才發(fā)現(xiàn)錄入的是錯(cuò)誤信息或一段時(shí)間以后數(shù)據(jù)需要更新,這時(shí)就要對(duì)數(shù)據(jù)進(jìn)行編輯。數(shù)據(jù)更新使用update語(yǔ)句,依然通過(guò)mysqli_query()函數(shù)來(lái)執(zhí)行該語(yǔ)句。
【例9.05】 編輯圖書(shū)信息。(實(shí)例位置:資源包\源碼\09\9.05)
本實(shí)例將通過(guò)update語(yǔ)句和mysqli_query()函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的更新操作。具體步驟如下。
(1)創(chuàng)建editBook.php文件,獲取需要編輯的圖書(shū)信息。在lists.html圖書(shū)列表頁(yè)中,有如下代碼:

當(dāng)單擊“編輯”按鈕時(shí),頁(yè)面跳轉(zhuǎn)至editBook.php,并傳遞圖書(shū)id參數(shù)。在editBook.php文件中,接收傳遞的id,根據(jù)id查找圖書(shū)信息。editBook.php文件的具體代碼如下:

(2)創(chuàng)建edit.html文件。圖書(shū)編輯頁(yè)面和新增圖書(shū)頁(yè)面相似,不同之處在于編輯頁(yè)面需要顯示輸入框內(nèi)的值,即value的值。edit.html文件的關(guān)鍵代碼如下:

上述代碼中,為<input>標(biāo)簽的value屬性賦值后,編輯頁(yè)中將會(huì)顯示相應(yīng)的圖書(shū)內(nèi)容。此外還需要注意兩點(diǎn):
使用<input>標(biāo)簽的隱藏域type=“hidden“,傳遞圖書(shū)id,為下一步保存圖書(shū)信息做準(zhǔn)備。
在圖書(shū)類(lèi)別select下拉列表中,默認(rèn)選中的是select的第一項(xiàng)(本代碼中為PHP),使用selected屬性可以設(shè)置選中為當(dāng)前項(xiàng)。所以在每個(gè)<o(jì)ption>標(biāo)簽中,使用if語(yǔ)句來(lái)判斷當(dāng)前選項(xiàng)是否被選中。
在瀏覽器中運(yùn)行index.php圖書(shū)列表頁(yè),選擇id為2的記錄(PHP自學(xué)寶典),單擊右側(cè)“編輯”按鈕,進(jìn)入“編輯”頁(yè)面。運(yùn)行效果如圖9.7所示。

圖9.7 圖書(shū)編輯頁(yè)
(3)創(chuàng)建updateBook.php文件,獲取表單中提交的數(shù)據(jù),根據(jù)隱藏域傳遞的id值,定義更新語(yǔ)句完成數(shù)據(jù)的更新操作,代碼如下:

上述代碼中,預(yù)處理和參數(shù)綁定的內(nèi)容與新增圖書(shū)相同,不再贅述。注意SQL語(yǔ)句使用update和where條件來(lái)實(shí)現(xiàn)數(shù)據(jù)更新。
運(yùn)行本實(shí)例,修改id為2的記錄(PHP自學(xué)寶典),修改效果如圖9.8所示。

圖9.8 編輯圖書(shū)
修改成功后,單擊“確定”按鈕,頁(yè)面跳轉(zhuǎn)到圖書(shū)列表頁(yè),顯示修改后的信息,如圖9.9所示。

圖9.9 編輯后圖書(shū)列表頁(yè)
9.2.3 刪除數(shù)據(jù)
刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù),使用的是delete語(yǔ)句,如果在不指定刪除條件的情況下,那么將刪除指定數(shù)據(jù)表中所有的數(shù)據(jù),如果定義了刪除條件,那么將刪除數(shù)據(jù)表中指定的記錄。刪除操作的執(zhí)行是一件非常慎重的事情,因?yàn)橐坏﹫?zhí)行該操作,數(shù)據(jù)就沒(méi)有恢復(fù)的可能。
【例9.06】 刪除圖書(shū)信息。(實(shí)例位置:資源包\源碼\09\9.06)
在添加圖書(shū)過(guò)程中,如果輸入了無(wú)效的圖書(shū)信息,那么,就會(huì)用到刪除數(shù)據(jù)的功能。刪除數(shù)據(jù)只需利用mysqli_query()函數(shù)執(zhí)行delete語(yǔ)句即可。在lists.html圖書(shū)列表頁(yè)中,有如下代碼:

當(dāng)單擊“刪除”按鈕時(shí),頁(yè)面跳轉(zhuǎn)至deleteBook.php,并傳遞圖書(shū)id參數(shù)。在deleteBook.php文件中,接收傳遞的id,刪除該id的圖書(shū)記錄。deleteBook.php具體代碼如下:

運(yùn)行本實(shí)例,單擊id為2記錄右側(cè)的“刪除”按鈕,運(yùn)行結(jié)果如圖9.10所示。

圖9.10 刪除數(shù)據(jù)成功
單擊“確定”按鈕,頁(yè)面跳轉(zhuǎn)至圖書(shū)列表頁(yè),此時(shí)id為2的記錄被刪除,不會(huì)在列表頁(yè)中顯示。刪除后的列表頁(yè)如圖9.11所示。

圖9.11 刪除數(shù)據(jù)后的列表頁(yè)
注意
由于刪除后,數(shù)據(jù)不可恢復(fù),通常刪除前彈出提示框,確定是否刪除。當(dāng)單擊“確認(rèn)”按鈕后,再執(zhí)行刪除操作。
9.3 小結(jié)
本章主要介紹了使用PHP操作MySQL數(shù)據(jù)庫(kù)的方法。通過(guò)本章的學(xué)習(xí),讀者能夠掌握PHP操作MySQL數(shù)據(jù)庫(kù)的一般流程,掌握mysqli擴(kuò)展庫(kù)中常用函數(shù)的使用方法,并能夠具備獨(dú)立完成基本數(shù)據(jù)庫(kù)程序的能力。希望本章能夠起到拋磚引玉的作用,能夠幫助讀者在此基礎(chǔ)上更深層次地學(xué)習(xí)PHP操作MySQL數(shù)據(jù)庫(kù)的相關(guān)技術(shù),并進(jìn)一步學(xué)習(xí)使用面向?qū)ο蟮姆绞讲僮鱉ySQL數(shù)據(jù)庫(kù)的方法。
9.4 實(shí)戰(zhàn)
9.4.1 實(shí)現(xiàn)會(huì)員注冊(cè)功能
實(shí)例位置:資源包\源碼\09\實(shí)戰(zhàn)\01
在database9數(shù)據(jù)庫(kù)中新建member表,實(shí)現(xiàn)會(huì)員注冊(cè)功能。注冊(cè)頁(yè)面如圖9.12所示,注冊(cè)成功后,member表數(shù)據(jù)如圖9.13所示。

圖9.12 注冊(cè)頁(yè)面

圖9.13 member表數(shù)據(jù)
9.4.2 實(shí)現(xiàn)博客添加文章功能
實(shí)例位置:資源包\源碼\09\實(shí)戰(zhàn)\02
在database9數(shù)據(jù)庫(kù)中新建blog表,包含title、author、post和publish_time 4個(gè)字段。實(shí)現(xiàn)博客的添加文章功能,如圖9.14所示。

圖9.14 添加博客
9.4.3 實(shí)現(xiàn)多選刪除功能
實(shí)例位置:資源包\源碼\09\實(shí)戰(zhàn)\03
修改例9.06,實(shí)現(xiàn)多選刪除功能,如圖9.15所示。

圖9.15 刪除多條記錄
- Web程序設(shè)計(jì)及應(yīng)用
- JavaScript全程指南
- Kali Linux Web Penetration Testing Cookbook
- 編程的修煉
- C語(yǔ)言程序設(shè)計(jì)習(xí)題解析與上機(jī)指導(dǎo)(第4版)
- 軟件測(cè)試工程師面試秘籍
- Object-Oriented JavaScript(Second Edition)
- Java程序設(shè)計(jì):原理與范例
- 蘋(píng)果的產(chǎn)品設(shè)計(jì)之道:創(chuàng)建優(yōu)秀產(chǎn)品、服務(wù)和用戶體驗(yàn)的七個(gè)原則
- Python爬蟲(chóng)、數(shù)據(jù)分析與可視化:工具詳解與案例實(shí)戰(zhàn)
- Hands-On Kubernetes on Windows
- Unity 2017 Game AI Programming(Third Edition)
- Unity Android Game Development by Example Beginner's Guide
- Greenplum構(gòu)建實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)實(shí)踐
- Android高級(jí)開(kāi)發(fā)實(shí)戰(zhàn):UI、NDK與安全