文档章节

PDO详解

lonelydawn
 lonelydawn
发布于 2016/06/16 20:23
字数 1469
阅读 470
收藏 24

一、PDO诞生的意义

PHP对数据库支持的抽象度不够,接口不统一。每一种数据库环境都必须重新定义数据库的操作。在这种背景下,统一操作接口PDO诞生了。

在PHP中,有三种数据库连接方式:

(1)mysql 最常用,过程式风格的一种应用

(2)mysqli,mysql函数的增强版,提供面向对象和过程两种风格的API,增加了预编译和参数绑定等新的特性

(3)PDO统一抽象接口,更类似于mysqli

 

二、PDO常用函数

PDO中包含三个预定义类:PDO、PDOStatement和PDOException

(1)PDO类中的常用方法有:

beginTransaction():开启事务机制

commit():提交事务

exec():执行一条SQL语言并返回影响的行数

prepare():为执行准备一条SQL语句,返回语句执行后的联合结果集

query():执行一条SQL语句并返回一个结果集

rollBack():回滚一个事务

getAttribute():获取一个数据库连接属性

setAttribute():设置一个数据库连接属性

 

(2)PDOStatement类中常用方法有:

bindParam():绑定一个PHP变量到一个预处理语句中的参数

execute():执行一条预处理语句

fetch():从结果集中取出一行

fetchAll():从结果集中取出一个包含所有行的数组

fetchColumn():返回结果集中某一列的数据

 

(3)PDOException是对exception类的简单重写,这里不作介绍

 

 

三、PDO的简单使用

1.在windows系统下,开启PDO需要在php.ini中将

;extension=php_pdo_mysql.dll

前面的分号去掉,如果使用的数据库不是mysql,则将对应的数据库扩展配置前面的分号去掉

在linux或者ngnix系统下,开启PDO也需要在php配置文件中将对应的拓展前的注释符号去掉。

 

2.在数据库中建立test数据库和一张test表,如下图所示

 

在服务器目录下新建一个php脚本如下:

<?php

try{

//配置数据源,数据库服务器IP和数据库名

$dsn="mysql:host=127.0.0.1;dbname=test";

$db=new PDO($dsn,"root","");


//设置异常可捕获

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

 

$db->exec("set names utf8");

//插入新数据

$sql="insert into test(name) values('HeCheng')";

$db->exec($sql);

 

}catch(PDOException $err){

echo $err->getMessage();

}

?>

结果如下:

 

三、PDO预编译和参数绑定

预编译:

<?php

try{

//数据库地址,数据库,数据库账户和密码

$dsn="mysql:host=127.0.0.1;dbname=test";

$db=new PDO($dsn,"root","");

 

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$insert=$db->prepare("insert into test(name) values(?);");

//插入

$insert->execute(Array("HeChengLei"));

 

//异常语句

//$insert->execute(Array("ZhangJun","1983-09-21"));

 

//查找

$select=$db->prepare("select * from test");

$select->execute();

var_dump($select->fetchAll(PDO::FETCH_ASSOC));

 

}catch(PDOException $err){

echo $err->getMessage();

}

?>

 

结果:

 

 

参数绑定:

<?php

$name='HeCheng';

$dsn="mysql:host=127.0.0.1;dbname=test";

 

$db=new PDO($dsn,"root","");

 

//用?代替param

$sth=$db->prepare("select * from test where name=?");

//参数绑定

$sth->bindParam(1,$name,PDO::PARAM_STR,12);

$sth->execute();

var_dump($sth->fetchAll(PDO::FETCH_ASSOC));

 

//用:param代替param

$sth=$db->prepare("select * from test where name=:name");

$sth->bindParam(':name',$name,PDO::PARAM_STR,12);

$sth->execute();

var_dump($sth->fetchAll(PDO::FETCH_ASSOC));

?>

 

结果:

 

PDO最大的特点就是引入了预编译和参数绑定,二者的关系其实就是同一件事情的不同阶段,参数绑定使用bindParam()函数传入参数。

 

四、SQL注入与参数绑定

1.SQL注入的原理

MySQL注入又称为SQL Injection,通过构造特定的SQL语句获取权限外的数据。

SQL注入的原理非常简单,就是在原有SQL语句上添加一些布尔条件语句。

例,在浏览器中执行下列请求:

http://127.0.0.1/index.php?name=HeCheng

