文档章节

PHP中的PDO详解

freedonn
 freedonn
发布于 2015/10/12 20:09
字数 777
阅读 286
收藏 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发展史】PHP5.2 到 PHP5.6 中新增的功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护的 PHP5.2, 其余的一半用户在使用 PHP5.3。 因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围...

良言
09/27
0
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
Memcache的安装使用及与mysql交互实例

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

行者PHPer
2012/05/06
0
0
再论php 5.3.6以前版本中的PDO SQL注入漏洞问题

我曾经写一篇《PDO防注入原理分析以及使用PDO的注意事项》,里面描述到php 5.3.6之前的PDO可能存在SQL注入之问题,并给出了彻底的解决方案,有的朋友给我发电子邮件,对此有疑问,说是在php 5...

月影又无痕
2013/09/22
0
3

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
24分钟前
5
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
25分钟前
3
0
my.ini

1

architect刘源源
41分钟前
3
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
49分钟前
5
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
55分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部