PHP网站开发实例教程(第3版) 课件 第9章 PDO扩展和Smarty模板引擎_第1页
PHP网站开发实例教程(第3版) 课件 第9章 PDO扩展和Smarty模板引擎_第2页
PHP网站开发实例教程(第3版) 课件 第9章 PDO扩展和Smarty模板引擎_第3页
PHP网站开发实例教程(第3版) 课件 第9章 PDO扩展和Smarty模板引擎_第4页
PHP网站开发实例教程(第3版) 课件 第9章 PDO扩展和Smarty模板引擎_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章PDO扩展和Smarty模板引擎《PHP网站开发实例教程(第3版)》学习目标/Target

掌握PDO扩展的使用方法,能够使用PDO扩展操作数据库。

掌握数据库操作类的封装,能够在自定义框架中封装数据库操作类。

掌握Smarty模板引擎的使用方法,能够在自定义框架中使用Smarty模板引擎。章节概述/Summary在第7章和第8章中,我们已经创建好了自定义框架并且完成了框架的基本功能。为了能够在框架中操作数据库和渲染数据,本章将介绍PDO扩展和Smarty模板引擎,在自定义框架中封装数据库操作类和使用Smarty模板引擎。目录/Contents9.19.29.3PDO扩展在自定义框架中封装数据库操作类Smarty模板引擎PDO扩展9.1

先定一个小目标!了解开启PDO扩展的方法,能够开启PDO扩展。9.1.1开启PDO扩展PDO扩展为PHP操作数据库定义了一个轻量级的接口,从而可以用一套相同的接口操作不同的数据库。目前支持的数据库包括Firebird、FreeTDS、MySQL、MicrosoftSQLServer、Oracle、PostgreSQL、SQLite、Sybase等。9.1.1开启PDO扩展PDO支持的每个数据库都对应不同的扩展文件。如果想让PDO支持MySQL数据库,需要修改如下配置:extension=pdo_mysql9.1.1开启PDO扩展

先定一个小目标!掌握连接和选择数据库的方法,能够使用PDO类连接和选择数据库。9.1.2连接和选择数据库PDO扩展提供了PDO类,能够用于连接和操作数据库。使用PDO类操作数据库前,需要先实例化PDO类,传递连接数据库的参数:语法格式PDO::__construct(

string$dsn, //数据源名称 string$username,//用户名(可选参数)string$password,//密码(可选参数) array$driver_options //包含键值的驱动连接选项(可选参数))9.1.2连接和选择数据库$dsn由PDO驱动程序名称、冒号和PDO驱动程序特有的连接语法组成。例如,连接MySQL数据库时,PDO驱动程序名称为mysql,它特有的连接语法包括主机名、端口号、数据库名称、字符集等;连接Oracle数据库时,PDO驱动程序名称为oci,它特有的连接语法只包括数据库名称和字符集。MySQL数据库和Oracle数据库的$dsn如下:$mysqldsn='mysql:host=主机名;port=端口号;dbname=数据库名称;charset=字符集';$oracledsn='oci:dbname=数据库名称;charset=字符集';9.1.2连接和选择数据库创建pdo01.php文件,使用PDO连接MySQL服务器并选择myframe数据库:<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');var_dump($pdo);//输出结果:object(PDO)#1(0){}9.1.2连接和选择数据库

先定一个小目标!掌握执行SQL语句的方法,能够使用query()方法和exec()方法执行SQL语句。9.1.3执行SQL语句PDO类对象的query()方法和exec()方法用于执行SQL语句。这两个方法的区别:query()方法返回的是PDOStatement类对象,该对象主要用于解析结果集、实现预处理和事务处理等;exec()方法返回的是受影响行数,使用exec()方法执行SELECT语句时不会返回查询结果。通常使用query()方法执行查询类的SQL语句;使用exec()方法执行操作类的SQL语句。执行SQL语句后,使用lastInsertId()方法获取最后插入行的id值。9.1.3执行SQL语句修改pdo01.php文件,使用query()方法和exec()方法执行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));//输出结果:object(PDOStatement)#2(1){["queryString"]=>string(23)"SELECT*FROM`student`"}$sql="INSERTINTO`student`(`name`)VALUES('Leon')";var_dump($pdo->exec($sql)); //输出结果:int(1)var_dump($pdo->lastInsertId()); //输出结果:string(1)"5"9.1.3执行SQL语句

