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使之能同时支持GIF和JPEG
Oct 09 PHP
推荐一篇入门级的Class文章
Mar 19 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
header与缓冲区之间的深层次分析
Jul 30 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 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
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
小程序实现密码输入框
2020/11/16 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python获取本地计算机名字的方法
2015/04/29 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python实现猜拳游戏项目
2020/11/30 Python
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
雪山饭庄的创业计划书范文
2014/01/18 职场文书
销售顾问岗位职责
2014/02/25 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
Python 内置函数速查表一览
2021/06/02 Python
mysql主从复制的实现步骤
2021/10/24 MySQL