首页 >php教程 >php手册 >php PDO 使用方法详解

php PDO 使用方法详解

WBOY
WBOY原创
2016-05-25 16:37:521223浏览

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 所传回的错误讯息


本文地址:

转载随意,但请附上文章地址:-)

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn