简介

PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操作各种数据库。PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。当选择不同的数据库时,只需要修改PDO的DSN(数据源)即可,有效的解决了早期PHP版本中各个数据库扩展互不兼容,维护性差,可移植性差的缺点。注意:从 PHP 5.1开始附带了PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。

基本使用

创建测试数据表并且插入测试数据

 CREATE TABLE `book` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '书名',
`author` varchar(15) DEFAULT NULL COMMENT '作者',
`ptime` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; INSET INTO book VALUES(1,'php','leo',now()),(2,'mysql','lisi',now()),(3,'linux','ben',now()),(4,'apache','lily',now());

连接数据库、执行SQL语句、处理结果集并且展示到模板

<?php
header('Content-type:text/html;charset=utf-8');
//保存数据源基本信息
$arr = array(
'dbms' =>'mysql',
'host' =>'localhost',
'port' =>3306,
'dbname' =>'mytest',
'charset' =>'utf8',
'user' =>'root',
'pwd'=>123456
); $dsn = "$arr[dbms]:host=$arr[host];port=$arr[port];dbname=$arr[dbname];charset=$arr[charset]";//php版本需大于5.3.6才能使用charset属性设置字符集
try{
//连接数据库、选择数据库
$pdo = new PDO($dsn,$arr['user'],$arr['pwd']); //执行sql语句
$sql ='SELECT * FROM book';
$result = $pdo->query($sql); //定义空数组保存数据
$info = array();
//遍历结果集获取数据详细信息
while ($row = $result->fetch()){
$info[] = $row;
} }catch (PDOException $e){
//输出异常信息
echo $e->getMessage().'<br>';
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h2>书籍信息列表</h2>
<table border="1" >
<tr>
<td>图书名称</td>
<td>图书作者</td>
<td>出版日期</td>
</tr>
<?php foreach ($info as $v):?>
<tr>
<td><?php echo $v['name'];?></td>
<td><?php echo $v['author'];?></td>
<td><?php echo $v['ptime'];?></td>
</tr>
<?php endforeach;?>
</table>
</body>
</html>

执行SQL语句

PDO中提供了query()和exec()方法用于执行SQL语句,query()方法主要是用于有记录结果返回的操作,特别是SELECT操作,执行成功则返回一个PDOStatement类的对象,失败则返回false。exec()则主要针对没有结果集合返回的操作,如INSERT、UPDATE、DELETE等,它用于执行一条SQL语句并且返回执行后受影响的行数。

处理结果集

PDO中常用获取结果集的方式有三种:fetch()、fetchColumn()、fetchAll()
  1. PDO中的fetch()方法可以从结果集中获取下一行数据
  2. PDO中的fetchColumn()方法用于获取结果集中单独一列
  3. PDO中的fetchAll()方法用于返回一个包含结果集中所有行的数组

    具体的语法参数就不一一赘述了,可参看PHP手册。

预处理语句

PDO中的预处理语句机制可简单理解为SQL的一种编译过的模板,在执行时,只需在服务器和客户端之间传输有变化的数据即可,可以避免重复分析与编译,由于预处理语句实现了将SQL和数据的分离,因此可以防止SQL注入。以下代码演示预处理语句的使用
<?php

header("Content-type:text/html;charset=utf-8");
try{
//连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456'); //预处理sql语句
$stmt = $pdo->prepare("insert into `book`(`name`,`author`)VALUES (?,?)");
//print_r($stmt);exit();
//为占位符绑定变量
$stmt->bindParam(1,$name);
$stmt->bindParam(2,$author); // 第二种占位符使用方式
// $stmt = $pdo->prepare("insert into `book`(`name`,`author`)VALUES (:name,:author)");
// $stmt->bindParam(':name',$name);
// $stmt->bindParam(':author',$author); //准备数据
$data = array(
array('php第一本教材','人民邮电出版社'),
array('php第二本教材','人民邮电出版社'),
array('php第三本教材','人民邮电出版社'),
array('php第四本教材','人民邮电出版社'),
array('php第五本教材','人民邮电出版社')
);
foreach ($data as $row){
//为绑定的变量赋值
$name = $row[0];
$author = $row[1];
//执行预处理语句
$stmt->execute(); } }catch (PDOException $e){
echo $e->getMessage().'<br>';
}

占位符

可以在SQL语句中添加占位符,当多次执行SQL语句时,只需要编译一次SQL语句,可以使用相同或不同的参数执行多次,可以节省资源。PDO支持两种占位符:问号占位符(?)和命名参数占位符(:参数名称),使用时需注意,同一条SQL语句只能选择一种占位符使用。

参数绑定

准备好预处理语句后可以使用bindParam()方法为占位符绑定变量参数,方法的第一个参数表示参数标识符,第二个参数用于表示参数标识符对应的变量名。

excute()方法

excute()方法有个可选参数,表示一个元素个数与预处理语句占位符数量一样多的数组,用于为预处理语句中的占位符赋值。当占位符为问号占位符时,需要给excute()方法传递一个索引数组参数,反之,当占位符为命名参数占位符时传入一个关联数组参数

错误处理

PDO错误处理机制提供了三种方案,通过设置"PDO::ATTR_ERRMODE"的值来进行不同的处理。下面分别阐述:
  1. PDO错误处理默认模式

    "PDO::ERRMODE_SILENT"为PDO默认的错误处理模式。在发生错误时不进行任何操作,只简单设置错误代码,可以通过PDO提供的errorCode()和errorInfo()这两个方法对语句和数据库对象进行排查。
  2. PDO错误处理WARNING模式

    如果想要查看发生了什么问题且不中断应用程序的流程,可以将PDO的错误模式设置为"PDO::ERRMODE_WARNING",当错误发生时,除了设置错误代码外,PDO还会发出一条E_WARNING信息。
  3. PDO错误处理EXCEPTION模式

    "PDO::ERRMODE_EXCEPTION"表示进行错误异常处理,可以在PDO执行SQL语句错误时,使用try...catch捕捉到PDOException异常。代码如下:
<?php

header("Content-type:text/html;charset=utf-8");
try{
//1.连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456'); //2.设置错误处理
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT); //3.预处理SQL语句
$stmt = $pdo->prepare('select * from books'); //4.执行预处理语句
$stmt->execute();
echo"well-done!"; //5.获取错误码
$code = $stmt->errorCode(); //6.判断执行错误
if (!empty($code)){
echo"<br>$code<br>";
print_r($stmt->errorInfo());
}
}catch (PDOException $e){
echo $e->getMessage().'<br>';
}

