版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、【中級(jí)篇】項(xiàng)目二:內(nèi)容管理系統(tǒng),模塊五 后臺(tái)功能實(shí)現(xiàn),MySQL安裝與使用HTTP、會(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)備,,
2、,項(xiàng)目初始化,任務(wù)一:項(xiàng)目準(zhǔn)備,,,項(xiàng)目初始化,項(xiàng)目首先分成了前臺(tái)和后臺(tái)兩個(gè)平臺(tái)將common和upload目錄作為前后臺(tái)公共目錄后臺(tái)相關(guān)的文件全部放到了admin目錄中從而在目錄結(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_DEB
3、UG,用于表示是否開(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)行訪問(wèn)時(shí),從當(dāng)前目錄“./”開(kāi)始。,任務(wù)一:項(xiàng)目準(zhǔn)備,,,項(xiàng)目初始化,為后臺(tái)創(chuàng)建初始化文件admin\init.php定義常量APP_DEBUG,用于表示是否開(kāi)啟調(diào)試,其值可以為true和false。當(dāng)
4、開(kāi)啟時(shí)將提示完整的錯(cuò)誤信息以便于調(diào)試,否則只進(jìn)行簡(jiǎn)單的錯(cuò)誤提示。定義常量COMMON_PATH和UPLOAD_PATH,用于表示公共文件目錄和上傳文件目錄的路徑。從后臺(tái)進(jìn)行訪問(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ù)的名稱,通過(guò)一個(gè)大寫(xiě)字母的命名風(fēng)格,既書(shū)寫(xiě)方便,又便于程序閱讀。
5、,任務(wù)一:項(xiàng)目準(zhǔn)備,,,函數(shù)庫(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)目的初始
6、化文件中載入函數(shù)庫(kù),任務(wù)一:項(xiàng)目準(zhǔn)備,,,函數(shù)庫(kù)與配置文件,——配置文件,在項(xiàng)目中通常有一些常用的配置,如數(shù)據(jù)庫(kù)連接信息,使用獨(dú)立的配置文件來(lái)保存配置可以使代碼更利于維護(hù)。,任務(wù)一:項(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ù)
7、庫(kù)的連接信息,如數(shù)據(jù)庫(kù)服務(wù)器地址、用戶名、密碼、默認(rèn)數(shù)據(jù)庫(kù)和端口號(hào)。DB_CHARSET元素用于保存數(shù)據(jù)庫(kù)字符集,任務(wù)一:項(xiàng)目準(zhǔn)備,,,函數(shù)庫(kù)與配置文件,——訪問(wèn)配置文件,完成配置文件common\config.php的創(chuàng)建后,接下來(lái)還需要對(duì)配置文件進(jìn)行訪問(wèn)。,任務(wù)一:項(xiàng)目準(zhǔn)備,,,函數(shù)庫(kù)與配置文件,——訪問(wèn)配置文件,在函數(shù)庫(kù)文件common\function.php中編寫(xiě)函數(shù)C()實(shí)現(xiàn)此功能。,函數(shù)名是英文字母“config”的首字
8、母縮寫(xiě),表示訪問(wèn)程序的設(shè)置。參數(shù)$name表示待訪問(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)初始化文件admin\init.php中,添加以下代碼用于測(cè)試函數(shù)的使用。,//訪
9、問(wèn)數(shù)據(jù)庫(kù)連接信息$config = C('DB_CONNECT');echo $config['host']; //輸出結(jié)果:localhost//訪問(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ě)。
10、接下來(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ù)連接$link,任務(wù)一:項(xiàng)目準(zhǔn)備,,,數(shù)據(jù)庫(kù)函數(shù),——執(zhí)行SQL語(yǔ)句,在完成數(shù)據(jù)庫(kù)連接后接下來(lái)就可以執(zhí)行SQL語(yǔ)句。由于MySQLi擴(kuò)展提供的預(yù)處
11、理語(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_execut
12、e()直接執(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ù)首先依次保存
13、前兩個(gè)參數(shù)$stmt和數(shù)據(jù)格式由于mysqli_stmt_bind_param()的參數(shù)綁定需要引用傳參,因此通過(guò)遍歷數(shù)據(jù)內(nèi)容,為每個(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`) VAL
14、UES (?, ?)';//執(zhí)行SQL語(yǔ)句db_query($sql, 'si', ['test', 0]);,第二個(gè)參數(shù)‘si’,表示插入數(shù)據(jù)的類型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ī)制還可以實(shí)現(xiàn)批量操作。因此,還可以改進(jìn)db_query()函數(shù),
15、當(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
16、 (?, ?)';//準(zhǔn)備數(shù)據(jù)$data = [['aa', 1], ['bb', 12], ['cc', 30]];//執(zhí)行SQL語(yǔ)句db_query($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ù)完
17、善數(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ù),,——示例演示,// ① 查詢數(shù)據(jù),獲得保存所有結(jié)果的關(guān)
18、聯(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, 's
19、i', ['test', 0]);echo $id;,任務(wù)一:項(xiàng)目準(zhǔn)備,,,輸入過(guò)濾函數(shù),在項(xiàng)目開(kāi)發(fā)中,對(duì)于$_GET、$_POST數(shù)組的訪問(wèn)是非常頻繁的,但是這兩個(gè)數(shù)組保存的是來(lái)自外部提交的數(shù)據(jù),如果直接進(jìn)行訪問(wèn),會(huì)帶來(lái)安全隱患。因此,通過(guò)函數(shù)來(lái)統(tǒng)一接收外部變量,可以使項(xiàng)目代碼更加嚴(yán)謹(jǐn)和規(guī)范。接下來(lái),在common\function.php中編寫(xiě)I()函數(shù)用于接收外部變量。,任務(wù)一:項(xiàng)目準(zhǔn)備,,,輸入過(guò)濾函
20、數(shù),該函數(shù)名取自英文單詞“input”的首字母,表示輸入。該函數(shù)的參數(shù)依次為需要處理的變量名、接收方法、數(shù)據(jù)類型、默認(rèn)值根據(jù)接收方法確定數(shù)據(jù)變量使用哪種接收類型通過(guò)isset()判斷接收的數(shù)據(jù)變量是否存在,若不存在將其值設(shè)為默認(rèn)值結(jié)合switch和數(shù)據(jù)類型進(jìn)行不同的過(guò)濾處理,具體有字符串型、html轉(zhuǎn)義、整數(shù)、無(wú)符號(hào)整數(shù)、頁(yè)碼、浮點(diǎn)數(shù)、布爾型、數(shù)組型。,任務(wù)一:項(xiàng)目準(zhǔn)備,,,輸入過(guò)濾函數(shù),結(jié)合htmlspecialchars()
21、函數(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)在common\function.php中實(shí)現(xiàn)該函數(shù)toHTML()。具體思路如下:,任務(wù)一:項(xiàng)目準(zhǔn)備,,,,輸入過(guò)
22、濾函數(shù),——示例演示,,// ① POST方式$_POST['name'] = '測(cè)試';$name = I('name', 'post', 'html');echo $name; //輸出結(jié)果:測(cè)試<文本>,// ② GET方式$_GET['id'] = '123abc';$id =
23、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)如圖。,,top是頁(yè)面的頂部,通常用于顯示系統(tǒng)名稱、相關(guān)鏈接;nav是頁(yè)面的左側(cè)導(dǎo)航菜單,后臺(tái)中的各個(gè)功能模塊通過(guò)這個(gè)菜單進(jìn)入;content是頁(yè)面內(nèi)容,根據(jù)當(dāng)前訪問(wèn)
24、的功能而改變。,任務(wù)一:項(xiàng)目準(zhǔn)備,,,后臺(tái)頁(yè)面布局,,在admin\view目錄中創(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è)admin\index.php,載入后臺(tái)初始化文件和布局文件接下來(lái)在當(dāng)前目錄下,創(chuàng)建admin\cp_index.php文件,載入后臺(tái)首頁(yè)信息創(chuàng)建文件admin\view\index.html,該文件是后臺(tái)首頁(yè)的HTML模
25、板文件,任務(wù)一:項(xiàng)目準(zhǔn)備,,,后臺(tái)頁(yè)面布局,,——后臺(tái)頁(yè)面布局展示圖,任務(wù)一:項(xiàng)目準(zhǔn)備,,,,實(shí)現(xiàn)管理員登錄,,——添加管理員信息,在管理員表中添加初始數(shù)據(jù),具體字段應(yīng)包括ID、用戶名和密碼,SQL語(yǔ)句如下。,INSERT INTO `cms_admin` VALUES (1, 'admin', '123456');,任務(wù)二:管理員登錄,,,,實(shí)現(xiàn)管理員登錄,,——?jiǎng)?chuàng)建后臺(tái)登錄表單,在后臺(tái)admin\vi
26、ew中創(chuàng)建后臺(tái)用戶登錄的HTML表單login.html。,用戶名:密 碼: ,任務(wù)二:管理員登錄,,,實(shí)現(xiàn)管理員登錄,,——載入數(shù)據(jù)庫(kù)操作函數(shù),修改前后臺(tái)的初始化文件admin\init.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)登錄文件admin\login.ph
27、p,實(shí)現(xiàn)載入HTML模板顯示登錄頁(yè)面,當(dāng)接收到提交的登錄表單時(shí)處理表單。,任務(wù)二:管理員登錄,,,實(shí)現(xiàn)管理員登錄,,——接收登錄表單,載入后臺(tái)初始化文件init.php和表單模板文件login.html通過(guò)if與$_POST處理提交后的表單內(nèi)容在處理表單時(shí),先通過(guò)I()函數(shù)接收用戶名和密碼,到數(shù)據(jù)庫(kù)中查詢信息,然后取出密碼后進(jìn)行驗(yàn)證。如果驗(yàn)證通過(guò),則將用戶登錄信息保存到Session中,然后利用自定義redirect()函數(shù)跳轉(zhuǎn)到
28、后臺(tái)首頁(yè)index.php如果驗(yàn)證失敗,則調(diào)用E()函數(shù)停止程序繼續(xù)執(zhí)行。,任務(wù)二:管理員登錄,,,,實(shí)現(xiàn)管理員登錄,,——接收登錄表單,接下來(lái)在common\function.php中編寫(xiě)用于實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的redirect()函數(shù)。,function redirect($url){ header("Location:$url"); //重定向到目標(biāo)URL地址 exit;},任務(wù)二:管理
29、員登錄,,,頁(yè)面信息提示,,當(dāng)PHP處理用戶提交表單時(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)在admin\login.php中編寫(xiě)display()函數(shù),將載入HTML模板的代碼放到函數(shù)中。,,function d
30、isplay($msg=null){ require './view/login.html'; exit; },任務(wù)二:管理員登錄,,,頁(yè)面信息提示,,——在頁(yè)面中輸出提示信息,編輯后臺(tái)登錄頁(yè)面admin\view\login.html,在頁(yè)面中添加元素用于顯示信息提示。,,,任務(wù)二:管理員登錄,,,頁(yè)面信息提示,,——在頁(yè)面中輸出提示信息,在common\function.php中編
31、寫(xiě)該函數(shù)tips()輸出提示信息。,,function tips($msg=null){ if(!$msg){ return ''; //沒(méi)有提示信息時(shí)直接返回空字符串 } return $msg[0] ? "$msg[1]" : "$msg[1]";},tips()函數(shù)的參數(shù)$msg用于傳入一個(gè)數(shù)組,數(shù)組的第1個(gè)元素表示成功或失敗第2個(gè)元
32、素是表示提示信息當(dāng)省略參數(shù)$msg,或$msg為空時(shí),直接返回空字符串,表示沒(méi)有提示信息,任務(wù)二:管理員登錄,,,頁(yè)面信息提示,,——顯示頁(yè)面并提示信息,在完成信息提示功能后,修改admin\login.php中登錄失敗的提示代碼,,//修改前的代碼://E('登錄失?。河脩裘蛎艽a錯(cuò)誤。');,,//修改后的代碼:display([false, '登錄失?。河脩裘蛎艽a錯(cuò)誤。']);,任務(wù)二:管理
33、員登錄,,,,頁(yè)面信息提示,,——沒(méi)有表單提交時(shí)顯示頁(yè)面,在完成創(chuàng)建display()函數(shù)后,當(dāng)沒(méi)有表單提交時(shí),應(yīng)顯示登錄頁(yè)面,if($_POST){ //有表單提交時(shí),處理表單……}else{ //沒(méi)有表單提交時(shí),顯示登錄頁(yè)面 display();},任務(wù)二:管理員登錄,,,頁(yè)面信息提示,,——效果展示,任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,在實(shí)現(xiàn)了用戶登錄功能后,還需要判斷用戶是否登錄,如果
34、沒(méi)有登錄則提示用戶進(jìn)行登錄,并阻止用戶訪問(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)建前綴。修改文件admin\init.php,具體如下:,——開(kāi)啟Session,//啟動(dòng)sessionsession_start();//為項(xiàng)目創(chuàng)建Session,統(tǒng)一保存到cms
35、中if(!isset($_SESSION['cms'])){ $_SESSION = ['cms' => []];},任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,接下來(lái)在admin\init.php中繼續(xù)編寫(xiě)代碼,實(shí)現(xiàn)檢查用戶登錄。,——檢查用戶登錄,判斷是否已經(jīng)定義了NO_CHECK_LOGIN常量如果沒(méi)有定義則檢查用戶是否登錄,如果已經(jīng)定義了則不檢查用戶是否登錄當(dāng)用戶登錄時(shí),取出
36、用戶信息保存到變量$user中如果沒(méi)有登錄則跳轉(zhuǎn)到登錄頁(yè)面login.php并停止腳本繼續(xù)執(zhí)行當(dāng)其他腳本載入這個(gè)文件時(shí),就會(huì)自動(dòng)判斷用戶是否登錄,而如果不需要判斷登錄,則在載入admin\init.php之前,先定義NO_CHECK_LOGIN常量。,任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,在admin\login.php文件中,當(dāng)用戶登錄成功時(shí),將用戶信息(ID和用戶名)保存到了Session中。在admin\init.php中
37、判斷用戶是否登錄,如果已經(jīng)登錄,則從Session中取出用戶信息,保存到$user中。當(dāng)用戶登錄成功后進(jìn)入后臺(tái)首頁(yè)時(shí),可通過(guò)輸出$user將用戶名顯示在頁(yè)面中。,——顯示當(dāng)前登錄的用戶名,任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,——效果展示,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,在開(kāi)發(fā)管理員登錄功能時(shí),還要考慮一個(gè)問(wèn)題,就是除了瀏覽器,其他軟件也可以向服務(wù)器提交數(shù)據(jù)。從系統(tǒng)安全的角度看,如果使用軟件自動(dòng)大批量向服務(wù)器提交表單,那么管
38、理員的用戶名、密碼將會(huì)被窮舉出來(lái),導(dǎo)致管理員賬號(hào)被盜取。為此,驗(yàn)證碼就是一種防御的手段。,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,通常情況下,驗(yàn)證碼是一張帶有文字的圖片,要求用戶輸入圖中的文字。對(duì)于圖片中的文字,人類識(shí)別非常容易,而軟件識(shí)別非常困難。因此,驗(yàn)證碼是一種區(qū)分人類和計(jì)算機(jī)的程序。接下來(lái),就在項(xiàng)目中實(shí)現(xiàn)驗(yàn)證碼的功能。,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,——生成驗(yàn)證碼文本,在項(xiàng)目中創(chuàng)建common\captcha.php,該
39、文件用于保存驗(yàn)證碼相關(guān)的函數(shù)。,編寫(xiě)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)證
40、碼,,——生成驗(yàn)證碼圖像,在common\captcha.php中繼續(xù)編寫(xiě)代碼,實(shí)現(xiàn)輸出驗(yàn)證碼圖像的函數(shù)。,編寫(xiě)captcha_show()函數(shù),用于驗(yàn)證碼圖像該函數(shù)有一個(gè)參數(shù),用于表示驗(yàn)證碼文本創(chuàng)建圖片資源,隨機(jī)生成背景顏色,設(shè)置字體顏色和樣式生成指定長(zhǎng)度的驗(yàn)證碼添加8個(gè)干擾線和250個(gè)噪點(diǎn)向?yàn)g覽器輸出PNG格式的驗(yàn)證碼圖片,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,——調(diào)用驗(yàn)證碼函數(shù),在完成了驗(yàn)證碼文本和圖像生成的函數(shù)后,接下
41、來(lái)在后臺(tái)中調(diào)用函數(shù)顯示驗(yàn)證碼。,創(chuàng)建文件admin\captcha.php,完成驗(yàn)證碼函數(shù)的調(diào)用載入驗(yàn)證碼函數(shù)文件common\captcha.php生成驗(yàn)證碼值輸出驗(yàn)證碼圖像,將驗(yàn)證碼保存到Session中,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,——顯示驗(yàn)證碼,在完成驗(yàn)證碼的調(diào)用后,接下來(lái)在后臺(tái)管理員登錄的表單中顯示驗(yàn)證碼。修改登錄表單admin\view\login.html,在表單中使用載入驗(yàn)證碼圖片。,,驗(yàn)證碼:,任務(wù)二
42、:管理員登錄,,,登錄驗(yàn)證碼,,——效果展示,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,——判斷驗(yàn)證碼,在用戶提交表單后,在判斷用戶名和密碼之前,應(yīng)該先判斷驗(yàn)證碼是否正確。如果驗(yàn)證碼有誤,則沒(méi)有必要繼續(xù)判斷用戶名和密碼。,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,——判斷驗(yàn)證碼,通過(guò)I()函數(shù)獲取用戶輸入的驗(yàn)證碼載入驗(yàn)證碼函數(shù)調(diào)用自定義函數(shù)checkCode()驗(yàn)證用戶輸入的驗(yàn)證碼是否正確若驗(yàn)證錯(cuò)誤,則顯示驗(yàn)證碼驗(yàn)證失敗若驗(yàn)證正確,接著
43、繼續(xù)驗(yàn)證用戶名和密碼是否正確,任務(wù)二:管理員登錄,,,登錄驗(yàn)證碼,,——判斷驗(yàn)證碼,接著自定義函數(shù)checkCode()該函數(shù)的參數(shù)是用戶輸入的驗(yàn)證碼$code接著取出保存到Session中的驗(yàn)證碼$captcha 在$captcha 不為空的情況下,為防止重復(fù)驗(yàn)證,清除驗(yàn)證碼在不區(qū)分大小寫(xiě)的情況下,返回$code和$captcha 的比較結(jié)果在$captcha 為空的情況下,直接返回false,任務(wù)二:管理員登錄,,,,退出
44、登錄,,在完成管理員登錄功能后,還需要開(kāi)發(fā)管理員退出功能。編輯admin\view\layout.html文件,在顯示用戶信息的位置,添加一個(gè)退出登錄的鏈接。,您好,前臺(tái)首頁(yè)退出,任務(wù)二:管理員登錄,,,退出登錄,,接下來(lái)在admin\login.php中接收參數(shù),實(shí)現(xiàn)退出功能。,,//接收操作參數(shù)$action = I('a', 'get', 'string');//執(zhí)行操作
45、if($action=='logout'){ //退出登錄 unset($_SESSION['cms']['admin']); //清除Session display([true, '您已經(jīng)成功退出。']);},任務(wù)二:管理員登錄,,,,讀取欄目,,——準(zhǔn)備測(cè)試數(shù)據(jù),在管理員登錄后,就可以對(duì)欄目進(jìn)行管理。在項(xiàng)目數(shù)據(jù)庫(kù)中,為欄目表添加測(cè)試數(shù)據(jù),用
46、于讀取欄目功能的開(kāi)發(fā)。添加測(cè)試數(shù)據(jù)的SQL語(yǔ)句如下。,INSERT INTO `cms_category` (`id`, `pid`, `name`, `sort`) VALUES(1, 0, 'PHP', 0), (2, 0, 'Java', 1), (3, 1, 'PHP基礎(chǔ)', 0),(4, 1, 'PHP高級(jí)', 1);,任務(wù)三:欄目管理,,,讀取欄目,,—
47、—讀取欄目數(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,用于緩存查詢結(jié)果當(dāng)?shù)谝淮握{(diào)用函數(shù)時(shí),到數(shù)據(jù)庫(kù)中獲取
48、數(shù)據(jù),并分別根據(jù)id和pid創(chuàng)建數(shù)組索引,方便查找。最后根據(jù)索引方式返回查詢結(jié)果,任務(wù)三:欄目管理,,,編輯欄目,,——輸出已有欄目,在項(xiàng)目中創(chuàng)建cp_category.php文件,該文件用于讀取欄目數(shù)據(jù)顯示在HTML模板中。,在該文件中載入初始化文件接著定義display()函數(shù),顯示頁(yè)面從數(shù)據(jù)庫(kù)中根據(jù)pid取出數(shù)據(jù),載入HTML模板文admin\view\cateogory.html調(diào)用函數(shù)display(),任務(wù)三:欄目管
49、理,,,編輯欄目,,——輸出已有欄目,接下來(lái)編寫(xiě)用于顯示欄目的admin\view\cateogory.html文件。為了提高后臺(tái)管理的操作效率,可以將欄目顯示、添加、修改功能都在一個(gè)頁(yè)面中完成。,pid的頂級(jí)分類為0外層循環(huán)輸出頂級(jí)欄目接著判斷該分類下是否存在子欄目,若存在則循環(huán)輸出,任務(wù)三:欄目管理,,,編輯欄目,,——效果展示,任務(wù)三:欄目管理,,,編輯欄目,,——添加欄目,在完成已有欄目的輸出后,還需要開(kāi)發(fā)欄目添加功能,在實(shí)
50、現(xiàn)欄目添加時(shí),為了更直觀地在頁(yè)面中添加欄目和子欄目,這里通過(guò)jQuery實(shí)現(xiàn)了頁(yè)面的靈活處理。編輯admin\view\cp_category.html文件,在頁(yè)面底部添加JavaScript代碼如下。,任務(wù)三:欄目管理,,,編輯欄目,,——添加欄目,當(dāng)單擊頁(yè)面中的class屬性為jq-add的元素時(shí),就會(huì)觸發(fā)點(diǎn)擊事件在該元素的前面添加HTML內(nèi)容,內(nèi)容是添加新欄目的輸入框?qū)τ谔砑颖韱蔚膎ame屬性,這里使用了名稱為add的二維數(shù)
51、組,其外層用于區(qū)分多個(gè)添加的內(nèi)容,內(nèi)層是sort、name、pid三個(gè)字段由于是頂級(jí)欄目,所以pid的值為0,① 頂級(jí)分類欄目添加,任務(wù)三:欄目管理,,,編輯欄目,,——添加欄目,當(dāng)單擊頁(yè)面中的class屬性為jq-sub-add的元素時(shí),就會(huì)觸發(fā)點(diǎn)擊事件為“添加子欄目”元素添加data-id屬性,用于保存子欄目的上級(jí)欄目ID。添加子欄目的事件函數(shù)中應(yīng)該先獲取到此ID,然后保存到隱藏域的pid字段中。,② 二級(jí)分類欄目添加,任務(wù)三
52、:欄目管理,,,編輯欄目,,——效果展示,任務(wù)三:欄目管理,,,批量保存,,接收表單 調(diào)用addData()函數(shù)添加欄目,調(diào)用saveData()函數(shù)修改欄目 實(shí)現(xiàn)接收表單并處理批量添加 添加欄目的信息保存在了add二維數(shù)組中 利用I()函數(shù)接收數(shù)組后保存到數(shù)據(jù)庫(kù)中即可批量修改 批量修改的實(shí)現(xiàn)方式和批量添加類似 在接收表單時(shí),修改欄目的信息保存在了save數(shù)組中,任務(wù)三:欄目管理,,,修改層級(jí),,添加編輯鏈接 為
53、每個(gè)欄目添加“編輯”超鏈接,鏈接到cp_category_edit.php文件 同時(shí),傳遞參數(shù)ID,表示編輯指定ID的欄目取出指定欄目信息先取出待編輯欄目的信息,然后取出所有頂級(jí)欄目信息保存信息 在admin\cp_category_edit.php中接收表單數(shù)據(jù),將信息保存到數(shù)據(jù)庫(kù)中,任務(wù)三:欄目管理,,,刪除欄目,,添加刪除鏈接在開(kāi)發(fā)刪除功能時(shí),為了防止誤操作,在執(zhí)行操作前進(jìn)行彈框提示執(zhí)行操作判斷待刪除欄目下是否有子
54、級(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í),如果訪問(wèn)了其他用戶惡意構(gòu)造的危險(xiǎn)URL地址,就會(huì)導(dǎo)致后臺(tái)的操作被執(zhí)行,這種安全漏洞稱為CSRF(跨域請(qǐng)求偽造)。,任務(wù)三:欄目管理,,,刪除欄目,,——令牌
55、保護(hù),防御CSRF安全問(wèn)題的一個(gè)有效的措施,是為所有涉及更改數(shù)據(jù)的操作加上令牌保護(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)行比較,判
56、斷是否正確。如果令牌有誤,說(shuō)明用戶當(dāng)前的操作是非法的。,在common\function.php中,自定義token_get()和token_check()函數(shù),任務(wù)三:欄目管理,,,,刪除欄目,,——令牌保護(hù),在admin\init.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)性,在本
57、書(shū)的配套源代碼中已經(jīng)全部加上了令牌驗(yàn)證。,任務(wù)三:欄目管理,,,文章列表,,準(zhǔn)備測(cè)試數(shù)據(jù) 在開(kāi)發(fā)具體功能前,先向數(shù)據(jù)庫(kù)中插入測(cè)試數(shù)據(jù)查詢文章列表 通過(guò)文章表和欄目表的左連接查詢,從數(shù)據(jù)庫(kù)中獲取到文章列表, 在列表中包含了文章所屬欄目的信息展示文章列表 編寫(xiě)代碼輸出文章列表,任務(wù)四:文章管理,,,文章列表,,——效果展示,任務(wù)四:文章管理,,,編輯文章,,添加編輯鏈接當(dāng)單擊“編輯”鏈接時(shí),訪問(wèn)cp_article_e
58、dit.php并傳入?yún)?shù)id查詢指定文章信息 接收文章id,顯示修改頁(yè)面 如果沒(méi)有收到,或id的值為0時(shí),直接顯示空表單,用于發(fā)布新文章顯示文章編輯表單 創(chuàng)建一個(gè)表單顯示文章編輯內(nèi)容輸出欄目列表 下面將欄目輸出到一個(gè)下拉菜單中,任務(wù)四:文章管理,,,編輯文章,,引入在線編輯器 在CKEditor的官方網(wǎng)站可以下載此編輯器 將編輯器放入到項(xiàng)目的admin\js目錄中,并將編輯器目錄命名為“ckeditor”
59、 在文章編輯頁(yè)面admin\view\article_edit.html的底部編寫(xiě)JavaScript代碼,實(shí)現(xiàn)在線編輯器的引入。 修改容器的name屬性值,任務(wù)四:文章管理,,,編輯文章,,——效果展示,任務(wù)四:文章管理,,,,保存文章,,接收表單 接收用戶填寫(xiě)的基本信息 接收由在線編輯器提交的內(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)題
60、,原因是瀏覽器端任何限制都可以被繞過(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)文章修改 在執(zhí)行接收表單后的操作時(shí),如果接收到文章ID,就執(zhí)行文章修改操作。實(shí)現(xiàn)文章添加 在處理表單時(shí),如果沒(méi)有接收到文章ID,就執(zhí)行文章添加操作。,任務(wù)四:文章管理,,,上傳封面圖,,檢查上傳文件 在進(jìn)行添加或修
61、改數(shù)據(jù)之前,先處理上傳文件 在common\function.php中,自定義check_upload()函數(shù),用于判斷上傳文件是否成功,成功時(shí)返回true,失敗時(shí)將錯(cuò)誤信息保存到$error中準(zhǔn)備縮略圖函數(shù) 為圖片生成縮略圖image_thumb 根據(jù)原圖文件創(chuàng)建圖像資源image_create 保存圖像資源image_save,任務(wù)四:文章管理,,,上傳封面圖,,獲取圖片信息 實(shí)現(xiàn)image_thumb()函數(shù)的功能,完
62、成縮略圖的生成實(shí)現(xiàn)圖片等比例縮放 通常會(huì)保持圖片比例,防止圖片被拉伸或者壓扁,影響圖片的美觀生成保存路徑 可以根據(jù)日期為圖片生成子目錄,并為文件自動(dòng)生成文件名,防止文件名沖突調(diào)用縮略圖函數(shù)在調(diào)用時(shí),需要指定原圖路徑、縮略圖寬高、上傳目錄等信息,任務(wù)四:文章管理,,,上傳封面圖,,——效果展示,任務(wù)四:文章管理,,,刪除文章,,添加刪除鏈接 該功能和欄目刪除時(shí)的代碼相同執(zhí)行刪除操作 當(dāng)用戶單擊刪除鏈接后,就會(huì)向PHP
63、腳本發(fā)送待刪除的文章ID參數(shù) 在實(shí)際進(jìn)行文章記錄刪除操作之前,需要先判斷文章是否有封面圖。 如果封面圖存在,就先刪除圖片文件,再刪除文章記錄,任務(wù)四:文章管理,,,列表功能區(qū),,準(zhǔn)備排序條件 在admin\cp_article.php文章列表程序中編寫(xiě)代碼,獲取列表相關(guān)的GET參數(shù),并定義排序的方式以及對(duì)應(yīng)的SQL語(yǔ)句顯示列表功能區(qū) 欄目篩選和列表排序功能是兩個(gè)下拉菜單 列表搜索功能是一個(gè)文本框 三個(gè)功能各放在
64、三個(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ǔ)句進(jìn)行查詢。在文章列表功能admin\cp_article.php中繼續(xù)編寫(xiě)代碼,在接收變量后組合SQL語(yǔ)句。,,//拼接排
65、序條件$sql_order = ' ORDER BY '$sql_order .= isset($order_arr[$order]) ? $order_arr[$order]['sql'] : 'a.`id` DESC';//拼接WHERE條件$sql_where = ' WHERE 1=1 ';$sql_where .= $cid ? ' AND a.
66、`cid` IN ('.module_category_sub($cid).')' : '';$sql_where .= ' AND a.`title` LIKE ? ';$sql_search = '%'.db_escape_like($search).'%';,任務(wù)五:排序與搜索,,,組合SQL語(yǔ)句,,——根據(jù)欄目ID取出所有子欄目ID,下面
67、在common\module.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]) : []; a
68、rray_unshift($sub, $id); //將$id放入數(shù)組開(kāi)頭 return implode(',', $sub);},任務(wù)五:排序與搜索,,,組合SQL語(yǔ)句,,——轉(zhuǎn)義LIKE搜索字符串,接下來(lái)在common\db.php文件中編寫(xiě)db_escape_like()函數(shù),用于實(shí)現(xiàn)轉(zhuǎn)義LIKE搜索字符串中的所有特殊字符。,,function db_escape_like($like){
69、 return strtr($like, ['%'=>'\%', '_'=>'\_', '\\'=>'\\\\']); },在單引號(hào)字符串中書(shū)寫(xiě)“\”字符時(shí),如果一個(gè)“\”后面跟一個(gè)單引號(hào),單引號(hào)將會(huì)被轉(zhuǎn)義成字符串中的字符,而非字符串定界符,因此需要在“\”前面加一個(gè)“\”進(jìn)行轉(zhuǎn)義(字符串中實(shí)際只保存了一個(gè)“\”字符)。
70、,任務(wù)五:排序與搜索,,,組合SQL語(yǔ)句,,——修改文章列表查詢SQL,在完成對(duì)ORDER和WHERE的組合后,接下來(lái)繼續(xù)編寫(xiě)admin\cp_article.php,修改查詢文章列表數(shù)據(jù)的代碼,將篩選和排序條件加入到SQL語(yǔ)句中。,,$data = db_fetch(DB_ALL, 'SELECT a.`id`, a.`cid`, a.`title`, a.`author`,a.`show`, a.`time`, c.`n
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- cms內(nèi)容管理系統(tǒng)
- 榕基內(nèi)容管理系統(tǒng)
- 基于java的網(wǎng)站內(nèi)容管理系統(tǒng)-用戶管理、內(nèi)容管理、欄目管理模塊
- 廣州銀行影像內(nèi)容管理平臺(tái)項(xiàng)目
- 廣州銀行影像內(nèi)容管理平臺(tái)項(xiàng)目
- 網(wǎng)站內(nèi)容管理系統(tǒng)(cms)
- 網(wǎng)站內(nèi)容管理系統(tǒng) .doc
- php網(wǎng)站內(nèi)容管理系統(tǒng)
- 通用網(wǎng)站內(nèi)容管理系統(tǒng)
- cms網(wǎng)站內(nèi)容管理系統(tǒng)
- 人才網(wǎng)內(nèi)容管理系統(tǒng)
- 網(wǎng)站內(nèi)容管理系統(tǒng).doc
- 基于java的網(wǎng)站內(nèi)容管理系統(tǒng)-用戶管理、內(nèi)容管理、欄目管理模塊.doc
- 廣州銀行影像內(nèi)容管理平臺(tái)項(xiàng)目
- 通用網(wǎng)站內(nèi)容管理系統(tǒng)
- 基于二階建模的內(nèi)容管理系統(tǒng)研究
- 人才網(wǎng)內(nèi)容管理系統(tǒng).doc
- 人才網(wǎng)內(nèi)容管理系統(tǒng).doc
- 網(wǎng)站內(nèi)容管理系統(tǒng)技術(shù)方案
- 人才網(wǎng)內(nèi)容管理系統(tǒng).doc
評(píng)論
0/150
提交評(píng)論