PHP網(wǎng)站開發(fā)實(shí)例教程(第3版) 課件 第9-11章 PDO擴(kuò)展和Smarty模板引擎、項(xiàng)目實(shí)戰(zhàn)-內(nèi)容管理系統(tǒng)、Laravel框架_第1頁
PHP網(wǎng)站開發(fā)實(shí)例教程(第3版) 課件 第9-11章 PDO擴(kuò)展和Smarty模板引擎、項(xiàng)目實(shí)戰(zhàn)-內(nèi)容管理系統(tǒng)、Laravel框架_第2頁
PHP網(wǎng)站開發(fā)實(shí)例教程(第3版) 課件 第9-11章 PDO擴(kuò)展和Smarty模板引擎、項(xiàng)目實(shí)戰(zhàn)-內(nèi)容管理系統(tǒng)、Laravel框架_第3頁
PHP網(wǎng)站開發(fā)實(shí)例教程(第3版) 課件 第9-11章 PDO擴(kuò)展和Smarty模板引擎、項(xiàng)目實(shí)戰(zhàn)-內(nèi)容管理系統(tǒng)、Laravel框架_第4頁
PHP網(wǎng)站開發(fā)實(shí)例教程(第3版) 課件 第9-11章 PDO擴(kuò)展和Smarty模板引擎、項(xiàng)目實(shí)戰(zhàn)-內(nèi)容管理系統(tǒng)、Laravel框架_第5頁
已閱讀5頁,還剩204頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章PDO擴(kuò)展和Smarty模板引擎《PHP網(wǎng)站開發(fā)實(shí)例教程(第3版)》學(xué)習(xí)目標(biāo)/Target

掌握PDO擴(kuò)展的使用方法,能夠使用PDO擴(kuò)展操作數(shù)據(jù)庫。

掌握數(shù)據(jù)庫操作類的封裝,能夠在自定義框架中封裝數(shù)據(jù)庫操作類。

掌握Smarty模板引擎的使用方法,能夠在自定義框架中使用Smarty模板引擎。章節(jié)概述/Summary在第7章和第8章中,我們已經(jīng)創(chuàng)建好了自定義框架并且完成了框架的基本功能。為了能夠在框架中操作數(shù)據(jù)庫和渲染數(shù)據(jù),本章將介紹PDO擴(kuò)展和Smarty模板引擎,在自定義框架中封裝數(shù)據(jù)庫操作類和使用Smarty模板引擎。目錄/Contents9.19.29.3PDO擴(kuò)展在自定義框架中封裝數(shù)據(jù)庫操作類Smarty模板引擎PDO擴(kuò)展9.1

先定一個(gè)小目標(biāo)!了解開啟PDO擴(kuò)展的方法,能夠開啟PDO擴(kuò)展。9.1.1開啟PDO擴(kuò)展PDO擴(kuò)展為PHP操作數(shù)據(jù)庫定義了一個(gè)輕量級(jí)的接口,從而可以用一套相同的接口操作不同的數(shù)據(jù)庫。目前支持的數(shù)據(jù)庫包括Firebird、FreeTDS、MySQL、MicrosoftSQLServer、Oracle、PostgreSQL、SQLite、Sybase等。9.1.1開啟PDO擴(kuò)展PDO支持的每個(gè)數(shù)據(jù)庫都對(duì)應(yīng)不同的擴(kuò)展文件。如果想讓PDO支持MySQL數(shù)據(jù)庫,需要修改如下配置:extension=pdo_mysql9.1.1開啟PDO擴(kuò)展

先定一個(gè)小目標(biāo)!掌握連接和選擇數(shù)據(jù)庫的方法,能夠使用PDO類連接和選擇數(shù)據(jù)庫。9.1.2連接和選擇數(shù)據(jù)庫PDO擴(kuò)展提供了PDO類,能夠用于連接和操作數(shù)據(jù)庫。使用PDO類操作數(shù)據(jù)庫前,需要先實(shí)例化PDO類,傳遞連接數(shù)據(jù)庫的參數(shù):語法格式PDO::__construct(

string$dsn, //數(shù)據(jù)源名稱 string$username,//用戶名(可選參數(shù))string$password,//密碼(可選參數(shù)) array$driver_options //包含鍵值的驅(qū)動(dòng)連接選項(xiàng)(可選參數(shù)))9.1.2連接和選擇數(shù)據(jù)庫$dsn由PDO驅(qū)動(dòng)程序名稱、冒號(hào)和PDO驅(qū)動(dòng)程序特有的連接語法組成。例如,連接MySQL數(shù)據(jù)庫時(shí),PDO驅(qū)動(dòng)程序名稱為mysql,它特有的連接語法包括主機(jī)名、端口號(hào)、數(shù)據(jù)庫名稱、字符集等;連接Oracle數(shù)據(jù)庫時(shí),PDO驅(qū)動(dòng)程序名稱為oci,它特有的連接語法只包括數(shù)據(jù)庫名稱和字符集。MySQL數(shù)據(jù)庫和Oracle數(shù)據(jù)庫的$dsn如下:$mysqldsn='mysql:host=主機(jī)名;port=端口號(hào);dbname=數(shù)據(jù)庫名稱;charset=字符集';$oracledsn='oci:dbname=數(shù)據(jù)庫名稱;charset=字符集';9.1.2連接和選擇數(shù)據(jù)庫創(chuàng)建pdo01.php文件,使用PDO連接MySQL服務(wù)器并選擇myframe數(shù)據(jù)庫:<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');var_dump($pdo);//輸出結(jié)果:object(PDO)#1(0){}9.1.2連接和選擇數(shù)據(jù)庫

先定一個(gè)小目標(biāo)!掌握?qǐng)?zhí)行SQL語句的方法,能夠使用query()方法和exec()方法執(zhí)行SQL語句。9.1.3執(zhí)行SQL語句PDO類對(duì)象的query()方法和exec()方法用于執(zhí)行SQL語句。這兩個(gè)方法的區(qū)別:query()方法返回的是PDOStatement類對(duì)象,該對(duì)象主要用于解析結(jié)果集、實(shí)現(xiàn)預(yù)處理和事務(wù)處理等;exec()方法返回的是受影響行數(shù),使用exec()方法執(zhí)行SELECT語句時(shí)不會(huì)返回查詢結(jié)果。通常使用query()方法執(zhí)行查詢類的SQL語句;使用exec()方法執(zhí)行操作類的SQL語句。執(zhí)行SQL語句后,使用lastInsertId()方法獲取最后插入行的id值。9.1.3執(zhí)行SQL語句修改pdo01.php文件,使用query()方法和exec()方法執(zhí)行SQL語句:<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$sql='SELECT*FROM`student`';var_dump($pdo->query($sql));//輸出結(jié)果:object(PDOStatement)#2(1){["queryString"]=>string(23)"SELECT*FROM`student`"}$sql="INSERTINTO`student`(`name`)VALUES('Leon')";var_dump($pdo->exec($sql)); //輸出結(jié)果:int(1)var_dump($pdo->lastInsertId()); //輸出結(jié)果:string(1)"5"9.1.3執(zhí)行SQL語句

