我们应该使用PDO操作数据库

PHP官方支持
PDO是PHP官方用C写的连接数据库的扩展模块,从效率上绝对比自己封装的数据库类更快。从PHP5.1以上版本开始,PHP都自带了PDO模块,你再也不需要自己编写各种数据库驱动类,并且传PHP6将只支持PDO连接数据库。轻松连接各种数据库
你可以通过以下代码获得你PDO支持的数据库驱动
print_r(PDO::getAvailableDrivers());

连接数据库的例子,在执行以下代码前请安装好各种数据库服务
# 连接MSSQL
$DBH = new PDO(“mssql:host=$host;dbname=$dbname, $user, $pass”);
# 连接SYBASE
$DBH = new PDO(“sybase:host=$host;dbname=$dbname, $user, $pass”);
# 连接MySQL
$DBH = new PDO(“mysql:host=$host;dbname=$dbname”, $user, $pass);
# 有点不一样的SqLite
$DBH = new PDO(“sqlite:my/database/path/database.db”);

连接完后我们可以使用系统返回的 $DBH 进行查询操作了
$statement = $DBH->query(“select * from table”);
$data = $statement->fetchAll(PDO::FETCH_ASSOC);
print_r($data);

也可以这样
$data = $DBH->query(“select * from table”)->fetchAll(PDO::FETCH_ASSOC);
print_r($data);

异常处理
PDO自身内置了一个PDOException异常处理类,将代码放在try块中异常类将自动捕捉PDO抛出的异常并做相关处理
try{
#这里查询了一个错误的SQL语句
$DBH->query(“select * from111 table “)->fetch();
}catch(PDOException $e){
#系统捕捉到异常并记录到日志文件中
file_put_contents(‘log.txt’,$e->getMessage(),FILE_APPEND);
}事务处理
如果数据库支持事务那么PDO可以开始一个事务进行提交或回滚,如果数据库不支持事务而开始了一个事务时将抛出一个致命的错误异常。
PDO::beginTransaction()
$rst = $DBH->query(“INSERT INTO table (`field1`,`field2`)VALUES(‘value1′,’value2’)”);
if($rst){
PDO::commit();
}else{
PDO::rollBack();
}预处理参数绑定
预处理和参数绑定就是把一条SQL当作模板,只需传入不同的参数即可查询出不同的数据。
参数绑定不用引号括起来,PDO会自动将值填入,这样可以有效防止SQL注入等攻击。
# 参数绑定
$st1 = $Dbh->prepare(“select * from table where id=? and pid=?”);
$st1->bindValue(1,$id,PDO::PARAM_INT);
$st1->bindValue(2,$pid,PDO::PARAM_INT);

# 参数绑定2
$st2 = $Dbh->prepare(“select * from table where id=:id and pid=:pid”);
$st2->bindValue(‘:id’,$id,PDO::PARAM_INT);
$st2->bindValue(‘:pid’,$pid,PDO::PARAM_INT);

# 执行Sql
$st1->execute();

# 出错抛出异常
if($st1->errorCode != 0){
$error = $st->errorInfo();
throw new PDOException($error[2]);
}else{
# 取出数据
$data = $st1->fetchAll();
print_r($data);
}自定义扩展
如果你觉得PDO不适合你的使用习惯,你也可以扩展PDO类来创建属于自己的数据库操作类,只需继承自PDO。
class MyDB extends PDO{
# 重写PDO的query方法,并使之更适合自己
# 这里只需传入SQL并传入需要绑定的值即返回一个已执行的预处理对象
public function query($query, $parameters = array()){
//初始化参数
$query = (string) $query;
$parameters = (array) $parameters;

//构建查询对象
$st =$this->prepare($query);

//构建对象失败
if( ! $st){
$error = $this->errorInfo();
throw new PDOException($error[2]);
}

//绑定参数
if( ! empty($parameters)){
foreach($parameters as $tag => $value){
$st->bindValue((is_int($tag) ? $tag + 1 : (string) $tag), $value, $this->getType($value));
}
}

//执行查询
$st->execute();

//执行出错
if($st->errorCode() != 0){
$error = $st->errorInfo();
throw new PDOException($error[2]);
}
return $st;
}

# 获取所有结果
public function getAll($query, $parameters = array()){
return $this->query($query, $parameters)->fetchAll(PDO::FETCH_ASSOC);
}

#获取一行结果
public function getRow($query, $parameters = array()){
return $this->query($query, $parameters)->fetch(PDO::FETCH_ASSOC);
}
}总结
从上面的功能来看PDO是十分强大的,他自带各种数据库驱动,无需修改代码即可更换数据库,官方支持速度快易扩展等等,而且还有很功能在本文没有提到,如果感兴趣可以自己搜索相关资料。

本文固定链接: http://www.ccsbbs.com.cn/archives/5821.html | 极限手指

该日志由 极限手指 于2013年03月01日发表在 PHP 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 我们应该使用PDO操作数据库 | 极限手指
【上一篇】
【下一篇】

我们应该使用PDO操作数据库:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!