先定一个小目标!掌握处理结果集的方法,能够使用不同方法处理结果集。9.1.4处理结果集使用query()方法执行SQL语句后,返回的结果是PDOStatement类对象。通过PDOStatement类对象可以对结果集进行处理,常用的处理结果集的方法有fetch()、fetchColumn()和fetchAll()。下面对这3个方法分别进行讲解。9.1.4处理结果集1.fetch()fetch()方法用于从结果集中获取下一行数据。9.1.4处理结果集语法格式PDOStatement::fetch(int$mode=PDO::FETCH_DEFAULT, //返回方式(可选参数)int$cursorOrientation=PDO::FETCH_ORI_NEXT,//可滚动游标(可选参数)int$cursorOffset=0

//游标的偏移量(可选参数))$mode的值必须是PDO::FETCH_*系列常量中的一个,$mode的可选值:9.1.4处理结果集可选值说明返回值PDO::FETCH_ASSOC以关联数组的方式提取结果集中的数据每一行的数据将被返回为一个关联数组,其中键是列名,值是对应的数据值PDO::FETCH_NUM以索引数组的方式提取结果集中的数据每一行的数据将被返回为一个索引数组,其中索引从0开始,值为对应的数据值PDO::FETCH_BOTH同时以关联数组和索引数组的方式提取结果集中的数据每一行的数据将被返回为一个混合数组,其中既包含字符串键名也包含数字键名,即每个列名对应两个键名PDO::FETCH_OBJ以匿名对象的方式提取结果集中的数据每一行的数据将被返回为一个匿名对象,其中属性名对应列名,属性值对应数据值1/2$mode的值必须是PDO::FETCH_*系列常量中的一个,$mode的可选值:9.1.4处理结果集可选值说明返回值PDO::FETCH_LAZY以延迟加载的方式提取结果集中的数据,只有在访问数据时才会从数据库中取出在访问数据时,会返回一个包含该行数据的对象,对象的属性名对应列名,属性值对应数据值PDO::FETCH_BOUND将结果集中的列值分配给PDOStatement::bindColumn()方法绑定的变量返回true,并分配结果集中的列值给PDOStatement::bindColumn()方法绑定的PHP变量PDO::FETCH_CLASS将结果集中的数据映射为指定请求类的实例返回一个请求类的实例,其中的属性会被赋值为结果集中对应的列值PDO::FETCH_INTO将结果集中的数据映射为指定被请求类的实例返回一个被请求类已存在的实例,其中命名的属性会被赋值为结果集中对应的列2/2创建pdo02.php文件,使用fetch()方法获取查询的数据的代码及运行结果:<?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处理结果集2.fetchColumn()fetchColumn()方法用于获取结果集中的单独一列,该方法执行成功返回获取的数据,执行失败返回false。9.1.4处理结果集语法格式stringPDOStatement::fetchColumn(int$column=0)修改pdo02.php文件,使用fetchColumn()方法获取结果集中的第2列数据:while($column=$res->fetchColumn(1)){echo''.$column; //输出结果:AllenJames}9.1.4处理结果集3.fetchAll()fetchAll()方法用于获取结果集中所有的行数据。9.1.4处理结果集语法格式arrayPDOStatement::fetchAll(int$mode, //返回方式(可选参数)mixed$fetch_argument, //可滚动游标(可选参数)array$ctor_args=array() //PDO::FETCH_CLASS的参数(可选参数))$fetch_argument根据$mode参数值的变化而有不同意义,$mode的可选值:9.1.4处理结果集可选值作用返回值PDO::FETCH_COLUMN提取结果集中的单个列的值返回指定索引位置的列值,索引从0开始计数PDO::FETCH_CLASS将结果集中的数据映射为指定类的对象返回一个指定类的对象,其中的属性会被赋值为结果集中对应的列值PDO::FETCH_FUNC使用自定义的回调函数处理结果集中的每一行数据返回回调函数处理后的结果修改pdo02.php,使用fetchAll()方法以关联数组形式获取结果集:$data=$res->fetchAll(PDO::FETCH_ASSOC);print_r($data);9.1.4处理结果集输出结果:Array([0]=>Array([id]=>1[name]=>Allen)[1]=>Array([id]=>2[name]=>James))多学一招:将变量绑定到结果集中的某一列将变量绑定到结果集中的某一列fetch()方法的参数设置为PDO::FETCH_BOUND时,执行成功后会分配结果集中的列值给bindColumn()方法绑定的变量。将变量绑定到结果集中的某一列的示例代码:$res->bindColumn('id',$id);

//将变量$id绑定到结果集$res的id列$res->bindColumn('name',$name); //将变量$name绑定到结果集$res的name列while($res->fetch(PDO::FETCH_BOUND)){ //获取绑定到变量中的数据

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

先定一个小目标!掌握预处理机制的使用,能够使用指定方法创建预处理SQL语句和绑定数据。9.1.5预处理机制在PHP程序中编写SQL语句时,如果将发送的数据和SQL语句写在一起,每条SQL语句都需要解析器进行分析、编译和优化,效率低。预处理机制是先定义和发送模板形式的SQL语句,用占位符替代实际数据,称为预处理SQL语句,解析器会预先编译预处理SQL语句,再处理相关数据。使用预处理机制可以避免数据中有特殊字符(如单引号)而导致的语法问题出现,提高程序运行效率。下面讲解预处理机制中的预处理方法和数据绑定。9.1.5预处理机制1.预处理方法通过PDO中的预处理方法prepare()和execute()可以实现预处理机制。prepare()方法用于准备预处理SQL语句,execute()方法用以执行预处理语句。prepare()方法语法格式PDOStatementPDO::prepare(string$query,array$options=array())9.1.5预处理机制execute()方法语法格式PDOStatement::execute($input_parameters)$query是预处理SQL语句,该语句中动态变化的量用占位符代替,占位符使用问号占位符“?”和参数占位符“:参数名称”;

$options是可选参数,设置一个或多个PDOStatement对象的属性值$input_parameters是可选参数,表示为预处理SQL语句中的占位符绑定数据,如果预处理SQL语句不包含占位符,可省略此参数。演示如何使用预处理方法:9.1.5预处理机制<?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()); //输出结果:bool(true)2.数据绑定预处理SQL语句中有占位符时,使用execute()方法、bindParam()方法和bindValue()方法为占位符绑定数据。bindParam()方法和bindValue()方法的区别:bindParam()方法将占位符绑定到指定的变量名上,使用execute()方法执行预处理SQL语句时,只需要修改变量名的值。bindValue()方法将值绑定到占位符上,使用execute()方法执行预处理SQL语句时,每修改一次值,都需要重复执行一次bindValue()方法和execute()方法。9.1.5预处理机制(1)execute()方法execute()方法的参数$input_parameters是一个数组,该数组的元素个数必须与预处理SQL语句中的占位符数量相同。当占位符是问号占位符时,$input_parameters必须是一个索引数组;当占位符是参数占位符时,$input_parameters必须是一个关联数组。使用execute()方法为问号占位符绑定数据:<?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预处理机制使用execute()方法为参数占位符绑定数据:$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预处理机制为参数占位符绑定数据可以使用“:参数名”或“参数名”的形式(2)bindParam()方法使用bindParam()方法为问号占位符绑定数据时,bindParam()方法的第1个参数是一个以1开始的数字,表示对应预处理中的第几个问号占位符,使用bindParam()方法为参数占位符绑定数据时,bindParam()方法的第1个参数是“:参数名”或“参数名”的形式。使用bindParam()方法为问号占位符和参数占位符绑定数据://绑定问号占位符$stmt->bindParam(1,$name);$stmt->bindParam(2,$entry_date);//绑定参数占位符$stmt->bindParam(':参数名',$name);$stmt->bindParam('参数名',$entry_date);//省略“:”9.1.5预处理机制将占位符绑定指定的变量后,即可进行变量的赋值和预处理SQL语句的执行:list($name,$entry_date)=['Charles','2019-1-1'];$stmt->execute();list($name,$entry_date)=['Andy','2019-1-1'];$stmt->execute();9.1.5预处理机制(3)bindValue()方法bindValue()方法和bindParam()方法的第1个参数的使用方法相同,bindValue()方法的第2个参数用于传入一个值,它无须进行变量的绑定,使用较为方便。使用bindValue()方法为问号占位符和参数占位符绑定数据://绑定问号占位符$stmt->bindValue(1,'Charles');$stmt->bindValue(2,'2019-1-1');$stmt->execute();//绑定参数占位符$stmt->bindValue(':参数名','Charles');$stmt->bindValue('参数名','2019-1-1');//省略“:”$stmt->execute();9.1.5预处理机制

