PDO、PDOStatement、PDOException

最近在学PDO  比较详细的资料

出处:http://blog.csdn.net/hsst027/article/details/23682003

PDO中包含三个预定义的类,它们分别是PDO、PDOStatement、PDOException

PDO:

PDO->setAttribute();

全局属性设置,包括:列名格式和错误提示类型

PDO->query($sql);

常用于执行有返回的sql查找语句,但执行之前要手动转义,返回PDOStatement对象

PDO->exec($sql);

执行没有返回的sql语句,同样要手动转义,有插入、修改、删除操作。返回影响的行数

PDO->lastInsertId();

返回最后一次执行插入的主键值,如果一条语句多次插入则返回第一个主键值:id+rows-1

PDO->beginTransaction();

事务的开启,中间加入多条关联的可执行sql语句,进行块化处理,也叫(回滚起点)

PDO->commit();

事务结束,即回滚结束

PDO->rollback();

事务的回滚处理,即回滚到原起点

PDO->quto($sql);

将$sql语句手动转义,进而进入下一次的处理

PDO->prepare($sql);

生成一个新的编译模板,用于以后的多次重复执行,返回一个PDOStatement对象

PDO->__construct();

建立一个PDO数据库连接对象实例

PDO->errorCode();

捕获PDO错误代码

PDO->errorInfo();

捕获PDO错误信息,返回信息数组

PDO->getAttribute();

获取一个数据库连接对象的属性信息

PDO->getAvailableDriver();

获取有效PDO连接的驱动名称

PDOStatement对象由PDO->query()和PDO->prepare()返回:

PDOStatement->fetch();

以指定格式每次返回一条记录,通常和while配合遍历出内容

PDOStatement->fetchAll();

以指定格式一次性返回所有内容

PDOStatement->fetchColumn(intnum);

返回指定字段索引的一个值,每次返回指定字段的一行,即一个内容值。配合while遍历

PDOStatement->fetchObject();

以面向对象的风格每次返回一条记录,配合while遍历

PDOStatement->bindColumn();

将查找记录集中的列与变量相绑定,进而用变量获取相应列的行内容,用$smt->fetch(::BOUBD)进行遍历

PDOStatement->bindParam();

以引用方式绑定一个变量到占位符,从而完成编译!因为是引用所以可以重复多次

PDOStatement->bindValue();

同上,但只能绑定一次

PDOStatement->closeCursor();

关闭当前的模板编译链接,为下次创建好的模板链接做好准备。(即模板只能有一个链接)

PDOStatement->excute();

执行编译模板,有两种格式。1.先编译后执行,2.边编译边执行

PDOStatement->columnCount();

返回PDOStatement结果集列的总数

PDOStatement->rowCount();

返回PDOStatement结果集行的总数

PDOStatement->nextRowset();

常配合fetch()和fetchAll()判断下一条记录是否存在,以便继续遍历出下一条记录

PDOStatement->errorCode();

返回错误代码

PDOStatement->errorInfo();

返回错误信息

PDOStatement->getAttribute();

PDOStatement->getColumnMeta();

PDOStatement->setAttribute();

PDOStatement->setFetchMode();

各参数及属性介绍:

1.       全局属性,设置列名为一定的格式,指定一种错误提示

***PDO::ATTR_CASE: (强制列名变成一种格式)

PDO::CASE_LOWER: 强制列名是小写.

PDO::CASE_NATURAL: 列名按照原始的方式

PDO::CASE_UPPER: 强制列名为大写.

***PDO::ATTR_ERRMODE:(错误提示.    )

PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码.(默认)

PDO::ERRMODE_WARNING: 显示警告错误.

PDO::ERRMODE_EXCEPTION: 抛出异常.

$dbh->setAttribute(PDO::ERR_MODE,PDO::ERRMODE_SILENT);默认

$dbh->setAttribute(PDO::ERR_MODE,PDO::ERRMODE_EXCEPTION);

$dbh->setAttribute(PDO::ERR_MODE,PDO::ERRMODE_WARNING);

$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS,PDO::CASE_LOWER);

$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS,PDO::CASE_NATURAL);

$dbh->setAttribute(PDO::ATTR_ORACLE_NULLS,PDO::CASE_UPPER);

2.       对编译参数的绑定,即对绑定到占位符的参数进行必要的限制如类型,长度等

PDO_PARAM_BOOL 布尔类型。

PDO_PARAM_INT 整型。

PDO_PARAM_STR  char,varchar和其它字符串类型。