数据库执行对应的SQL语句如下

select * from test where name=’HeCheng’;

但如果一些不良客户构造这样的请求如:

http://127.0.0.1/index.php?name=HeCheng or 1=1

数据库即执行下列SQL语句

select * from test where name=’HeCheng’; or 1=1;

将会把数据库表中所有客户的信息查找出来,造成客户信息泄露

 

2.SQL注入的防范

实际上,SQL注入的技术含量并不高,防范也非常简单。

在处理客户输入的信息时,如果是整型变量,就是用intval()把传入的参数转化为一个数值。对于字符型变量,可以使用addslashes()把所有单引号、双引号、反斜线和空字符转化为含有反斜线的溢出字符。对于可能出现的特殊字符,进行转译和过滤。

 

3.使用PDO参数绑定防范SQL注入

PDO的参数绑定就是防范SQL注入的一种好办法。

其函数原型为:

<?php

function bindParam(&$sql,$location,$var,$type){

switch ($type) {

default:

case 'STRING':

$var=addslashes($var);

$var="'".$var."'";

break;

case "INTEGER":

case "INT":

$var=(int)$var;

//还可以拓展多种类型

}

for($i=1,$pos=0;$i<=$location;$i++)

$pos=strpos($sql,'?',$pos+1);

 

$sql=substr($sql,0,$pos).$var.substr($sql,$pos+1);

}

?>

 

五、PDO的事务机制

PDO中使用beginTransaction()创建事务,使用commit()或者rollback()结束事务。

在使用beginTransaction()后,如果事务中有异常出现或者没有提交事务即关闭数据库连接和结束脚本,事务会自动回滚,即终止前的所有语句都不会生效。这体现了事务的原子性。

如:

$db->beginTransaction();

$db->exec(“insert into test(name) values(‘ZhangDa’)”);

$db->exec(“insert test(name) values(‘WangGang’)”);//这条语句是错误的,无法执行

$db->commit();

 

在这段代码中,因为使用了事务机制,第二个插入语句错误会导致第一个插入语句也不会生效。

 

六、PDO的效率问题

PDO比mysql、mysqli的连接更为稳定,但在效率上却不一定比直连更好。而且在实际应用中,数据库迁移的情况不是很多,PDO更无法保证一次编写,到处运行。所以推荐在新应用中考虑使用PDO,在旧的应用中则没有必要进行重构。

© 著作权归作者所有

共有 人打赏支持
lonelydawn
粉丝 42
博文 50
码字总数 52905
作品 0
闵行
前端工程师
加载中

评论(3)

os790858223
os790858223
21313232132
开源中国红薯批发商
开源中国红薯批发商
旧的应用如果要升级到PHP7,必须抛弃mysql扩展,改用mysqli或者PDO。
Loveni
Loveni
好用否
PHP PDOStatement对象bindpram()、bindvalue()和bindcolum

PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别 PDOStatement::bindParam ― 绑定一个参数到指定的变量名。 绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或...

开元中国2015
2015/07/31
233
0
PHP中的PDO详解

PDO 是一个“数据库访问抽象层”,作用是统一各种数据库(MySQL、MSSQL、Oracle、DB2、PostgreSQL……)的访问接口,能轻松的在不同的数据库之间完成切换,使得数据库间的移植容易实现。 PD...

freedonn
2015/10/12
227
0
Ubuntu16.04手动编译PHP5.6.30详解

记录下爬坑过程,以便以后使用 原料: Ubuntu16.04 Server PHP5.6.30 步骤: 手动编译源码之前需要提前安装编译环境,以下为所需要的安装包: apt-get -y install gcc libxml2-dev libssl-de...

luweiv998
2017/03/17
0
0
SylixOS-IgH系统平台搭建

1.参考手册 下面7个文件存放在本地服务器“\10.9.1.113.研发部9.ExchangeFolder郑磊”路径下 《RealEvo-IDE使用手册》 《SylixOS应用开发手册》 《SylixOSshell用户手册》 《SylixOS-IgH使用...

zhengleich
05/15
0
0
微擎数据库缓存的增、删、改和查函数详解

函数所在文件:framework/function/cache.mysql.func.php 目前微擎的个人真实调用: $setting = $this->module['config']; $aaaaa = $setting['copyright']; 在微擎微信公众号系统里面可以分...

gutaotao1989
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
4
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部