先定一个小目标!掌握PDO错误处理,能够使用不同的错误处理模式进行错误处理。9.1.6PDO错误处理在使用SQL语句操作数据库时,难免会出现各种各样的错误,如语法错误、逻辑错误等。为了避免SQL语句出现这些错误,我们既可以利用前面学习过的异常处理方式手动捕获PDOException类异常,也可以使用PDO提供的错误处理模式进行错误处理。9.1.6PDO错误处理PDO提供了3种错误处理模式:①PDO::ERRMODE_SILENT:此模式表示在发生错误时不进行任何操作,只简单地设置错误代码。通过PDO类的errorCode()方法和errorInfo()方法获取最后一次操作的错误码和错误信息。②PDO::ERRMODE_WARNING:此模式表示在发生错误时,将错误作为警告抛出,不中断程序的运行。③PDO::ERRMODE_EXCEPTION:此模式是默认的错误处理模式,它表示在错误发生时抛出相关异常。此模式在项目调试当中较为实用,可以快速地找到存在问题的代码。9.1.6PDO错误处理setAttribute()方法用于设置PDO的属性,在程序中使用该方法设置错误处理模式。语法格式PDO::setAttribute(PDO::ATTR_ERRMODE,$value);PDO::ATTR_ERRMODE表示设置错误处理模式,$value表示设为哪种错误处理模式,如PDO::ERRMODE_WARNING。9.1.6PDO错误处理演示如何设置WARNING错误处理模式:<?php$dsn='mysql:host=localhost;port=3306;dbname=myframe;charset=utf8mb4';$pdo=newPDO($dsn,'root','123456');//设置错误模式$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//预处理SQL语句$stmt=$pdo->prepare('SELECT*FROM`test`');//执行预处理SQL语句,若execute()方法返回false表示执行失败if(false===$stmt->execute()){echo'错误码:'.$stmt->errorCode().'<br>'; //输出错误码

