PHP作为一种强大的服务器端脚本语言,其最核心的功能之一便是与数据库进行交互,从而动态地生成网页内容,要理解PHP怎么读取网页数据库数据,关键在于掌握连接、查询和获取这三个核心步骤,本文将以目前最为主流的MySQL数据库为例,详细介绍这一过程。

第一步:建立数据库连接
在从数据库读取任何数据之前,PHP必须首先与数据库服务器建立一个有效的连接,连接时需要提供数据库的主机地址、用户名、密码以及要操作的数据库名称,PHP主要提供两种流行的扩展来实现此功能:MySQLi和PDO。
使用PDO(PHP Data Objects)连接 PDO是推荐使用的方式,因为它提供了一个数据访问抽象层,意味着你可以使用相同的函数来处理不同类型的数据库(如MySQL, PostgreSQL等),具有极佳的可移植性,更重要的是,PDO原生支持预处理语句,能有效防止SQL注入攻击。
$host = 'localhost';
$db = 'my_database';
$user = 'root';
$pass = 'password';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
使用MySQLi(MySQL Improved Extension)连接 MySQLi是专门针对MySQL数据库的增强版扩展,同时支持面向对象和面向过程两种编程风格。
$host = 'localhost';
$db = 'my_database';
$user = 'root';
$pass = 'password';
// 面向对象风格
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_error) {
die('连接失败: ' . $mysqli->connect_error);
}
第二步:准备并执行SQL查询
连接成功后,下一步就是构建并发送SQL查询语句,为了安全起见,强烈建议使用“预处理语句”,预处理语句将SQL命令和用户数据分开,先由数据库编译SQL命令模板,再将数据作为参数传入,从根本上杜绝了SQL注入的风险。

以PDO为例,假设我们要从users表中读取ID为1的用户信息:
// SQL语句模板,使用问号作为占位符 $sql = "SELECT id, name, email FROM users WHERE id = ?"; $stmt = $pdo->prepare($sql); // 绑定参数并执行 $stmt->execute([1]);
第三步:获取并处理数据
查询执行后,结果集会存储在语句对象($stmt)中,我们需要将其取出并转换为PHP可以使用的数组或对象。
// 获取所有匹配的行(这里只有一行)
$user = $stmt->fetch();
// 如果需要获取多行数据,可以使用fetchAll()
// $users = $stmt->fetchAll();
// 现在可以访问数据了
if ($user) {
echo "用户名: " . htmlspecialchars($user['name']) . "<br>";
echo "邮箱: " . htmlspecialchars($user['email']);
} else {
echo "未找到该用户。";
}
fetch()方法默认返回一个关联数组,其键是数据库表的列名。htmlspecialchars()函数用于转义HTML特殊字符,防止跨站脚本(XSS)攻击,这是另一个重要的安全实践。
MySQLi 与 PDO 对比
为了帮助开发者做出选择,下表简要对比了两者:

| 特性 | PDO | MySQLi |
|---|---|---|
| 数据库支持 | 支持12种以上不同数据库 | 仅支持MySQL |
| API | 面向对象 | 面向对象和面向过程 |
| 预处理语句 | 客户端和服务器端都支持,更安全 | 仅服务器端支持 |
| 命名参数 | 支持(如 id) |
不支持 |
| 性能 | 通常略快,尤其在PHP 5.0+版本中 | 性能优异,与PDO相差无几 |
使用PHP读取数据库数据是一个标准化的流程,优先选择PDO扩展,因为它提供了更好的安全性、灵活性和可移植性,始终遵循“连接-预处理-执行-获取”的模式,并注意对输出数据进行适当的安全处理,是构建健壮、安全的Web应用的关键。
相关问答 (FAQs)
问:我应该选择PDO还是MySQLi? 答: 对于新项目,强烈推荐使用PDO,最主要的原因是它的数据库抽象层特性,未来如果需要从MySQL迁移到其他数据库(如PostgreSQL或SQLite),你几乎不需要修改数据访问层的代码,PDO对命名参数的支持使得代码更具可读性,除非你的项目有特殊需求且确定永远不会离开MySQL环境,否则PDO是更现代、更具前瞻性的选择。
问:什么是SQL注入,为什么预处理语句能防止它?
答: SQL注入是一种代码注入技术,攻击者通过在Web应用的输入字段中“注入”恶意的SQL代码,来欺骗服务器执行非预期的数据库操作,在一个登录表单中,攻击者可能输入' OR '1'='1作为密码,如果代码直接拼接SQL语句,生成的查询可能会变成SELECT * FROM users WHERE password = '' OR '1'='1',从而绕过验证,预处理语句通过将SQL逻辑(命令)和数据(用户输入)严格分离来解决这个问题,SQL命令模板被数据库预先编译,用户输入的数据只是作为纯粹的参数填充进去,数据库引擎绝不会将输入内容解释为SQL代码,从而彻底杜绝了注入风险。