PHP 中 PDO 基础教程

PHP PDO 基础教程

PDO(PHP Data Object) PHP5 新出来的东西,在 PHP6 中只默认使用 PDO 来处理数据库,我们只有与时俱进学习 PDO 相关知识。本文只是入门级基础教程。

PDO PHP 5 新加入的一个重大功能,因为在 PHP 5 以前的 php4/php3 都是一堆的数据库扩展来跟各个数据库 的连接和处理,什么 php_mysql.dll php_pgsql.dll php_mssql.dll php_sqlite.dll 等等扩展来连接 MySQL PostgreSQL MS SQL Server SQLite ,同样的,我们必须借助 ADOdb PEAR::DB PHPlib::DB 之类的数据库抽象类来帮助我们,无比 烦琐和低效,毕竟, php 代码的效率怎么能够我们直接用 C/C++ 写的扩展斜率高捏?所以嘛, PDO 的出现是必然的,大家要平静学习的心 态去接受使用,也许你会发现能够减少你不少功夫哦。

安装 PDO
我是在 Windows XP SP2 上面,所以嘛,整个过程都是在 Windows 行进行的啦,至于 Linux/FreeBSD 等平台,请自行查找资料设置安装。
我的是 PHP 5.1.4 ,已经自带有了 php_pdo.dll 的扩展,不过需要稍微设置一下才能使 用。
打开 c:/windows/php.ini ,那是我的 PHP 配置文件,找到下面这行:

extension_dir

这个就是我们扩展存在的目录,我的 PHP 5 扩展是在: C:/php5/ext ,那么我就把这行改成:

extension_dir = "C:/php5/ext"

然后再往 php.ini 下面找到:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

下面有一堆类似 ;extension=php_mbstring.dll 的东西,这里就是 PHP 扩展加载的配置了,我们再最后面添加 上我们 PDO 的扩展:

extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
extension=php_pdo_mssql.dll
extension=php_pdo_odbc.dll
extension=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll

各种 PDO 的驱动,能给加上的全给加上,不过后 面的 php_pdo_oci8.dll ,因为我没有安装 Oralce 数据库,所以没有这个,就使用分号注 释掉它。然后重启我们的 Web 服务器 , IIS/Apache ,我的是 IIS ,嘿嘿,表鄙视我,在 Windows 上,简单嘛。重启后,在我们 Web 服务器的文档目录下写一个 phpinfo.php 的文件,加上这些:

?
 phpinfo();
?

输出的内容中,如果你能够顺利的看到:

PDO
PDO support enabled
PDO drivers mysql, pgsql, sqlite, mssql, odbc, firebird

后面有各种驱动的说明: PDO_Firebird pdo_mssql pdo_mysql PDO_ODBC pdo_pgsql pdo_sqlite 。那么,恭喜你安装成功了,否则请仔 细检查上面的步骤。

PDO
教程

我用的是 MySQL 4.0.26 ,但是我个人推荐大家使用 MySQL 4.1.x 或者 MySQL 5.0.x ,因为那些版本有很多有趣的东西值得 去学习。我们这里 PDO 需要连接的就是我的 MySQL 4.0 啦,如果你没有安装 MySQL ,请自行安装。我们建立好了 MySQL ,并且在 test 库里添加了表 foo ,包括 id,name,gender,time 等四个字段。

我们开始构造第一个 PDO 应用,建立一个 pdo.php 文件在 Web 文档目录下:

?php
 $dsn = "mysql:host=localhost;dbname=test";
 $db = new PDO($dsn, 'root', '');
 $count = $db-exec("INSERT INTO foo SET name = 'heiyeluren',gender='',time=NOW()");
 echo $count;
 $db = null;
?

$dsn = "mysql:host=localhost;dbname=test";

就是构造我们的 DSN (数据源),看看里面的信息包括:数 据库类型是 mysql ,主机地址是 localhost ,数据库名称是 test ,就这么几个信息。不同数据库的数据 源构造方式是不一样的。

$db = new PDO($dsn, 'root', '');

初始化一个 PDO 对象,构造函数的参数第一个就是我们 的数据源,第二个是连接数据库服务器的用户,第三个参数是密码。我们不能保证连接成功,后面我们会讲到异常情况,这里我们姑且认为它是连接成功的。

$count = $db- exec("INSERT INTO foo SET name = 'heiyeluren',gender='',time=NOW()");
echo $count;

