百科上说
PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用。 这是什么意思?用pdo执行的查询代码即使更换了数据库也能正常运行?
SQL查询各个数据都不同的啊 ,比如mysql有limit,MSSQL没有limit,pdo会自动转换过来?
如果不行的话用pdo又有什么意义?php扩展

解决方案 »

  1.   

    就是你说的那个意思。你可以把pdo想成一个抽象类、定义了sql语句的很多方法,然后由它的子类去实现。子类当然就是pdo_mysql、pdo_mssql、pdo_oracle等等。你也可以把pdo想象成一个工厂类,在new实例时,由你传入的参数来决定是创建那个哪个子类的实例对象。在php的源码目录ext下,有一系列pdo开头的目录,可以去看看。
      

  2.   

    由于数据库的差异性,各个数据库的调用不是完全相同的,同样的程序如果使用不同的数据库存放数据时,需要对程序的数据处理部分进行改动,给移植带来不便。
    用pdo,为数据库访问提供了一致的接口,只需在配置的连接参数中,配置不同的数据库驱动就可以了,而把对数据处理程序的改动降低到最小,甚至不需改动。为数据的处理及安全性都带来了很大的方便。
      

  3.   

    其实也不能说与其他包完全没有依赖关系。在php5.3后,php加入了一个叫mysqlnd的库,pdo_mysql会判断,如果定义了PDO_USE_MYSQLND这个宏,就使用mysqlnd提供的api来操作mysql,否则他需要知道你mysql的安装目录,去找mysql的.h文件,然后调用mysql本身的api。还有php_mysql和php_mysqli,如果你在编译php时,指定了mysql的驱动为mysqlnd(--with-mysql=mysqlnd和--with-mysqli=mysqlnd),就使用mysqlnd的接口来操作mysql,否则你需要将--with-mysql和--with-mysqli指定为php-config,他会去使用mysql本身api。
    php_pdo_mysql_int.h
    --------------------------------
    /* $Id$ */#ifndef PHP_PDO_MYSQL_INT_H
    #define PHP_PDO_MYSQL_INT_H#if defined(PDO_USE_MYSQLND)
    #   include "ext/mysqlnd/mysqlnd.h"
    #   include "ext/mysqlnd/mysqlnd_libmysql_compat.h"
    #   define PDO_MYSQL_PARAM_BIND MYSQLND_PARAM_BIND
    #else
    #   include <mysql.h>
    #   define PDO_MYSQL_PARAM_BIND MYSQL_BIND
    #endif