PDO、PDOStatement、PDOException
最近在学PDO 比较详细的资料
出处:http://blog.csdn.net/hsst027/article/details/23682003
PDO中包含三个预定义的类,它们分别是PDO、PDOStatement、PDOException
PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的prepare()方法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的。如果通过之前执行PDO对象中的query()方法返回的PDOStatement类对象,只代表的是一个结果集对象。而如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参数化的SQL命令。
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 ¶m [,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();
事务处理等就先手动转义
PDO、PDOStatement、PDOException的更多相关文章
- mysql、mysqli、PDO一句话概括比较
mysql.mysqli.PDO一句话概括比较 1 mysql扩展 (注:原始的,较差) 2 mysqli扩展(面向过程式) (注:比上面多了更多功能) 3 mysqli扩展(面向对象式) (注:比上 ...
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. P ...
- 10月28日下午MySQL数据库的增加、删除、查询(匹配数据库登录和可以增、删、查的显示数据库内容的页面))
一.匹配数据库登录 步骤: 1.做一个普通的登录界面,注意提交方式为post. <!--登录界面--> <form action="chuli.php" meth ...
- 自学php的几个例子(包含AMP(Apache、MySQL、PHP)环境搭建链接)
学习PHP之前需要先搭建PHP运行的环境(即服务器+PHP+数据库)来使PHP成功运行,具体环境搭建教程可参考pharen(http://www.cnblogs.com/pharen/archive/ ...
- (笔记)CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32
转自http://bbs.21ic.com/icview-878522-1-1.html 前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC.QT.STM ...
- CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32
前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC.QT.STM32等平台,由于网上的资源较少,走了不少弯路,移植好使用过程中才逐渐暴露出各种问题,比如OD字 ...
- 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)
3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...
- linux 配置apache、mysql、php ——20150807
2015年8月7日 一部分:mysql mysql 5.5.40安装 第二部分:apache(apache要安装在php前面.apache和mysql可以随意顺序) 1. # tar zxvf htt ...
- mysql-介绍、MySQL部署、数据类型、存储引擎
数据库介绍 什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材.数据是信息的表现形式和载体,可以是符号.文字.数字.语音.图像.视频等. ...
随机推荐
- apicloud踩坑集锦
最近在用apicloud开发,这里录入一些踩坑的地方,从头到尾,要多尴尬有多尴尬,新入app开发,记录一些心得,和遇到的坑以及解决办法. 1,apicloud 打包的Android app ,打开fr ...
- AFNetworking2.5使用-转
来自:http://blog.csdn.net/daiyelang/article/details/38434023 官网下载2.5版本:http://afnetworking.com/ 此文章是基于 ...
- 453 Minimum Moves to Equal Array Elements 最小移动次数使数组元素相等
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1.示例:输入:[1,2,3]输出:3解释:只需要3次移动(注意每次移动会增加两个元素 ...
- XmlDocument
XmlDocument增删改查. using System; using System.Collections.Generic; using System.ComponentModel; using ...
- 设置webbrowser浏览器内核
var hklm = Microsoft.Win32.Registry.LocalMachine; var lmRun64 = hklm.OpenSubKey(@"SO ...
- MySQL多表
一.外键 1.外键:链接两张表的字段,通过主表的主键和从表的外键来描述主外键关系,呈现的是一对多的关系.例如:商品类别(一)对商品(多),主表:商品类别表,从表:商品表. 2.外键的特点:从表外键的值 ...
- ReactJS-3-组件生命周期
简介 普通的UI应用生命周期一般包括Birth, Growth, Death, React中Component的生命周期也是如此,这是一个持续的过程,贯穿整个应用的生命历程. 阶段 1.mountin ...
- 聊5块钱P2V
上一秒还在写代码,下一秒就跑机房干活. 这台机器产制石器时代,重启一次后再就启动不了了.这个故障处理的方式我们以后再谈. 今天聊聊啥是P2V,国人总喜欢弄些稀奇古怪的定义来证明自己技术很牛X,就跟当年 ...
- .NET 之ViewState的本质
ViewState是如何实现这些功能. 以名值对的方式来存控件的值,和Hashtable的结构类似: 跟踪那些ViewState中出现改变的值,以便对这些脏数据(dirty)进行进一步的处理: 通过序 ...
- 详解Android Activity启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...