先定一個(gè)小目標(biāo)!掌握處理結(jié)果集的方法,能夠使用不同方法處理結(jié)果集。9.1.4處理結(jié)果集使用query()方法執(zhí)行SQL語句后,返回的結(jié)果是PDOStatement類對(duì)象。通過PDOStatement類對(duì)象可以對(duì)結(jié)果集進(jìn)行處理,常用的處理結(jié)果集的方法有fetch()、fetchColumn()和fetchAll()。下面對(duì)這3個(gè)方法分別進(jìn)行講解。9.1.4處理結(jié)果集1.fetch()fetch()方法用于從結(jié)果集中獲取下一行數(shù)據(jù)。9.1.4處理結(jié)果集語法格式PDOStatement::fetch(int$mode=PDO::FETCH_DEFAULT, //返回方式(可選參數(shù))int$cursorOrientation=PDO::FETCH_ORI_NEXT,//可滾動(dòng)游標(biāo)(可選參數(shù))int$cursorOffset=0

//游標(biāo)的偏移量(可選參數(shù)))$mode的值必須是PDO::FETCH_*系列常量中的一個(gè),$mode的可選值:9.1.4處理結(jié)果集可選值說明返回值PDO::FETCH_ASSOC以關(guān)聯(lián)數(shù)組的方式提取結(jié)果集中的數(shù)據(jù)每一行的數(shù)據(jù)將被返回為一個(gè)關(guān)聯(lián)數(shù)組,其中鍵是列名,值是對(duì)應(yīng)的數(shù)據(jù)值PDO::FETCH_NUM以索引數(shù)組的方式提取結(jié)果集中的數(shù)據(jù)每一行的數(shù)據(jù)將被返回為一個(gè)索引數(shù)組,其中索引從0開始,值為對(duì)應(yīng)的數(shù)據(jù)值PDO::FETCH_BOTH同時(shí)以關(guān)聯(lián)數(shù)組和索引數(shù)組的方式提取結(jié)果集中的數(shù)據(jù)每一行的數(shù)據(jù)將被返回為一個(gè)混合數(shù)組,其中既包含字符串鍵名也包含數(shù)字鍵名,即每個(gè)列名對(duì)應(yīng)兩個(gè)鍵名PDO::FETCH_OBJ以匿名對(duì)象的方式提取結(jié)果集中的數(shù)據(jù)每一行的數(shù)據(jù)將被返回為一個(gè)匿名對(duì)象,其中屬性名對(duì)應(yīng)列名,屬性值對(duì)應(yīng)數(shù)據(jù)值1/2$mode的值必須是PDO::FETCH_*系列常量中的一個(gè),$mode的可選值:9.1.4處理結(jié)果集可選值說明返回值PDO::FETCH_LAZY以延遲加載的方式提取結(jié)果集中的數(shù)據(jù),只有在訪問數(shù)據(jù)時(shí)才會(huì)從數(shù)據(jù)庫中取出在訪問數(shù)據(jù)時(shí),會(huì)返回一個(gè)包含該行數(shù)據(jù)的對(duì)象,對(duì)象的屬性名對(duì)應(yīng)列名,屬性值對(duì)應(yīng)數(shù)據(jù)值PDO::FETCH_BOUND將結(jié)果集中的列值分配給PDOStatement::bindColumn()方法綁定的變量返回true,并分配結(jié)果集中的列值給PDOStatement::bindColumn()方法綁定的PHP變量PDO::FETCH_CLASS將結(jié)果集中的數(shù)據(jù)映射為指定請(qǐng)求類的實(shí)例返回一個(gè)請(qǐng)求類的實(shí)例,其中的屬性會(huì)被賦值為結(jié)果集中對(duì)應(yīng)的列值PDO::FETCH_INTO將結(jié)果集中的數(shù)據(jù)映射為指定被請(qǐng)求類的實(shí)例返回一個(gè)被請(qǐng)求類已存在的實(shí)例,其中命名的屬性會(huì)被賦值為結(jié)果集中對(duì)應(yīng)的列2/2創(chuàng)建pdo02.php文件,使用fetch()方法獲取查詢的數(shù)據(jù)的代碼及運(yùn)行結(jié)果:<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$sql='SELECT`id`,`name`FROM`student`LIMIT2';$res=$pdo->query($sql);while($row=$res->fetch(PDO::FETCH_ASSOC)){echo$row['id'].'-'.$row['name'].'<br>';}9.1.4處理結(jié)果集2.fetchColumn()fetchColumn()方法用于獲取結(jié)果集中的單獨(dú)一列,該方法執(zhí)行成功返回獲取的數(shù)據(jù),執(zhí)行失敗返回false。9.1.4處理結(jié)果集語法格式stringPDOStatement::fetchColumn(int$column=0)修改pdo02.php文件,使用fetchColumn()方法獲取結(jié)果集中的第2列數(shù)據(jù):while($column=$res->fetchColumn(1)){echo''.$column; //輸出結(jié)果:AllenJames}9.1.4處理結(jié)果集3.fetchAll()fetchAll()方法用于獲取結(jié)果集中所有的行數(shù)據(jù)。9.1.4處理結(jié)果集語法格式arrayPDOStatement::fetchAll(int$mode, //返回方式(可選參數(shù))mixed$fetch_argument, //可滾動(dòng)游標(biāo)(可選參數(shù))array$ctor_args=array() //PDO::FETCH_CLASS的參數(shù)(可選參數(shù)))$fetch_argument根據(jù)$mode參數(shù)值的變化而有不同意義,$mode的可選值:9.1.4處理結(jié)果集可選值作用返回值PDO::FETCH_COLUMN提取結(jié)果集中的單個(gè)列的值返回指定索引位置的列值,索引從0開始計(jì)數(shù)PDO::FETCH_CLASS將結(jié)果集中的數(shù)據(jù)映射為指定類的對(duì)象返回一個(gè)指定類的對(duì)象,其中的屬性會(huì)被賦值為結(jié)果集中對(duì)應(yīng)的列值PDO::FETCH_FUNC使用自定義的回調(diào)函數(shù)處理結(jié)果集中的每一行數(shù)據(jù)返回回調(diào)函數(shù)處理后的結(jié)果修改pdo02.php,使用fetchAll()方法以關(guān)聯(lián)數(shù)組形式獲取結(jié)果集:$data=$res->fetchAll(PDO::FETCH_ASSOC);print_r($data);9.1.4處理結(jié)果集輸出結(jié)果:Array([0]=>Array([id]=>1[name]=>Allen)[1]=>Array([id]=>2[name]=>James))多學(xué)一招:將變量綁定到結(jié)果集中的某一列將變量綁定到結(jié)果集中的某一列fetch()方法的參數(shù)設(shè)置為PDO::FETCH_BOUND時(shí),執(zhí)行成功后會(huì)分配結(jié)果集中的列值給bindColumn()方法綁定的變量。將變量綁定到結(jié)果集中的某一列的示例代碼:$res->bindColumn('id',$id);

//將變量$id綁定到結(jié)果集$res的id列$res->bindColumn('name',$name); //將變量$name綁定到結(jié)果集$res的name列while($res->fetch(PDO::FETCH_BOUND)){ //獲取綁定到變量中的數(shù)據(jù)

echo$id.'-'.$name.'<br>';}

先定一個(gè)小目標(biāo)!掌握預(yù)處理機(jī)制的使用,能夠使用指定方法創(chuàng)建預(yù)處理SQL語句和綁定數(shù)據(jù)。9.1.5預(yù)處理機(jī)制在PHP程序中編寫SQL語句時(shí),如果將發(fā)送的數(shù)據(jù)和SQL語句寫在一起,每條SQL語句都需要解析器進(jìn)行分析、編譯和優(yōu)化,效率低。預(yù)處理機(jī)制是先定義和發(fā)送模板形式的SQL語句,用占位符替代實(shí)際數(shù)據(jù),稱為預(yù)處理SQL語句,解析器會(huì)預(yù)先編譯預(yù)處理SQL語句,再處理相關(guān)數(shù)據(jù)。使用預(yù)處理機(jī)制可以避免數(shù)據(jù)中有特殊字符(如單引號(hào))而導(dǎo)致的語法問題出現(xiàn),提高程序運(yùn)行效率。下面講解預(yù)處理機(jī)制中的預(yù)處理方法和數(shù)據(jù)綁定。9.1.5預(yù)處理機(jī)制1.預(yù)處理方法通過PDO中的預(yù)處理方法prepare()和execute()可以實(shí)現(xiàn)預(yù)處理機(jī)制。prepare()方法用于準(zhǔn)備預(yù)處理SQL語句,execute()方法用以執(zhí)行預(yù)處理語句。prepare()方法語法格式PDOStatementPDO::prepare(string$query,array$options=array())9.1.5預(yù)處理機(jī)制execute()方法語法格式PDOStatement::execute($input_parameters)$query是預(yù)處理SQL語句,該語句中動(dòng)態(tài)變化的量用占位符代替,占位符使用問號(hào)占位符“?”和參數(shù)占位符“:參數(shù)名稱”;

