文档章节

PHP中的PDO详解

freedonn
 freedonn
发布于 2015/10/12 20:09
字数 777
阅读 271
收藏 6

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

PDO常用方法:
PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作。
PDO::exec()主要是针对没有结果集合返回的操作。如insert,update等操作。返回影响行数。
PDO::lastInsertId()返回上次插入操作最后一条ID,但要注意:如果用insert into tb(col1,col2) values(v1,v2),(v11,v22)..的方式一次插入多条记录,lastinsertid()返回的只是第一条(v1,v2)插入时的ID,而不是最后一条记录插入的记录ID。
PDOStatement::fetch()是用来获取一条记录。配合while来遍历。
PDOStatement::fetchAll()是获取所有记录集到一个中。
PDOStatement::fetchcolumn([int column_indexnum])用于直接访问列,参数column_indexnum是该列在行中的从0开始索引值,但是,这个方法一次只能取得同一行的一列,只要执行一次,就跳到下一行。因此,用于直接访问某一列时较好用,但要遍历多列就用不上。
PDOStatement::rowcount()适用于当用query(“select …”)方法时,获取记录的条数。也可以用于预处理中。$stmt->rowcount();
PDOStatement::columncount()适用于当用query(“select …”)方法时,获取记录的列数。

注解:
1、选fetch还是fetchall?
小记录集时,用fetchall效率高,减少从数据库检索次数,但对于大结果集,用fetchall则给系统带来很大负担。数据库要向WEB前端传输量太大反而效率低。
2、fetch()或fetchall()有几个参数:
mixed pdostatement::fetch([int fetch_style [,int cursor_orientation [,int cursor_offset]]])
array pdostatement::fetchAll(int fetch_style)

fetch_style参数:
■$row=$rs->fetchAll(PDO::FETCH_BOTH); FETCH_BOTH是默认的,可省,返回关联和索引。
■$row=$rs->fetchAll(PDO::FETCH_ASSOC); FETCH_ASSOC参数决定返回的只有关联数组。
■$row=$rs->fetchAll(PDO::FETCH_NUM); 返回索引数组
■$row=$rs->fetchAll(PDO::FETCH_OBJ); 如果fetch()则返回对象,如果是fetchall(),返回由对象组成的二维数组

实例:

<?php 
try{ 
$dbh=newPDO('mysql:host=localhost;dbname=test',$user,$pass); 
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
$dbh->exec("SET CHARACTER SET utf8"); 
/*添加*/ 
$sql = "INSERT INTO `user` (`login` ,`password`)VALUES (:login, :password)"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(':login'=>'king',':password'=>'123')); 
echo $dbh->lastinsertid(); 
/*修改*/ 
$sql = "UPDATE `user` SET `password`=:password WHERE `user_id`=:userId"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(':userId'=>'7', ':password'=>'4607e782c4d86fd5364d7e4508bb10d9')); 
echo $stmt->rowCount(); 
/*删除*/ 
$sql = "DELETE FROM `user` WHERE `login` LIKE 'ke'"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(); 
echo $stmt->rowCount(); 
/*查询*/ 
$login = 'kevi'; 
$sql = "SELECT * FROM `user` WHERE `login` LIKE :login"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(':login'=>$login)); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
print_r($row); 
} 
print_r( $stmt->fetchAll(PDO::FETCH_ASSOC)); 
$dbh=null; //断开连接 
}catch(PDOException$e){ 
print"Error!:".$e->getMessage()."<br/>"; 
die(); 
} 
?>

 

事务:

<?php 
try { 
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', ''); 
$dbh->query('set names utf8;'); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$dbh->beginTransaction(); 
$dbh->exec("Insert INTO `test`.`table` (`name` ,`age`)VALUES ('mick', 22);"); 
$dbh->exec("Insert INTO `test`.`table` (`name` ,`age`)VALUES ('lily', 29);"); 
$dbh->exec("Insert INTO `test`.`table` (`name` ,`age`)VALUES ('susan', 21);"); 
$dbh->commit(); 
} catch (Exception $e) { 
$dbh->rollBack(); 
echo "Failed: " . $e->getMessage(); 
} 
?> 

 排除错误:

$sth = $dbh->prepare('select * from db where SN = :SN'); 
$sth->bindParam(':SN',$value[SN]); 
$sth->execute(); 
if ($sth->errorCode()) 
{ 
echo "有错误!有错误!"; 
print_r($sth->errorInfo()); 
}

 

本文转载自:http://blog.iqingniu.com/223.html

共有 人打赏支持
freedonn
粉丝 25
博文 258
码字总数 16565
作品 0
潍坊
程序员
PHP PDOStatement对象bindpram()、bindvalue()和bindcolum

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

开元中国2015
2015/07/31
233
0
PHP 自 5.2 到 5.6 中新增的功能详解[转]

本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征。 PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期...

W_Lu
2014/02/07
0
2
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
PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3...

mickelfeng
2014/09/24
0
0
Memcache的安装使用及与mysql交互实例

一、Memcache介绍 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等...

行者PHPer
2012/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
10
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
20
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部