php使用PDO方法详解
本文详细分析了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=newPDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASSWD);
文中的使用常数设定是我个人的习惯,各位不用像我这么麻烦,当像上面的操作,$dbh本身就是代表了PDO的连线了,那要怎样使用PDO呢?
第一种,懒人法query,什么都不用想,像平常一样的使用query的函式,代码如下:
$sql='select*fromtest'; foreach($dbh->query($sql)as$value) { echo$value[col]; };
第二种,自动带入法prepare,我个人使用PDO后,偏好利用prepare的函式来进行作动prepare的好处是可以先写好SQL码,并且在稍后自动带入我们要的资料.
这个我想最大的好处是比起直接利用query可以减少许多安全性的问题,首先,我们利用prepare进行SQL码的设定,在利用bindparm来进行设定的动作,代码如下:
$sth=$dbh->prepare('updatedbsetzh_CN=:strwhereSN=: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('insertintodb("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*fromdbwhereSN=: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*fromdbwhereSN=:SN'); $sth->bindParam(':SN',$value[SN]); $sth->execute(); if($sth->errorCode()) { echo"有错误!有错误!"; print_r($sth->errorInfo()); }
而$sth->errorInfo()会是一个阵列,这个阵列有三个值:
0为SQLSTATEerrorcode
1为你所使用的Driver所传回的错误码
2为你所使用的Driver所传回的错误讯息
希望本文所述对大家的php程序设计有所帮助。