$options是可選參數(shù),設(shè)置一個(gè)或多個(gè)PDOStatement對(duì)象的屬性值$input_parameters是可選參數(shù),表示為預(yù)處理SQL語句中的占位符綁定數(shù)據(jù),如果預(yù)處理SQL語句不包含占位符,可省略此參數(shù)。演示如何使用預(yù)處理方法:9.1.5預(yù)處理機(jī)制<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$sql='SELECT*FROM`student`';$stmt=$pdo->prepare($sql);var_dump($stmt->execute()); //輸出結(jié)果:bool(true)2.數(shù)據(jù)綁定預(yù)處理SQL語句中有占位符時(shí),使用execute()方法、bindParam()方法和bindValue()方法為占位符綁定數(shù)據(jù)。bindParam()方法和bindValue()方法的區(qū)別:bindParam()方法將占位符綁定到指定的變量名上,使用execute()方法執(zhí)行預(yù)處理SQL語句時(shí),只需要修改變量名的值。bindValue()方法將值綁定到占位符上,使用execute()方法執(zhí)行預(yù)處理SQL語句時(shí),每修改一次值,都需要重復(fù)執(zhí)行一次bindValue()方法和execute()方法。9.1.5預(yù)處理機(jī)制(1)execute()方法execute()方法的參數(shù)$input_parameters是一個(gè)數(shù)組,該數(shù)組的元素個(gè)數(shù)必須與預(yù)處理SQL語句中的占位符數(shù)量相同。當(dāng)占位符是問號(hào)占位符時(shí),$input_parameters必須是一個(gè)索引數(shù)組;當(dāng)占位符是參數(shù)占位符時(shí),$input_parameters必須是一個(gè)關(guān)聯(lián)數(shù)組。使用execute()方法為問號(hào)占位符綁定數(shù)據(jù):<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$sql='INSERTINTO`student`(`name`,`mobile`)VALUES(?,?)';$stmt=$pdo->prepare($sql);$stmt->execute(['Charles','1111']);$stmt->execute(['Andy','2222']);$stmt->execute(['Bruce','3333']);9.1.5預(yù)處理機(jī)制使用execute()方法為參數(shù)占位符綁定數(shù)據(jù):$sql='INSERTINTO`student`(`name`,`mobile`)VALUES'.'(:name,:mobile)';$stmt=$pdo->prepare($sql);$stmt->execute([':name'=>'Charles',':mobile'=>'1111']);$stmt->execute([':name'=>'Andy',':mobile'=>'2222']);$stmt->execute(['name'=>'Bruce','mobile'=>'3333']);9.1.5預(yù)處理機(jī)制為參數(shù)占位符綁定數(shù)據(jù)可以使用“:參數(shù)名”或“參數(shù)名”的形式(2)bindParam()方法使用bindParam()方法為問號(hào)占位符綁定數(shù)據(jù)時(shí),bindParam()方法的第1個(gè)參數(shù)是一個(gè)以1開始的數(shù)字,表示對(duì)應(yīng)預(yù)處理中的第幾個(gè)問號(hào)占位符,使用bindParam()方法為參數(shù)占位符綁定數(shù)據(jù)時(shí),bindParam()方法的第1個(gè)參數(shù)是“:參數(shù)名”或“參數(shù)名”的形式。使用bindParam()方法為問號(hào)占位符和參數(shù)占位符綁定數(shù)據(jù)://綁定問號(hào)占位符$stmt->bindParam(1,$name);$stmt->bindParam(2,$entry_date);//綁定參數(shù)占位符$stmt->bindParam(':參數(shù)名',$name);$stmt->bindParam('參數(shù)名',$entry_date);//省略“:”9.1.5預(yù)處理機(jī)制將占位符綁定指定的變量后,即可進(jìn)行變量的賦值和預(yù)處理SQL語句的執(zhí)行:list($name,$entry_date)=['Charles','2019-1-1'];$stmt->execute();list($name,$entry_date)=['Andy','2019-1-1'];$stmt->execute();9.1.5預(yù)處理機(jī)制(3)bindValue()方法bindValue()方法和bindParam()方法的第1個(gè)參數(shù)的使用方法相同,bindValue()方法的第2個(gè)參數(shù)用于傳入一個(gè)值,它無須進(jìn)行變量的綁定,使用較為方便。使用bindValue()方法為問號(hào)占位符和參數(shù)占位符綁定數(shù)據(jù)://綁定問號(hào)占位符$stmt->bindValue(1,'Charles');$stmt->bindValue(2,'2019-1-1');$stmt->execute();//綁定參數(shù)占位符$stmt->bindValue(':參數(shù)名','Charles');$stmt->bindValue('參數(shù)名','2019-1-1');//省略“:”$stmt->execute();9.1.5預(yù)處理機(jī)制

先定一個(gè)小目標(biāo)!掌握PDO錯(cuò)誤處理,能夠使用不同的錯(cuò)誤處理模式進(jìn)行錯(cuò)誤處理。9.1.6PDO錯(cuò)誤處理在使用SQL語句操作數(shù)據(jù)庫時(shí),難免會(huì)出現(xiàn)各種各樣的錯(cuò)誤,如語法錯(cuò)誤、邏輯錯(cuò)誤等。為了避免SQL語句出現(xiàn)這些錯(cuò)誤,我們既可以利用前面學(xué)習(xí)過的異常處理方式手動(dòng)捕獲PDOException類異常,也可以使用PDO提供的錯(cuò)誤處理模式進(jìn)行錯(cuò)誤處理。9.1.6PDO錯(cuò)誤處理PDO提供了3種錯(cuò)誤處理模式:①PDO::ERRMODE_SILENT:此模式表示在發(fā)生錯(cuò)誤時(shí)不進(jìn)行任何操作,只簡(jiǎn)單地設(shè)置錯(cuò)誤代碼。通過PDO類的errorCode()方法和errorInfo()方法獲取最后一次操作的錯(cuò)誤碼和錯(cuò)誤信息。②PDO::ERRMODE_WARNING:此模式表示在發(fā)生錯(cuò)誤時(shí),將錯(cuò)誤作為警告拋出,不中斷程序的運(yùn)行。③PDO::ERRMODE_EXCEPTION:此模式是默認(rèn)的錯(cuò)誤處理模式,它表示在錯(cuò)誤發(fā)生時(shí)拋出相關(guān)異常。此模式在項(xiàng)目調(diào)試當(dāng)中較為實(shí)用,可以快速地找到存在問題的代碼。9.1.6PDO錯(cuò)誤處理setAttribute()方法用于設(shè)置PDO的屬性,在程序中使用該方法設(shè)置錯(cuò)誤處理模式。語法格式PDO::setAttribute(PDO::ATTR_ERRMODE,$value);PDO::ATTR_ERRMODE表示設(shè)置錯(cuò)誤處理模式,$value表示設(shè)為哪種錯(cuò)誤處理模式,如PDO::ERRMODE_WARNING。9.1.6PDO錯(cuò)誤處理演示如何設(shè)置WARNING錯(cuò)誤處理模式:<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');//設(shè)置錯(cuò)誤模式$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//預(yù)處理SQL語句$stmt=$pdo->prepare('SELECT*FROM`test`');//執(zhí)行預(yù)處理SQL語句,若execute()方法返回false表示執(zhí)行失敗if(false===$stmt->execute()){echo'錯(cuò)誤碼:'.$stmt->errorCode().'<br>'; //輸出錯(cuò)誤碼