PDO_PARAM_input_output参数传给存储过程时使用此类型,可以在过程执行后修改。

PDO_PARAM_NULL NULL类型。

PDO_PARAM_LOG  大对象类型。

PDO_PARAM_STMT   PDO对象类型,当前不可操作。

$sth->bindParam(‘:calories‘, $calories, PDO::PARAM_INT);

$sth->bindParam(‘:colour‘, $colour, PDO::PARAM_STR, 12);

$sth->bindValue(‘:colour‘, $colour, PDO::PARAM_STR);

3.       对返回值进行相应格式的设定,->fetch(),->fetchAll()

PDO::FETCH_BOTH-- 两者数组形式都有,**这是缺省的**

$result $sth->fetch(PDO::FETCH_BOTH);

PDO::FETCH_ASSOC-- 关联数组形式

$result $sth->fetch(PDO::FETCH_ASSOC);

PDO::FETCH_NUM-- 数字索引数组形式

$result $stmt->fetch(PDO::FETCH_NUM);

PDO::FETCH_OBJ -- 按照对象的形式,同fetchObject()

$result $sth->fetch(PDO::FETCH_OBJ);

$result $sth->fetch(PDO::FETCH_LAZY);

其实PDO最难的一点是对各种参数的理解,而且这方面的中文资料很少,所以正在更新中…

以上返回的结构都是一定的数组和对象的结构。通常用遍历和while的方式进行取值

以下围绕数据库连接及相应的操作:插入、查找、修改、删除进行讲解。

下面两个连接数据库的实例化过程是等价的!

$dsn= MySQL:host=localhost;dbname=world;‘; //数据源名称,为特定的数据库加载相应的驱动

$user= ‘root‘;

$password= ‘root‘;

try{

$dbh= new PDO($dsn,$user, $password[,driverOptions]);//数据库对象的实例化

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置全局属性

}catch(PDOException $e){

echo ‘Error:‘ . $e->getMessage();//错误异常,抛出提示

}

try{

$pdo= new PDO($dsn,$user,$password,array(PDO::ATTR_PERSISTENT=>TRUE,PDO::ATTR_CASE=>PDO::CASE_UPPER,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));//可以用$row[‘city‘]来访问列值,而不必要用$row[‘CITY‘]大写方式来访问

}catch(PDOException $e){

echo ‘Error:‘ . $e->getMessage();//错误异常,抛出提示

}

PDO中包含三个预定义的类,它们分别是 PDO、PDOStatement、PDOException。

持久连接的缓存可以使你避免在脚本每次需要与数据库对话时都要部署一个新的连接的资源消耗,让你的Web应用更加快速。

array(PDO::ATTR_PERSISTENT=> true)就是把连接类型设置为持久连接。

先分四类讨论:

1.PDO->query()主要用于有记录结果返回的操作,特别是查找操作。返回PDOSatement对象

PDO->exec()主要是针对没有结果集合返回的操作。如:设置、修改、删除、插入等操作。返回影响行数。

2.PDO->lastInsertId()返回上次插入操作最后一条ID,但要注意:如果用insert into tb(col1,col2)values(v1,v2),(v11,v22)..的方式一次插入多条记录,lastinsertid()返回的只是第一条(v1,v2)插入时的ID,而不是最后一条记录插入的记录ID。要使得所有的方式都得到统一:$id=PDO->lastInsertId()+rows-1;

PDOStatement::fetch()每一次获取一条记录(即一行)。配合while来遍历。

PDOStatement::fetchAll()是获取所有记录集到一个变量中。

PDOStatement::fetchcolumn([intindex]) 好比单列的fetch()访问。用于直接访问列,参数index是该列在行中的从0开始索引值,但是,这个方法一次只能取得同一行的一列,只要执行一次,就跳到下一行。就好比每次只访问一个内容

PDOStatement::rowcount()适用于当用query("select ...")方法时,获取记录的条数。也可以用于预处理中。$stmt->rowcount();

PDOStatement::columncount()适用于当用query("select ...")方法时,获取记录的列数。

记录集较小时fetchAll效率高,减少从数据库检索次数,但对于大结果集,用fetchAll则给系统带来很大负担。

2、fetch()或fetchall()的几个参数详解:

mixedpdostatement::fetch([int fetch_style[,int cursor_orientation [,intcursor_offset]]])

