中級(jí)篇項(xiàng)目二內(nèi)容管理系統(tǒng)
《中級(jí)篇項(xiàng)目二內(nèi)容管理系統(tǒng)》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《中級(jí)篇項(xiàng)目二內(nèi)容管理系統(tǒng)(110頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、PHP 【 中級(jí)篇 】 項(xiàng)目二:內(nèi)容管理系統(tǒng) 模塊五 后臺(tái)功能實(shí)現(xiàn) MySQL安裝與使用 HTTP、會(huì)話(huà)技術(shù) PHP操作數(shù)據(jù)庫(kù) 文件、圖像技術(shù) 任務(wù)一 任務(wù)二 任務(wù)三 項(xiàng)目準(zhǔn)備 管理員登錄 欄目管理 任務(wù)四 任務(wù)五 文章管理 排序與搜索 任務(wù)五 分頁(yè)導(dǎo)航 目錄 在項(xiàng)目開(kāi)發(fā)的初始階段,先進(jìn)行項(xiàng)目的目錄結(jié)構(gòu)劃分,才能合理、規(guī)范地 管理項(xiàng)目中的各種文件。根據(jù)功能模塊劃分,本項(xiàng)目的目錄結(jié)構(gòu)如下所示。 項(xiàng)目初始化 任務(wù)一:項(xiàng)目準(zhǔn)備 項(xiàng)目初始化 文件 說(shuō)明 common 前后臺(tái) 公共文件目錄 upload 前后臺(tái) 上傳文件目錄 css 前臺(tái) CSS樣式文件目錄 js 前臺(tái) JavaScript文件目錄 i
2、mage 前臺(tái) 圖片文件目錄 view 前臺(tái) HTML模板文件目錄 init.php 前臺(tái) 初始化文件 index.php 前臺(tái) 首頁(yè) 文件 說(shuō)明 admin 后臺(tái) 文件目錄 admincss 后臺(tái) CSS樣式文件目錄 adminjs 后臺(tái) JavaScript文件目錄 adminimage 后臺(tái) 圖片文件目錄 adminview 后臺(tái) HTML模板文件目錄 admininit.php 后臺(tái) 初始化文件 adminindex.php 后臺(tái) 首頁(yè) 任務(wù)一:項(xiàng)目準(zhǔn)備 項(xiàng)目初始化 項(xiàng)目首先分成了前臺(tái)和后臺(tái)兩個(gè)平臺(tái) 將 common和 upload目錄作為前后臺(tái)公共目錄 后臺(tái)相關(guān)的文件全部放到了 ad
3、min目錄中 從而在目錄結(jié)構(gòu)上對(duì)前后臺(tái)進(jìn)行了區(qū)分 任務(wù)一:項(xiàng)目準(zhǔn)備 項(xiàng)目初始化 在完成目錄劃分后,接下來(lái)為項(xiàng)目的前后臺(tái)創(chuàng)建初始化文件,為項(xiàng)目定義一 些基礎(chǔ)的常量,方便在項(xiàng)目中使用。 任務(wù)一:項(xiàng)目準(zhǔn)備 項(xiàng)目初始化 為前臺(tái)創(chuàng)建初始化文件 init.php 定義常量 APP_DEBUG,用于表示是否開(kāi)啟調(diào)試,其值可以為 true和 false。 當(dāng)開(kāi)啟時(shí)將提示完整的錯(cuò)誤信息以便于調(diào)試,否則只進(jìn)行簡(jiǎn)單的錯(cuò)誤提示。 定義常量 COMMON_PATH和 UPLOAD_PATH,用于表示公共文件目錄和上 傳文件目錄的路徑。 從前臺(tái)進(jìn)行訪(fǎng)問(wèn)時(shí),從當(dāng)前目錄“ ./”開(kāi)始。 任務(wù)一:項(xiàng)目準(zhǔn)備 項(xiàng)目初始化 為后臺(tái)創(chuàng)
4、建初始化文件 admininit.php 定義常量 APP_DEBUG,用于表示是否開(kāi)啟調(diào)試,其值可以為 true和 false。 當(dāng)開(kāi)啟時(shí)將提示完整的錯(cuò)誤信息以便于調(diào)試,否則只進(jìn)行簡(jiǎn)單的錯(cuò)誤提示。 定義常量 COMMON_PATH和 UPLOAD_PATH,用于表示公共文件目錄和上 傳文件目錄的路徑。 從后臺(tái)進(jìn)行訪(fǎng)問(wèn)時(shí),從上級(jí)目錄“ ./”開(kāi)始。 任務(wù)一:項(xiàng)目準(zhǔn)備 函數(shù)庫(kù)與配置文件 函數(shù)庫(kù) 在項(xiàng)目開(kāi)發(fā)時(shí),有許多常用的功能可以通過(guò)函數(shù)來(lái)完成,因此應(yīng)該為項(xiàng)目創(chuàng) 建一個(gè)函數(shù)庫(kù),保存項(xiàng)目中的常用函數(shù)。 常用函數(shù)的名稱(chēng),通過(guò)一個(gè)大寫(xiě)字母的命名風(fēng)格,既書(shū)寫(xiě)方便,又便于程序 閱讀。 任務(wù)一:項(xiàng)目準(zhǔn)備 函數(shù)
5、庫(kù)與配置文件 函數(shù)庫(kù) 在 common目錄中創(chuàng)建文件 function.php,編寫(xiě)一個(gè)“ E()”函數(shù)。 函數(shù)名是英文單詞“ error”的首字母縮寫(xiě),表示程序遇到錯(cuò)誤。 該函數(shù)有兩個(gè)參數(shù) $msg和 $debug,參數(shù) $debug的默認(rèn)值為空字符串 該函數(shù)的參數(shù) $msg表示錯(cuò)誤信息, $debug表示調(diào)試信息 當(dāng)開(kāi)啟調(diào)試時(shí),顯示錯(cuò)誤信息和調(diào)試信息,而關(guān)閉調(diào)試時(shí),只顯示錯(cuò)誤信息 在完成編寫(xiě)函數(shù)庫(kù)后,接下來(lái)在項(xiàng)目的初始化文件中載入函數(shù)庫(kù) 任務(wù)一:項(xiàng)目準(zhǔn)備 函數(shù)庫(kù)與配置文件 配置文件 在項(xiàng)目中通常有一些常用的配置,如數(shù)據(jù)庫(kù)連接信息,使用獨(dú)立的配置文 件來(lái)保存配置可以使代碼更利于維護(hù)。 任務(wù)一
6、:項(xiàng)目準(zhǔn)備 函數(shù)庫(kù)與配置文件 配置文件 接下來(lái)在 common目錄中創(chuàng)建配置文件 config.php,保存數(shù)據(jù)庫(kù)的連接信息。 在 config.php中,直接返回?cái)?shù)組,數(shù)組中的元素用于設(shè)置項(xiàng)目的配置信息 DB_CONNECT元素的值是一個(gè)數(shù)組,用于保存數(shù)據(jù)庫(kù)的連接信息,如 數(shù) 據(jù)庫(kù)服務(wù)器地址、用戶(hù)名、密碼、默認(rèn)數(shù)據(jù)庫(kù)和端口號(hào) 。 DB_CHARSET元素用于保存數(shù)據(jù)庫(kù)字符集 任務(wù)一:項(xiàng)目準(zhǔn)備 函數(shù)庫(kù)與配置文件 訪(fǎng)問(wèn)配置文件 完成配置文件 commonconfig.php的創(chuàng)建后,接下來(lái)還需要對(duì)配置文件進(jìn) 行訪(fǎng)問(wèn)。 任務(wù)一:項(xiàng)目準(zhǔn)備 函數(shù)庫(kù)與配置文件 訪(fǎng)問(wèn)配置文件 在函數(shù)庫(kù)文件 commonf
7、unction.php中編寫(xiě)函數(shù) C()實(shí)現(xiàn)此功能。 函數(shù)名是英文字母“ config”的首字母縮寫(xiě),表示訪(fǎng)問(wèn)程序的設(shè)置。 參數(shù) $name表示待訪(fǎng)問(wèn)的數(shù)組元素,如 DB_CONNECT。 在 C()函數(shù)中設(shè)置靜態(tài)變量 $config,用于保存項(xiàng)目配置信息 判斷 $config是否為 null,若為 null,則載入配置文件 判斷要獲取的配置信息是否存在,若不存在賦值為空字符串 返回要獲取的配置信息 任務(wù)一:項(xiàng)目準(zhǔn)備 函數(shù)庫(kù)與配置文件 示例演示 在后臺(tái)初始化文件 admininit.php中,添加以下代碼用于測(cè)試函數(shù)的使用。 /訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)連接信息 $config = C(DB_CONNECT)
8、; echo $confighost; /輸出結(jié)果: localhost /訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)字符集 echo C(DB_CHARSET); /輸出結(jié)果: utf8 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 在基于數(shù)據(jù)庫(kù)的項(xiàng)目中,對(duì)數(shù)據(jù)庫(kù)的操作是非常頻繁的,因此可以利用函數(shù) 將這部分代碼提取出來(lái),以方便后續(xù)的代碼編寫(xiě)。 接下來(lái)在 common目錄中創(chuàng)建 db.php,保存數(shù)據(jù)庫(kù)的常見(jiàn)操作函數(shù) 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 連接數(shù)據(jù)庫(kù) 編寫(xiě) db_connect()函數(shù),用于完成數(shù)據(jù)庫(kù)連接和設(shè)置字符集操作 設(shè)置靜態(tài)變量 $link用于保存數(shù)據(jù)庫(kù)連接 實(shí)現(xiàn) 函數(shù)第一次調(diào)用時(shí)進(jìn)行數(shù)據(jù)庫(kù)連接 實(shí)現(xiàn) 函數(shù)執(zhí)行后返回?cái)?shù)據(jù)庫(kù)連
9、接 $link 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 執(zhí)行 SQL語(yǔ)句 在完成數(shù)據(jù)庫(kù)連接后接下來(lái)就可以執(zhí)行 SQL語(yǔ)句。由于 MySQLi擴(kuò)展提供 的預(yù)處理語(yǔ)句更加高效和安全,因此在項(xiàng)目中執(zhí)行 SQL語(yǔ)句時(shí),將通過(guò)預(yù)處理 來(lái)實(shí)現(xiàn)。 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 執(zhí)行 SQL語(yǔ)句 編寫(xiě)函數(shù) db_query(),完成 SQL語(yǔ)句的預(yù)處理操作 該函數(shù)的 參數(shù)依次為 SQL語(yǔ)句、數(shù)據(jù)格式 和 數(shù)據(jù)內(nèi)容 。其中,數(shù)據(jù)格式的默 認(rèn)值為空字符串、數(shù)據(jù)內(nèi)容的默認(rèn)值為空數(shù)組。 獲取數(shù)據(jù)庫(kù)連接后,利用 mysqli_prepare()預(yù)處理 SQL語(yǔ)句,獲取 $stmt 數(shù)據(jù)內(nèi)容為空,利用 mysqli_stmt_ex
10、ecute()直接執(zhí)行 SQL語(yǔ)句。 數(shù)據(jù)內(nèi)容不為空,則執(zhí)行自定義函數(shù) db_bind_param()進(jìn)行參數(shù)綁定后,再 執(zhí)行 SQL語(yǔ)句 最后返回預(yù)處理結(jié)果 $stmt 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 執(zhí)行 SQL語(yǔ)句 編寫(xiě)函數(shù) db_bind_param(),完成 SQL語(yǔ)句的參數(shù)綁定 該函數(shù)的 參數(shù)依次 $stmt、數(shù)據(jù)格式和引用傳遞的數(shù)據(jù)內(nèi)容 利用 $params保存預(yù)處理函數(shù) mysqli_stmt_bind_param()需要的每個(gè)參數(shù) 首先依次保存前兩個(gè)參數(shù) $stmt和數(shù)據(jù)格式 由于 mysqli_stmt_bind_param()的參數(shù)綁定需要引用傳參,因此通過(guò)遍歷數(shù) 據(jù)內(nèi)容,
11、為每個(gè)參數(shù)創(chuàng)建引用,并依次賦值給 $param 最后調(diào)用 mysqli_stmt_bind_param()函數(shù)完成參數(shù)的綁定 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 示例演示 /準(zhǔn)備 SQL語(yǔ)句 $sql = INSERT INTO cms_category (name, sort) VALUES (?, ?); /執(zhí)行 SQL語(yǔ)句 db_query($sql, si, test, 0); 第二個(gè)參數(shù) si,表示插入數(shù)據(jù)的類(lèi)型 s表示字符串 i表示整型 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 批量操作 在 db_query()函數(shù)中,第 3個(gè)參數(shù)用于傳入數(shù)據(jù)內(nèi)容,目前只支持一維數(shù)組。 MySQLi擴(kuò)展的預(yù)處理機(jī)制
12、還可以實(shí)現(xiàn)批量操作。 因此,還可以改進(jìn) db_query()函數(shù),當(dāng)傳入數(shù)據(jù)內(nèi)容是二維數(shù)組時(shí),自動(dòng) 進(jìn)行批量操作。 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 批量操作 在 db_query()函數(shù)實(shí)現(xiàn)參數(shù)綁定的位置進(jìn)行修改 首先進(jìn)行預(yù)處理操作的參數(shù)綁定并執(zhí)行預(yù)處理操作 然后刪除執(zhí)行完的數(shù)據(jù) 最后批量執(zhí)行剩余的其他數(shù)據(jù) 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 示例演示 /準(zhǔn)備 SQL語(yǔ)句 $sql = INSERT INTO cms_category (name, sort) VALUES (?, ?); /準(zhǔn)備數(shù)據(jù) $data = aa, 1, bb, 12, cc, 30; /執(zhí)行 SQL語(yǔ)句 db_query(
13、$sql, si, $data); 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 其他數(shù)據(jù)庫(kù)操作 在數(shù)據(jù)庫(kù)操作中,除了執(zhí)行 SQL語(yǔ)句,還需要處理結(jié)果集、獲取受影響行 數(shù)、獲取最后插入的 ID等后續(xù)操作。接下來(lái)繼續(xù)完善數(shù)據(jù)庫(kù)操作函數(shù) 。 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 其他數(shù)據(jù)庫(kù)操作 定義常用常量,用于表示后續(xù)的具體操作 定義函數(shù) db_fetch(),處理有結(jié)果集的 SQL語(yǔ)句;定義函數(shù) db_exec(),處理 沒(méi)有結(jié)果集的 SQL語(yǔ)句。 兩個(gè)函數(shù)的參數(shù)依次為后續(xù)的操作, SQL語(yǔ)句,數(shù)據(jù)格式和數(shù)據(jù)內(nèi)容 最后結(jié)合 switch語(yǔ)句根據(jù)不同的操作,執(zhí)行不同的處理函數(shù) 任務(wù)一:項(xiàng)目準(zhǔn)備 數(shù)據(jù)庫(kù)函數(shù) 示例演示 /
14、 查詢(xún)數(shù)據(jù),獲得保存所有結(jié)果的關(guān)聯(lián)數(shù)組 $data = db_fetch(DB_ALL, SELECT * FROM cms_category); var_dump($data); / 插入數(shù)據(jù),獲得最后插入的 ID $sql = INSERT INTO cms_category (name, sort) VALUES (?, ?); $id = db_exec(DB_LASTID, $sql, si, test, 0); echo $id; 任務(wù)一:項(xiàng)目準(zhǔn)備 輸入過(guò)濾函數(shù) 在項(xiàng)目開(kāi)發(fā)中,對(duì)于 $_GET、 $_POST數(shù)組的訪(fǎng)問(wèn)是非常頻繁的,但是這兩 個(gè)數(shù)組保存的是來(lái)自外部提交的數(shù)據(jù),如果直
15、接進(jìn)行訪(fǎng)問(wèn),會(huì)帶來(lái)安全隱患。 因此,通過(guò)函數(shù)來(lái)統(tǒng)一接收外部變量,可以使項(xiàng)目代碼更加嚴(yán)謹(jǐn)和規(guī)范。接 下來(lái),在 commonfunction.php中編寫(xiě) I()函數(shù)用于接收外部變量 。 任務(wù)一:項(xiàng)目準(zhǔn)備 輸入過(guò)濾函數(shù) 該函數(shù)名取自英文單詞“ input”的首字母,表示輸入。 該函數(shù)的參數(shù)依次為需要處理的變量名、接收方法、數(shù)據(jù)類(lèi)型、默認(rèn)值 根據(jù)接收方法確定數(shù)據(jù)變量使用哪種接收類(lèi)型 通過(guò) isset()判斷接收的數(shù)據(jù)變量是否存在,若不存在將其值設(shè)為默認(rèn)值 結(jié)合 switch和數(shù)據(jù)類(lèi)型進(jìn)行不同的過(guò)濾處理,具體有字符串型、 html轉(zhuǎn)義、整 數(shù)、無(wú)符號(hào)整數(shù)、頁(yè)碼、浮點(diǎn)數(shù)、布爾型、數(shù)組型。 任務(wù)一:項(xiàng)目準(zhǔn)
16、備 輸入過(guò)濾函數(shù) 結(jié)合 htmlspecialchars()函數(shù)把一些預(yù)定義的 HTML 實(shí)體轉(zhuǎn)換為字符,并設(shè)置 第二個(gè)參數(shù) ENT_QUOTES完成對(duì)單引號(hào)和雙引號(hào)的轉(zhuǎn)義操作。 結(jié)合 trim()函數(shù)去除字符串首尾處的空白字符(或者其他字符) 結(jié)合 str_replace()函數(shù)將字符串中的空格替換成 其中 , 在對(duì)數(shù)據(jù)進(jìn)行 HTML特殊字符轉(zhuǎn)義時(shí),為方便管理和操作,接下來(lái)在 commonfunction.php中實(shí)現(xiàn)該函數(shù) toHTML()。具體思路如下: 任務(wù)一:項(xiàng)目準(zhǔn)備 輸入過(guò)濾函數(shù) 示例演示 / POST方式 $_POSTname = 測(cè)試 ; $name = I(name, pos
17、t, html); echo $name; /輸出結(jié)果:測(cè)試 文本 / GET方式 $_GETid = 123abc; $id = I(id, get, id); echo $id; /輸出結(jié)果: 123 任務(wù)一:項(xiàng)目準(zhǔn)備 后臺(tái)頁(yè)面布局 下面開(kāi)始進(jìn)入網(wǎng)站后臺(tái)頁(yè)面的開(kāi)發(fā)。在設(shè)計(jì)后臺(tái)頁(yè)面時(shí),通常使用“品” 字形的頁(yè)面布局,此布局的具體結(jié)構(gòu)如圖 。 t o p n a v c o n t e n t top是頁(yè)面的頂部,通常用于顯示系統(tǒng) 名稱(chēng)、相關(guān)鏈接; nav是頁(yè)面的左側(cè)導(dǎo)航菜單,后臺(tái)中的 各個(gè)功能模塊通過(guò)這個(gè)菜單進(jìn)入; content是頁(yè)面內(nèi)容,根據(jù)當(dāng)前訪(fǎng)問(wèn)的 功能而改變。 任務(wù)一:項(xiàng)目準(zhǔn)備 后
18、臺(tái)頁(yè)面布局 在 adminview目錄中創(chuàng)建后臺(tái)的布局文件 layout.html,頁(yè)面頂部和 左側(cè)導(dǎo)航 標(biāo)簽中添加響應(yīng) ,頁(yè)面內(nèi)容部分嵌套一個(gè)框架,用于動(dòng)態(tài)改變內(nèi)容 創(chuàng)建后臺(tái)首頁(yè) adminindex.php,載入后臺(tái)初始化文件和布局文件 接下來(lái) 在當(dāng)前目錄下, 創(chuàng)建 admincp_index.php文件 ,載入后臺(tái)首頁(yè)信息 創(chuàng)建文件 adminviewindex.html,該文件是后臺(tái)首頁(yè)的 HTML模板文件 任務(wù)一:項(xiàng)目準(zhǔn)備 后臺(tái)頁(yè)面布局 后臺(tái)頁(yè)面布局展示圖 任務(wù)一:項(xiàng)目準(zhǔn)備 實(shí)現(xiàn)管理員登錄 添加管理員信息 在管理員表中添加初始數(shù)據(jù),具體字段應(yīng)包括 ID、用戶(hù)名和密碼, SQL 語(yǔ)句如
19、下。 INSERT INTO cms_admin VALUES (1, admin, 123456); 任務(wù)二:管理員登錄 實(shí)現(xiàn)管理員登錄 創(chuàng)建后臺(tái)登錄表單 在后臺(tái) adminview中創(chuàng)建后臺(tái)用戶(hù)登錄的 HTML表單 login.html。 用戶(hù)名: 密 碼: 任務(wù)二:管理員登錄 實(shí)現(xiàn)管理員登錄 載入數(shù)據(jù)庫(kù)操作函數(shù) 修改前后臺(tái)的初始化文件 admininit.php,載入數(shù)據(jù)庫(kù)操作函數(shù) db.php。 將數(shù)據(jù)庫(kù)操作函數(shù)載入后,在項(xiàng)目中就可以使用來(lái)自 db.php中的函數(shù)。 任務(wù)二:管理員登錄 實(shí)現(xiàn)管理員登錄 接收登錄表單 創(chuàng)建后臺(tái)登錄文件 adminlogin.php,實(shí)現(xiàn)載入 HTML模板
20、顯示登錄頁(yè)面,當(dāng) 接收到提交的登錄表單時(shí)處理表單。 任務(wù)二:管理員登錄 實(shí)現(xiàn)管理員登錄 接收登錄表單 載入后臺(tái)初始化文件 init.php和表單模板文件 login.html 通過(guò) if與 $_POST處理提交后的表單內(nèi)容 在處理表單時(shí),先通過(guò) I()函數(shù)接收用戶(hù)名和密碼,到數(shù)據(jù)庫(kù)中查詢(xún)信息,然后取 出密碼后進(jìn)行驗(yàn)證。 如果驗(yàn)證通過(guò),則將用戶(hù)登錄信息保存到 Session中,然后利用自定義 redirect() 函數(shù)跳轉(zhuǎn)到后臺(tái)首頁(yè) index.php 如果驗(yàn)證失敗,則調(diào)用 E()函數(shù)停止程序繼續(xù)執(zhí)行。 任務(wù)二:管理員登錄 實(shí)現(xiàn)管理員登錄 接收登錄表單 接下來(lái)在 commonfunction.p
21、hp中編寫(xiě)用于實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的 redirect()函數(shù)。 function redirect($url) header(Location:$url); /重定向到目標(biāo) URL地址 exit; 任務(wù)二:管理員登錄 頁(yè)面信息提示 當(dāng) PHP處理用戶(hù)提交表單時(shí),如果在處理過(guò)程中發(fā)生了成功或失敗的信息,應(yīng) 該以友好的提示信息在頁(yè)面中顯示。 為了利于程序的維護(hù),可以將載入 HTML頁(yè)面的代碼放到一個(gè)函數(shù)中,通過(guò)調(diào) 用函數(shù)的方式來(lái)決定程序在什么情況下顯示頁(yè)面。 任務(wù)二:管理員登錄 頁(yè)面信息提示 編寫(xiě)顯示頁(yè)面的函數(shù) 接下來(lái)在 adminlogin.php中編寫(xiě) display()函數(shù),將載入 HTML模板的
22、代碼放 到函數(shù)中 。 function display($msg=null) require ./view/login.html; exit; 任務(wù)二:管理員登錄 頁(yè)面信息提示 在頁(yè)面中輸出提示信息 編輯后臺(tái)登錄頁(yè)面 adminviewlogin.html,在頁(yè)面中添加 元素用于 顯示信息提示。 任務(wù)二:管理員登錄 頁(yè)面信息提示 在頁(yè)面中輸出提示信息 在 commonfunction.php中編寫(xiě)該函數(shù) tips()輸出提示信息。 function tips($msg=null) if(!$msg) return ; /沒(méi)有提示信息時(shí)直接返回空字符串 return $msg0 ? $msg1
23、: $msg1; tips()函數(shù)的參數(shù) $msg用于傳入一個(gè)數(shù)組,數(shù)組的第 1個(gè)元素表示成功或失敗 第 2個(gè)元素是表示提示信息 當(dāng)省略參數(shù) $msg,或 $msg為空時(shí),直接返回空字符串,表示沒(méi)有提示信息 任務(wù)二:管理員登錄 頁(yè)面信息提示 顯示頁(yè)面并提示信息 在完成信息提示功能后,修改 adminlogin.php中登錄失敗的提示代碼 /修改前的代碼: /E(登錄失?。河脩?hù)名或密碼錯(cuò)誤。 ); /修改后的代碼: display(false, 登錄失?。河脩?hù)名或密碼錯(cuò)誤。 ); 任務(wù)二:管理員登錄 頁(yè)面信息提示 沒(méi)有表單提交時(shí)顯示頁(yè)面 在完成創(chuàng)建 display()函數(shù)后,當(dāng)沒(méi)有表單提交時(shí),應(yīng)
24、顯示登錄頁(yè)面 if($_POST) /有表單提交時(shí),處理表單 else /沒(méi)有表單提交時(shí),顯示登錄頁(yè)面 display(); 任務(wù)二:管理員登錄 頁(yè)面信息提示 效果展示 任務(wù)二:管理員登錄 判斷登錄狀態(tài) 在實(shí)現(xiàn)了用戶(hù)登錄功能后,還需要判斷用戶(hù)是否登錄,如果沒(méi)有登錄則提 示用戶(hù)進(jìn)行登錄,并阻止用戶(hù)訪(fǎng)問(wèn)本來(lái)的功能。 任務(wù)二:管理員登錄 判斷登錄狀態(tài) 在后臺(tái)中, Session操作是項(xiàng)目中的公共功能,為了更好地維護(hù)項(xiàng)目中的 Session,可以在初始化文件中統(tǒng)一開(kāi)啟 Session,并為項(xiàng)目中的 Session創(chuàng)建前 綴。修改文件 admininit.php,具體如下: 開(kāi)啟 Session /啟動(dòng)
25、 session session_start(); /為項(xiàng)目創(chuàng)建 Session,統(tǒng)一保存到 cms中 if(!isset($_SESSIONcms) $_SESSION = cms = ; 任務(wù)二:管理員登錄 判斷登錄狀態(tài) 接下來(lái)在 admininit.php中繼續(xù)編寫(xiě)代碼,實(shí)現(xiàn)檢查用戶(hù)登錄。 檢查用戶(hù)登錄 判斷是否已經(jīng)定義了 NO_CHECK_LOGIN常量 如果沒(méi)有定義則檢查用戶(hù)是否登錄,如果已經(jīng)定義了則不檢查用戶(hù)是否登錄 當(dāng)用戶(hù)登錄時(shí),取出用戶(hù)信息保存到變量 $user中 如果沒(méi)有登錄則跳轉(zhuǎn)到登錄頁(yè)面 login.php并停止腳本繼續(xù)執(zhí)行 當(dāng)其他腳本載入這個(gè)文件時(shí),就會(huì)自動(dòng)判斷用戶(hù)是否
26、登錄,而如果不需要判斷 登錄,則在載入 admininit.php之前,先定義 NO_CHECK_LOGIN常量。 任務(wù)二:管理員登錄 判斷登錄狀態(tài) 在 adminlogin.php文件中,當(dāng)用戶(hù)登錄成功時(shí),將用戶(hù)信息( ID和用戶(hù)名)保 存到了 Session中。 在 admininit.php中判斷用戶(hù)是否登錄,如果已經(jīng)登錄,則從 Session中取出用 戶(hù)信息,保存到 $user中。 當(dāng)用戶(hù)登錄成功后進(jìn)入后臺(tái)首頁(yè)時(shí),可通過(guò)輸出 $user將用戶(hù)名顯示在頁(yè)面中。 顯示當(dāng)前登錄的用戶(hù)名 任務(wù)二:管理員登錄 判斷登錄狀態(tài) 效果展示 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 在開(kāi)發(fā)管理員登錄功能時(shí),還要考
27、慮一個(gè)問(wèn)題,就是除了瀏覽器,其他軟 件也可以向服務(wù)器提交數(shù)據(jù)。 從系統(tǒng)安全的角度看,如果使用軟件自動(dòng)大批量向服務(wù)器提交表單,那么 管理員的用戶(hù)名、密碼將會(huì)被窮舉出來(lái),導(dǎo)致管理員賬號(hào)被盜取。為此,驗(yàn)證 碼就是一種防御的手段。 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 通常情況下,驗(yàn)證碼是一張帶有文字的圖片,要求用戶(hù)輸入圖中的文字。 對(duì)于圖片中的文字,人類(lèi)識(shí)別非常容易,而軟件識(shí)別非常困難。 因此,驗(yàn)證碼是一種區(qū)分人類(lèi)和計(jì)算機(jī)的程序。接下來(lái),就在項(xiàng)目中實(shí)現(xiàn) 驗(yàn)證碼的功能。 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 生成驗(yàn)證碼文本 在項(xiàng)目中創(chuàng)建 commoncaptcha.php,該文件用于保存驗(yàn)證碼相關(guān)的函數(shù)。 編寫(xiě)
28、captcha_create()函數(shù) , 用于生成指定位數(shù)的驗(yàn)證碼 該函數(shù)有一個(gè)參數(shù),用于 表示生成 文本的 位數(shù) ,默認(rèn)值為 5 從 $charset字符串中隨機(jī)取出 $count個(gè)字符,保存到 $code中 調(diào)用該 函數(shù)后,返回生成的驗(yàn)證碼文本 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 生成驗(yàn)證碼圖像 通過(guò) PHP提供的 GD庫(kù)擴(kuò)展,可以繪制一張圖片。在繪制圖片時(shí),可以將文 本寫(xiě)入到圖片中 。 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 生成驗(yàn)證碼圖像 在 commoncaptcha.php中繼續(xù)編寫(xiě)代碼,實(shí)現(xiàn)輸出驗(yàn)證碼圖像的函數(shù)。 編寫(xiě) captcha_show()函數(shù) , 用于驗(yàn)證碼圖像 該函數(shù)有一個(gè)參數(shù),
29、用于表示驗(yàn)證碼文本 創(chuàng)建圖片資源,隨機(jī)生成背景顏色, 設(shè)置字體顏色和樣式 生成指定長(zhǎng)度的驗(yàn)證碼 添加 8個(gè)干擾線(xiàn) 和 250個(gè)噪點(diǎn) 向?yàn)g覽器輸出 PNG格式的 驗(yàn)證碼圖片 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 調(diào)用驗(yàn)證碼函數(shù) 在完成了驗(yàn)證碼文本和圖像生成的函數(shù)后,接下來(lái)在后臺(tái)中調(diào)用函數(shù)顯示 驗(yàn)證碼。 創(chuàng)建文件 admincaptcha.php,完成驗(yàn)證碼函數(shù)的調(diào)用 載入驗(yàn)證碼函數(shù) 文件 commoncaptcha.php 生成驗(yàn)證碼值 輸出驗(yàn)證碼圖像 , 將驗(yàn)證碼保存到 Session中 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 顯示驗(yàn)證碼 在完成驗(yàn)證碼的調(diào)用后,接下來(lái)在后臺(tái)管理員登錄的表單中顯示驗(yàn)證碼。修
30、改登錄表單 adminviewlogin.html,在表單中使用 載入驗(yàn)證碼圖片 。 驗(yàn)證碼: 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 效果展示 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 判斷驗(yàn)證碼 在用戶(hù)提交表單后,在判斷用戶(hù)名和密碼之前,應(yīng)該先判斷驗(yàn)證碼是否正確。 如果驗(yàn)證碼有誤,則沒(méi)有必要繼續(xù)判斷用戶(hù)名和密碼。 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 判斷驗(yàn)證碼 通過(guò) I()函數(shù)獲取用戶(hù)輸入的驗(yàn)證碼 載入驗(yàn)證碼函數(shù) 調(diào)用自定義函數(shù) checkCode()驗(yàn)證用戶(hù)輸入的驗(yàn)證碼是否正確 若驗(yàn)證錯(cuò)誤,則顯示驗(yàn)證碼驗(yàn)證失敗 若驗(yàn)證正確,接著繼續(xù)驗(yàn)證用戶(hù)名和密碼是否正確 任務(wù)二:管理員登錄 登錄驗(yàn)證碼 判斷驗(yàn)證碼 接著自定
31、義函數(shù) checkCode() 該函數(shù)的參數(shù)是用戶(hù)輸入的驗(yàn)證碼 $code 接著取出保存到 Session中的驗(yàn)證碼 $captcha 在 $captcha 不為空的情況下,為防止重復(fù)驗(yàn)證,清除驗(yàn)證碼 在不區(qū)分大小寫(xiě)的情況下,返回 $code和 $captcha 的比較結(jié)果 在 $captcha 為空的情況下,直接返回 false 任務(wù)二:管理員登錄 退出登錄 在完成管理員登錄功能后,還需要開(kāi)發(fā)管理員退出功能。 編輯 adminviewlayout.html文件,在顯示用戶(hù)信息的位置,添加一個(gè)退出登 錄的鏈接 。 您好, 前臺(tái)首頁(yè) 退出 任務(wù)二:管理員登錄 退出登錄 接下來(lái)在 adminlog
32、in.php中接收參數(shù),實(shí)現(xiàn)退出功能。 /接收操作參數(shù) $action = I(a, get, string); /執(zhí)行操作 if($action=logout) /退出登錄 unset($_SESSIONcmsadmin); /清除 Session display(true, 您已經(jīng)成功退出。 ); 任務(wù)二:管理員登錄 讀取欄目 準(zhǔn)備測(cè)試數(shù)據(jù) 在管理員登錄后,就可以對(duì)欄目進(jìn)行管理。在項(xiàng)目數(shù)據(jù)庫(kù)中,為欄目表添 加測(cè)試數(shù)據(jù),用于讀取欄目功能的開(kāi)發(fā)。添加測(cè)試數(shù)據(jù)的 SQL語(yǔ)句如下。 INSERT INTO cms_category (id, pid, name, sort) VALUES (1,
33、0, PHP, 0), (2, 0, Java, 1), (3, 1, PHP基礎(chǔ) , 0), (4, 1, PHP高級(jí) , 1); 任務(wù)三:欄目管理 讀取欄目 讀取欄目數(shù)據(jù) 在項(xiàng)目中,讀取欄目數(shù)據(jù)的需求可能會(huì)頻繁出現(xiàn),因此將此功能寫(xiě)在函數(shù)中。 在 common目錄下創(chuàng)建文件 module.php,用于保存和數(shù)據(jù)相關(guān)的功能模塊函數(shù)。 任務(wù)三:欄目管理 讀取欄目 讀取欄目數(shù)據(jù) 定義函數(shù) module_category(),用于獲取欄目列表 該函數(shù)的參數(shù) $mode表示索引方式: id 或 pid,默認(rèn)返回兩種格式 定義一個(gè)靜態(tài)變量 $result,用于緩存查詢(xún)結(jié)果 當(dāng)?shù)谝淮握{(diào)用函數(shù)時(shí),到數(shù)據(jù)庫(kù)中
34、獲取數(shù)據(jù),并分別根據(jù) id和 pid 創(chuàng)建數(shù)組索引,方便查找。 最后根據(jù)索引方式返回查詢(xún)結(jié)果 任務(wù)三:欄目管理 編輯欄目 輸出已有欄目 在項(xiàng)目中創(chuàng)建 cp_category.php文件,該文件用于讀取欄目數(shù)據(jù)顯示在 HTML模板中。 在該文件中載入初始化文件 接著定義 display()函數(shù),顯示頁(yè)面 從數(shù)據(jù)庫(kù)中根據(jù) pid取出數(shù)據(jù),載入 HTML模板文 adminviewcateogory.html 調(diào)用函數(shù) display() 任務(wù)三:欄目管理 編輯欄目 輸出已有欄目 接下來(lái)編寫(xiě)用于顯示欄目的 adminviewcateogory.html文件。為了提高后臺(tái) 管理的操作效率,可以將欄目顯示
35、、添加、修改功能都在一個(gè)頁(yè)面中完成。 pid的頂級(jí)分類(lèi)為 0 外層循環(huán)輸出頂級(jí)欄目 接著判斷該分類(lèi)下是否存在子欄目,若存在則循環(huán)輸出 任務(wù)三:欄目管理 編輯欄目 效果展示 任務(wù)三:欄目管理 編輯欄目 添加欄目 在完成已有欄目的輸出后,還需要開(kāi)發(fā)欄目添加功能,在實(shí)現(xiàn)欄目添加時(shí),為 了更直觀地在頁(yè)面中添加欄目和子欄目,這里通過(guò) jQuery實(shí)現(xiàn)了頁(yè)面的靈活處理。 編輯 adminviewcp_category.html文件,在頁(yè)面底部添加 JavaScript代碼如下。 任務(wù)三:欄目管理 編輯欄目 添加欄目 當(dāng)單擊頁(yè)面中的 class屬性為 jq-add的元素時(shí),就會(huì)觸發(fā)點(diǎn)擊事件 在該元素的前面添
36、加 HTML內(nèi)容,內(nèi)容是添加新欄目的輸入框 對(duì)于添加表單的 name屬性,這里使用了名稱(chēng)為 add的二維數(shù)組,其外層用于 區(qū)分多個(gè)添加的內(nèi)容,內(nèi)層是 sort、 name、 pid三個(gè)字段 由于是頂級(jí)欄目,所以 pid的值為 0 頂級(jí)分類(lèi)欄目添加 任務(wù)三:欄目管理 編輯欄目 添加欄目 當(dāng)單擊頁(yè)面中的 class屬性為 jq-sub-add的元素時(shí),就會(huì)觸發(fā)點(diǎn)擊事件 為“添加子欄目”元素添加 data-id屬性,用于保存子欄目的上級(jí)欄目 ID。 添加子欄目的事件函數(shù)中應(yīng)該先獲取到此 ID,然后保存到隱藏域的 pid字段中。 二級(jí)分類(lèi)欄目添加 任務(wù)三:欄目管理 編輯欄目 效果展示 任務(wù)三:欄目管理
37、 批量保存 接收表單 調(diào)用 addData()函數(shù)添加欄目,調(diào)用 saveData()函數(shù)修改欄目 實(shí)現(xiàn)接收表單并處理 批量添加 添加欄目的信息保存在了 add二維數(shù)組中 利用 I()函數(shù)接收數(shù)組后保存到數(shù)據(jù)庫(kù)中即可 批量修改 批量修改的實(shí)現(xiàn)方式和批量添加類(lèi)似 在接收表單時(shí),修改欄目的信息保存在了 save數(shù)組中 任務(wù)三:欄目管理 修改層級(jí) 添加編輯鏈接 為每個(gè)欄目添加“編輯”超鏈接,鏈接到 cp_category_edit.php文件 同時(shí),傳遞參數(shù) ID,表示編輯指定 ID的欄目 取出指定欄目信息 先取出待編輯欄目的信息,然后取出所有頂級(jí)欄目信息 保存信息 在 admincp_catego
38、ry_edit.php中 接收表單數(shù)據(jù),將信息保存到數(shù)據(jù)庫(kù)中 任務(wù)三:欄目管理 刪除欄目 添加刪除鏈接 在開(kāi)發(fā)刪除功能時(shí),為了防止誤操作,在執(zhí)行操作前進(jìn)行彈框提示 執(zhí)行操作 判斷 待刪除 欄目下是否有子級(jí)欄目, 若 有則不執(zhí)行刪除操作; 若 沒(méi)有 則 刪除 任務(wù)三:欄目管理 刪除欄目 效果展示 任務(wù)三:欄目管理 刪除欄目 令牌保護(hù) 在前面實(shí)現(xiàn)刪除功能時(shí),通過(guò)一個(gè) URL地址直接實(shí)現(xiàn)了刪除數(shù)據(jù),然而這 種方式在 Web開(kāi)發(fā)中存在安全隱患。 當(dāng)管理員在登錄系統(tǒng)的狀態(tài)下進(jìn)行其他操作時(shí),如果訪(fǎng)問(wèn)了其他用戶(hù)惡意 構(gòu)造的危險(xiǎn) URL地址,就會(huì)導(dǎo)致后臺(tái)的操作被執(zhí)行,這種安全漏洞稱(chēng)為 CSRF (跨域請(qǐng)求偽造
39、)。 任務(wù)三:欄目管理 刪除欄目 令牌保護(hù) 防御 CSRF安全問(wèn)題的一個(gè)有效的措施,是為所有涉及更改數(shù)據(jù)的操作加上 令牌保護(hù),該令牌將在用戶(hù)登錄時(shí)隨機(jī)生成,每個(gè)更改的操作都附加上令牌, 沒(méi)有令牌時(shí)將無(wú)法執(zhí)行操作。 任務(wù)三:欄目管理 刪除欄目 令牌保護(hù) token_get():利用 md5()和 microtime(true)生成令牌, 將其保存在 Session中 token_check():先從 GET參數(shù)中取出 token,然后再與保存到 Session中的 token 進(jìn)行比較,判斷是否正確。如果令牌有誤,說(shuō)明用戶(hù)當(dāng)前的操作是非法的。 在 commonfunction.php中,自定義
40、token_get()和 token_check()函數(shù) 任務(wù)三:欄目管理 刪除欄目 令牌保護(hù) 在 admininit.php中添加代碼實(shí)現(xiàn)令牌的自動(dòng)生成和驗(yàn)證 對(duì)刪除欄目的操作添加令牌驗(yàn)證 需要注意的是,為了避免項(xiàng)目中頻繁的令牌驗(yàn)證影響代碼演示,在 本書(shū)后面的開(kāi)發(fā)步驟中并沒(méi)有加上令牌驗(yàn)證功能。同時(shí)為了確保項(xiàng) 目的嚴(yán)謹(jǐn)性,在本書(shū)的配套源代碼中已經(jīng)全部加上了令牌驗(yàn)證。 任務(wù)三:欄目管理 文章列表 準(zhǔn)備測(cè)試數(shù)據(jù) 在開(kāi)發(fā)具體功能前,先向數(shù)據(jù)庫(kù)中插入測(cè)試數(shù)據(jù) 查詢(xún)文章列表 通過(guò)文章表和欄目表的左連接查詢(xún),從數(shù)據(jù)庫(kù)中獲取到文章列表, 在列表中包含了文章所屬欄目的信息 展示文章列表 編寫(xiě)代碼輸出文章列表
41、任務(wù)四:文章管理 文章列表 效果展示 任務(wù)四:文章管理 編輯文章 添加編輯鏈接 當(dāng)單擊“編輯”鏈接時(shí),訪(fǎng)問(wèn) cp_article_edit.php并傳入?yún)?shù) id 查詢(xún)指定文章信息 接收 文章 id,顯示修改頁(yè)面 如果沒(méi)有收到,或 id的值為 0時(shí),直接顯示空表單,用于發(fā)布新文章 顯示文章編輯表單 創(chuàng)建一個(gè)表單顯示文章編輯內(nèi)容 輸出欄目列表 下面將欄目輸出到一個(gè)下拉菜單中 任務(wù)四:文章管理 編輯文章 引入在線(xiàn)編輯器 在 CKEditor的官方網(wǎng)站可以下載此編輯器 將編輯器放入到項(xiàng)目的 adminjs目錄中,并將編輯器目錄命名為“ ckeditor” 在文章編輯頁(yè)面 adminviewartic
42、le_edit.html的底部編寫(xiě) JavaScript代碼, 實(shí)現(xiàn)在線(xiàn)編輯器的引入 。 修改容器的 name屬性值 任務(wù)四:文章管理 編輯文章 效果展示 任務(wù)四:文章管理 保存文章 接收表單 接收用戶(hù)填寫(xiě)的基本信息 接收由在線(xiàn)編輯器提交的內(nèi)容時(shí),沒(méi)有進(jìn)行 HTML轉(zhuǎn)義,這是因?yàn)?編輯器提交內(nèi)容的本來(lái)就是 HTML。 從安全角度來(lái)說(shuō),服務(wù)器端不進(jìn)行 HTML轉(zhuǎn)義會(huì)帶來(lái)安全問(wèn)題,原因是瀏覽 器端任何限制都可以被繞過(guò)。 在項(xiàng)目開(kāi)發(fā)時(shí),可以考慮使用富文本過(guò)濾器(如 HTML Purifier)對(duì) HTML內(nèi) 容進(jìn)行安全過(guò)濾,這部分內(nèi)容將在后面的項(xiàng)目中進(jìn)行講解。 任務(wù)四:文章管理 保存文章 實(shí)現(xiàn)文章修
43、改 在執(zhí)行接收表單后的操作時(shí),如果接收到文章 ID,就執(zhí)行文章修改操作。 實(shí)現(xiàn)文章添加 在處理表單時(shí),如果沒(méi)有接收到文章 ID,就執(zhí)行文章添加操作。 任務(wù)四:文章管理 上傳封面圖 檢查上傳文件 在進(jìn)行添加或修改數(shù)據(jù)之前,先處理上傳文件 在 commonfunction.php中,自定義 check_upload()函數(shù) , 用于判斷上傳文 件是否成功,成功時(shí)返回 true,失敗時(shí)將錯(cuò)誤信息保存到 $error中 準(zhǔn)備縮略圖函數(shù) 為圖片生成縮略圖 image_thumb 根據(jù)原圖文件創(chuàng)建圖像資源 image_create 保存圖像資源 image_save 任務(wù)四:文章管理 上傳封面圖 獲取圖片
44、信息 實(shí)現(xiàn) image_thumb()函數(shù)的功能,完成縮略圖的生成 實(shí)現(xiàn)圖片等比例縮放 通常會(huì)保持圖片比例,防止圖片被拉伸或者壓扁,影響圖片的美觀 生成保存路徑 可以根據(jù)日期為圖片生成子目錄,并為文件自動(dòng)生成文件名,防止文件名沖突 調(diào)用縮略圖函數(shù) 在調(diào)用時(shí),需要指定原圖路徑、縮略圖寬高、上傳目錄等信息 任務(wù)四:文章管理 上傳封面圖 效果展示 任務(wù)四:文章管理 刪除文章 添加刪除鏈接 該功能和欄目刪除時(shí)的代碼相同 執(zhí)行刪除操作 當(dāng)用戶(hù)單擊刪除鏈接后,就會(huì)向 PHP腳本發(fā)送待刪除的文章 ID參數(shù) 在實(shí)際進(jìn)行文章記錄刪除操作之前,需要先判斷文章是否有封面圖。 如果封面圖存在,就先刪除圖片文件,再刪除
45、文章記錄 任務(wù)四:文章管理 列表功能區(qū) 準(zhǔn)備排序條件 在 admincp_article.php文章列表程序中編寫(xiě)代碼,獲取列表相關(guān)的 GET參 數(shù),并定義排序的 方式以及對(duì)應(yīng)的 SQL語(yǔ)句 顯示列表功能區(qū) 欄目篩選和列表排序功能是兩個(gè)下拉菜單 列表搜索功能是一個(gè)文本框 三個(gè)功能各放在三個(gè)表單中,單擊表單提交按鈕即可完成對(duì)應(yīng)的功能操作。 任務(wù)五:排序與搜索 列表功能區(qū) 效果展示 任務(wù)五:排序與搜索 組合 SQL語(yǔ)句 組合 ORDER和 WHERE子句 在前面的步驟中,已經(jīng)使用 $cid、 $search、 $order三個(gè)變量接收了來(lái)自表單提 交的數(shù)據(jù)。接下來(lái)就可以根據(jù)這些數(shù)據(jù)組合 SQL語(yǔ)句
46、進(jìn)行查詢(xún)。在文章列表功能 admincp_article.php中繼續(xù)編寫(xiě)代碼,在接收變量后組合 SQL語(yǔ)句。 /拼接排序條件 $sql_order = ORDER BY $sql_order .= isset($order_arr$order) ? $order_arr$ordersql : a.id DESC; /拼接 WHERE條件 $sql_where = WHERE 1=1 ; $sql_where .= $cid ? AND a.cid IN (.module_category_sub($cid).) : ; $sql_where .= AND a.title LIKE ? ; $
47、sql_search = %.db_escape_like($search).%; 任務(wù)五:排序與搜索 組合 SQL語(yǔ)句 根據(jù)欄目 ID取出所有子欄目 ID 下面在 commonmodule.php文件中編寫(xiě) module_category_sub()函數(shù),實(shí)現(xiàn) 根據(jù)欄目 ID取出所有子欄目 ID的功能。 function module_category_sub($id) $data = module_category(pid); $sub = isset($data$id) ? array_keys($data$id) : ; array_unshift($sub, $id); /將 $id
48、放入數(shù)組開(kāi)頭 return implode(, $sub); 任務(wù)五:排序與搜索 組合 SQL語(yǔ)句 轉(zhuǎn)義 LIKE搜索字符串 接下來(lái)在 commondb.php文件中編寫(xiě) db_escape_like()函數(shù),用于實(shí)現(xiàn)轉(zhuǎn)義 LIKE搜索字符串中的所有特殊字符。 function db_escape_like($like) return strtr($like, %=%, _=_, =); 在單引號(hào)字符串中書(shū)寫(xiě)“ ”字符時(shí),如果一個(gè)“ ”后面跟一個(gè)單引號(hào),單引 號(hào)將會(huì)被轉(zhuǎn)義成字符串中的字符,而非字符串定界符,因此需要在“ ”前面加一 個(gè)“ ”進(jìn)行轉(zhuǎn)義(字符串中實(shí)際只保存了一個(gè)“ ”字符)。 任務(wù)
49、五:排序與搜索 組合 SQL語(yǔ)句 修改文章列表查詢(xún) SQL 在完成對(duì) ORDER和 WHERE的組合后,接下來(lái)繼續(xù)編寫(xiě) admincp_article.php, 修改查詢(xún)文章列表數(shù)據(jù)的代碼,將篩選和排序條件加入到 SQL語(yǔ)句中。 $data = db_fetch(DB_ALL, SELECT a.id, a.cid, a.title, a.author, a.show, a.time, c.name AS cname FROM cms_article AS a LEFT JOIN cms_category AS c ON a.cid=c.id. $sql_where $sql_order, s
50、, $sql_search); 任務(wù)五:排序與搜索 組合 SQL語(yǔ)句 效果展示 任務(wù)五:排序與搜索 分頁(yè)顯示信息 分頁(yè)查詢(xún)?cè)?實(shí)現(xiàn)分頁(yè)的原理是對(duì) SQL語(yǔ)句中的 LIMIT進(jìn)行控制,示例代碼如下。 SELECT title FROM cms_article LIMIT 0, 10; # 獲取第 1頁(yè)的 10條數(shù)據(jù) SELECT title FROM cms_article LIMIT 10, 10; # 獲取第 2頁(yè)的 10條數(shù)據(jù) SELECT title FROM cms_article LIMIT 20, 10; # 獲取第 3頁(yè)的 10條數(shù)據(jù) SELECT title FROM cms
51、_article LIMIT 30, 10; # 獲取第 4頁(yè)的 10條數(shù)據(jù) 任務(wù)六:分頁(yè)導(dǎo)航 分頁(yè)顯示信息 分頁(yè)查詢(xún)?cè)?LIMIT的第 2個(gè)參數(shù)“ 10” 表示每次讀取的最大條數(shù);第 1個(gè)參數(shù)與頁(yè)碼之 間存在一定的數(shù)學(xué)關(guān)系,具體如下: LIMIT 第 1個(gè)參數(shù) = (頁(yè)碼 - 1) * 每頁(yè)查詢(xún)的條數(shù) 任務(wù)六:分頁(yè)導(dǎo)航 分頁(yè)顯示信息 分頁(yè)查詢(xún)?cè)?根據(jù)上述條件,接下來(lái)在 common目錄中創(chuàng)建 page.php,用于實(shí)現(xiàn)分頁(yè)功 能。下面在文件中編寫(xiě)用于生成 LIMIT參數(shù)的函數(shù)。 ?php /獲取 SQL分頁(yè) Limit( $page表示頁(yè)碼, $size表示每頁(yè)查詢(xún)條數(shù)) functio
52、n page_sql($page, $size) return ($page-1) * $size . , . $size; 任務(wù)六:分頁(yè)導(dǎo)航 分頁(yè)顯示信息 實(shí)現(xiàn)分頁(yè)查詢(xún)數(shù)據(jù) 接下來(lái)在文章列表功能 admincp_article.php文件中實(shí)現(xiàn)分頁(yè)查詢(xún),在 display()函數(shù)中查詢(xún)文章列表數(shù)據(jù)之前 , 編寫(xiě)代碼定義每頁(yè)顯示的記錄數(shù)和 頁(yè)碼,并調(diào)用 page_sql函數(shù)生成 LIMIT參數(shù) 。 任務(wù)六:分頁(yè)導(dǎo)航 分頁(yè)顯示信息 實(shí)現(xiàn)分頁(yè)查詢(xún)數(shù)據(jù) $page = I(page, get, page); /獲取頁(yè)碼(限制最小值為 1) $page_size = 3; /每頁(yè)顯示 3條記錄 req
53、uire COMMON_PATH.page.php; /載入分頁(yè)函數(shù) $sql_limit = LIMIT .page_sql($page, $page_size); /拼接 LIMIT /獲取文章列表時(shí),將 LIMIT放入 SQL語(yǔ)句中 $data = db_fetch(DB_ALL, SELECT a.id, a.cid, a.title, a.author, a.show, a.time, c.name AS cname FROM cms_article AS a LEFT JOIN cms_category AS c ON a.cid=c.id. $sql_where $sql_ord
54、er $sql_limit, s, $sql_search); 任務(wù)六:分頁(yè)導(dǎo)航 生成分頁(yè)導(dǎo)航 獲取總頁(yè)數(shù) 查詢(xún)出符合 $sql_where條件的總記錄數(shù),通過(guò)總記錄數(shù)和每頁(yè)顯示的記錄數(shù), 即可計(jì)算出總頁(yè)數(shù),計(jì)算公式為“總記錄數(shù)每頁(yè)數(shù)量”,然后向上取整。 例如,總記錄數(shù)為 7,每頁(yè)顯示 3條,則 7除以 3的結(jié)果大于 2且小于 3,超出第 2頁(yè)的記錄在第 3頁(yè)顯示,因此總頁(yè)數(shù)為 3。 任務(wù)六:分頁(yè)導(dǎo)航 生成分頁(yè)導(dǎo)航 生成分頁(yè)導(dǎo)航 生成分頁(yè)導(dǎo)航的原理是,根據(jù)當(dāng)前頁(yè)碼和總記錄數(shù),計(jì)算出“上一頁(yè)”、 “下一頁(yè)”、“尾頁(yè)”的頁(yè)碼值。 其中,為了 在輸出分頁(yè)鏈接時(shí)攜帶 GET參數(shù) ,獲取原來(lái)所有的 GET參數(shù), 清 除原來(lái)的 page參數(shù) , 重新構(gòu)造參數(shù)字符串 并返回。 在 commonpage.php中編寫(xiě)程序,實(shí)現(xiàn)分頁(yè)導(dǎo)航的自動(dòng)生成 。 任務(wù)六:分頁(yè)導(dǎo)航 生成分頁(yè)導(dǎo)航 效果展示 任務(wù)六:分頁(yè)導(dǎo)航
- 溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案