Skip to content

MySQL 查询数据

SQL SELECT 语句用于从一个或多个数据库表中检索数据。

选择特定列的基本语法:

SELECT column1, column2, ...
FROM table_name;

要选择表中的所有列,请使用星号(*)通配符:

SELECT *
FROM table_name;

您可以使用 WHERE 子句过滤结果,使用 ORDER BY 排序结果,并使用 LIMIT 限制结果。有关 SQL 语法的更多详细信息,请参考专门的 SQL 教程。

PHP 提供了两个主要的扩展,用于与 MySQL/MariaDB 数据库交互:

  • PDO (PHP Data Objects): 提供了一个一致的接口来访问各种数据库(MySQL、PostgreSQL、SQLite 等)。由于其可移植性和功能性,通常推荐使用它。
  • MySQLi (MySQL Improved): 专为 MySQL/MariaDB 提供过程式和面向对象两种接口。它性能高,并提供对 MySQL 特定功能的访问。

最佳实践:预处理语句 (Prepared Statements)

强烈建议在执行 SQL 查询时始终使用预处理语句,特别是如果查询涉及任何用户输入(即使是带有 WHERE、LIMIT 或 OFFSET 子句的 SELECT 查询)。预处理语句可以防止 SQL 注入漏洞,并能提高重复查询的性能。

示例:使用 PDO 选择数据(推荐)

Section titled “示例:使用 PDO 选择数据(推荐)”

此示例使用 PDO 进行连接,使用预处理语句选择数据(即使在这种简单情况下没有绑定参数,也建立了良好的实践),获取结果,并将其显示在 HTML 表格中。

<?php
$servername = "localhost";
$username = "your_username"; // 替换为您的数据库用户名
$password = "your_password"; // 替换为您的数据库密码
$dbname = "myDBPDO"; // 替换为您的数据库名
try {
// 创建 PDO 连接
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
// 将 PDO 错误模式设置为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 准备 SQL 语句 (即使此处没有参数也是良好实践)
$stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests ORDER BY lastname");
// 执行语句
$stmt->execute();
// 将结果数组设置为关联数组
// fetchAll() 将所有结果获取到一个数组中
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (count($result) > 0) {
echo "<table border='1'><tr><th>ID</th><th>Name</th></tr>";
// 输出每一行的数据
foreach($result as $row) {
echo "<tr><td>" . htmlspecialchars($row["id"]) . "</td><td>" . htmlspecialchars($row["firstname"]) . " " . htmlspecialchars($row["lastname"]) . "</td></tr>";
}
echo "</table>";
} else {
echo "0 results found";
}
} catch(PDOException $e) {
// 失败时显示错误消息
echo "Connection failed: " . $e->getMessage();
} finally {
// 关闭连接
$conn = null;
}
?>

示例:使用 MySQLi 选择数据(面向对象)

Section titled “示例:使用 MySQLi 选择数据(面向对象)”

此示例使用 MySQLi 扩展的面向对象风格执行相同的任务。

<?php
$servername = "localhost";
$username = "your_username"; // 替换为您的数据库用户名
$password = "your_password"; // 替换为您的数据库密码
$dbname = "myDB"; // 替换为您的数据库名
// 为 mysqli 启用错误报告
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8mb4"); // 设置字符集
$sql = "SELECT id, firstname, lastname FROM MyGuests ORDER BY lastname";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table border='1'><tr><th>ID</th><th>Name</th></tr>";
// 使用 fetch_assoc() 输出每一行的数据
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . htmlspecialchars($row["id"]) . "</td><td>" . htmlspecialchars($row["firstname"]) . " " . htmlspecialchars($row["lastname"]) . "</td></tr>";
}
echo "</table>";
// 释放结果集
$result->free();
} else {
echo "0 results found";
}
} catch (mysqli_sql_exception $e) {
// 失败时显示错误消息
echo "Database error: " . $e->getMessage();
} finally {
// 如果连接已建立,则关闭连接
if (isset($conn)) {
$conn->close();
}
}
?>

示例中的关键步骤:

  • 使用 PDO 或 MySQLi 建立连接(包含凭据和错误处理)。
  • 准备(可选但推荐)并执行 SELECT SQL 查询。
  • 获取结果(例如,使用 fetchAll(PDO::FETCH_ASSOC) 或通过循环结合 MySQLi 的 fetch_assoc())。
  • 检查是否返回了任何行(PDO 的 fetchAll 使用 count(),MySQLi 使用 num_rows)。
  • 处理并显示数据(输出到 HTML 时使用 htmlspecialchars() 防止 XSS)。
  • 清理:释放结果集 (MySQLi) 并关闭数据库连接(PDO 使用 $conn = null,MySQLi 使用 $conn->close())。