arraypdostatement::fetchAll(intfetch_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(),返回由对象组成的二维数组

foreach($row as $r){

echo "{$r->cityid}:城市 {$r->city}.<br />";}

$row=$rs->fetchAll(PDO::FETCH_LAZY);

$row=$rs->fetch(PDO::FETCH_LAZY);FETCH_LAZY返回对象如:

PDORowObject( [queryString] => select * from city//这个在特定的时候很有用

[cityid] => 2

[city] => 福州

[countryid] => 1)

$row= $stmt->fetch(PDO::FETCH_BOUND);用于使fetch返回true,并将获取的列值赋给

???bindParam()方法中指定的相应变量。

3.的预处理:(查找、插入、修改、删除等批量数据)

意义:批量进行重复性操作,可实现模块化处理(可以自动转义)

mysql支持两种参数占位方式:问号参数“?”和命名参数“:字段名”;命名参数更明确。

$q="insertinto city(city,countryid) values(?,?)";

//或$q = "insert into city(city,countryid)values(:city,:countryid)";

执行execute后:$pdo->lastinsertid();对预处理也是可用的。

有两种方式:注意两种方式用“?”问号参数绑定时有不同的execute占位引用方式。并且偏移基数不同。

(1)显式地把参数值做为参数传给execute: booleanPDOSTatement::execute([arrayinput_parameters])

命名参数方式:

$q= "insert into city(city,countryid) values(:city,:countryid)";

$stmt= $pdo->prepare($q);

$stmt->execute(array(‘:city‘=>‘hubei‘,‘:countryid‘=>‘2‘));

//本条可多次执行。注意,countryid是数值型,但也要用单引号来包住。

问号参数:

$q = "insertinto city(city,countryid) values(?,?)";

$stmt= $pdo->prepare($q);

$stmt->execute(array(‘0‘=>‘hubei‘,‘1‘=>‘2‘));

//注意这里不是用‘?‘的方式,而是用上面占位符的从0开始的索引偏移,

(2)绑定参数。booleanPDOSTatement::bindParam(mixed parameter,mixed &variable [,intdatatype [,int length [,mixed driver_option]]])

mixed parameter 是占位符,当用?问号参数时,parameter是占位符的从1开始的索引偏移,而不是‘?’.

预处理的绑定列:

booleanPDOStatement::bindcolum(mixed column_index,mixed &param [,inttype [,int maxlen[,mixed driver_options]]]);

参数column_index是要绑定的行中列偏移,从1开始。当然也可以用列名。type就用来设置类型限制变量值,如PDO::PARAM_STR是限制文本,具体参bindParam()。通过maxlen限制其长度。

$calories = 150;

$colour = ‘red‘;

$sth = $dbh->prepare(‘SELECT name, colour, caloriesFROM fruit

WHERE calories < :calories AND colour = :colour‘);

$sth->bindParam(‘:calories‘, $calories, PDO::PARAM_INT);//限制为int类型

$sth->bindParam(‘:colour‘, $colour, PDO::PARAM_STR, 12);//限制长度为12的字串

$sth->execute();

$calories = 150;

$colour = ‘red‘;

$sth = $dbh->prepare(‘SELECT name, colour, caloriesFROM fruit

WHERE calories < :calories AND colour = :colour‘);

$sth->execute(array(‘:calories‘ => $calories, ‘:colour‘ => $colour));//直接以数组的形式

$calories = 150;

$colour = ‘red‘;

$sth = $dbh->prepare(‘SELECT name, colour, caloriesFROM fruit

WHERE calories < ? AND colour = ?‘);

$sth->execute(array($calories, $colour));

$calories = 150;

$colour = ‘red‘;

$sth = $dbh->prepare(‘SELECT name, colour, caloriesFROM fruit

WHERE calories < ? AND colour = ?‘);

$sth->bindParam(1, $calories, PDO::PARAM_INT);

$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);

$sth->execute();

4.用PDO处理事务:(关联数据的关联处理,包括prepare())

意义:对要求相关联的数据同时操作的内容作事务处理,要么同时失败要么同时成功(最适合处理关联数据)

PDO->__construct()方法的作用是建立一个PDO链接数据库的实例。

PDO->beginTransaction(),PDO->commit(),PDO->rollBack()这三个方法是在支持回滚功能时一起使用的。PDO->beginTransaction()方法标明起始点,PDO->commit()方法标明回滚结束点,并执行SQL,PDO->rollBack()执行回滚。

try {

$dbh = new PDO (‘mysql:host=localhost;dbname=test‘‘root‘‘‘);

$dbh->exec(“set names ‘utf-8’”);

$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();   }

 

5.需手动转义的情况

PDO->quto();

