heiyeluren的blog(黑夜路人的开源世界)

【为在5.12地震中丧生的同胞哀悼,为灾区人民祈福!】

谢华亮ID:heiyeshuwu
[修改头像]
756061次访问,排名37好友16人,关注者35
既然决定远行,便只顾风雨兼程。
heiyeshuwu的文章
原创 271 篇
翻译 3 篇
转载 194 篇
评论 426 篇
heiyeluren的公告

联系方式:


访问统计: free hit counter code
FeedSky订阅:
FeedSky订阅
最近评论
出会い系サイト:出会い出会い系サイト出会い喫茶出会い掲示板ナンパ出会いカ……
出会い系サイト:出会い出会い系サイト出会い喫茶出会い掲示板ナンパ出会いカ……
出会い系サイト:出会い出会い系サイト出会い喫茶出会い掲示板ナンパ出会いカ……
phpclep:太棒了, 非常詳細. 感謝!
1005491876:wei shen me dian nao zhuo mian kan bu dao ren he tu biao ne?lian shu ru fa dou bu neng yong ,ying gai zen me chu li ne ?
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    技术图片
    搜索引擎
    ::eYou::
    kevin world
    lewis - 老吕
    qyb - BT的花
    Realzay的blog
    叶金荣
    天堂地狱鬼-dulao5's Blog
    沙漠之周
    狐狸糊涂
    老韩
    與子觀化
    ::Yahoo::
    glemir’s blog
    Rainx
    stauren
    互联网,请记住我 - 162同学的技术博客
    小蚂蚁同学滴测试博客
    张彪同学
    随网之舞 - kaven的DHTML博客
    ::朋友::
    【推荐】中文分类网
    kevin world
    miky
    俺兄弟的blog
    晋陵路人的Blog
    李天华同学滴技术博客
    沙狐部落
    ::网友::
    Code & Stock.
    LionD8的Blog
    Phzzy
    张贺同学的博客
    技术大牛老余的博客
    抚琴居
    邢红瑞的blog
    阿健的博客
    :PHP博客:
    .: Easy style :.
    [琴剑楼]
    CoolCode.cn
    Haohappy的Blog
    Hightman
    iwind的blog
    Javascript开发站
    JD Space
    Nio's Weblog
    Open Source PHP
    PHP面对对象
    SourceForge.net
    trip的专栏
    UGIA.cn
    windix's blog
    Windix's Weblog
    一个藏袍
    俊麟 Michael`s blog
    偶然的blog
    刘敏的blog
    大龄青年的Blog
    廖宇雷的blog
    懒猫开始新生活blog
    某人的栖息地
    王春生的博客
    神仙
    :牛人blog:
    DBA notes
    侯捷网站
    孟岩
    搜索引擎研究
    方舟
    王咏刚的BLOG
    竹笋炒肉
    荣耀
    车东[Blog^2]
    透明思考
    陈硕的Blog
    DHTML
    DHTMLGoodies
    FCKEditor
    Google Code
    Google Web Toolkit
    HTML Goodies
    HTML.it
    HTMLAre
    HTMLdog
    JavaScript Kit
    jQuery
    KindEditor
    Prototype
    TinyMCE
    W3 Schools
    Yahoo JavaScript Developer Center
    Yahoo! Developer Network
    Yahoo! UI Library (YUI)
    网页设计师Web标准
    Java国内站
    ChinaJavaWorld.com技术论坛
    IBM developerWorks 中国: Java
    Java中文站
    Java开源大全
    Java爱好者
    JR - Java翻译站
    J道-JDON
    Matrix: 与Java共舞
    中国Java开发网
    中文java技术网
    PHP国内站点
    CSDN PHP论坛
    Discuz!
    FleaPHP
    Google--PHP用户组
    IBM DeveloperWorks
    JavsScript技术讨论
    Nirvana Studio
    OpenPHP.cn
    PHPChina
    TiM Club
    中文 PFC 1.0 手册--PHP5的开发包
    中文 PFC 1.0 手册--PHP5的开发包
    中文PHP网
    太平洋--PHP开发区
    爱MySQL
    超越PHP
    PHP国外站点
    ADOdb
    Agavi Framework
    Cake PHP
    MySQL Performance Blog
    MySQL Performance Blog
    Nonaweb
    PEAR
    PECL
    PECL Windows
    PHP Builder
    PHP Classes
    PHP Classes
    PHP New Download
    PHP Security Consortium
    php.MVC
    php.MVC
    PHPkitchen(OO & MVC)
    phpPatterns
    PHP国外图书下载
    smart template
    Smarty
    SourceForge.net
    Symfony Framework
    Zend
    Zend Framework
    Unix C/C++
    Free Gentux
    周立发的blog(Linux C)
    Unix/Linux
    BSD智库
    ChinaUnix
    FreeBSDChina
    FreeLAMP
    IBM开发者Linux专区
    Linux Byte
    LinuxKit
    LinuxTS
    Linux伊甸园
    Linux技术中坚站
    Linux非常空间
    Love Unix
    NetBSD&OpenBSD中文用户组
    NetBSD中国社区
    Oracle中国用户讨论组
    OurLinux
    Unix中文
    Unix中文
    Unix中文宝库
    中国Linux公社
    中国Unix用户技术论坛
    中文FreeBSD用户组
    永远的Unix
    炎黄角马
    程序设计
    CSDN
    IBM开发者中心
    Microsoft TechNet: 主页
    MSDN 中文网站
    PHP中文站
    Sun技术社区
    中国IT认证实验室--企业应用技术
    中国协议分析网
    喜悦国际村
    太平洋电脑网---开发特区
    实用网站
    veBook(国外大量免费图书下载网站)
    Whois.net
    中国Web信息博物馆
    中国互联网络信息中心whois查询
    服务器系统信息查看
    网络安全
    AnySide.com
    CGI Secutiry
    K-OTik Security Monitoring
    Linux Security
    Packet Storm Security
    PHP Secure
    RFC中文文档索引
    Safemode.org
    SecuriTeam.com
    Security Corporation
    SecurityFocus
    SecurityTracker
    Zone-h (区域黑客,每天公布各国被黑的网站)
    中华安全网
    中国信息安全组织
    国家计算机网络应急处理中心
    安全天使
    安全焦点
    幻影旅团
    绿盟科技
    网络安全评估中心(cnns )
    在线手册
    Apache2.0中文文档
    Beyond Linux From Scratch
    Debian参考手册
    FreeBSD Porter 手册
    FreeBSD使用手册
    Linux C函数中文参考手册
    MySQL 4.1.0 中文参考手册
    NetBSD在线手册
    OpenBSD在线FAQ
    PHP ADODB 1.99版手册中文翻译(Tripc)
    PHP中文手册(国内)
    PHP中文手册(国外)
    PostgreSQL中文文档
    Red Hat Linux 9入门指南
    Red Hat Linux 9安装指南
    Red Hat Linux 9定制手册
    中国OSS技术手册中心
    技术文档手册中心-ChinaUnix
    存档

    原创 [原创]PHP5中PDO的简单使用

    新一篇: [转]PHPer为什么被认为是草根?


    PHP5中PDO的简单使用

    作者:heiyeluren <http://blog.csdn.net/heiyeshuwu>
    时间:2006-10-29
    关键字:PHP PHP5 PDO 数据库抽象类


    PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的php_mysql.dll之类的了,那怎么办捏,我们只有与时俱进了,我就小试了一把PDO。(本文只是入门级的,高手可以略过,呵呵)


    【PDO是啥】

    PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dllphp_pgsql.dllphp_mssql.dllphp_sqlite.dll等等扩展来连接MySQLPostgreSQLMS SQL ServerSQLite,同样的,我们必须借助 ADOdbPEAR::DBPHPlib::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();
    ?>


    然后打开我们可爱的浏览器:IE/FireFox,我的是FireFox 2.0,刚下载的,很爽,不怕流氓软件,哈哈。
    在浏览器里面输入:http://localhost/phpinfo.php,如果你的这个页面路径不一致,请自行输入。
    输出的内容中,如果你能够顺利的看到:

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

    后面有各种驱动的说明,
    PDO_Firebird,pdo_mssql,pdo_mysql,PDO_ODBC,pdo_pgsql,pdo_sqlite

     

    那么,恭喜你安装成功了,否则请仔细检查上面的步骤。

     

    【牛刀小小试验】

    我用的是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倒是有几分相似。

     

    【继续了解】

    如果我们想提取数据的话,那么就应该使用数据获取功能。(下面用到的$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::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类的错误信息和异常处理。

    1. 面向对象的方式

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

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

     

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

     

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

     

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

    <?php
    class Exception
    {
        
    // 属性
        protected $message = 'Unknown exception';   // 异常信息
        protected $code = 0;                        // 用户自定义异常代码
        protected $file;                            // 发生异常的文件名
        protected $line;                            // 发生异常的代码行号

        // 方法

        final function getMessage();                // 返回异常信息
        final function getCode();                   // 返回异常代码
        final function getFile();                   // 返回发生异常的文件名
        final function getLine();                   // 返回发生异常的代码行号
        final function getTrace();                  // backtrace() 数组
        final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息
    }
    ?>

     


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


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

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


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

    Array
    (
        [
    0=> 42S22
        [
    1=> 1054
        [
    2=> Unknown column 'aaa' in 'field list'
    )

     

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

     

    【简单总结】

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



    [ 参考资料 ]
    PHP 5 数据对象 (PDO) 抽象层与 Oracle

    PDO Functions

     

      

    发表于 @ 2006年10月29日 21:15:00|评论(loading...)|编辑

    旧一篇: [转]通过案例深入探讨PHP中的内存管理问题

    评论

    #AspxCN.net 发表于2006-11-06 21:10:00  IP: 218.83.159.*
    TrackBack来自《PDO 资源》

    PDO Functions

    通过 PDO 将 PHP 连接到 DB2 和 Cloudscape

    PHP 5 数据对象 (PDO) 抽象层与 Oracle

    PHP5中PDO的简单使用
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © heiyeluren