PHP数据库拓展之PDO使用总结:

PDO(PHP Data Object)是PHP的数据对象,它为PHP访问数据库提供了一种兼容一致的轻量级接口,也就是提供了一个数据库访问抽象层,不管使用哪种数据库,都可以使用相同的API来访问和操作数据,大大降低了不同数据库操作的维护工作;另外,PDO提供了对SQL的预编译功能,使执行相同的SQL不需要每次重新加载和编译,可以很好的解决SQL编译性能问题。PDO拓展本身不提供任何数据库功能,须使用具体数据库PDO驱动来访问数据库服务。

·     拓展的作用

·     安装与配置

·     预定义常量

·     连接及操作

·     错误及处理

1、拓展的作用

NOTE:

Php Api:PDO封装及兼容的供php进程调用的数据库访问接口;

Pdo Interface:PDO驱动层关于PDO拓展的接口实现及逻辑处理;

2、安装与配置

A、PDO拓展

PDO在PHP5.0及以前是作为一个PECL拓展使用,而在PHP5.1及后续版本已附带PDO拓展,对于前者,我们可以查看关于PECL拓展安装文章《PHP安装、配置及拓展总结》,地址:

http://blog.csdn.net/why_2012_gogo/article/details/51120645

对于后者,我们只需要启用对应数据库类型的PDO驱动即可,请继续往下看PDO驱动。

B、PDO驱动

这里以PDO_MYSQL(支持数据库版本3.x/4.x/5.x)驱动为例进行说明(同样适合PHP5.0及以前版本),具体如下(我的PHP为5.6.20,源码包ext中已经带有PDO驱动):

$cd php-5.6.20/ext/pdo_mysql

$sudo phpize

$sudo ./configure

--with-php-config=/usr/local/bin/php-config --with-pdo-mysql=/usr/local/mysql

$sudo make

$sudo make install

PDO驱动位置:

Installing shared extensions:

/usr/local/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so

C、PDO配置

php.ini:

[pdo]

extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so

NOTE:

配置后,重启PHP服务,例如:fpm、apache等

D、验证安装

<?php

phpinfo();

?>

结果:

说明我们已经安装好了PDO_MYSQL驱动,默认PDO_SQLITE已经添加了。

3、预定义常量

自PHP 5.1及后续版本起,开始使用PHP类常量,之前版本使用类似PDO_PARAM_BOOL这样的全局常量,接下来继续介绍下一些常用的PDO预定义常量:

A、数据类型

//布尔数据类型

PDO::PARAM_BOOL(integer)

//整型数据类型

PDO::PARAM_INT(integer)

//字符串数据类型 SQL中的CHAR,VARCHAR及其它字符串类型

PDO::PARAM_STR(integer)

//NULL数据类型

PDO::PARAM_NULL

//大对象数据类型

PDO::PARAM_LOB

B、获取方式

//指定存储过程的INOUT参数

PDO::PARAM_INPUT_OUTPUT(integer)

//将结果集每一行作为一个对象返回,对象的属性名对应列名,

//但在PDOStatement::fetchAll() 中无效

PDO::PARAM_LAZY(integer)

//将结果集中的每一行作为一个属性名对应列名的对象返回

PDO::PFETCH_OBJ(integer)

//指定获取方式,返回 TRUE 且将结果集中的列值分配给通过//PDOStatement::bindParam() 或PDOStatement::bindColumn() 方法绑定的 PHP 变//量

PDO::FETCH_BOUND(integer)

NOTE:

至于其他的预定义常量,可参看文档:

http://php.net/manual/zh/pdo.constants.php

4、连接及操作

PHP使用PDO连接到数据库,是通过建立PDO实例进行的,不论使用哪种驱动程序,都是使用PDO类名构建,PDO构造函数接受用于指定数据源(DSN)以及用户名和密码。

A、连接

为了方便,这里创建了一个PDO连接和管理的封装类,方便维护和拓展:

class PDOEntity {

private $_dsn = 'mysql:host=localhost;dbname=study';

private $_user = 'root';

private $_pass = '';

private $_dbh = null;

function __construct() {

if(null ==$this->_dbh) {

try {

$this->_dbh= new \PDO(

$this->_dsn,

$this->_user,$this->_pass,

array(\PDO::ATTR_PERSISTENT=>true)           // 持久化连接

);

} catch(\PDOException$e) {

print 'Error:'.$e->getMessage().'</br>';

die();

}

}

}

public function getDsn(){

return $this->_dsn;

}

public function getUser(){

return $this->_user;

}

public function getPass(){

return $this->_pass;

}

public function getDbh(){

return $this->_dbh;

}

public function clearDbh(){

$this->_dbh = null;

}

}

B、连接操作

<?php

// 提供一个对外访问PDO的函数(单例模式)

private function getPDOEntity(){

$pdoEntity = null;

if(null ==$pdoEntity) {

$pdoEntity = new PDOEntity();

}

return $pdoEntity;

}

?>

NOTE:

PDO的连接实际就是通过创建PDO实例连接的,这里也就是间接通过创建PDOEntity来连接的,如上面的getPDOEntity即为连接操作。

B、操作

这里以查询为例说明其使用:

<?php

$pdo = $this->getPDOEntity();