事务处理

PDO提供了事务处理机制,对于MySQL数据库来说支持事务的数据引擎有InnoDB和BDB两种。有三个PDO方法可以完成事务任务:beginTransaction()、commit()和rollBack()。测试代码如下:
<?php

    header("Content-type:text/html;charset=utf-8");
//1.连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456');
$pdo->exec('set names utf8');
//2.设置错误处理
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//3.开启事务
$pdo->beginTransaction();
try{ //一次操作
$sql = "delete from book where id=3";
$stmt = $pdo->prepare($sql);
$stmt->execute(); //一次操作
$sql = "delete from book where id=4";
$stmt = $pdo->prepare($sql);
$stmt->execute(); //一次操作
$sql = "delete from book where id=5";
$stmt = $pdo->prepare($sql);
$stmt->execute(); //提交
$pdo->commit();
}catch (PDOException $e){
echo $e->getMessage().'<br>';
//回滚
$pdo->rollBack();
}

最新文章

  1. Meterpreter run vnc 遇到的问题
  2. 如何通过SecureCRTPortable.exe 软件远程连接某个计算机(或者虚拟机)中的某个数据库
  3. DataGridView控件的各种操作总结
  4. mysql的sql_mode 模式修改 my.cnf
  5. 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇05:二段跳》
  6. Running an etcd cluster on localhost
  7. Lucene为不同字段指定不同分词器(转)
  8. javaScript 手写图片轮播
  9. [上海] 携程 门票事业部 招聘.NET 架构师 2 名 - V2EX
  10. Nginx设置alias实现虚拟目录 alias与root的用法区别
  11. UVA - 129 Krypton Factor (困难的串)(回溯法)
  12. NUnit实战,第一个测试类,测试事件触发是否是并行的
  13. python一(字符串,字典)
  14. Oracle数据加载和卸载
  15. Django REST framework 第一章 Serialization
  16. Python流程控制if判断以及whlie循环
  17. win10+Theano+GPU
  18. RSS 使用前详解
  19. sql distinct去除重复
  20. android 自动拨打电话 挂断电话代码

热门文章

  1. VS插件开发 - 登录身份验证
  2. 如何升级PowerShell
  3. 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法
  4. 使用Flask设计带认证token的RESTful API接口[翻译]
  5. 4-iscsi
  6. MYSQL 基本SQL语句
  7. Handler(二)
  8. nginx配置
  9. js实现一个简单计算器
  10. 5G关键技术评述