php使用PDO方法详解


Posted in PHP onDecember 27, 2014

本文详细分析了php使用PDO方法。分享给大家供大家参考。具体分析如下:

PDO::exec:返回的是int类型,表示影响结果的条数.

PDOStatement::execute

返回的是boolean型,true表示执行成功,false表示执行失败,这两个通常出现在如下代码:

$rs0 = $pdo->exec($sql);

$pre = $pdo->prepare($sql);

$rs1 = $pre->execute();

一般情况下可以用$rs0的值判断SQL执行成功与否,如果其值为false表示SQL执行失败,0表示没有任何更改,大于0的值表示影响了多少条记录.

但是$rs1只能返回SQL执行成功与否,如果需要获取影响的记录数需要使用$pre->rowCount();

我个人喜欢使用 MySQL,所以我的 extensions.ini 中有这二行.

extension=pdo.so

extension=pdo_mysql.so

接著在程式中,代码如下:

define('DB_NAME','test'); 

define('DB_USER','test'); 

define('DB_PASSWD','test'); 

define('DB_HOST','localhost'); 

define('DB_TYPE','mysql'); 

$dbh = new PDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWD);

文中的使用常数设定是我个人的习惯,各位不用像我这么麻烦,当像上面的操作,$dbh 本身就是代表了PDO的连线了,那要怎样使用PDO呢?

第一种,懒人法 query,什么都不用想,像平常一样的使用 query 的函式,代码如下:

$sql = 'select * from test'; 

foreach ( $dbh->query($sql) as $value) 

{ 

    echo $value[col]; 

};

第二种,自动带入法 prepare,我个人使用PDO后,偏好利用 prepare 的函式来进行作动 prepare 的好处是可以先写好 SQL 码,并且在稍后自动带入我们要的资料.

这个我想最大的好处是比起直接利用 query 可以减少许多安全性的问题,首先,我们利用 prepare 进行 SQL 码的设定,在利用bindparm 来进行设定的动作,代码如下:

$sth = $dbh->prepare('update db set zh_CN= :str where SN=:SN'); 

$sth->bindParam(':str',$str,PDO::PARAM_STR,12); 

$sth->bindParam(':SN',$SN); 

$sth->execute();

请注意文中的 :str 及 :SN,当我们利用 bindParam的函式,可以利用 :word 来指定系统需要套用的部份,像是我们利用:str 及 :SN 来指定,而实际的内容,就靠bindParam还可以指定我们要输入的型态。

首先我们先看 :str 的指定,:str 由於我确定资料是属於文字,因此利用 PD::PARAM_STR 来告诉程式“这个是字串哟”,并且给一个范围,也就是长度是12个位元。

我们也可以不要那么复杂,像 :SN,虽然也是用 bindParam 来指定,但是我们省略了型态及长度,PHP 会用该变数预设的型态来套用.

最后呢,就是利用 $sth->execute(); 来进行执行的动作,基本上不难,甚至可以说很简单呢.

如果你有大量需要重复套用的资料,你就可以拼了命的重新利用 bindParam 来指定,比如我的:str 及 :SN 如果有十笔资料,我也可以这样子直接新增到资料库,代码如下:

$sth = $dbh->prepare('insert into db ("zh_CN","zh_TW")values(:str , :SN'); 

foreach ($array => $value ) 

{

 $sth->bindParam(':str',$value[str],PDO::PARAM_STR,12); 

 $sth->bindParam(':SN',$value[SN]); 

 $sth->execute(); 

}

甚至强者如我朋友,把所有可能的 SQL 全写在一个档案后面,后来的过程SQL的部份就变成全用变数带进去了,反正资料可以用现成的方式套用嘛.

那,如果利用 prepare 的方式来 select,关键字当然也可以像上面的方式利用:word 来指定,代码如下:

$sth = $dbh->prepare('select * from db where SN = :SN'); 

$sth->bindParam(':SN',$value[SN]); 

$sth->execute(); 

while($meta = $sth->fetch(PDO::FETCH_ASSOC)) 

{ 

 echo $meta["name"]; 

}

这样新出现的是 fetch,跟mysql_fetch_row() 的意思差不多,但是在 fetch() 中我们发现多了一个 PDO::FETCH_ASSOC 这个东西.

fetch() 提供了许多获取资料的方式,而 PDO::FETCH_ASSOC 指的就是传回下一笔资料的栏位名及值啦

比如上例,利用 $meta 来取得 fetch 传回的资料,此时 $meta 的元素名称就是资料库的栏位名称,而内容当然就是值本身这个跟你利用 mysql_fetch_row() 时不一样,因为除了栏位名称,mysql_fetch_row() 还会依照顺利将元素名称除了栏位外在多给予一个以序号的方式为基础的元素,那难道 PDO 没有吗?

当然有,只要将 PDO::FETCH_ASSOC 改为 PDO::FETCH_BOTH,那用法就跟 mysql_fetch_row() 没什么两样了.

如何除错

除错是所有程式设计师中心中永远的痛,我们使用 PDO 要如何除错呢?

其实 PDO 已经提供了二个非常方便的函式 errorInfo() 及 errorCode()

用法也是世界简单,每当我们利用 execute() 执行后,如果有错误,那 errorInfo() 及 errorCode() 中就会有内容,我们就可以这样子做,代码如下:

$sth = $dbh->prepare('select * from db where SN = :SN'); 

$sth->bindParam(':SN',$value[SN]); 

$sth->execute(); 

if ($sth->errorCode()) 

{ 

 echo "有错误!有错误!"; 

 print_r($sth->errorInfo()); 

}

而 $sth->errorInfo() 会是一个阵列,这个阵列有三个值:

0 为SQLSTATE error code

1 为你所使用的 Driver 所传回的错误码

2 为你所使用的 Driver 所传回的错误讯息

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
PHP正则的Unknown Modifier错误解决方法
Mar 02 PHP
PHP 一个随机字符串生成代码
May 26 PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
php格式化金额函数分享
Feb 02 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
php+ajax登录跳转登录实现思路
Jul 31 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
thinkphp分页集成实例
Jul 24 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 #PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 #PHP
php下pdo的mysql事务处理用法实例
Dec 27 #PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 #PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
Dec 26 #PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 #PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 #PHP
You might like
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php链表用法实例分析
2015/07/09 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
基于jQuery的倒计时实现代码
2012/05/30 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
python避免死锁方法实例分析
2015/06/04 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Flask框架配置与调试操作示例
2018/07/23 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
财务部经理岗位职责
2014/02/03 职场文书
安全生产演讲稿
2014/05/09 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
同乡会致辞
2015/07/30 职场文书
教师教育教学随笔
2015/08/15 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
Python实现自动玩连连看的脚本分享
2022/04/04 Python