PDO->query();

PDO->exec();

事务处理等就先手动转义

时间: 2024-12-29 11:17:46

PDO、PDOStatement、PDOException的相关文章

PDO类PDO、PDOStatement、PDOException

PDO中包含三个预定义的类,它们分别是PDO.PDOStatement.PDOException PDO: PDO->setAttribute(); 全局属性设置,包括:列名格式和错误提示类型 PDO->query($sql); 常用于执行有返回的sql查找语句,但执行之前要手动转义,返回PDOStatement对象 PDO->exec($sql); 执行没有返回的sql语句,同样要手动转义,有插入.修改.删除操作.返回影响的行数 PDO->lastInsertId(); 返回最后

mysql、mysqli、PDO一句话概括

mysql.mysqli.PDO一句话概括比较 1 mysql扩展 (注:原始的,较差) 2 mysqli扩展(面向过程式) (注:比上面多了更多功能) 3 mysqli扩展(面向对象式) (注:比上面更符合面向对象思想) 4 mysqli扩展(面向对象式)(准备语句) (注:比上面更性能和安全) 5 PDO (注:比上面更具跨数据库的移植性) 推荐由下往上优先使用.

PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)

PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展.MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的.因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性.由于太古老,又

(笔记)CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32

转自http://bbs.21ic.com/icview-878522-1-1.html 前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC.QT.STM32等平台,由于网上的资源较少,走了不少弯路,移植好使用过程中才逐渐暴露出各种问题,比如OD字符串传输.心跳时间不准确等等,现在已经解决了遇到的所有问题,移植出来的工程能够完好支持CanOpen协议,花了点时间,整理出一个简单易用的移植方法说明,也写了一些比较实用的调试工具,本来还想整理SDO.PDO.

Centos7 编译安装 Nginx、MariaDB、PHP

前言 本文主要大致介绍CentOS 7下编译安装Nginx.MariaDB.PHP.面向有Linux基础且爱好钻研的朋友.技艺不精,疏漏再所难免,还望指正. 环境简介: 系统: CentOS 7,最小化安装 IP: 192.168.170.128 Nginx: 1.6.1 MariaDB: 5.5.39 PHP: 5.5.16 1.准备工作 1.1.系统硬件准备 尽管Linux能最大化发挥硬件资源,但RHEL/CentOS随着版本增加对最低硬件的配置也越来越高[1].RHEL7/CentOS最低

自学php的几个例子(包含AMP(Apache、MySQL、PHP)环境搭建链接)

学习PHP之前需要先搭建PHP运行的环境(即服务器+PHP+数据库)来使PHP成功运行,具体环境搭建教程可参考pharen(http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html)的教程(亲测可用),教程中一些资源链接可能已经失效,下面给出部分资源链接:PHP资源:http://windows.php.net/download#php-5.6 Apache(msi安装包)资源:http://archive.apache.org/

10月28日下午 数据库的增加、删除、查询(匹配数据库登录)

一.匹配数据库登录 步骤: 1.做一个普通的登录界面,注意提交方式为post. <!--登录界面--> <form action="chuli.php" method="post"><!--表单提交action到chuli界面,提交方式设置为post.--> <div>用户名:<input type="text" name="uid"/></div> &l

php、python、ruby——web脚本语言的比较

原文地址:http://klau.si/php-vs-python-vs-ruby 摘要 在过去几年里,在web应用程序编程中,脚本语言变得越来越受欢迎.本论文试图在如今三种最受欢迎的语言:PHP.Python和Ruby中找到其中的差异.优点.缺点.很明显,他们有他们自己的观点和支持,所以要陈述客观事实并满足一种科学的方法是一项困难的任务.这三种语言将在web应用程序环境进行有关历史.进化.流行程度.语法.语义.功能.安全性和性能方面做评估.最后,一个最终的结论将建议最有前途的一种语言. 1.介

Yii框架数据库多数据库、主从、读写分离

Yii框架数据库多数据库.主从.读写分离 实现 功能描述:1.实现主从数据库读写分离 主库:写 从库(可多个):读2.主数据库无法连接时 可设置从数据库是否 可写3.所有从数据库无法连接时 可设置主数据库是否 可读4.如果从数据库连接失败 可设置N秒内不再连接 利用yii扩展实现: <?php /**  * 主数据库 写 从数据库(可多个)读  * 实现主从数据库 读写分离 主服务器无法连接 从服务器可切换写功能  * 从务器无法连接 主服务器可切换读功  * by lmt  * */ clas