PHP網(wǎng)站開(kāi)發(fā)實(shí)例教程(第3版) 課件 第9章 PDO擴(kuò)展和Smarty模板引擎_第1頁(yè)
PHP網(wǎng)站開(kāi)發(fā)實(shí)例教程(第3版) 課件 第9章 PDO擴(kuò)展和Smarty模板引擎_第2頁(yè)
PHP網(wǎng)站開(kāi)發(fā)實(shí)例教程(第3版) 課件 第9章 PDO擴(kuò)展和Smarty模板引擎_第3頁(yè)
PHP網(wǎng)站開(kāi)發(fā)實(shí)例教程(第3版) 課件 第9章 PDO擴(kuò)展和Smarty模板引擎_第4頁(yè)
PHP網(wǎng)站開(kāi)發(fā)實(shí)例教程(第3版) 課件 第9章 PDO擴(kuò)展和Smarty模板引擎_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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)站開(kāi)發(fā)實(shí)例教程(第3版)》學(xué)習(xí)目標(biāo)/Target

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

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

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

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

先定一個(gè)小目標(biāo)!掌握連接和選擇數(shù)據(jù)庫(kù)的方法,能夠使用PDO類連接和選擇數(shù)據(jù)庫(kù)。9.1.2連接和選擇數(shù)據(jù)庫(kù)PDO擴(kuò)展提供了PDO類,能夠用于連接和操作數(shù)據(jù)庫(kù)。使用PDO類操作數(shù)據(jù)庫(kù)前,需要先實(shí)例化PDO類,傳遞連接數(shù)據(jù)庫(kù)的參數(shù):語(yǔ)法格式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ù)庫(kù)$dsn由PDO驅(qū)動(dòng)程序名稱、冒號(hào)和PDO驅(qū)動(dòng)程序特有的連接語(yǔ)法組成。例如,連接MySQL數(shù)據(jù)庫(kù)時(shí),PDO驅(qū)動(dòng)程序名稱為mysql,它特有的連接語(yǔ)法包括主機(jī)名、端口號(hào)、數(shù)據(jù)庫(kù)名稱、字符集等;連接Oracle數(shù)據(jù)庫(kù)時(shí),PDO驅(qū)動(dòng)程序名稱為oci,它特有的連接語(yǔ)法只包括數(shù)據(jù)庫(kù)名稱和字符集。MySQL數(shù)據(jù)庫(kù)和Oracle數(shù)據(jù)庫(kù)的$dsn如下:$mysqldsn='mysql:host=主機(jī)名;port=端口號(hào);dbname=數(shù)據(jù)庫(kù)名稱;charset=字符集';$oracledsn='oci:dbname=數(shù)據(jù)庫(kù)名稱;charset=字符集';9.1.2連接和選擇數(shù)據(jù)庫(kù)創(chuàng)建pdo01.php文件,使用PDO連接MySQL服務(wù)器并選擇myframe數(shù)據(jù)庫(kù):<?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ù)庫(kù)

先定一個(gè)小目標(biāo)!掌握?qǐng)?zhí)行SQL語(yǔ)句的方法,能夠使用query()方法和exec()方法執(zhí)行SQL語(yǔ)句。9.1.3執(zhí)行SQL語(yǔ)句PDO類對(duì)象的query()方法和exec()方法用于執(zhí)行SQL語(yǔ)句。這兩個(gè)方法的區(qū)別:query()方法返回的是PDOStatement類對(duì)象,該對(duì)象主要用于解析結(jié)果集、實(shí)現(xiàn)預(yù)處理和事務(wù)處理等;exec()方法返回的是受影響行數(shù),使用exec()方法執(zhí)行SELECT語(yǔ)句時(shí)不會(huì)返回查詢結(jié)果。通常使用query()方法執(zhí)行查詢類的SQL語(yǔ)句;使用exec()方法執(zhí)行操作類的SQL語(yǔ)句。執(zhí)行SQL語(yǔ)句后,使用lastInsertId()方法獲取最后插入行的id值。9.1.3執(zhí)行SQL語(yǔ)句修改pdo01.php文件,使用query()方法和exec()方法執(zhí)行SQL語(yǔ)句:<?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語(yǔ)句

