开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第三阶段:PDO 事物功能】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/713/detail/12733
PDO 类基本应用
内容介绍:
一、前言
二、基本应用
三、示例演示
四、小结
一、前言
目标:快速了解PDO类的基本功能,能够利用PDO类实现数据库的初始化认证和SQL执行。
先进行数据库的初始化认证再执行SQL。
概念:
PDO类基本应用:了解PDO类的方法,使用PDO方法解决相应需求问题
二、基本应用
1. PDO类虽然提供了很多方法,但是常用的方法有以下几个,因为PDO类是一个工具类考虑比较全面,需要解决大多数问题,而实际应用用不到。
PDO::_construct():实例化PDO对象:帮助实现连接认证、数据库连接、字符集设置。数据库认证连接好后直接执行SQL完善业务。
PDO:.exec():执行一个写操作SQL指令,返回受影响的行数。业务中的执行分为读和写两个操作。
PDO:query():执行一个读操作SQL指令,返回一个PDOStatement类对象(后者进行数据解析操作)利用PDOStatement类中的其它方法进行操作。
PDO::errorCode()和PDO::errorInfo():获取上次错误的信息(错误码和错误描述数组)
2. PDO实例化对象:利用其构造方法_construct(string \$dsn, string $user,string \$pass [, array \$drivers])实现。[, array \$drivers])可以不存在,string $user,string \$pass [, array \$drivers])三个理论上也可以不存在,但是在连接认证时用户名密码都需要提供。构造方法由4个参数组成,其中一般前三个为必须参数,第四个为可选参数
1)$dsn:一个数据库基本信息字符串,包含数据库产品,主机地址等
l 驱动名字(数据库产品),使用英文:分隔,PDO可以操作多个数据库,操作具体的数据库如mysql:表示使用mysql数据库
l 驱动选项(主机地址),使用host=具体主机地址,跟在驱动名字之后,如'mysql:host=localhost'
l 驱动选项(端口),使用port=端口号,默认为3306可以不写,拼凑在驱动名字后,不区分先后顺序。如'mysql:host=localhost;port=3306'或者'mysql:port=3306;host=localhost',使用分号和其他驱动分开
l 驱动选项(数据库名字),使用dbname=数据库名字(可以事先没有)
l 字符集设置(字符集名字)使用charset=字符集名字(可以事先没有)
2)$user :用户名,如果数据库允许匿名用户出现﹐那么可以没有该参数(只有dsn)
3)$pass:密码,与用户名一样
4)$drivers: PDO属性设置,是关联数组,利用PDO内部的常量进行设置。若想要使用可以查看具体说明。案例大部分使用都为($dsn, $user, $password)
以上就是一些基本使用。exec()和query()不做讲解,只是一个方法,用SQL就可以执行。errorCode()和errorInfo()在以上方法出错时可以获取错误。
三、示例演示
PDO如何具体实现基本应用?
1、步骤
1、实例化PDO对象,完成数据库初始化认证
2、根据SQL类型选择不同的方法执行SQL,写操作就使用PDO的exec()方法,读操作使用query()方法。
3、检查SQL可能存在的语法错误
2、示例:
(1)实例化PDO对象,完成初始化操作
#方案1:直接写入数据进行数据库初始化
$pdo = new PDO('mysql: host=localhost;port=3306;dbname=db_2; charset=utf8 ' , ' root ' , ' root');
//主机地址、端口号、dbname、charset、用户名、密码
#方案2:利用变量保存数据来实现数据库初始化(数据来源可以是其他配置文件:安全)
$dsn = 'mysql:host=localhost; dbname=db_2 ; charset=utf8 ' ;
$user = 'root' ;
$pass = 'root ';
$pdo = new PDO($dsn , suser , $pass) ;
//可以将参数放在其它配置文件中安全进行操作,不要在编写时直接编写,因为一旦修改就需要修改其中的代码,所以使用配置文件配置,采用从中读取的方式,配置文件一处修改后都可以使用,只要是数据库实例化都会去使用得到新内容。
两种方式都可以,在Sublime Text中新建32pdo.php保存到本机上,接着输入
#PDO的基本操作
#1、实例化
$pdo=new PDO(‘mysql:host=localhost;port=3306;dbname=db_2;charset=charset’,’root’,’root’)
new PDO就可以实现数据库的连接、字符集的选择等,有三个参数,第一个是数据库的信息:产品,此处使用mysql产品因为开启了mysql扩展,若使用其它不能连接,主机地址连接当前host,端口等于3306,dbname为db_2,再加上charset,没有顺序;第二个参数为用户root;第三个参数为密码。
完成后还需要进行使用,所以使用对象:$pdo进行保存。
再来查看该对象:输入
var_dump($pdo);
在下图输入32pdo.php
出现报错:unknown character
上述代码中的charset=charset改为charset=utf8。出现报错系统可以直接看到。再来刷新得到一个对象object(PDO)#1{0}{}
看到在PDO的对象中没有属性,为0,意味着mysql:host=localhost;port=3306;dbname=db_2;charset=charset’,’root’,’root’
中的数据没有进行数据保存。也不能后期修改。因为连接完成就不再使用,所以不进行保存。所以PDO类没有属性。
以上实例化PDO后,就可以进行SQL操作。
(2)得到对象后,我们就可以利用PDO对象调用相关方法执行SQL操作: exec执行数据返回SQL,query执行有结果返回SQL
#实例化PDO对象
$pdo = new PDO( 'mysql:host=localhost;port=3306; dbname=db_2 ' , ' root' , ' root');
#写操作
$sql = "delete from t_28";
#模拟SQL指令
$rows = $pdo >exec($sql);
#得到受影响的行数:执行失败返回false
#读操作
$sql = "select * from t_40";
$stmt = $pdo->query($sql);
#成功返回PDOStatement类对象,失败得到false
进行读操作:delete from,进行写操作:select * from,然后使用query方法。
演示:在代码中继续输入:
#写操作执行
$sql = ‘delete from t_28 limit 1’;
$res=$pdo->exec($sql);
//最终会拿到一个结果
var_dump($res);
//布尔类型无法输出,使用dump
完成后在页面刷新,得到结果
object(PDO)#1(0){}int(1)
int(1)说明当前删除成功,返回受影响的行数。
如果失败会返回一个false,演示失败:
$sql = ‘delete from t_28limit 1’;
再刷新得到结果
object(PDO)#1{0}{}bool(false)
以上就是写操作,注释掉代码var_dump($res);,再来输入
#读操作执行
$sql = “select * from t_40”;
$stmt = $pdo->query($sql);
var_dump($stmt);
//打印结果
刷新页面结果显示
object(PDO)#1(0){}object(PDOStatement)#2(1){[“queryString”]=>string(18)*select*from t_40*}
拿到PDO类的对象,其中只有一个属性queryString。
正确会得到对象,演示错误:
$sql = “select * fromt_40”;
再刷新得到结果
object(PDO)#1{0}{}bool(false)
所以错误同样得到false,但是false不能具体显示哪处错误,所以要对错误进行处理。
(3)如果PDO对象在执行SQL时出现错误,即SQL本身有错误,那么可以通过PDO类提供的errorCode()和errorlnfo()
#实例化PDO对象
$pdo = new PDO('mysql:host=localhost;port=3306; dbname=db_2 ' , ' root ' , ' root');
#写操作
$sql = "delete fromt_40"; #错误SQL
$rows = Spdo->exec($sql);
#错误判定: exec方法执行结果成功也存在返回0的情况,错误会返回false,所以要判定是否是SQL错误,需要判定结果为false
if(false === $stmt){
#取出错误细信息
echo 'SQL错误:
';
echo '错误代码为: ' . $pdo->errorCode() . '
拿到错误编号,一般不会直接echo,而是写到错误日志中进行分析
'; //$pdo->errorCode()
echo '错误原因为: '. $pdo->errorInfo()[2];
# errorInfo返回数组,2下标代表错误具体信息
exit;
#错误不需要继续执行代码
演示:
先来打印错误原因代码,在读操作执行下输入
var_dump($pdo->errorInfo());
刷新页面显示:
object(PDO)#1(0){}bool(false) array(3)([0]=> string(5) 42000"[1]= int(1064)[2]=> string(154) "You have an error in your SQl syntax check the manual that corresponds to your MySQL server version for the right syntax to use near 'fromt_40' at line 1”}
结果是一个数组,有三个元素:内置错误编号、外置错误编号、具体错误信息
再来注释掉打印错误原因的代码,复制第三步代码:
不打印而是直接输出错误原因,结果就会变成:
object(PDO)#1(0){}bool(false) SQL错误:
错误代码为:42000
错误原因为:You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to use near ‘fromt_40’ at line 1
以上错误结果与在cmd运行结果相同,在cmd内输入
mysql -uroot -p
use db_2
select * from_40;
如图与浏览器得到的结果相同
可以将它当成客户端来进行调试,一般在开发阶段。生产阶段写入日志。
四、小结
1、PDO是一种外部提供的扩展,可以通过操作手册来协助学习使用2、PDO类主要用来实现数据库的初始化操作和SQL指令的执行。是PDO类的核心功能
3、SQL执行的结果不论是写操作还是读操作都有可能出错,因为执行的为SQL,而SQL在外部提供,系统没有办法保证sql完全正确,因此需要进行错误处理。