调用我们连接成功的 PDO 对象来执行一个查询,这个查询是一个 插入一条记录的操作,使用 PDO::exec() 方法会返回一个影响记录的结果,所以 我们输出这个结果。最后还是需要结束对象资源:

$db = null;

默认这个不是长连接,如果需要数据库长连接,需 要最后加一个参数: array(PDO::ATTR_PERSISTENT = true) 变成这样:

$db = new PDO($dsn, 'root', '', array(PDO::ATTR_PERSISTENT = true));

一次操作就这么简单,也许跟以前的没有太大区 别,跟 ADOdb 倒是有几分相似。

PDO
进阶教程

如果我们想提取数据的话,那么就应该 使用数据获取功能。(下面用到的 $db 都是上面已经连接好的对象)

?php
 foreach($db-query("SELECT * FROM foo")){
print_r($row);
 }
?

我们也可以使用这种获取方式:

?php
 $rs = $db-query("SELECT * FROM foo");
 while($row = $rs-fetch()){
print_r($row);
 }
?

如果想一次把数据都获取到数组里可以这样:

?php
$rs = $db-
query("SELECT * FROM foo");
$result_arr = $rs-
fetchAll();
print_r($result_arr);
?

输出的结果如下:

Array
([0] =
Array(
  [id] = 1
  [0] = 1
  [name] = heiyeluren
  [1] = heiyeluren
  [gender] =
  [2] =
  [time] = 2006-10-28 23:14:23
  [3] = 2006-10-28 23:14:23
)
}

我们看里面的记录,数字索引和关联索引都有,浪 费资源,我们只需要关联索引的:

?php
$db-
setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$rs = $db-
query("SELECT * FROM foo");
$rs-
setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs-
fetchAll();
print_r($result_arr);
?

看上面的代码, setAttribute() 方法是设置部分属性,主要属性有: PDO::ATTR_CASE PDO::ATTR_ERRMODE 等等,我们这里需要设置的是 PDO::ATTR_CASE ,就是我们使用关联索引获取数据集的 时候,关联索引是大写还是小写,有几个选择:

PDO::CASE_LOWER --
强制列名是小写
PDO::CASE_NATURAL --
列名按照原始的方式
PDO::CASE_UPPER --
强制列名为大写  

我们使用 setFetchMode 方法来设置获取结果集的返回值的类 型,同样类型还有:

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

当然,一般情况下我们是使用 PDO::FETCH_ASSOC ,具体使用什么,按照你自己的需要, 其他获取类型参考手册。

除了上面这种获取数据的方式,还有这 种:

?php
$rs = $db-
prepare("SELECT * FROM foo");
$rs-
execute();
while($row = $rs-
fetch()){
 print_r($row);
}
?

其实差不多啦。如果你想获取指定记录里一个字段 结果的话,可以使用 PDOStatement::fetchColumn():

?php
$rs = $db-
query("SELECT COUNT(*) FROM foo");
$col = $rs-
fetchColumn();
echo $col;
?

一般使用 fetchColumn() 来进行 count 统计或者某些只需要单字段的记录很好 操作。  

 

【错误处理】

如果程序中碰到错误咋办?我们这里描述 PDO 类的错误信息和异常处 理。

1. 面向对 象的方式

先看看如果连接错误等的处理,使用面向对象的方式来处理:

