PHP数据库拓展之PDO使用总结
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使用总结相关推荐
- 数据库抽象层 PDO
因为这段时间工作比较忙 所以很长时间没有更新技术博客了. 在这段时间学习到了很多以前没有接触过的东西.下面就来介绍一下数据库抽象层PDO的使用: PDO(PHP Data Objects)是一个轻量 ...
- php pdo输出数据库,PHP中PDO对像及PDOStatement::fetch()的用法数据库查询,结果输出处理...
//isset()判读用户是否提交查询请求 if(isset($_GET['dosubmit'])){ //创建PDO数据库查询对象 $pdo=new PDO('mysql:host=localhos ...
- php pdo操作mysql_PHP操作数据库详细(PDO)
PHP 5.1 发布时将附带一个全新的数据库连接层,即 PHP Data Objects (PDO).虽然 PHP 一直都拥有很好的数据库连接,但 PDO 让 PHP的数据库操作 达到一个新的高度.P ...
- php大量数据库抽象,PHP系列(十二)数据库抽象层pdo
PHP系列(十二)数据库抽象层pdo 发布时间:2020-06-01 10:07:54 来源:51CTO 阅读:503 作者:sswqzx 1.数据库抽象层pdo (1).PDO(php data o ...
- php study 直接显示代码_《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12
18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PDO ...
- php pdo 新建数据库,php – 使用PDO数据库类而不是每次都创建新...
我有这个PDO数据库类 class clsDatabase{ // db settings private $host = 'localhost'; private $user = 'test'; p ...
- php .accdb,PHP:调试与Access数据库(.accdb)的PDO连接
我是编程新手,想使用PDO类连接到ms-access(accdb)数据库. Environement:PHP(5.5.11)/ XAMPP / Windows 7专业版.启用了ODBC(win32)的 ...
- php7.*连接mssql数据库,使用PDO连接,同时兼容windows和centos
首先说明,安装部分,我是转载的. 一.首先是windows安装扩展,转载自:https://www.cnblogs.com/huixch/p/7065033.html 7.0.x的扩展下载地址: Mi ...
- pdo连接mysql数据库(简洁明了)
一 实例化pdo对象 $dsn = "mysql:dbname=test;host=127.0.0.1"; $pdo = new PDO($dsn,'root','root'); ...
最新文章
- Dynamics CRM 开启EmailRouter日志记录
- Android自定义进度条
- Api文档生成工具与Api文档的传播(pdf)
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
- 1.9 编程基础之顺序查找 07 不与最大数相同的数字之和
- 每天一个linux命令(40):wc命令
- 借一本可以编辑HTML,index.html
- MySQL 开启慢查询日志
- 如何修改RubyOnRails中ActiveRecord默认的表格名和外键字段映射关系?
- 鞋类电商出路考:成本洼地在哪里
- bluefish中文乱码问题
- Excel百宝箱ET特别版
- 如何做顶级“新生代农民工”?这几本书为你打开大门
- 随机梯度下降法,批量梯度下降法和小批量梯度下降法以及代码实现
- R | 导入excel文件乱码
- c++二分法求平方根
- QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection
- 超融合一体机如何影响私有云部署
- python爬虫实战——运用requests批量下载qq音乐
- 跳过linux磁盘自检