PHP基础之PDO
简介
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()
- PDO中的fetch()方法可以从结果集中获取下一行数据
- PDO中的fetchColumn()方法用于获取结果集中单独一列
- 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"的值来进行不同的处理。下面分别阐述:
- PDO错误处理默认模式
"PDO::ERRMODE_SILENT"为PDO默认的错误处理模式。在发生错误时不进行任何操作,只简单设置错误代码,可以通过PDO提供的errorCode()和errorInfo()这两个方法对语句和数据库对象进行排查。 - PDO错误处理WARNING模式
如果想要查看发生了什么问题且不中断应用程序的流程,可以将PDO的错误模式设置为"PDO::ERRMODE_WARNING",当错误发生时,除了设置错误代码外,PDO还会发出一条E_WARNING信息。 - 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的更多相关文章
- Yii之路(第八)
[URL地址美化]给域名地址做一个别名伪静态.通过设置服务器服务.做域名地址的转换工作. urlManager地址美化,通过程序的方式实现地址的美化工作 http://xxxxx.com/index. ...
- 前端学PHP之PDO基础操作
× 目录 [1]创建PDO [2]使用PDO [3]事务处理 前面的话 PDO(php data object)扩展类库为php访问数据库定义了轻量级的.一致性的接口,它提供了一个数据库访问抽象层,这 ...
- PHP基础知识之————PDO预处理语句
转载处:http://www.cnblogs.com/xiaohuochai/p/6133353.html 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这 ...
- PHP - PDO 之 mysql 基础操作
<?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...
- PDO基础知识
使用PDO之前首先开启PHP的PDO扩展,方法见百度. PDO连接数据库的方式有三种 1.通过参数的形式连接数据库 (推荐) //通过参数形式连接数据库 try{ $dsn = 'mysql:host ...
- PDO 基础知识
PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz(数据库名);host=localho ...
- PDO基础
//PDO:数据访问抽象层 $dsn = "mysql:dbname=mydb;host=localhost";//造PDO对象 $pdo = new PDO($dsn," ...
- PDO 基础
为什么要使用PDO PDO是PHP5新加入的一个重大功能,我们的数据库服务器为MySQL,所有的程序代码的数据库操作全是一mysql()或者mysqli()函数来操作,当我们的数据库 需要更换时比如换 ...
- php 基础代码大全(不断完善中)
下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...
随机推荐
- Swift-数组
Swift数组 OC和Swift数组的比较 OC 只能存放对象 swift 既可以存放对象,又可以存Int,Float等基本数据类型 下面是swift数组的具体示范 空数组 let arr = [] ...
- luke使用
Luke介绍 Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容.能提供: 通过document编号或term浏览索引 查看document内容,可复制 ...
- 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:
Asp.net MVC中的ViewData与ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP. ...
- [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集
虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- Sql基础
SELECT 列名称 FROM 表名称 SELECT * FROM 表名称 SELECT DISTINCT Company FROM Orders 去重 SELECT 列名称 FROM 表名称 WHE ...
- 【原】移动web页面给用户发送邮件的方法 (邮件含文本、图片、链接)
微信商户通有这么一个需求,用户打开H5页面后,引导用户到电脑下载设计资源包,由于各种内部原因,被告知无后台资源支持,自己折腾了一段时间找了下面2个办法,简单做下笔记. 使用mailto功能,让用户自己 ...
- Warning: strftime(): It is not safe to rely on the system's timezone settings.
当运行程序时,会出现如下警告: Warning: strftime(): It is not safe to rely on the system's timezone settings. You a ...
- Doctype作用?严格模式与混杂模式如何区分?它们有何意义?
怪异模式和严格模式(译注:一般称为标准模式:Standards Mode,下文中的严格模式都可以理解为标准模式)是浏览器解析CSS时的两种‘模式’.这篇文章将简单阐述这两种模式之间的差异. 译注:一个 ...
- maven/gradle 打包后自动上传到nexus仓库
前提: nexus的相关repository必须设置允许redeploy,参考下图: maven项目: pom.xml中增加以下节点: <distributionManagement> & ...
- LZ77压缩算法编码原理详解(结合图片和简单代码)
前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图 ...