http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif <?php
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
try  {
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    
$db  =  new  PDO('mysql:host=localhost;dbname=test',  $user $pass );
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    
$db  =  null ;
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
catch  (PDOException  $e ) {
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    
print  "Error: " .  $e ->getMessage() . "<br/>";
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif    
die ();
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif }
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif ?>

 

 

这里利用我们 PHP 5 面向对象的异常处理特 征,如果里面有异常的话就初始化调用 PDOException 来初始化一个异常类。
PDOException
异常类的属性结构:

 

http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif <?php
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
class  PDOException  extends   Exception
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif {
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     
public   $errorInfo  =  null ;   //  错误信息,可以调用  PDO::errorInfo()  PDOStatement::errorInfo() 来访问
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     protected   $message ;     //  异常信息,可以试用  Exception::getMessage()  来访问
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     protected   $code ;              // SQL 状态错误代码,可以使用  Exception::getCode()  来访问
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
}
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif ?>

 

 

这个异常处理类是集成 PHP 5 内置的异常处理类,我们 简单的看一下 PHP 5 内置的异常处理类结构:

http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif <?php
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
class   Exception
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif {
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     
//  属性
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     protected   $message  = 'Unknown exception';    //  异常信息
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     protected   $code  = 0;                         //  用户自定义异常代码
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     protected   $file ;                             //  发生异常的文件名
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     protected   $line ;                             //  发生异常的代码行号
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     // 
方法
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     final   function  getMessage();                 //  返回异常信息
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     final   function  getCode();                    //  返回异常代码
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     final   function  getFile();                    //  返回发生异常的文件名
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     final   function  getLine();                    //  返回发生异常的代码行号
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     final   function  getTrace();                   // backtrace()  数组
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
     final   function  getTraceAsString();           //  已格成化成字符串的  getTrace()  信息
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
}
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif ?>
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif

 

 

相应的,在代码中可以合适的调用   getFile()     getLine()   来进行错误定位,更方便 的进行调试。


2.
使用面 向过程的方法
先看代码:

http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif <?
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
$db  =  new  PDO('mysql:host=localhost;dbname=test',  $user $pass );
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
$rs  =  $db ->query("SELECT aa,bb,cc FROM foo");
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
if  ( $db ->errorCode() != '00000'){
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     
print_r ( $db ->errorInfo());
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     
exit ;
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif }
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
$arr  =  $rs ->fetchAll();
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
print_r ( $arr );
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
$db  =  null ;
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif ?>



PDO
PDOStatement 对象有 errorCode()     errorInfo()   方法,如果没有任何错误 errorCode()  返回的是 00000   ,否则就会返回一些错误代码。 errorInfo()   返回的一个数组,包括 PHP 定义的错误代码和 MySQL 的错误代码和错误信息,数组结构如下:

http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif Array
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif (
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     [0] => 42S22
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     [1] => 1054
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif     [2] => Unknown column 'aaa' in 'field list'
http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif )

 

每次执行查询以后, errorCode() 的结果都是最新的,所以 我们可以很容易自己控制错误信息显示。

 

 


简单的总结
查询操作主要是 PDO::query() PDO::exec() PDO::prepare() PDO::query() 主要是用于有记录结果返回的操作,特 别是 SELECT 操作, PDO::exec() 主要是针对没有结果集合返回的操作, 比如 INSERT UPDATE DELETE 等操作,它返回的结果是当前操作影响 的列数。 PDO::prepare() 主要是预处理操作,需要通过 $rs- execute() 来执行预处理里面的 SQL 语句,这个方法可以绑定参数,功能比 较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。 获取结果集操作主要是: PDOStatement::fetchColumn() PDOStatement::fetch() PDOStatement::fetchALL() PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字 段,缺省是第一个字段。 PDOStatement::fetch() 是用来获取一条记录, PDOStatement::fetchAll() 是获取所有记录集到一个中,获取结果 可以通过 PDOStatement::setFetchMode 来设置需要结果集合的类型。

另外有两个周边的操作,一个是 PDO::lastInsertId() PDOStatement::rowCount() PDO::lastInsertId() 是返回上次插入操作,主键列类型是自 增的最后的自增 ID PDOStatement::rowCount() 主要是用于 PDO::query() PDO::prepare() 进行 DELETE INSERT UPDATE 操作影响的结果集,对 PDO::exec() 方法和 SELECT 操作无效。

从上面的使用看出, PDO 功能确实强大,另外还有一些内容我没 有讲到,比如绑定参数、预处理、存储过程、事务处理等等功能。另外还有不同数据扩 DSN 的构造, Oracle 数据库自己很多特殊的东西,都需要深 入去学习理解,这篇文章就只是简单的描述了一些入门知识,算是对 PDO 一个简单的了解吧。

 

 

 

 

PHP PDO 学习笔记

lib.cublog.cn 2007 11 13 09:36  查 看 7433   作 者 : 流 水孟春      

文章分类: PHP5 研究 [ ]

PDO 为 何物?

POD PHP Data Object ) 扩展在 PHP5 中 加入, PHP6 中 将默认识用 PDO 连 接数据库,所有非 PDO 扩 展将会在 PHP6 被 从扩展中移除。该扩展提供 PHP 内 置类 PDO 来 对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。

我是配置在 windows 下 做开发用的。

