基础级-PDO

前述

PDO(PHP Data Object)在旧版PHP中无法使用,将在未来取代繁杂的数据库接口。

开启1

开启文件:php.ini
相关代码:(去除所需数据库的注释即可)

extension=php_pdo.dll //如若没有,请自行添加
extension=php_pdo_mysql.dll //MySQL数据库

连接数据库

try{
    $pdo = new PDO('mysql:host=localhost;dbname=db_name', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->exec('SET NAMES "utf8"');
}catch(PDOException $e){
    $error = '连接数据库失败,错误代码:<br>' . $e->getMessage();
    include 'error.html.php';
    exit();
}

连接

$pdo = new PDO('mysql:host=localhost;dbname=db_name', 'username', 'password');

异常

PDO在成功连接数据库后,将启用“故障沉默”模式。
我们希望出现任何执行失败后,PDO都会抛出一个PDOException,通过调用PDO对象的setAttribute方法可以配置模式。

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ATTR_ERRMODE控制错误模式:ERRMODE_EXCEPTION为抛出异常;

字符编码

$pdo->exec('SET NAMES "utf8"');

错误

我们截取Catch中的部分代码,错误信息的设置,首先源于:PDOException类2的$e(类型强制,PHP5的新功能之一),然后在提示中调用了getMessage方法,从服务器回去一条错误信息。

catch(PDOException $e){
    $error = '连接数据库失败,错误代码:<br>' . $e->getMessage();

查询

$sql="SELECT name, password FORM user LIMIT 10"

exec方法:

发送SQL代码,执行查询,并返回影响条数。$result = $pdo->exec($sql)

query方法:

返回PDOStatement对象(一个结果集,涵盖了通过查询返回的所有条目的一个列表),可以通过循环来输出。$result = $pdo->query($sql)

fetch方法:

将数据集中的下一行作为一个数组返回,当数据集中无行之后,返回false。

// 可用foreach语句优化
while ($row = $result->fetch()){
    // process the row
}

预处理语句:

(prepared statement)提前发送给数据库一条查询,但并不立刻执行。SQL代码中含有占位符(placeholder),稍后执行查询时,再为占位符供值,PDO会预防占位符的值产生的危险。
预处理语句在建立后,将允许重复使用,如下代码所示:

$sql = 'DELETE FROM joke WHERE jokeid = :id';
$s = $pdo->prepare($sql);

foreach($result as $row)
{
    $jokeId = $row['id'];
    $s->bindValue(':id', $jokeId);
    $s->execute();
}

prepare方法:

发送SQL语句,要求数据库准备好运行查询,并返回一个PDOStatement对象。

bindValue方法:

属于PDOStatement的方法,目的是发送所缺的值,每次发送一个值。

execute方法:

属于PDOStatement的方法,目的是请求数据库执行最终的查询。

预处理 实例:

$sql = 'INSERT INTO user SET name = "无名氏", password = :password';
$s = $pdo->prepare($sql);
$s->bindValue(':password', $_POST['password']);
$s->execute();

fetchAll方法:

查询整个结果集,并将之存储在一个数组中。针对执行效率较慢的fetch方法。

小玩意

其实PDO除了标准的增删改查,还有一些有趣的东西。

最后插入ID

譬如注册时,我们需要一个最后ID,来完成玩家初始化(在玩家初次进入游戏时,再做这一步更安全),我们肯定会找到它:

// PDO::lastInsertId
// 假设情景:新玩家插入完毕,计入日志系统
$lastId = $pdo->lastInsertId();
plog('系统生成新玩家,ID为' . $lastId);

事务

某些情况下,你想要执行一系列的多个SQL查询,并让它们一次生效,那你就需要用到“事务”(transaction)了。事务允许你将复杂的多个查询操作,当做一组动作来执行,已让其同时生效。
这里仅介绍PDO的事务命令,事务本身则另开一篇文章叙述。

try{
    $pdo->beginTransaction();

    /* perform a series of queries … */

    $pdo->commit();
}catch(PDOStatement $e){
    $pdo->rollBack();

    $error = '执行事务时出错。';
    include 'error.html.php';
    exit();
}

关闭

关闭数据库连接很简洁,只需要$pdo = null;即可。


尾注

本文仅涵盖基础PDO部分,对于未涵盖内容,请参见菜鸟教程(参考资料),或官方手册。

参考资料:
《PHP&MySQL Novice to Ninja》 著者:Kevin Yank
PDO - 菜鸟教程


  1. 在PHP中,PDO默认是开启的。
  2. PDO共有三种类,PDO 类代表与数据库的一个连接;PDOStatement 类代表查询以及查询结果集;PDOException 异常类意味着一个PDO引发的异常。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值