PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。
PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。
从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。
详细内容请参考 PHP 官方手册:PDO
你可以通过 PHP 的 phpinfo()
函数来查看是否安装了PDO扩展。
小实践
准备
在这个系列之前的手记中有创建过 MySQL 数据库和表:
- 数据库:mytodo
- 表:todos
如果还没有相应的数据库和表可以使用下面的命令或者通过客户端工具建立。
通过终端命令创建数据库和表:
create database mytodo;
create table todos (
id int PRIMARY KEY AUTO_INCREMENT,
description text NOT NULL,
completed boolean NOT NULL
);
开始
建立一个文件 index.php
,内容如下:
<?php
try {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mytodo', 'root', '');
} catch (PDOException $e) {
die('Could not connect.');
}
$statement = $pdo->prepare('select * from todos');
$statement->execute();
$tasks = $statement->fetchAll(PDO::FETCH_OBJ);
require "index.view.php";
字符串 mysql:host=127.0.0.1;dbname=mytodo
被称为 DSN。
数据源名称或叫做 DSN,包含了请求连接到数据库的信息。
通常,一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成。更深入的信息能从 PDO 具体驱动文档找到。
详情可以查阅参数介绍:PDO 构造方法说明
这里 fetchAll(PDO::FETCH_OBJ)
方法返回一个包含结果集中所有行的对象数组。你可以查阅 fetchall 方法 详细说明以了解更多。
另外, index.view.php
的内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<ul>
<?php foreach ($tasks as $task) : ?>
<li>
<?php if ($task->completed) : ?>
<strike><?= $task->description; ?></strike>
<?php else: ?>
<?= $task->description; ?>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
页面上将呈现从数据库读取出来表数据,前提是你的数据库mytodo
下的表 todos 中已存在数据,否则没什么会显示,就像这样。
页面执行的效果如下:
重构优化代码
在项目目录下新建 Task.php
,内容如下:
<?php
class Task
{
public $description;
public $completed;
}
接下来将之前 index.php
业务逻辑通过函数实现放入 functions.php
中:
<?php
// 连接数据库
function connectToDb()
{
try {
return new PDO('mysql:host=127.0.0.1;dbname=mytodo', 'root', '');
} catch (PDOException $e) {
die('Could not connect.');
}
}
// 读取所有任务
function fetchAllTasks($pdo)
{
$statement = $pdo->prepare('select * from todos');
$statement->execute();
return $statement->fetchAll(PDO::FETCH_OBJ);
}
// 打印变量(用于调试输出)
function dd($data)
{
echo '<pre>';
die(var_dump($data));
echo '</pre>';
}
那么 index.php
被整合后的代码如下:
<?php
require 'functions.php';
require 'Task.php';
$pdo = connectToDb();
$tasks = fetchAllTasks($pdo);
require "index.view.php";
好了,刷新页面,可以看到和之前的效果一样,重构完成。