PDO 的 目标

·   提供一种轻型、清晰、方便的 API

·   统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。

·   通过 PHP 脚本提供可选的较大程度的抽象 / 兼容性。  

PDO 的特点:

·   性能。 PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。

·   能力。 PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。

·   简单。 PDO 旨在使您能够轻松使用数据库。 API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。

·   运行时可扩展。 PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如, PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API 。还有一些用于 MySQL PostgreSQL ODBC Firebird 的驱动程序,更多的驱动程序尚在开发。


安 装 PDO
我 这里是 WINDOWS 下 开发用的 PDO 扩 展,要是你要在 Linux 下 安装配置,请到别的地方寻找。
版 本要求:

php5.1 以 及以后版本的程序包里已经带了;

php5.0.x 则 要到 pecl.php.net 下 载,放到你的扩展库,就是 PHP 所 在的文件夹的 ext 文 件夹下;

手册上说 5.0 之 前的版本不能运行 PDO 扩 展。

 

配置:
修 改你的 php.ini 配 置文件 , 使 它支持 pdo. php.ini 这 个东西没有弄懂的话,先弄清楚,要修改调用你的 phpinfo() 函 数所显示的那个 php.ini

extension=php_pdo.dll 前 面的分号去掉,分毫是php 配置文件注释符号, 这个扩展是必须的。

往下还有
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll

各各扩展所对应的数据库是:

Driver name

Supported databases

PDO_DBLIB

FreeTDS / Microsoft SQL Server / Sybase

PDO_FIREBIRD

Firebird/Interbase 6

PDO_INFORMIX

IBM Informix Dynamic Server

PDO_MYSQL

MySQL 3.x/4.x

PDO_OCI

Oracle Call Interface

PDO_ODBC

ODBC v3 (IBM DB2, unixODBC and win32 ODBC)

PDO_PGSQL

PostgreSQL

PDO_SQLITE

SQLite 3 and SQLite 2

你要使用哪种数据库,只要把相应的扩展前的注释符号 ";" 去 掉就可以了。

使用 PDO
我 这里假设你已经装好 mysql 了, 要是没装的话,麻烦先想办法装上,我的是 mysql5.0.22, 黑 夜路人用的是 MySQL 4.0.26 也 可以用。

数据库的连接:
我们通过下面的例子来分析 PDO 连接数据库,

<? php
$ dbms = 'mysql' ;        // 数据库类型 Oracle ODI, 对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了
$ host = 'localhost' ;   // 数据库主机名
$ dbName = 'test' ;       // 使用的数据库
$ user = 'root' ;         // 数据库连接用户名
$ pass = '' ;             // 对应的密码
$ dsn = "$dbms:host=$host;dbname=$dbName" ;
//

try   {
    
$ dbh   =   new   PDO ( $ dsn ,   $ user ,   $ pass );   // 初始化一个PDO 对象,就是创建了数据库连接对象$dbh
    
echo   " 连接成功<br/>" ;
    
/* 你还可以进行一次搜 索操作

      foreach   ( $ dbh -> query ( 'SELECT * from FOO' )   as   $ row )   {
        
print_r ( $ row );   // 你可以用 echo($GLOBAL); 来看到这些值
     }
     
*/
    
$ dbh   =   null ;
}   catch   ( PDOException   $ e )   {
    
die   ( "Error!: "   .   $ e -> getMessage ()   .   "<br/>" );
}
// 默认这个不是长连 接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$ db   =   new   PDO ( $ dsn ,   $ user ,   $ pass ,   array ( PDO :: ATTR_PERSISTENT   =>   true ));

?>


数据库查询:
上 面我们已经进行了一次查询,我们还可以使用如下的查询:

<? php
$db
-> setAttribute ( PDO :: ATTR_CASE ,   PDO :: CASE_UPPER ); // 设置属性
$rs  
=   $db -> query ( "SELECT * FROM foo" );
$rs
-> setFetchMode ( PDO :: FETCH_ASSOC );
$result_arr  
=   $rs -> fetchAll ();
print_r
($ result_arr );
?>


以 上因为用到 setAttribute() 方 法,放上那两个参数,把字段名强制转换成大写。下面列出多有PDO::setAttribute() 的参数:

·         PDO::ATTR_CASE : 强制列名变成一种格式,详细如下 ( 第二个参数 )