try {

// 查询id=1的记录

$statement = 'SELECTid,account,nickname,email,address FROM t_user_info WHERE id=?';

$stmt = $pdo->getDbh()->prepare($statement);

// 执行sql及替换占位符

if($stmt->execute(array($_GET['id']))){

//echo$stmt->debugDumpParams();exit;

// 返回值变量绑定

$stmt->bindColumn('id',$id);

$stmt->bindColumn('account',$account);

$stmt->bindColumn('nickname',$nickname);

$stmt->bindColumn('email',$email);

$stmt->bindColumn('address',$address);

// 显示打印

while ($stmt->fetch()){

echo 'id:'.$id.'---account:'.$account.'---nickname:'.$nickname.'---email:'.$email.'---address:'.$address;

}

} else {

echo '预处理语句执行失败!';

}

} catch(\PDOException$e) {

print 'Error:'.$e->getMessage().'</br>';

die();

} finally {

// 关闭PDO

$this->clearDbh();

}

?>

NOTE:

bindColumn:将返回的结果,以列名形式绑定到变量。

5、错误

如果应用程序不在 PDO 构造函数中捕获异常,zend 引擎采取的默认动作是结束脚本并显示一个回溯跟踪,此回溯跟踪可能泄漏完整的数据库连接细节,包括用户名和密码。因此有责任去显式(通过catch 语句)或隐式(通过set_exception_handler())地捕获异常。

NOTE:

PDO相关的api使用,这里不能全部列出,具体可参考:

http://php.net/manual/zh/refs.database.abstract.php

技术讨论群:

489451956(新)

PHP数据库拓展之PDO使用总结相关推荐

  1. 数据库抽象层 PDO

    因为这段时间工作比较忙  所以很长时间没有更新技术博客了. 在这段时间学习到了很多以前没有接触过的东西.下面就来介绍一下数据库抽象层PDO的使用: PDO(PHP Data Objects)是一个轻量 ...

  2. php pdo输出数据库,PHP中PDO对像及PDOStatement::fetch()的用法数据库查询,结果输出处理...

    //isset()判读用户是否提交查询请求 if(isset($_GET['dosubmit'])){ //创建PDO数据库查询对象 $pdo=new PDO('mysql:host=localhos ...

  3. php pdo操作mysql_PHP操作数据库详细(PDO)

    PHP 5.1 发布时将附带一个全新的数据库连接层,即 PHP Data Objects (PDO).虽然 PHP 一直都拥有很好的数据库连接,但 PDO 让 PHP的数据库操作 达到一个新的高度.P ...

  4. php大量数据库抽象,PHP系列(十二)数据库抽象层pdo

    PHP系列(十二)数据库抽象层pdo 发布时间:2020-06-01 10:07:54 来源:51CTO 阅读:503 作者:sswqzx 1.数据库抽象层pdo (1).PDO(php data o ...

  5. php study 直接显示代码_《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12

    18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PDO ...

  6. php pdo 新建数据库,php – 使用PDO数据库类而不是每次都创建新...

    我有这个PDO数据库类 class clsDatabase{ // db settings private $host = 'localhost'; private $user = 'test'; p ...

  7. php .accdb,PHP:调试与Access数据库(.accdb)的PDO连接

    我是编程新手,想使用PDO类连接到ms-access(accdb)数据库. Environement:PHP(5.5.11)/ XAMPP / Windows 7专业版.启用了ODBC(win32)的 ...

  8. php7.*连接mssql数据库,使用PDO连接,同时兼容windows和centos

    首先说明,安装部分,我是转载的. 一.首先是windows安装扩展,转载自:https://www.cnblogs.com/huixch/p/7065033.html 7.0.x的扩展下载地址: Mi ...

  9. pdo连接mysql数据库(简洁明了)

    一 实例化pdo对象 $dsn = "mysql:dbname=test;host=127.0.0.1"; $pdo = new PDO($dsn,'root','root'); ...

最新文章

  1. Dynamics CRM 开启EmailRouter日志记录
  2. Android自定义进度条
  3. Api文档生成工具与Api文档的传播(pdf)
  4. POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
  5. 1.9 编程基础之顺序查找 07 不与最大数相同的数字之和
  6. 每天一个linux命令(40):wc命令
  7. 借一本可以编辑HTML,index.html
  8. MySQL 开启慢查询日志
  9. 如何修改RubyOnRails中ActiveRecord默认的表格名和外键字段映射关系?
  10. 鞋类电商出路考:成本洼地在哪里
  11. bluefish中文乱码问题
  12. Excel百宝箱ET特别版
  13. 如何做顶级“新生代农民工”?这几本书为你打开大门
  14. 随机梯度下降法,批量梯度下降法和小批量梯度下降法以及代码实现
  15. R | 导入excel文件乱码
  16. c++二分法求平方根
  17. QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection
  18. 超融合一体机如何影响私有云部署
  19. python爬虫实战——运用requests批量下载qq音乐
  20. 跳过linux磁盘自检

热门文章

  1. 生产者消费者 读者写者
  2. 打破所有权,创客经济的Web3.0之旅
  3. linux 中 ~/. 是什么意思
  4. 面朝大海,春暖花开(部分引用)
  5. emqtt配置MySQL_EMQTT服务器部署与配置
  6. linux svn拒绝,Linux SVN的安装以及配置
  7. AHP层次分析法matlab实现
  8. AddressSanitizer的使用
  9. AddressSanitizer使用入门
  10. 在IIS服务器上部署SSL证书(基于阿里云平台)