PDO入门

技术周报:PDO入门 [技术白痴]

post by 那多记忆 / 2008-5-11 7:54 Sunday

上周代码走查的时候准备的一份关于PDO的概要文档。大部分内容来源于php手册关于PDO的翻译。放在草稿里也是放着不如拿出来给大家共享下。

什么是PDO?

PDO是php的一个扩展, 它为PHP访问数据库定义了一个轻量级的、一致性的接口。提供了一个数据访问抽象层,无论你使用什么数据库,你都可以通过一致的函数执行查询和获取数据。PDO随PHP5.1发行,在PHP5.0中可以作为php的一个PECL扩展使用。PDO需要PHP5核心OO特性的支持,所以它无法运行于之前的PHP5之前的版本。在PHP 6只默认使用PDO来处理数据库。
插曲:Pear与Pecl的区别?
Pear:(PHP Extension and Application Repository)是PHP的扩展代码包,所有的扩展均以PHP代码的形式出现,使用的时候,要在代码中进行Include才能够使用。
Pecl:是PHP的标准扩展,可以补充实际开发中所需的功能,所有的扩展都需要安装,在Windows下面以Dll的形式出现,在linux下面,需要单独进行编译,它的表现形式为根据PHP官方的标准用C语言写成,尽管源码开放但是一般人无法随意更改源码。
最直接的表述:Pear是PHP的上层扩展,Pecl是PHP的底层扩展。


为什么选择PDO?

 

  1. PDO与ADOdb、PEAR::DB、PHPlib::DB 相比怎么样,后者烦琐而且低效,PDO是php的一个底层的扩展,而后者是php代码实现的,效率上是不言而喻的,
  2. 从应用趋势上来看,PDO随PHP5.1发行,PHP 6只默认使用PDO来处理数据库。
  3. 还可以通过预处理语句来防止sql注入


如何安装PDO?
这里只说下 FreeBSD下的安装:
#cd /usr/ports/databases/php5-pdo 
#make install clean 
安装了这个仅仅是安装好了PDO的驱动,这时候还是连接不到任何数据库的。还需要安装具体数据库的连接驱动.我一般也就装PDO_MYSQL,PDO_PGSQL,PDO_SQLITE。
#cd /usr/ports/databases/php5-pdo_mysql 
#make install clean 
安装好了之后,重起apache,再看phpinfo,应该可以看到pdo的项目了。如果没有就去看一下 
vi /usr/local/etc/php/extensions.ini 
看看有没有下面这写,没有就自己加上去,重起apache即可.
extension=pdo.so
extension=pdo_pgsql.so
extension=pdo_mysql.so
extension=pdo_sqlite.so

PDO的方法 :
PDO::exec()  主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。
PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作,
PDO::prepare() 主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句
PDO::query()和PDO::prepare()将返回一个 PDOStatement object 对象
PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段。PDOStatement::fetch() 是用来获取一条记录,
PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。
PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。
PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效
PDO::setAttribute():Sets an attribute on the database handle
PDO::ATTR_CASE: 强制列名变成一种格式,
PDO::CASE_LOWER: 强制列名是小写. 
PDO::CASE_NATURAL: 列名按照原始的方式
PDO::CASE_UPPER: 强制列名为大写.

PDO::ATTR_ERRMODE: 错误提示. 
PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码.
PDO::ERRMODE_WARNING: 显示警告错误.
PDO::ERRMODE_EXCEPTION: 抛出异常. 
PDO::NULL_NATURAL: 不变.
PDO::NULL_EMPTY_STRING: Empty string is converted to NULL.
PDO::NULL_TO_STRING: NULL is converted to an empty string.
PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requires bool. 
PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requires array(string classname, array(mixed constructor_args)). PDO::ATTR_AUTOCOMMIT (available in OCI, Firebird and MySQL): Whether to autocommit every single statement. 
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (available in MySQL): Use buffered queries.


应用实例:


<?php
function readDataForwards($dbh) {
  $sql = 'SELECT uid FROM feelog ORDER BY id';
  try {
    $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL));
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
      $data = $row[0] . "/n";
      print $data;
    }
    $stmt = null;
  }
  catch (PDOException $e) {
    print $e->getMessage();
  }
}

print "Reading forwards:/n";
readDataForwards($conn);
?>

PDO::FETCH_ASSOC -- 关联数组形式
PDO::FETCH_NUM   -- 数字索引数组形式
PDO::FETCH_BOTH  -- 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ   -- 按照对象的形式,类似于以前的 mysql_fetch_object()


事务:
<?php
try {
  $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true));
  echo "Connected/n";
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $dbh->beginTransaction();
  $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
  $dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");
  $dbh->commit();
  
} catch (Exception $e) {
  $dbh->rollBack();
  echo "Failed: " . $e->getMessage();
}
?>

预处理语句和存储过程


什么是预处理语句?您可以把预处理语句看作您想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。

预处理语句可以带来两大好处:
1.查询只需解析(或准备)一次,但是可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,这个过程要花比较长的时间,如果您需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/ 编译/优化周期。简言之,预处理语句使用更少的资源,因而运行得更快。
2.提供给预处理语句的参数不需要用引号括起来,驱动程序会处理这些。如果应用程序独占地使用预处理语句,那么可以确保没有 SQL 入侵发生。(然而,如果您仍然将查询的其他部分建立在不受信任的输入之上,那么就仍然存在风险)。

<?php

$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值