o    PDO::CASE_LOWER : 强制列名是小写 .

o    PDO::CASE_NATURAL : 列名按照原始的方式

o    PDO::CASE_UPPER : 强制列名为大写 .

·         PDO::ATTR_ERRMODE : 错误提示 .

o    PDO::ERRMODE_SILENT : 不显示错误信息,只显示错误码 .

o    PDO::ERRMODE_WARNING : 显示警告错误 .

o    PDO::ERRMODE_EXCEPTION : 抛出异常 .

·         PDO::ATTR_ORACLE_NULLS   ( 不仅仅是 ORACLE 有效,别的数据库也有效 ): 指定数据库返回的 NULL 值在 php 中对应的数值

o    PDO::NULL_NATURAL : 不变 .

o    PDO::NULL_EMPTY_STRING : Empty string is converted to  NULL .

o    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.

例子中的 $rs ->setFetchMode(PDO::FETCH_ASSOC); PDOStatement:: setFetchMode () ,对返回类型的声明。
有如下:
PDO::FETCH_ASSOC
  -- 关联数组形式
PDO::FETCH_NUM    -- 数字索引数组形式
PDO::FETCH_BOTH   -- 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ    -- 按照对象的形式,类似于以前的 mysql_fetch_object()

更多返回类型声明 (PDOStatement:: 方法名 ) 看手册。

插入,更新,删除数据,

$db -> exec ( "DELETE FROM `xxxx_menu` where mid=43" );

 

·   简单的总结一下上面的 操作 :

查询操作主要是 PDO::query() PDO::exec() PDO::prepare()
PDO::query() 主要是用于有记录结果返回的操作,特别 是 SELECT 操作,
PDO::exec()
主要是针对没有结果集合返回的操作,比 如 INSERT UPDATE DELETE 等操作,它返回的结果是当前操作影响的 列数。
PDO::prepare() 主要是预处理操作,需要通过 $rs->execute() 来执行预处理里面的 SQL 语句,这个方法可以绑定参数,功能比较 强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。

获取结果集操作主要是: PDOStatement::fetchColumn() PDOStatement::fetch() PDOStatement::fetchALL()
PDOStatement::fetchColumn()   是获取结果指定第一条记录的某个字段, 缺省是第一个字段。
PDOStatement::fetch()   是用来获取一条记录,
PDOStatement::fetchAll() 是获取所有记录集到一个中,获取结果可 以通过 PDOStatement::setFetchMode 来设置需要结果集合的类型。

另外有两个周边的操作,一个是 PDO::lastInsertId() PDOStatement::rowCount() PDO::lastInsertId() 是返回上次插入操作,主键列类型是自增 的最后的自增 ID
PDOStatement::rowCount()
主要是用于 PDO::query() PDO::prepare() 进行 DELETE INSERT UPDATE 操作影响的结果集,对 PDO::exec() 方法和 SELECT 操作无效。



事务和自动提交

   
至此,您已经通过 PDO 连接到了 mysql ,在发出查询之前,您应该理解 PDO 是如何管理事务的。如果之前没有接触过 事务,那么首先要知道事务的 4 个特征:原子性( Atomicity )、一致性( Consistency )、独立性( Isolation )和持久性( Durability ),即 ACID 。用外行人的话说,对于在一个事务中执 行的任何工作,即使它是分阶段执行的,也一定可以保证该工作会安全地应用于数据库,并且在工作被提交时,不 会受到来自其他连接的影响。事务性工作 可以根据请求自动撤销(假设您还没有提交它),这使得脚本中的错误处理变得更加容易。
   
事务通常是通过把一批更改积蓄起来、使 之同时生效而实现的。这样做的好处是可以大大提高这些更新的效率。换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的 好处)。  
   