print_r($stmt->errorInfo()); //輸出錯(cuò)誤信息}9.1.6PDO錯(cuò)誤處理上述代碼運(yùn)行結(jié)果:9.1.6PDO錯(cuò)誤處理多學(xué)一招:PDO屬性的獲取PDO屬性的獲取使用PDO類提供的getAttribute()方法可以獲取PDO連接的特定屬性的值,用于查詢和檢索與數(shù)據(jù)庫連接相關(guān)的各種屬性。getAttribute()方法的語法格式:PDO::getAttribute($attribute);$attribute用于指定要獲取的屬性的常量值多學(xué)一招:PDO屬性的獲取PDO屬性的獲取getAttribute()方法中的常量值是PDO::ATTR_*系列常量中的一個(gè),$attribute的可選值如下:PDO::ATTR_AUTOCOMMIT:連接的自動(dòng)提交模式。PDO::ATTR_CASE:列名在結(jié)果集中的大小寫方式。PDO::ATTR_CLIENT_VERSION:客戶端庫版本。PDO::ATTR_CONNECTION_STATUS:連接狀態(tài)。PDO::ATTR_DRIVER_NAME:驅(qū)動(dòng)程序名稱。PDO::ATTR_SERVER_INFO:服務(wù)器信息。PDO::ATTR_SERVER_VERSION:數(shù)據(jù)庫服務(wù)器版本。多學(xué)一招:PDO屬性的獲取PDO屬性的獲取演示使用getAttribute()方法獲取PDO連接的特定屬性的值:$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$driver_name=$pdo->getAttribute(PDO::ATTR_DRIVER_NAME);echo'驅(qū)動(dòng)程序名稱是'.$driver_name; //輸出結(jié)果:驅(qū)動(dòng)程序名稱是mysql$server_version=$pdo->getAttribute(PDO::ATTR_SERVER_VERSION);echo'服務(wù)器的版本是'.$server_version; //輸出結(jié)果:服務(wù)器的版本是8.0.32

先定一個(gè)小目標(biāo)!掌握PDO事務(wù)處理,能夠使用PDO類的事務(wù)處理的相關(guān)方法實(shí)現(xiàn)事務(wù)。9.1.7PDO事務(wù)處理PDO類提供了事務(wù)處理的相關(guān)方法:9.1.7PDO事務(wù)處理方法名說明PDO::beginTransaction()啟動(dòng)事務(wù)PDO::commit()提交事務(wù)PDO::inTransaction()檢查是否在事務(wù)內(nèi)PDO::rollBack()回滾事務(wù)演示如何進(jìn)行事務(wù)處理:9.1.7PDO事務(wù)處理<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$pdo->beginTransaction(); //開啟事務(wù)try{$stmt=$pdo->prepare('INSERTINTO`student`(`name`)VALUES(?)');

//執(zhí)行插入操作

$stmt->execute(['小明']);$pdo->commit(); //提交事務(wù)}catch(PDOException$e){

$pdo->rollBack(); //回滾事務(wù)echo'執(zhí)行失?。?.$e->getMessage();}在自定義框架中封裝數(shù)據(jù)庫操作類9.2

先定一個(gè)小目標(biāo)!掌握封裝DB類的方法,能夠在自定義框架中封裝DB類。9.2.1【案例】封裝DB類在自定義框架中,DB類負(fù)責(zé)數(shù)據(jù)庫操作,主要包括連接數(shù)據(jù)庫、執(zhí)行SQL語句、處理結(jié)果集等。SQL語句分為查詢類和執(zhí)行類。查詢類是指SELECT語句這種有結(jié)果集的操作,執(zhí)行類是指INSERT語句、UPDATE語句、DELETE語句等沒有結(jié)果集的操作。本案例需要在DB類中封裝實(shí)現(xiàn)查詢類的操作和執(zhí)行類的操作。

案例需求9.2.1【案例】封裝DB類①在C:\web\www\myframe\myframe目錄下創(chuàng)建DB.php文件,創(chuàng)建DB類,在DB類中創(chuàng)建getInstance()和init()兩個(gè)靜態(tài)方法,getInstance()方法用于連接數(shù)據(jù)庫,init()方法用于傳入連接配置。②在config目錄下創(chuàng)建database.php文件,保存數(shù)據(jù)庫連接配置,在框架中加載配置。③在DB類中封裝查詢類操作,創(chuàng)建fetchRow()和fetchAll()方法,實(shí)現(xiàn)查詢一條數(shù)據(jù)和查詢多條數(shù)據(jù)。④在DB類中封裝執(zhí)行類操作,創(chuàng)建execute()方法實(shí)現(xiàn)執(zhí)行類操作,創(chuàng)建lastInsertId()方法獲取自動(dòng)增長(zhǎng)字段最后插入的id值。

實(shí)現(xiàn)思路9.2.1【案例】封裝DB類

先定一個(gè)小目標(biāo)!掌握封裝Model類的方法,能夠在自定義框架中封裝Model類。9.2.2【案例】封裝Model類在自定義框架中,Model類負(fù)責(zé)對(duì)數(shù)據(jù)表進(jìn)行增、刪、改、查等操作,每個(gè)Model類對(duì)應(yīng)一張數(shù)據(jù)表。Model類使用數(shù)據(jù)表名稱來命名,在Model類中根據(jù)類名自動(dòng)識(shí)別表名,能夠根據(jù)條件查詢數(shù)據(jù),對(duì)數(shù)據(jù)排序和限量。

案例需求9.2.2【案例】封裝Model類①在myframe目錄下創(chuàng)建Model.php文件,實(shí)現(xiàn)初始化表名功能。②創(chuàng)建查詢數(shù)據(jù)方法,用于執(zhí)行SELECT語句,具體方法說明如下。get()方法:查詢多條記錄,其參數(shù)為字段數(shù)組,如果省略參數(shù)表示所有字段。first()方法:查詢一條記錄,其參數(shù)為字段數(shù)組,如果省略參數(shù)表示所有字段。value()方法:查詢單個(gè)字段,其參數(shù)為字段名。③創(chuàng)建where()方法和orWhere()方法,實(shí)現(xiàn)條件查詢。

實(shí)現(xiàn)思路9.2.2【案例】封裝Model類④創(chuàng)建orderBy()方法和limit()方法,分別實(shí)現(xiàn)排序和限量。⑤創(chuàng)建insert()方法和insertGetId()方法實(shí)現(xiàn)新增數(shù)據(jù),insert()方法返回的結(jié)果是新增的記錄數(shù),insertGetId()方法返回的結(jié)果是最后插入的id值。⑥創(chuàng)建update()方法實(shí)現(xiàn)修改數(shù)據(jù),返回的結(jié)果是受影響的行數(shù)。⑦創(chuàng)建delete()方法實(shí)現(xiàn)刪除數(shù)據(jù),返回的結(jié)果是被刪除的數(shù)據(jù)條數(shù)。

實(shí)現(xiàn)思路9.2.2【案例】封裝Model類Smarty模板引擎9.3

