在PHP 5之前,想要连接MySQL数据库就需要使用mysql或mysqli等一系列函数来操作数据库。例如,我们使用mysql系列数据库函数进行查询操作,对应的示例代码如下:
<?php //创建数据库连接 $link = mysql_connect('127.0.0.1', 'username', 'password') or die('连接数据库失败!'); mysql_select_db('test', $link); //选择指定的数据库 $res = mysql_query('SELECT id, body FROM demo', $link); while ($row = mysql_fetch_row($res)) { echo "id=$row[0],body=$row[1]<br/>"; } mysql_free_result($res); mysql_close($link); ?>
同样的,如果我们要使用PHP连接Oracle、DB2或者其他数据库,如上述代码所示一样,也需要使用到诸如db2_connect
、db2_fetch_row
、db2_close
、oci_connect
、oci_fetch_row
、oci_close
等许多以对应数据库开头的PHP函数。
如果我们的程序中有连接多个数据库的需要,我们就必须编写对应的操作不同数据库的多个工具类(或函数)。显然,这样的数据库访问API对PHP开发人员来说显得并不友好,给我们开发涉及多个数据库的程序徒增了许多烦恼。
不过,从PHP 5版本之后,这种状况得以改善。在 PHP 5及其后的版本中,PHP为我们提供了一套全新的数据库访问API扩展——PHP数据对象(PDO)。PDO扩展库为PHP访问数据库定义了一个轻量级的一致接口。它是一个抽象的数据访问接口,我们可以方便地使用它来统一操作各种不同的数据库。例如,我们以PDO方式再次重写上述示例,代码如下:
<?php $type = 'mysql'; //数据库类型 $db_name = 'test'; //数据库名 $host = '127.0.0.1'; $username = 'root'; $password = 'ready'; $dsn = "$type:host=$host;dbname=$db_name"; try { $pdo = new PDO($dsn, $username, $password); } catch (Exception $e) { die('连接数据库失败!'); } $stmt = $pdo->query('SELECT id, body FROM demo'); while ($row = $stmt->fetch()) { echo "id=$row[0],body=$row[1]<br/>"; } $pdo = null; ?>
此时,如果我们需要将数据库从MySQL迁移到DB2或者Oracle上,PHP程序中对应的改动就非常简单,其他地方无需多作更改,我们只需要将变量$type
设置为ODBC
或者OCI
即可。
备注: 1.到目前为止,PHP PDO扩展连接DB2,需要以ODBC方式连接,因此$type需设置ODBC。 2.PHP PDO扩展库只是一个数据访问的抽象接口,如果要连接不同的数据库,需要添加实现了PDO接口的对应数据库驱动。当然,PHP已经给我们准备好了一些数据库驱动扩展程序(存放在PHP安装目录/ext目录下),例如php_pdo_mysql.dll(用于MySQL)、php_pdo_oci.dll(用于Oracle)、php_pdo_odbc.dll(用于以ODBC形式访问的数据库)。虽然不同数据库驱动的底层实现不一样,但是对于我们开发人员来说,却是使用相同的方式来访问数据库,PDO在中间已经帮我们做了相应的转换处理工作。 3.在php.ini配置文件中,官方提供的默认配置并没有启用pdo扩展(mysql、mysqli扩展也没有启动),我们需要在php.ini中启用对应的pdo扩展库:
;需要使用何种数据库,就去掉配置文件对应行前面的注释符号";" extension=php_pdo_mysql.dll ;extension=php_pdo_oci.dll ;extension=php_pdo_odbc.dll