不幸的是,并不是每种数据库都支持事务 (Mysql5 支持事务, mysql4 我不知道 ) ,所以当第一次打开连接时, PDO 需要在所谓的 自动提交( auto-commit 模式下运行。自动提交模式意味着,如果 数据库支持事务,那么您所运行的每一个查询都有它自己的隐式事 务,如果数据库不支持事务,每个查询就 没有这样的事务。如果您需要一个事务,那么必须使用 PDO::beginTransaction() 方法来启动一个事务。如果底层驱动程序 不支持事务,那么将会抛出一个 PDOException (无论错误处理设置是怎样的:这总是一 个严重错误状态)。在一个事务中,可以使用 PDO::commit() PDO::rollBack() 来结束该事务,这取决于事务中运行的代 码是否成功。
   
当脚本结束时,或者当一个连接即将被关 闭时,如果有一个未完成的事务,那么 PDO 将自动回滚该事务。这是一种安全措施, 有助于避免在脚本非正常结束时出现不一致的情况 —— 如果没有显式地提交事务,那么假设有某 个地方会出现不一致,所以要执行回滚,以保证数据的安全性。

// 例子来自http :// www . ibm . com / developerworks / cn / db2 / library / techarticles / dm - 0505furlong / index . html
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 ();
}

 

在上面的示例中,假设我们为一个新雇员创建一组条 目,这个雇员有一个 ID 号,即 23 。除了输入这个人的基本数据外,我们还 需要记录雇员的薪水。两个更新分别完成起来很简单,但通过将这两个更新包括在 beginTransaction() commit() 调用中,就可以保证在更改完成之前,其 他人无法看到更改。如果发生了错误, catch 块可以回滚事务开始以来发生的所有更 改,并打印出一条错误消息。

并不是一定要在事务中作出更新。您也可以发出复杂的 查询来提取数据,还可以使用那种信息构建更多的更新和查询。当事务在活动时,可以保证其他人在工作进行当中无法作出更改。事实上,这不是 100% 的正确,但如果您之前没有听说过事务的 话,这样介绍也未尝不可。

预处理语句和存储过程

很多更成熟的数据库都支持预处理语句的概念。什么是 预处理语句?您可以把预处理语句看作您想要运行的 SQL 的一种编译过的模板,它可以使用变量参 数进行定制。预处理语句可以带来两大好处:

·         查询只需解析(或准备)一次,但是可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行 该查询的计划。对于复杂的查 询, 这个过程要花比较长的时间,如果您需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析 / 编 译 / 优 化周期。简言之,预处理语句使用更少的资源,因而运行得更快。

·         提供给预处理语句的参数不需要用引号括起来,驱动程序会处理这些。如果应用程序独占地使用预处理语句,那么可以确保 没有 SQL 入 侵发生。(然而,如果您仍然将查询的其他部分建立在不受信任的输入之上,那么就仍然存在风险)。

预处理语句是如此有用,以致 PDO 实际上打破了在目标 4 中设下的规则:如果驱动程序不支持预处 理语句,那么 PDO 将仿真预处理语句。  


实例: PDO 的应用例子:

<? php
$ dbms = 'mysql' ;   // 数据库类型 Oracle ODI, 对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了

$ host = 'localhost' ;   // 数据库主机名

$ dbName = 'test' ;   // 使用的数据库

$ user = 'root' ;   // 数据库连接用户名

$ pass = '' ;   // 对应的密码

$ dsn = "$dbms:host=$host;dbname=$dbName" ;  


class   db   extends   PDO   {
    
public   function   __construct (){
        
try   {
            parent
:: __construct ( "$GLOBALS[dsn]" ,   $ GLOBALS [ 'user' ],   $ GLOBALS [ 'pass' ]);
          
}   catch   ( PDOException   $ e )   {
          
die ( "Error: "   .   $ e -> __toString ()   .   "<br/>" );
        
}
    
}
    
    
public   final   function   query ( $ sql ){
        
try   {
            
return   parent :: query ( $ this -> setString ( $ sql ));
        
} catch   ( PDOException   $ e ){
            
die ( "Error: "   .   $ e -> __toString ()   .   "<br/>" );
        
}
    
}
    
    
private   final   function   setString ( $ sql ){
        
echo   " 我要处理一下$sql" ;
        
return   $ sql ;
    
}
}

$ db = new   db ();
$ db -> setAttribute ( PDO :: ATTR_CASE ,   PDO :: CASE_UPPER );
foreach   ( $ db -> query ( 'SELECT * from xxxx_menu' )   as   $ row )   {
    
print_r ( $ row );
}
$db->exec(
'DELETE FROM  `xxxx_menu` where mid=43' );
?>





参 考:
1.
http://www.oracle.com/technology/global/cn/pub/articles/php_experts/otn_pdo_oracle5.html
2.
http://dev.csdn.net/author/heiyeshuwu/69c79a293895433dba178ce04caea20b.html
3.http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html 
4.PHP
手 册

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值