先定一個(gè)小目標(biāo)!掌握Smarty的安裝,能夠獨(dú)立安裝Smarty。9.3.1安裝SmartySmarty是使用PHP語言開發(fā)的模板引擎,具有響應(yīng)速度快、語句自由、支持插件擴(kuò)展等特點(diǎn)。Smarty實(shí)現(xiàn)了PHP代碼與HTML代碼的分離,使PHP開發(fā)人員專注于數(shù)據(jù)的處理及功能模塊的實(shí)現(xiàn),網(wǎng)頁設(shè)計(jì)人員專注于網(wǎng)頁的設(shè)計(jì)與排版工作。9.3.1安裝Smarty使用Composer可以安裝Smarty模板引擎。在命令提示符窗口中,切換到C:\web\www\myframe目錄,執(zhí)行安裝Smarty模板引擎的命令:composerrequiresmarty/smarty=~4.39.3.1安裝Smarty執(zhí)行安裝命令后,打開composer.json,會(huì)看到該文件自動(dòng)添加了Smarty的相關(guān)配置:"require":{"smarty/smarty":"^4.3"}安裝Smarty后,打開vendor目錄,會(huì)看到里面新增了smarty目錄,Smarty的核心文件在vendor\smarty\smarty\libs目錄下,該目錄中的文件和目錄介紹如下:9.3.1安裝Smarty名稱說明Autoloader.phpSmarty中實(shí)現(xiàn)自動(dòng)載入文件功能的類bootstrap.php實(shí)現(xiàn)自動(dòng)加載Smartydebug.tplSmarty中的提示信息模板文件functions.php輔助函數(shù)文件Smarty.class.phpSmarty核心類文件,提供相關(guān)方法用于實(shí)現(xiàn)Smarty模板引擎的功能plugins自定義插件目錄,存放各類自定義插件的目錄sysplugins存放系統(tǒng)文件目錄

先定一個(gè)小目標(biāo)!掌握Smarty的基本使用,能夠使用Smarty的語法在模板展示數(shù)據(jù)。9.3.2Smarty的基本使用Smarty的常用語法:語法說明if指令條件判斷foreach指令循環(huán)展示數(shù)據(jù)include指令引用其他模板文件9.3.2Smarty的基本使用Smarty的常用方法:方法說明assign()向模板頁面分配變量display()展示模板fetch()將模板轉(zhuǎn)化為字符串block()定義一個(gè)區(qū)域塊演示使用Smarty查詢student數(shù)據(jù)表的數(shù)據(jù),smarty.php文件的示例代碼如下:<?phprequire_once('C:/web/www/myframe/vendor/smarty/smarty/libs/Smarty.class.php');$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');$res=$pdo->query('SELECT*FROM`student`');$data=[];while($row=$res->fetch(PDO::FETCH_ASSOC)){$data[]=['id'=>$row['id'],'name'=>$row['name']];}$smarty=newSmarty();$smarty->assign('data',$data);$smarty->display('student.html');9.3.2Smarty的基本使用student.html文件的示例代碼如下:<body><tableborder="1"><tr><th>id</th><th>name</th></tr>

{foreach$dataas$v}<tr><td>{$v.id}</td><td>{$}</td></tr>

{/foreach}</table></body>9.3.2Smarty的基本使用

先定一個(gè)小目標(biāo)!掌握Smarty的基本使用,能夠在自定義框架中使用Smarty。9.3.3【案例】在自定義框架中使用Smarty在自定義框架中使用Smarty時(shí),需要配置模板文件目錄和編譯文件目錄。其中,模板文件是指使用Smarty語法編寫的HTML模板文件,編譯文件是指Smarty模板引擎將模板文件編譯成的PHP腳本文件。為了使所有的控制器都能使用Smarty,需要?jiǎng)?chuàng)建基礎(chǔ)控制器類,將Smarty的初始化代碼寫在基礎(chǔ)控制器的構(gòu)造方法中,其他控制器繼承這個(gè)基礎(chǔ)控制器類。

案例需求9.3.3【案例】在自定義框架中使用Smarty①在C:\web\www\myframe\myframe目錄下創(chuàng)建Controller.php文件,用于實(shí)現(xiàn)基礎(chǔ)控制器類,在基礎(chǔ)控制器類中創(chuàng)建getRootPath()方法,獲取項(xiàng)目的根路徑,配置模板引擎的視圖文件路徑和編譯文件路徑。②在Controller.php中封裝assign()方法和fetch()方法。③在StudentController中創(chuàng)建test()方法和模板文件resources\views\test.html,測(cè)試是否可以顯示頁面和數(shù)據(jù)。④讀取student數(shù)據(jù)表中的數(shù)據(jù),輸出學(xué)生信息,如果學(xué)生的性別是男,將學(xué)生名稱顯示為紅色。

實(shí)現(xiàn)思路9.3.3【案例】在自定義框架中使用Smarty本章小結(jié)本章講解了PDO擴(kuò)展、在自定義框架中封裝數(shù)據(jù)庫操作類以及Smarty模板引擎的使用方法。通過本章的學(xué)習(xí),讀者應(yīng)能夠使用PDO擴(kuò)展操作數(shù)據(jù)庫,能夠在框架中按需求封裝數(shù)據(jù)庫操作類,能夠使用Smarty模板引擎實(shí)現(xiàn)視圖與業(yè)務(wù)邏輯代碼的分離。本章小結(jié)第10章項(xiàng)目實(shí)戰(zhàn)——內(nèi)容管理系統(tǒng)《PHP網(wǎng)站開發(fā)實(shí)例教程(第3版)》學(xué)習(xí)目標(biāo)/Target

熟悉內(nèi)容管理系統(tǒng)的頁面效果,能夠說出內(nèi)容管理系統(tǒng)的主要功能。

掌握內(nèi)容管理系統(tǒng)后臺(tái)功能的實(shí)現(xiàn),能夠根據(jù)實(shí)現(xiàn)步驟實(shí)現(xiàn)后臺(tái)的相關(guān)功能。

掌握內(nèi)容管理系統(tǒng)前臺(tái)功能的實(shí)現(xiàn),能夠根據(jù)實(shí)現(xiàn)步驟實(shí)現(xiàn)前臺(tái)的相關(guān)功能。章節(jié)概述/SummaryPHP可以開發(fā)各種不同類型的項(xiàng)目,內(nèi)容管理系統(tǒng)(ContentManagementSystem,CMS)就是一種比較典型的項(xiàng)目。常見的門戶、新聞、博客、文章等類型的網(wǎng)站都可以利用CMS進(jìn)行搭建。CMS用于對(duì)信息進(jìn)行分類管理,將信息有序、及時(shí)地呈現(xiàn)在用戶面前,滿足人們發(fā)布信息、獲取信息的需求,保證信息的共享更加快捷和方便。本章將講解如何基于自定義框架開發(fā)內(nèi)容管理系統(tǒng)。目錄/Contents10.110.2項(xiàng)目展示內(nèi)容管理系統(tǒng)的功能實(shí)現(xiàn)項(xiàng)目展示10.1

先定一個(gè)小目標(biāo)!熟悉內(nèi)容管理系統(tǒng)的頁面效果,能夠說出內(nèi)容管理系統(tǒng)的主要功能。10.1項(xiàng)目展示內(nèi)容管理系統(tǒng)的前臺(tái)首頁:10.1項(xiàng)目展示內(nèi)容管理系統(tǒng)的后臺(tái)登錄頁面:10.1項(xiàng)目展示內(nèi)容管理系統(tǒng)的后臺(tái)首頁:10.1項(xiàng)目展示內(nèi)容管理系統(tǒng)的功能實(shí)現(xiàn)10.2

