PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。
从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。
你可以通过 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。
另外, 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";
好了,刷新页面,可以看到和之前的效果一样,重构完成。