在现代网页开发中,动态内容是核心,而动态内容的源泉,往往来自于后台数据库,PHP作为一门强大的服务器端脚本语言,其最核心、最广泛的应用之一就是与数据库交互,读取数据并将其呈现在网页上,本文将详细、系统地介绍如何使用PHP读取网页数据库中的内容,涵盖从建立连接到安全查询并显示数据的完整流程。

准备工作:环境与前提
在开始编写代码之前,请确保您的开发环境已经准备就绪,这通常包括:
- Web服务器:如Apache或Nginx。
- PHP:已正确安装并配置在Web服务器中。
- 数据库管理系统:最常见的是MySQL或其分支MariaDB。
- 一个数据库和示例数据表:为了演示,假设我们有一个名为
my_website的数据库,其中有一张users表,包含id,username,email等字段。
第一步:建立数据库连接
PHP提供了多种方式连接MySQL数据库,其中最推荐的是使用PDO(PHP Data Objects)扩展,因为它提供了一个数据访问抽象层,意味着无论使用哪种数据库,其函数和方法都是统一的,更具可移植性和安全性,另一种是mysqli(MySQL Improved),它同样优秀,但专门针对MySQL。
使用PDO建立连接的代码示例如下:
<?php
$servername = "localhost"; // 数据库服务器地址
$username = "root"; // 数据库用户名
$password = "password"; // 数据库密码
$dbname = "my_website"; // 要连接的数据库名
try {
// 创建PDO实例,建立连接
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置PDO错误模式为异常,便于调试
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 设置字符集
$pdo->exec("set names utf8");
echo "数据库连接成功!"; // 连接成功的提示
} catch(PDOException $e) {
// 如果连接失败,捕获异常并输出错误信息
die("数据库连接失败: " . $e->getMessage());
}
?>
这段代码使用了try...catch块来优雅地处理连接可能出现的错误,如果连接成功,$pdo对象将作为我们后续所有数据库操作的桥梁。
第二步:构建并执行SQL查询
连接成功后,下一步就是准备SQL查询语句,为了安全起见,强烈建议使用预处理语句(Prepared Statements)来防止SQL注入攻击,预处理语句将SQL命令与数据分开,先发送命令模板到数据库,再单独发送数据,从根本上杜绝了注入风险。

以下是如何使用PDO预处理语句查询users表中的所有数据:
try {
// 1. 准备SQL语句模板
$sql = "SELECT id, username, email FROM users";
$stmt = $pdo->prepare($sql);
// 2. 执行查询(这里没有需要绑定的参数,直接执行)
$stmt->execute();
// 3. 获取结果集
$users = $stmt->fetchAll(PDO::FETCH_ASSOC); // 以关联数组形式获取所有结果
} catch(PDOException $e) {
die("查询失败: " . $e->getMessage());
}
fetchAll(PDO::FETCH_ASSOC)会返回一个包含所有结果行的数组,其中每一行都是一个键名为字段名的关联数组。
第三步:在网页中显示数据
获取到数据后,就可以将其嵌入到HTML结构中,呈现在用户面前,通常我们会使用循环来遍历结果数组,并动态生成HTML表格或列表。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">用户列表</title>
<style>
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1>网站用户列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>邮箱</th>
</tr>
</thead>
<tbody>
<?php if (!empty($users)): ?>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo htmlspecialchars($user['id']); ?></td>
<td><?php echo htmlspecialchars($user['username']); ?></td>
<td><?php echo htmlspecialchars($user['email']); ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="3">没有找到任何用户数据。</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</body>
</html>
注意:htmlspecialchars()函数非常重要,它能将特殊字符转换为HTML实体,是防止跨站脚本攻击(XSS)的关键步骤。
PDO 与 MySQLi 对比
为了帮助您做出选择,这里有一个简单的对比表格:

| 特性 | PDO (PHP Data Objects) | MySQLi (MySQL Improved) |
|---|---|---|
| 数据库支持 | 支持12种以上不同数据库 | 仅支持MySQL/MariaDB |
| API风格 | 面向对象 | 面向对象 + 过程化 |
| 命名参数 | 支持(如 name) |
不支持 |
| 安全性 | 预处理语句是核心特性 | 预处理语句是核心特性 |
| 性能 | 通常非常快,对于复杂查询可能略逊于MySQLi | 在纯MySQL环境下性能可能稍优 |
相关问答 (FAQs)
问题1:我应该选择PDO还是MySQLi?它们的主要区别是什么? 解答: 对于新项目,强烈推荐使用PDO,主要原因是它的数据库无关性,未来如果您因为项目需求需要从MySQL切换到PostgreSQL或其他数据库,使用PDO的代码几乎无需修改,而MySQLi则需要重写大部分数据库交互代码,PDO还支持命名参数,使得SQL语句更易读,除非您确定项目永远只会使用MySQL,并且追求极致的MySQL性能,否则PDO是更灵活、更具前瞻性的选择。
问题2:什么是SQL注入?为什么预处理语句能防止它?
解答: SQL注入是一种常见的网络攻击手段,攻击者通过在Web表单的输入字段中注入恶意的SQL代码,试图欺骗服务器执行非预期的数据库操作,例如窃取数据、删除数据等,在登录框输入用户名 ' OR '1'='1,可能会绕过密码验证,预处理语句之所以能防止它,是因为它将SQL命令和用户数据分两次发送给数据库,首先发送的是SQL“模板”(如 SELECT * FROM users WHERE username = ?),数据库会编译这个模板,之后,用户输入的数据(如 ' OR '1'='1')作为纯粹的参数发送过去,数据库只会将其作为字符串内容来匹配,而绝不会将其解释为可执行的SQL命令,从而从根本上切断了注入的途径。