先定一個(gè)小目標(biāo)!掌握后臺(tái)功能的實(shí)現(xiàn),能夠根據(jù)步驟實(shí)現(xiàn)功能。10.2.1后臺(tái)功能實(shí)現(xiàn)后臺(tái)功能后臺(tái)用戶登錄頁面搭建驗(yàn)證碼10.2.1后臺(tái)功能實(shí)現(xiàn)欄目管理文章管理1.后臺(tái)用戶登錄后臺(tái)用戶登錄通常是系統(tǒng)的管理員登錄,登錄后對(duì)系統(tǒng)進(jìn)行維護(hù)。后臺(tái)用戶登錄功能的實(shí)現(xiàn)步驟:10.2.1后臺(tái)功能實(shí)現(xiàn)登錄MySQL,在myframe數(shù)據(jù)庫中創(chuàng)建用戶表,向表中插入一條數(shù)據(jù)。1在C:\web\www\myframe下創(chuàng)建app\Http\Controllers\admin目錄,實(shí)現(xiàn)后臺(tái)功能。2創(chuàng)建LoginController處理登錄相關(guān)業(yè)務(wù),與登錄相關(guān)的方法如下。index()方法:顯示登錄頁面,提示用戶輸入用戶名、密碼和驗(yàn)證碼。login()方法:接收登錄表單,返回登錄成功或登錄失敗的提示。logout()方法:退出登錄。captcha()方法:顯示驗(yàn)證碼。3后臺(tái)用戶登錄功能的實(shí)現(xiàn)步驟:10.2.1后臺(tái)功能實(shí)現(xiàn)創(chuàng)建myframe\HttpException.php文件,在App.php的run()方法中捕獲HttpException,在myframe\Controller.php編寫success()方法和error()方法,實(shí)現(xiàn)Ajax交互。4創(chuàng)建app\User.php模型文件,在login()方法中驗(yàn)證用戶名和密碼。5用戶登錄成功后,通過Session來記住登錄狀態(tài),并在下次請(qǐng)求中判斷用戶是否登錄。6在logout()方法中清除用戶的Session信息,實(shí)現(xiàn)退出登錄。72.驗(yàn)證碼考慮到網(wǎng)站上線后可能會(huì)遭受攻擊,為了保護(hù)后臺(tái)登錄功能的安全,需要增加一個(gè)驗(yàn)證碼功能,用戶登錄時(shí)顯示一張驗(yàn)證碼圖片,要求用戶輸入圖片中的字符,只有驗(yàn)證碼輸入正確,后臺(tái)才會(huì)處理用戶的登錄請(qǐng)求。驗(yàn)證碼功能的實(shí)現(xiàn)步驟如下:10.2.1后臺(tái)功能實(shí)現(xiàn)在myframe\Captcha.php中創(chuàng)建驗(yàn)證碼類,create()方法自動(dòng)生成驗(yàn)證碼字符,show()方法生成驗(yàn)證碼圖像。1在控制器中使用驗(yàn)證碼類,生成驗(yàn)證碼圖像。2判斷用戶輸入的驗(yàn)證碼是否正確,驗(yàn)證碼驗(yàn)證成功后,該驗(yàn)證碼會(huì)立即過期,不允許被重復(fù)驗(yàn)證。33.頁面搭建用戶登錄成功以后,就會(huì)進(jìn)入后臺(tái)首頁。后臺(tái)頁面結(jié)構(gòu)主要分為3部分,分別是頂部、菜單和內(nèi)容區(qū)域。后臺(tái)頁面:10.2.1后臺(tái)功能實(shí)現(xiàn)頂部菜單內(nèi)容區(qū)域后臺(tái)頁面搭建的實(shí)現(xiàn)步驟:10.2.1后臺(tái)功能實(shí)現(xiàn)創(chuàng)建resources\views\admin\layout.html文件實(shí)現(xiàn)后臺(tái)頁面布局。1在Request.php文件中添加isAjax()方法,用于判斷當(dāng)前請(qǐng)求是否為Ajax請(qǐng)求,在CommonController中調(diào)用isAjax()方法,判斷如果不是Ajax請(qǐng)求就返回布局視圖。2在layout.html的菜單位置添加“首頁”“欄目管理”“文章管理”菜單項(xiàng)。3修改IndexController的index()方法,顯示后臺(tái)首頁對(duì)應(yīng)的admin/index模板,將系統(tǒng)環(huán)境、MySQL版本、文件上傳限制、腳本執(zhí)行時(shí)限以及服務(wù)器時(shí)間等信息輸出到頁面中。44.欄目管理欄目用于對(duì)內(nèi)容進(jìn)行分類,如生活類、咨訊類、編程類等,用戶可以更高效地找到需要的信息。欄目管理的功能主要包括欄目的查詢、添加、修改和刪除。欄目管理的實(shí)現(xiàn)步驟:10.2.1后臺(tái)功能實(shí)現(xiàn)創(chuàng)建欄目表cms_category,字段為id、name(欄目名稱)和sort(排序),添加測(cè)試數(shù)據(jù)。1創(chuàng)建欄目表對(duì)應(yīng)的模型文件app\Category.php,在該文件中完成對(duì)欄目表的操作。2創(chuàng)建app\Http\Controllers\Admin\CategoryController.php,創(chuàng)建index()方法讀取欄目列表。3在CategoryController中編寫edit()方法,實(shí)現(xiàn)修改欄目。4在CategoryController中編寫delete()方法,實(shí)現(xiàn)刪除欄目。55.文章管理文章管理功能需要支持上傳文件。用戶可以上傳封面圖,由于文章記錄會(huì)越來越多,需要提供分頁查詢,方便用戶瀏覽。文章管理的實(shí)現(xiàn)步驟:10.2.1后臺(tái)功能實(shí)現(xiàn)創(chuàng)建文章表cms_article,字段為文章id、所屬欄目id、文章標(biāo)題、作者名、封面圖路徑、發(fā)布狀態(tài)、閱讀量、文章內(nèi)容以及創(chuàng)建時(shí)間,向文章表中添加測(cè)試數(shù)據(jù)。1創(chuàng)建文章表對(duì)應(yīng)的模型文件app\Article.php,在該文件中完成對(duì)文章表的操作。2創(chuàng)建app\Http\Controllers\Admin\ArticleController.php,創(chuàng)建index()方法,讀取文章列表。3創(chuàng)建myframe\Page.php,實(shí)現(xiàn)分頁查詢,生成分頁的導(dǎo)航鏈接。4文章管理的實(shí)現(xiàn)步驟:10.2.1后臺(tái)功能實(shí)現(xiàn)在ArticleController中創(chuàng)建edit()方法,顯示添加或修改文章頁面,引入在線編輯器Ueditor,添加save()方法保存修改后的文章。5在myframe\Request.php中創(chuàng)建hasFile()方法,判斷當(dāng)前文章是否有文件上傳,創(chuàng)建file()方法獲取文件信息,創(chuàng)建myframe\Upload.php文件實(shí)現(xiàn)文件上傳。6在ArticleController中創(chuàng)建delete()方法,根據(jù)文章id刪除指定文章。7文章的欄目id依賴欄目表的記錄,當(dāng)刪除欄目時(shí),該欄目下原有的文章的所屬分類就會(huì)出現(xiàn)問題,修改CategoryController,將被刪除的欄目下的所有文章的欄目id設(shè)為0,表示未選擇欄目。8