print_r($stmt->errorInfo()); //输出错误信息}9.1.6PDO错误处理上述代码运行结果:9.1.6PDO错误处理多学一招:PDO属性的获取PDO属性的获取使用PDO类提供的getAttribute()方法可以获取PDO连接的特定属性的值,用于查询和检索与数据库连接相关的各种属性。getAttribute()方法的语法格式:PDO::getAttribute($attribute);$attribute用于指定要获取的属性的常量值多学一招:PDO属性的获取PDO属性的获取getAttribute()方法中的常量值是PDO::ATTR_*系列常量中的一个,$attribute的可选值如下:PDO::ATTR_AUTOCOMMIT:连接的自动提交模式。PDO::ATTR_CASE:列名在结果集中的大小写方式。PDO::ATTR_CLIENT_VERSION:客户端库版本。PDO::ATTR_CONNECTION_STATUS:连接状态。PDO::ATTR_DRIVER_NAME:驱动程序名称。PDO::ATTR_SERVER_INFO:服务器信息。PDO::ATTR_SERVER_VERSION:数据库服务器版本。多学一招: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'驱动程序名称是'.$driver_name; //输出结果:驱动程序名称是mysql$server_version=$pdo->getAttribute(PDO::ATTR_SERVER_VERSION);echo'服务器的版本是'.$server_version; //输出结果:服务器的版本是8.0.32

先定一个小目标!掌握PDO事务处理,能够使用PDO类的事务处理的相关方法实现事务。9.1.7PDO事务处理PDO类提供了事务处理的相关方法:9.1.7PDO事务处理方法名说明PDO::beginTransaction()启动事务PDO::commit()提交事务PDO::inTransaction()检查是否在事务内PDO::rollBack()回滚事务演示如何进行事务处理:9.1.7PDO事务处理<?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(); //开启事务try{$stmt=$pdo->prepare('INSERTINTO`student`(`name`)VALUES(?)');

//执行插入操作

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

$pdo->rollBack(); //回滚事务echo'执行失败:'.$e->getMessage();}在自定义框架中封装数据库操作类9.2

