PDO方式访问数据库
1、什么是PDO?
PDO 是 PHP Data Objects 的简称,是一种数据库访问抽象层。但是这样定义 pdo 反而让人觉得很难理解,很抽象,它究竟是什么东西呢?从根本上讲,pdo 是用于多种数据库的一致接口。你不必再使用mysql_*
函数,sqlite_*
函数等,也不必再为他们编写与您的数据库一起工作的封装类。相反,只需要使用 pdo 接口中的相同方法就可以与所有三种函数协同工作。简单的说,pdo 为我们提供了许多与各种数据库相关的操作接口,我们不再需要自己去编写麻烦的方法去链接,选择数据库等操作,只需要实例化 pdo 的对象,然后调用它的方法就可以实现所有想实现的数据库操作。
开启PDO
在Windows环境下PHP5.1以上的版本中,PDO和主要数据库的驱动同PHP一起作为扩展发布,要开启它们需要编辑一下 php.ini 文件,去掉相应数据库 PDO 驱动 dll 之前的注释(;)即可。例如:
[PDO_PDO_MYDQL]
extension=php_pdo_mysql.dll //开启 MySQL 的 PDO 驱动
[PDO_PDO_ODBC]
extension=php_pdo_odbc.dll //开启 ODBC 的 PDO 驱动
[PDO_PDO_PGSQL]
extension=php_pgsql.dll //开启 PGSQL 的 PDO 驱动
创建 PDO 对象
在使用 PDO 与数据库交互之前,首先要创建一个PDO对象,创建PDO对象的语句格式如下:
$db = new PDO(DSN, username, password);
其中,DSN 是数据源名, username 是连接数据库的用户名,password 是密码。不同的 DBMS 的 DSN 是不同的:
DMS | DSN |
---|---|
MySQl | mysql:host=localhost;dbname=testdb |
Oraclel | oci:dbname=//localhost:1521/testdb |
ODBC | odbc:testdb |
2、如何利用pdo访问数据库?
访问数据库之前首先需要链接到数据库,以 mysql 为例,使用 pdo 链接数据库的方法如下:
<?php
$host = 'mysql:host=localhost;dbname=pdotest;';
$username = 'root';
$password = 'root';
try{
$pdoobj = new PDO($host,$username,$password);
}catch(PDOException $e){
echo 'connection failed!'.$e->getMessage();
}
?>
规范点:
<?php
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
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));
?>
3、如何获得受影响的行数?
在做进一步动作之前就能够计算出一个查询返回或影响的行数通常很有用,可以用sql 的聚合函数 count()
来返回 select 查询结果所得的行数,代码如下:
<?php
$sql = "select count(id) from `testpdo` where `name`='$name'";
$pdoobj->prepare($sql);
$resultnum = $pdoobj->execute();
?>
这样就可以得到查询结果的条数,在某些时候需要统计数目,count() 函数就显示出他的威力了。通常情况下 count 函数都是和 distinct 搭配使用的,因为多数情况下统计数目都是需要去掉重复的,所以经常要和 distinct 搭配使用。
例如:
<?php
$sql = "select count(*) from `test` distinct by `name`";
$pdoobj->prepare($sql);
$resultNum = $pdoobj->execute();
?>
另外,还可以用 pdo 的函数rowCount()
方法返回受影响的行数。
例如:
<?php
$sql = "delet from `test` where `name`='$name' ";
$pdoobj->prepare($sql);
$resultNum = $pdoobj->execute();
?>
也就是说在调用了 pdo 的 execute()
函数之后,可以调用 pdo 的rowCount()
函数来返回受影响的行数。
POD 执行 sql 语句的方法是采用prepare()
和execute()
两个函数。