PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操做各类数据库。PDO提供了一个数据访问抽象层,这意味着,无论使用哪一种数据库,均可以用相同的函数(方法)来查询和获取数据。当选择不一样的数据库时,只须要修改PDO的DSN(数据源)便可,有效的解决了早期PHP版本中各个数据库扩展互不兼容,维护性差,可移植性差的缺点。注意:从 PHP 5.1开始附带了PDO,在 PHP 5.0 中是做为一个 PECL 扩展使用。 PDO 须要PHP 5 核心的新 OO 特性,所以不能在较早版本的 PHP 上运行。
建立测试数据表而且插入测试数据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语句、处理结果集而且展现到模板html
<?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>
PDO中提供了query()和exec()方法用于执行SQL语句,query()方法主要是用于有记录结果返回的操做,特别是SELECT操做,执行成功则返回一个PDOStatement类的对象,失败则返回false。exec()则主要针对没有结果集合返回的操做,如INSERT、UPDATE、DELETE等,它用于执行一条SQL语句而且返回执行后受影响的行数。
PDO中经常使用获取结果集的方式有三种:fetch()、fetchColumn()、fetchAll()
PDO中的fetchAll()方法用于返回一个包含结果集中全部行的数组
具体的语法参数就不一一赘述了,可参看PHP手册。mysql
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()方法传递一个索引数组参数,反之,当占位符为命名参数占位符时传入一个关联数组参数
PDO错误处理机制提供了三种方案,经过设置"PDO::ATTR_ERRMODE"的值来进行不一样的处理。下面分别阐述:
<?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(); }