先定一个小目标!掌握封装DB类的方法,能够在自定义框架中封装DB类。9.2.1【案例】封装DB类在自定义框架中,DB类负责数据库操作,主要包括连接数据库、执行SQL语句、处理结果集等。SQL语句分为查询类和执行类。查询类是指SELECT语句这种有结果集的操作,执行类是指INSERT语句、UPDATE语句、DELETE语句等没有结果集的操作。本案例需要在DB类中封装实现查询类的操作和执行类的操作。

案例需求9.2.1【案例】封装DB类①在C:\web\www\myframe\myframe目录下创建DB.php文件,创建DB类,在DB类中创建getInstance()和init()两个静态方法,getInstance()方法用于连接数据库,init()方法用于传入连接配置。②在config目录下创建database.php文件,保存数据库连接配置,在框架中加载配置。③在DB类中封装查询类操作,创建fetchRow()和fetchAll()方法,实现查询一条数据和查询多条数据。④在DB类中封装执行类操作,创建execute()方法实现执行类操作,创建lastInsertId()方法获取自动增长字段最后插入的id值。

实现思路9.2.1【案例】封装DB类

先定一个小目标!掌握封装Model类的方法,能够在自定义框架中封装Model类。9.2.2【案例】封装Model类在自定义框架中,Model类负责对数据表进行增、删、改、查等操作,每个Model类对应一张数据表。Model类使用数据表名称来命名,在Model类中根据类名自动识别表名,能够根据条件查询数据,对数据排序和限量。

案例需求9.2.2【案例】封装Model类①在myframe目录下创建Model.php文件,实现初始化表名功能。②创建查询数据方法,用于执行SELECT语句,具体方法说明如下。get()方法:查询多条记录,其参数为字段数组,如果省略参数表示所有字段。first()方法:查询一条记录,其参数为字段数组,如果省略参数表示所有字段。value()方法:查询单个字段,其参数为字段名。③创建where()方法和orWhere()方法,实现条件查询。

实现思路9.2.2【案例】封装Model类④创建orderBy()方法和limit()方法,分别实现排序和限量。⑤创建insert()方法和insertGetId()方法实现新增数据,insert()方法返回的结果是新增的记录数,insertGetId()方法返回的结果是最后插入的id值。⑥创建update()方法实现修改数据,返回的结果是受影响的行数。⑦创建delete()方法实现删除数据,返回的结果是被删除的数据条数。

实现思路9.2.2【案例】封装Model类Smarty模板引擎9.3

先定一个小目标!掌握Smarty的安装,能够独立安装Smarty。9.3.1安装SmartySmarty是使用PHP语言开发的模板引擎,具有响应速度快、语句自由、支持插件扩展等特点。Smarty实现了PHP代码与HTML代码的分离,使PHP开发人员专注于数据的处理及功能模块的实现,网页设计人员专注于网页的设计与排版工作。9.3.1安装Smarty使用Composer可以安装Smarty模板引擎。在命令提示符窗口中,切换到C:\web\www\myframe目录,执行安装Smarty模板引擎的命令:composerrequiresmarty/smarty=~4.39.3.1安装Smarty执行安装命令后,打开composer.json,会看到该文件自动添加了Smarty的相关配置:"require":{"smarty/smarty":"^4.3"}安装Smarty后,打开vendor目录,会看到里面新增了smarty目录,Smarty的核心文件在vendor\smarty\smarty\libs目录下,该目录中的文件和目录介绍如下:9.3.1安装Smarty名称说明Autoloader.phpSmarty中实现自动载入文件功能的类bootstrap.php实现自动加载Smartydebug.tplSmarty中的提示信息模板文件functions.php辅助函数文件Smarty.class.phpSmarty核心类文件,提供相关方法用于实现Smarty模板引擎的功能plugins自定义插件目录,存放各类自定义插件的目录sysplugins存放系统文件目录

先定一个小目标!掌握Smarty的基本使用,能够使用Smarty的语法在模板展示数据。9.3.2Smarty的基本使用Smarty的常用语法:语法说明if指令条件判断foreach指令循环展示数据include指令引用其他模板文件9.3.2Smarty的基本使用Smarty的常用方法:方法说明assign()向模板页面分配变量display()展示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论