先定一個(gè)小目標(biāo)!掌握前臺(tái)功能的實(shí)現(xiàn),能夠根據(jù)步驟實(shí)現(xiàn)功能。10.2.2前臺(tái)功能實(shí)現(xiàn)前臺(tái)功能前臺(tái)首頁文章展示10.2.2前臺(tái)功能實(shí)現(xiàn)供外部訪客訪問,主要展示網(wǎng)站的內(nèi)容。展示文章的詳細(xì)信息。10.2.2前臺(tái)功能實(shí)現(xiàn)1.前臺(tái)首頁前臺(tái)首頁的頁面布局分為頂部、內(nèi)容區(qū)域和尾部3部分。頂部包含欄目導(dǎo)航,用戶單擊欄目導(dǎo)航鏈接可以切換當(dāng)前顯示的欄目。內(nèi)容區(qū)域包含內(nèi)容:輪播圖:輪播圖突出展示網(wǎng)站的熱點(diǎn)內(nèi)容,通過直接編寫HTML代碼實(shí)現(xiàn)輪播圖。文章列表:首頁顯示所有欄目的文章,如果在某個(gè)欄目下,顯示某個(gè)欄目的文章。側(cè)邊欄:位于文章列表的右側(cè),側(cè)邊欄中會(huì)顯示熱門標(biāo)簽、最新文章和最熱文章3個(gè)模塊。其中,熱門標(biāo)簽功能在后臺(tái)沒有開發(fā),直接編寫HTML代碼展示,最新文章和最熱文章需要查詢文章表獲取數(shù)據(jù)。10.2.2前臺(tái)功能實(shí)現(xiàn)前臺(tái)首頁功能的實(shí)現(xiàn)步驟:創(chuàng)建resources\views\layout.html實(shí)現(xiàn)前臺(tái)頁面的布局,創(chuàng)建index.html保存首頁的內(nèi)容區(qū)域。1實(shí)現(xiàn)首頁的頂部?jī)?nèi)容,創(chuàng)建IndexController.php,通過index()方法顯示前臺(tái)首頁,編寫category()方法查詢欄目記錄。在layout.html輸出欄目列表,給選中的欄目添加選中樣式。2實(shí)現(xiàn)內(nèi)容區(qū)域輪播圖,在resources\views下創(chuàng)建sub目錄,將輪播圖代碼保存到slide.html中。3實(shí)現(xiàn)內(nèi)容區(qū)域的文章列表,修改IndexController的index()方法,讀取文章列表并實(shí)現(xiàn)分頁查詢,創(chuàng)建resources\views\sub\list.html文件,輸出文章列表。4實(shí)現(xiàn)內(nèi)容區(qū)域的側(cè)邊欄,在IndexController中創(chuàng)建sidebar(),其他頁面使用時(shí)直接調(diào)用,創(chuàng)建resources\views\sub\sidebar.html,輸出熱門標(biāo)簽、熱門文章和最新文章,在index.html中引入側(cè)邊欄。510.2.2前臺(tái)功能實(shí)現(xiàn)2.文章展示用戶單擊某一篇文章后,會(huì)進(jìn)入文章展示頁面,文章展示頁面會(huì)顯示文章的標(biāo)題、內(nèi)容、作者、發(fā)表時(shí)間、閱讀量,并且為了方便用戶瀏覽,還會(huì)提供上一篇、下一篇切換的鏈接。文章展示頁面的實(shí)現(xiàn)步驟:在IndexController中編寫show()方法,該方法的參數(shù)id表示要展示的文章的id,根據(jù)id查詢文章的詳細(xì)信息和所屬的分類名稱。1創(chuàng)建resources\views\show.html文件,顯示文章的詳細(xì)信息。2本章小結(jié)本章首先展示了內(nèi)容管理系統(tǒng)的相關(guān)功能,然后對(duì)內(nèi)容管理系統(tǒng)中的后臺(tái)和前臺(tái)的功能實(shí)現(xiàn)進(jìn)行了分析,并給出了每個(gè)功能的實(shí)現(xiàn)步驟,讀者可以根據(jù)這些步驟實(shí)現(xiàn)指定的功能。如果在實(shí)現(xiàn)功能的過程中遇到問題,可參考開發(fā)文檔進(jìn)行代碼的調(diào)試和修改,最終完成內(nèi)容管理系統(tǒng)。本章小結(jié)第11章Laravel框架《PHP網(wǎng)站開發(fā)實(shí)例教程(第3版)》學(xué)習(xí)目標(biāo)/Target

了解Laravel框架,能夠說出Laravel框架的特點(diǎn)。

掌握Laravel框架的創(chuàng)建,能夠創(chuàng)建Laravel項(xiàng)目。

了解VSCode編輯器的配置,能夠說出配置文件中各個(gè)配置項(xiàng)的作用。

了解Laravel框架的目錄結(jié)構(gòu),能夠說出各個(gè)目錄的作用。學(xué)習(xí)目標(biāo)/Target

掌握Laravel框架中路由的使用方法,能夠配置路由、設(shè)置路由參數(shù)、給路由

設(shè)置別名和分組。

掌握Laravel框架中控制器的使用方法,能夠創(chuàng)建控制器、配置控制器路由和

接收用戶輸入。

掌握Laravel框架中視圖的使用方法,能夠使用視圖展示數(shù)據(jù)。

掌握Laravel框架中模型的使用方法,能夠使用模型完成數(shù)據(jù)操作。章節(jié)概述/SummaryLaravel框架自發(fā)布以來備受PHP開發(fā)人員的喜愛,其用戶數(shù)量增長(zhǎng)速度十分快。本章將講解Laravel框架的相關(guān)內(nèi)容,主要包括Laravel框架的基礎(chǔ)知識(shí)、路由、控制器、視圖和模型等內(nèi)容。目錄/Contents11.111.211.3初識(shí)Laravel路由控制器11.4視圖11.5模型初識(shí)Laravel11.1

先定一個(gè)小目標(biāo)!了解Laravel框架,能夠說出Laravel框架的特點(diǎn)。11.1.1Laravel概述11.1.1Laravel概述Laravel是一套簡(jiǎn)潔、優(yōu)雅的Web應(yīng)用框架,具有富于表達(dá)性且簡(jiǎn)潔的語法。它提供了強(qiáng)大的工具用于開發(fā)大型應(yīng)用,這些工具包括自動(dòng)驗(yàn)證、路由、Session、緩存、數(shù)據(jù)庫遷移、單元測(cè)試等。11.1.1Laravel概述為了讓框架統(tǒng)一管理所有的請(qǐng)求,整個(gè)項(xiàng)目對(duì)外只提供一個(gè)入口。單入口AR(活動(dòng)記錄)模式允許在模型類中定義方法來處理數(shù)據(jù)的業(yè)務(wù)邏輯。支持AR模式利用MVC可以更好地協(xié)同開發(fā),為后期維護(hù)提供方便。MVC開發(fā)模式ORM(對(duì)象關(guān)系映射)將數(shù)據(jù)庫中的表和記錄轉(zhuǎn)換為對(duì)象和屬性,使用面向?qū)ο蠓绞讲僮鲾?shù)據(jù)庫。ORM方式操作數(shù)據(jù)庫Laravel框架特點(diǎn)

先定一個(gè)小目標(biāo)!掌握Laravel框架的創(chuàng)建,能夠創(chuàng)建Laravel項(xiàng)目。11.1.2創(chuàng)建Laravel項(xiàng)目本書基于Laravel10.0講解,該版本要求運(yùn)行環(huán)境的PHP版本必須大于或等于8.1。創(chuàng)建Laravel項(xiàng)目的步驟:11.1.2創(chuàng)建Laravel項(xiàng)目在php.ini開啟擴(kuò)展:curl、fileinfo、gd、mbstring、openssl、pdo_mysql。1在httpd.conf開啟rewrite模塊,在httpd-vhost.conf配置虛擬主機(jī),主機(jī)名www.laravel.test。2創(chuàng)建C:\web\www\laravel目錄,在該目錄下安裝Laravel框架,安裝結(jié)果:3創(chuàng)建Laravel項(xiàng)目的步驟:11.1.2創(chuàng)建Laravel項(xiàng)目重啟Apache服務(wù),使修改后的配置生效。4編輯hosts文件,添加域名的解析記錄。5通過瀏覽器訪問http://www.laravel.test,頁面效果:6www.laravel.testlaravel.test

