MySQL 查询数据
PHP:从 MySQL/MariaDB 中选择数据
Section titled “PHP:从 MySQL/MariaDB 中选择数据”从数据库中选择数据
Section titled “从数据库中选择数据”SQL SELECT 语句用于从一个或多个数据库表中检索数据。
选择特定列的基本语法:
SELECT column1, column2, ...FROM table_name;要选择表中的所有列,请使用星号(*)通配符:
SELECT *FROM table_name;您可以使用 WHERE 子句过滤结果,使用 ORDER BY 排序结果,并使用 LIMIT 限制结果。有关 SQL 语法的更多详细信息,请参考专门的 SQL 教程。
使用 PHP 连接和选择数据
Section titled “使用 PHP 连接和选择数据”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 建立连接(包含凭据和错误处理)。
- 准备(可选但推荐)并执行
SELECTSQL 查询。 - 获取结果(例如,使用
fetchAll(PDO::FETCH_ASSOC)或通过循环结合 MySQLi 的fetch_assoc())。 - 检查是否返回了任何行(PDO 的
fetchAll使用count(),MySQLi 使用num_rows)。 - 处理并显示数据(输出到 HTML 时使用
htmlspecialchars()防止 XSS)。 - 清理:释放结果集 (MySQLi) 并关闭数据库连接(PDO 使用
$conn = null,MySQLi 使用$conn->close())。