先定一個(gè)小目標(biāo)!掌握處理結(jié)果集的方法,能夠使用不同方法處理結(jié)果集。9.1.4處理結(jié)果集使用query()方法執(zhí)行SQL語(yǔ)句后,返回的結(jié)果是PDOStatement類對(duì)象。通過(guò)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é)果集語(yǔ)法格式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é)果集可選值說(shuō)明返回值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開(kāi)始,值為對(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é)果集可選值說(shuō)明返回值PDO::FETCH_LAZY以延遲加載的方式提取結(jié)果集中的數(shù)據(jù),只有在訪問(wèn)數(shù)據(jù)時(shí)才會(huì)從數(shù)據(jù)庫(kù)中取出在訪問(wèn)數(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é)果集語(yǔ)法格式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é)果集語(yǔ)法格式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開(kāi)始計(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語(yǔ)句和綁定數(shù)據(jù)。9.1.5預(yù)處理機(jī)制在PHP程序中編寫(xiě)SQL語(yǔ)句時(shí),如果將發(fā)送的數(shù)據(jù)和SQL語(yǔ)句寫(xiě)在一起,每條SQL語(yǔ)句都需要解析器進(jìn)行分析、編譯和優(yōu)化,效率低。預(yù)處理機(jī)制是先定義和發(fā)送模板形式的SQL語(yǔ)句,用占位符替代實(shí)際數(shù)據(jù),稱為預(yù)處理SQL語(yǔ)句,解析器會(huì)預(yù)先編譯預(yù)處理SQL語(yǔ)句,再處理相關(guān)數(shù)據(jù)。使用預(yù)處理機(jī)制可以避免數(shù)據(jù)中有特殊字符(如單引號(hào))而導(dǎo)致的語(yǔ)法問(wèn)題出現(xiàn),提高程序運(yùn)行效率。下面講解預(yù)處理機(jī)制中的預(yù)處理方法和數(shù)據(jù)綁定。9.1.5預(yù)處理機(jī)制1.預(yù)處理方法通過(guò)PDO中的預(yù)處理方法prepare()和execute()可以實(shí)現(xiàn)預(yù)處理機(jī)制。prepare()方法用于準(zhǔn)備預(yù)處理SQL語(yǔ)句,execute()方法用以執(zhí)行預(yù)處理語(yǔ)句。prepare()方法語(yǔ)法格式PDOStatementPDO::prepare(string$query,array$options=array())9.1.5預(yù)處理機(jī)制execute()方法語(yǔ)法格式PDOStatement::execute($input_parameters)$query是預(yù)處理SQL語(yǔ)句,該語(yǔ)句中動(dòng)態(tài)變化的量用占位符代替,占位符使用問(wèn)號(hào)占位符“?”和參數(shù)占位符“:參數(shù)名稱”;

$options是可選參數(shù),設(shè)置一個(gè)或多個(gè)PDOStatement對(duì)象的屬性值$input_parameters是可選參數(shù),表示為預(yù)處理SQL語(yǔ)句中的占位符綁定數(shù)據(jù),如果預(yù)處理SQL語(yǔ)句不包含占位符,可省略此參數(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語(yǔ)句中有占位符時(shí),使用execute()方法、bindParam()方法和bindValue()方法為占位符綁定數(shù)據(jù)。bindParam()方法和bindValue()方法的區(qū)別:bindParam()方法將占位符綁定到指定的變量名上,使用execute()方法執(zhí)行預(yù)處理SQL語(yǔ)句時(shí),只需要修改變量名的值。bindValue()方法將值綁定到占位符上,使用execute()方法執(zhí)行預(yù)處理SQL語(yǔ)句時(shí),每修改一次值,都需要重復(fù)執(zhí)行一次bindValue()方法和execute()方法。9.1.5預(yù)處理機(jī)制(1)execute()方法execute()方法的參數(shù)$input_parameters是一個(gè)數(shù)組,該數(shù)組的元素個(gè)數(shù)必須與預(yù)處理SQL語(yǔ)句中的占位符數(shù)量相同。當(dāng)占位符是問(wèn)號(hào)占位符時(shí),$input_parameters必須是一個(gè)索引數(shù)組;當(dāng)占位符是參數(shù)占位符時(shí),$input_parameters必須是一個(gè)關(guān)聯(lián)數(shù)組。使用execute()方法為問(wèn)號(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()方法為問(wèn)號(hào)占位符綁定數(shù)據(jù)時(shí),bindParam()方法的第1個(gè)參數(shù)是一個(gè)以1開(kāi)始的數(shù)字,表示對(duì)應(yīng)預(yù)處理中的第幾個(gè)問(wèn)號(hào)占位符,使用bindParam()方法為參數(shù)占位符綁定數(shù)據(jù)時(shí),bindParam()方法的第1個(gè)參數(shù)是“:參數(shù)名”或“參數(shù)名”的形式。使用bindParam()方法為問(wèn)號(hào)占位符和參數(shù)占位符綁定數(shù)據(jù)://綁定問(wèn)號(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語(yǔ)句的執(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è)值,它無(wú)須進(jìn)行變量的綁定,使用較為方便。使用bindValue()方法為問(wèn)號(hào)占位符和參數(shù)占位符綁定數(shù)據(jù)://綁定問(wèn)號(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語(yǔ)句操作數(shù)據(jù)庫(kù)時(shí),難免會(huì)出現(xiàn)各種各樣的錯(cuò)誤,如語(yǔ)法錯(cuò)誤、邏輯錯(cuò)誤等。為了避免SQL語(yǔ)句出現(xiàn)這些錯(cuò)誤,我們既可以利用前面學(xué)習(xí)過(guò)的異常處理方式手動(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ò)誤代碼。通過(guò)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í)用,可以快速地找到存在問(wèn)題的代碼。9.1.6PDO錯(cuò)誤處理setAttribute()方法用于設(shè)置PDO的屬性,在程序中使用該方法設(shè)置錯(cuò)誤處理模式。語(yǔ)法格式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語(yǔ)句$stmt=$pdo->prepare('SELECT*FROM`test`');//執(zhí)行預(yù)處理SQL語(yǔ)句,若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ù)庫(kù)連接相關(guān)的各種屬性。getAttribute()方法的語(yǔ)法格式:PDO::getAttribute($attribute);$attribute用于指定要獲取的屬性的常量值多學(xué)一招:PDO屬性的獲取PDO屬性的獲取getAttribute()方法中的常量值是PDO::ATTR_*系列常量中的一個(gè),$attribute的可選值如下:PDO::ATTR_AUTOCOMMIT:連接的自動(dòng)提交模式。PDO::ATTR_CASE:列名在結(jié)果集中的大小寫(xiě)方式。PDO::ATTR_CLIENT_VERSION:客戶端庫(kù)版本。PDO::ATTR_CONNECTION_STATUS:連接狀態(tài)。PDO::ATTR_DRIVER_NAME:驅(qū)動(dòng)程序名稱。PDO::ATTR_SERVER_INFO:服務(wù)器信息。PDO::ATTR_SERVER_VERSION:數(shù)據(jù)庫(kù)服務(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ù)處理方法名說(shuō)明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(); //開(kāi)啟事務(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ù)庫(kù)操作類9.2

先定一個(gè)小目標(biāo)!掌握封裝DB類的方法,能夠在自定義框架中封裝DB類。9.2.1【案例】封裝DB類在自定義框架中,DB類負(fù)責(zé)數(shù)據(jù)庫(kù)操作,主要包括連接數(shù)據(jù)庫(kù)、執(zhí)行SQL語(yǔ)句、處理結(jié)果集等。SQL語(yǔ)句分為查詢類和執(zhí)行類。查詢類是指SELECT語(yǔ)句這種有結(jié)果集的操作,執(zhí)行類是指INSERT語(yǔ)句、UPDATE語(yǔ)句、DELETE語(yǔ)句等沒(méi)有結(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ù)庫(kù),init()方法用于傳入連接配置。②在config目錄下創(chuàng)建database.php文件,保存數(shù)據(jù)庫(kù)連接配置,在框架中加載配置。③在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ù)表名稱來(lái)命名,在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語(yǔ)句,具體方法說(shuō)明如下。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語(yǔ)言開(kāi)發(fā)的模板引擎,具有響應(yīng)速度快、語(yǔ)句自由、支持插件擴(kuò)展等特點(diǎn)。Smarty實(shí)現(xiàn)了PHP代碼與HTML代碼的分離,使PHP開(kāi)發(fā)人員專注于數(shù)據(jù)的處理及功能模塊的實(shí)現(xiàn),網(wǎng)頁(yè)設(shè)計(jì)人員專注于網(wǎng)頁(yè)的設(shè)計(jì)與排版工作。9.3.1安裝Smarty使用Composer可以安裝Smarty模板引擎。在命令提示符窗口中,切換到C:\web\www\myframe目錄,執(zhí)行安裝Smarty模板引擎的命令:composerrequiresmarty/smarty=~4.39.3.1安裝Smarty執(zhí)行安裝命令后,打開(kāi)composer.json,會(huì)看到該文件自動(dòng)添加了Smarty的相關(guān)配置:"require":{"smarty/smarty":"^4.3"}安裝Smarty后,打開(kāi)vendor目錄,會(huì)看到里面新增了smarty目錄,Smarty的核心文件在vendor\smarty\smarty\libs目錄下,該目錄中的文件和目錄介紹如下:9.3.1安裝Smarty名稱說(shuō)明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的語(yǔ)法在模板展示數(shù)據(jù)。9.3.2Smarty的基本使用Smarty的常用語(yǔ)法:語(yǔ)法說(shuō)明if指令條件判斷foreach指令循環(huán)展示數(shù)據(jù)include指令引用其他模板文件9.3.2Smarty的基本使用Smarty的常用方法:方法說(shuō)明assign()向模板頁(yè)面分配變量display()展示

溫馨提示

  • 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ù)網(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)論