先定一個(gè)小目標(biāo)!了解VSCode編輯器的配置,能夠說出配置文件中每個(gè)配置項(xiàng)的作用。11.1.3配置VSCode編輯器配置VSCode編輯器:使用VSCode編輯器打開C:\web\www\laravel目錄。111.1.3配置VSCode編輯器配置VSCode編輯器:創(chuàng)建.vscode目錄,在該目錄創(chuàng)建settings.json文件,對(duì)代碼進(jìn)行語法檢查和自動(dòng)格式化。2{"php.suggest.basic":false,"php.executablePath":"C:/web/php8.2/php.exe","phpcs.standard":"psr2","files.eol":"\n"}是否啟用基本的PHP代碼建議功能指定php.exe文件的路徑指定PHP代碼風(fēng)格規(guī)范指定文件行尾的結(jié)束符11.1.3配置VSCode編輯器

先定一個(gè)小目標(biāo)!了解Laravel框架的目錄結(jié)構(gòu),能夠說出每個(gè)目錄的作用。11.1.4Laravel目錄結(jié)構(gòu)Laravel項(xiàng)目的一級(jí)目錄:目錄作用app框架核心目錄,保存項(xiàng)目中的控制器、模型等bootstrap和框架的啟動(dòng)相關(guān)的文件config存放一些配置文件database數(shù)據(jù)庫遷移文件及數(shù)據(jù)填充文件public存放入口文件index.php和前端資源文件(如CSS、JavaScript等)resources存放視圖文件、語言包和未編譯的前端資源文件routes存放框架中定義的所有路由storage存放編譯后的模板、Session文件、緩存文件、日志文件等tests自動(dòng)化測(cè)試文件vendor存放通過Composer加載的依賴11.1.4Laravel目錄結(jié)構(gòu)Laravel項(xiàng)目常用的子目錄和文件:11.1.4Laravel目錄結(jié)構(gòu)類型路徑作用目錄app\Http存放與HTTP請(qǐng)求相關(guān)的文件目錄app\Http\Controllers存放控制器文件文件app\Http\Controllers\Controller.php控制器的基類文件目錄app\Http\Middleware中間件目錄目錄app\Models模型目錄文件app\Models\User.phpUser模型文件文件bootstrap\app.php創(chuàng)建Laravel應(yīng)用實(shí)例文件config\app.php全局配置文件文件config\auth.phpAuth模塊的配置文件文件config\database.php數(shù)據(jù)庫配置文件文件config\filesystem.php文件系統(tǒng)的配置文件目錄database\factories存放工廠模式的數(shù)據(jù)填充文件1/2Laravel項(xiàng)目常用的子目錄和文件:11.1.4Laravel目錄結(jié)構(gòu)類型路徑作用目錄database\migrations存放數(shù)據(jù)庫遷移文件目錄database\seeders存放數(shù)據(jù)填充器文件目錄resources\views存放視圖文件文件routes\web.php定義路由的文件目錄storage\app存放用戶上傳的文件目錄storage\framework存放與框架自身相關(guān)的文件目錄storage\logs存放日志文件文件public\index.php入口文件文件.env環(huán)境變量配置文件文件artisan腳手架文件文件composer.jsonComposer依賴包配置文件2/2路由11.2

先定一個(gè)小目標(biāo)!掌握配置路由的語法,能夠定義不同請(qǐng)求方式的路由。11.2.1配置路由Laravel框架的路由在routes\web.php中配置,該文件已經(jīng)添加了一個(gè)默認(rèn)路由:Route::get('/',function(){returnview('welcome');});匹配路徑為“/”,view()函數(shù)表示要顯示的視圖,參數(shù)welcome是視圖文件的名稱11.2.1配置路由定義路由的語法格式:語法格式Route::請(qǐng)求方式('請(qǐng)求URI',匿名函數(shù)或控制器相應(yīng)的方法);請(qǐng)求方式如下:get、post、put、patch、delete、options11.2.1配置路由Route類中提供了match()和any()兩個(gè)靜態(tài)方法,match()用于在一個(gè)路由中同時(shí)匹配多個(gè)請(qǐng)求方式;any()用于在一個(gè)路由中匹配任意請(qǐng)求方式。語法格式//同時(shí)匹配get和post請(qǐng)求方式Route::match(['get','post'],'請(qǐng)求URI',匿名函數(shù)或控制器相應(yīng)的方法);//匹配任意請(qǐng)求方式Route::any('請(qǐng)求URI',匿名函數(shù)或控制器相應(yīng)的方法);11.2.1配置路由請(qǐng)求URI是一個(gè)完整URL地址中從域名后面的“/”開始的路徑,不含請(qǐng)求參數(shù)。下面演示完整的URL對(duì)應(yīng)的請(qǐng)求URI:11.2.1配置路由完整URI請(qǐng)求URIhttp://www.laravel.test//http://www.laravel.test/hello/123/hello/123http://www.laravel.test/hello/456?a=1/hello/456定義路由時(shí),請(qǐng)求URI中的/可以省略,如/hello修改為hello,運(yùn)行結(jié)果不變。在路由文件中定義路由,用于匹配/hello:11.2.1配置路由Route::get('/hello',function(){return'hello'; //返回一個(gè)字符串給瀏覽器,以方便測(cè)試});瀏覽器訪問http://www.laravel.test/hello,運(yùn)行結(jié)果如下:

先定一個(gè)小目標(biāo)!掌握路由參數(shù)的定義,能夠定義路由時(shí)設(shè)置必選參數(shù)和可選參數(shù)。11.2.2路由參數(shù)Laravel允許在請(qǐng)求URI中傳遞一些動(dòng)態(tài)參數(shù),稱為路由參數(shù)。通過路由參數(shù)可以傳遞請(qǐng)求信息,如id。11.2.2路由參數(shù)對(duì)應(yīng)語法對(duì)應(yīng)語法路由參數(shù)必選參數(shù)可選參數(shù)11.2.2路由參數(shù){參數(shù)名}{參數(shù)名?}演示使用必選參數(shù)和可選參數(shù)。必選參數(shù)示例代碼Route::get('find/{id}',function($id){return'輸入的id為'.$id;});11.2.2路由參數(shù)Route::get('find2/{id?}',function($id=0){

return'輸入的id為'.$id;});可選參數(shù)示例代碼

先定一個(gè)小目標(biāo)!掌握路由別名的設(shè)置,能夠給路由設(shè)置別名。11.2.3路由別名路由的使用場(chǎng)景:<ahref="/hello/123">hello</a>視圖A視圖B視圖C11.2.3路由別名3個(gè)視圖都使用路由,當(dāng)路由發(fā)生改變時(shí),這3個(gè)視圖都需要修改,非常麻煩。11.2.3路由別名給路由/hello/123設(shè)置別名。設(shè)置路由別名后,在其他地方用到這個(gè)路由地址的時(shí)候,可以不書寫原來的地址,而是通過別名來引用這個(gè)地址。11.2.3路由別名給路由設(shè)置別名調(diào)用name()方法。語法格式Route::請(qǐng)求方式('請(qǐng)求URI',匿名函數(shù)或控制器相應(yīng)的方法)->name('路由別名');11.2.3路由別名給路由/hello/123設(shè)置別名。示例代碼

Route::get('/hello/123',function(){

return'hello';

})->name('hello');在視圖中使用路由別名。示例代碼<ahref="{{route('hello')}}">hello</a>11.2.3路由別名

先定一個(gè)小目標(biāo)!掌握路由分組,能夠根據(jù)需求對(duì)路由分組。11.2.4路由分組路由分組使用Route::group()來實(shí)現(xiàn):11.2.4路由分組語法格式Route::group(公共屬性數(shù)組,回調(diào)函數(shù));公共屬性數(shù)組用于指定同組路由的公共屬性,如前綴、中間件等?;卣{(diào)函數(shù)中的代碼用于定義同組路由。路由文件中有如下路由:/admin/login/admin/logout/admin/user/addRoute::group(['prefix'=>'admin'],function(){Route::get('login',function(){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論