简介

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();
}

PHP基础之PDO的更多相关文章

  1. Yii之路(第八)

    [URL地址美化]给域名地址做一个别名伪静态.通过设置服务器服务.做域名地址的转换工作. urlManager地址美化,通过程序的方式实现地址的美化工作 http://xxxxx.com/index. ...

  2. 前端学PHP之PDO基础操作

    × 目录 [1]创建PDO [2]使用PDO [3]事务处理 前面的话 PDO(php data object)扩展类库为php访问数据库定义了轻量级的.一致性的接口,它提供了一个数据库访问抽象层,这 ...

  3. PHP基础知识之————PDO预处理语句

    转载处:http://www.cnblogs.com/xiaohuochai/p/6133353.html 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这 ...

  4. PHP - PDO 之 mysql 基础操作

    <?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...

  5. PDO基础知识

    使用PDO之前首先开启PHP的PDO扩展,方法见百度. PDO连接数据库的方式有三种 1.通过参数的形式连接数据库 (推荐) //通过参数形式连接数据库 try{ $dsn = 'mysql:host ...

  6. PDO 基础知识

    PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz(数据库名);host=localho ...

  7. PDO基础

    //PDO:数据访问抽象层 $dsn = "mysql:dbname=mydb;host=localhost";//造PDO对象 $pdo = new PDO($dsn," ...

  8. PDO 基础

    为什么要使用PDO PDO是PHP5新加入的一个重大功能,我们的数据库服务器为MySQL,所有的程序代码的数据库操作全是一mysql()或者mysqli()函数来操作,当我们的数据库 需要更换时比如换 ...

  9. php 基础代码大全(不断完善中)

    下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...

随机推荐

  1. web方式修改svn密码

    原帖:http://www.iusesvn.com/bbs/viewthread.php?tid=20 之前的Apache22Passwd版本有个小bug,用现在的浏览器会显示空白页.这个版本Apac ...

  2. Rocksdb引擎记录格式

    Rocksdb是一个kv引擎,由facebook团队基于levelDB改进而来,Rocksdb采用LSM-tree存储数据,良好的读写特性以及压缩特性使得其非常受欢迎.此外,Rocksdb引擎作为插件 ...

  3. Java中json的构造和解析

    什么是 Json? JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式.  易于人阅读和编写.同时也易于机 ...

  4. Java 发送邮件

    使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) . 你可以在 JavaMail ...

  5. QStatusBar的用法

      QStatusBa,状态栏是位于主窗口的最下方,提供一个显示工具提示等信息的地方.QMainWindow类里面就有一个statusBar()函数,用于实现状态栏的调用.以下例子都在QMainWin ...

  6. spring 定时任务@Scheduled

    1.配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:/ ...

  7. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  8. JMM(java内存模型)

    What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more laye ...

  9. nth-of-type在选择class的时候需要注意的一个小问题

    查了下w3和MDN的手册,没发现有这个说明,写篇随笔记下. 1..class:nth-of-type(n)在选择class的时候,如果在class前面插入x个同类型标签,n需要加上x <!DOC ...

  10. Introducing Holographic Emulation

    Holographic Emulation is a new feature that vastly reduces iteration time when developing holographi ...