php使用PDO方法详解

 更新时间:2014年12月27日 14:37:08   投稿:shichen2014  
这篇文章主要介绍了php使用PDO方法,较为详细的分析了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 = 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程序设计有所帮助。

相关文章

  • PHP7如何开启Opcode打造强悍性能详解

    PHP7如何开启Opcode打造强悍性能详解

    这篇文章主要给大家介绍了关于PHP7如何开启Opcode打造强悍性能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • 提升PHP性能的21种方法介绍

    提升PHP性能的21种方法介绍

    本篇文章是对提升PHP性能的21种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP常用数组函数介绍

    PHP常用数组函数介绍

    编程怎么能少的了数组呢,以下是学习PHP时常用的数组处理函数。在编程中要遵循一个原则就是DRY(Don`t Repeat Yourself)原则,PHP中有大量的函数,都记住这些函数不太现实,但常用的函数还是要熟练使用的,大部分的函数的使用方法可以通过查询PHP的手册来使用。
    2014-07-07
  • [PHP]实用函数7

    [PHP]实用函数7

    [PHP]实用函数7...
    2007-11-11
  • 解析centos中Apache、php、mysql 默认安装路径

    解析centos中Apache、php、mysql 默认安装路径

    本篇文章是对centos下Apache、php、mysql 默认安装路径进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 对squid中refresh_pattern的一些理解和建议

    对squid中refresh_pattern的一些理解和建议

    用于确定一个页面进入cache后,它在cache中停留的时间。refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。
    2009-04-04
  • PHP基于CURL发送JSON格式字符串的方法示例

    PHP基于CURL发送JSON格式字符串的方法示例

    这篇文章主要介绍了PHP基于CURL发送JSON格式字符串的方法,结合实例形式分析了php使用curl发送json格式字符串的相关属性设置及数据接收等操作技巧,需要的朋友可以参考下
    2018-03-03
  • PHP常用的三种设计模式

    PHP常用的三种设计模式

    本文为大家介绍常用的三种php设计模式:单例模式、工厂模式、观察者模式,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 分析PHP的垃圾回收机制

    分析PHP的垃圾回收机制

    垃圾回收,简称gc。在说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完后不收拾,那么那块儿地就算是糟蹋了,地越用越少,最后一地全是屎。说到底一句,用了记得还。一定程度上说,垃圾回收机制就是用来擦屁股的。
    2021-06-06

最新评论