2026-10-23 08:19:11
PHP处理MySQL查询结果并获取数据库数据,需依次完成数据库连接、查询执行、结果处理、内存释放及连接关闭等步骤,同时可通过性能优化和错误处理提升代码质量。以下是具体方法:
一、核心处理流程mysqli_fetch_assoc()返回关联数组,通过列名访问数据,适合需要清晰字段标识的场景。
if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { echo "ID: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>"; }} else { echo "0 结果";}mysqli_fetch_row()返回索引数组,通过数字索引访问数据,适合对性能要求高且字段顺序固定的场景。
while($row = mysqli_fetch_row($result)) { echo "ID: " . $row[0]. " - Name: " . $row[1]. " - Email: " . $row[2]. "<br>";}mysqli_fetch_array()同时返回关联和索引数组,但会消耗更多内存,通常不推荐使用。
mysqli_fetch_object()返回对象,通过属性访问数据,适合面向对象编程风格。
while($row = mysqli_fetch_object($result)) { echo "ID: " . $row->id. " - Name: " . $row->name. " - Email: " . $row->email. "<br>";}使用索引在WHERE子句常用列上创建索引(如CREATE INDEX idx_name ON users (name);),但需权衡读写比例。
避免SELECT *仅查询必要列,减少网络传输和内存占用。例如:
SELECT id, name FROM users;限制结果集大小使用LIMIT分页查询,例如:
SELECT id, name FROM users LIMIT 10 OFFSET 20;预处理语句防止SQL注入并提升重复查询性能:
$stmt = mysqli_prepare($conn, "SELECT id, name FROM users WHERE id = ?");mysqli_stmt_bind_param($stmt, "i", $id);mysqli_stmt_execute($stmt);$result = mysqli_stmt_get_result($stmt);while($row = mysqli_fetch_assoc($result)) { // 处理结果}mysqli_stmt_close($stmt);分析查询效率使用EXPLAIN查看执行计划,优化慢查询:
EXPLAIN SELECT * FROM users WHERE name = 'John';基础错误捕获通过mysqli_error()获取错误信息:
$result = mysqli_query($conn, "SELECT * FROM non_existent_table");if (!$result) { echo "查询失败: " . mysqli_error($conn);}自定义错误处理函数记录错误日志或发送通知:
function custom_error_handler($conn, $sql) { $error_message = "SQL错误:nSQL: " . $sql . "n错误: " . mysqli_error($conn) . "n时间: " . date("Y-m-d H:i:s"); error_log($error_message, 3, "/path/to/error.log"); echo "系统繁忙,请稍后重试。";}$result = mysqli_query($conn, "SELECT * FROM non_existent_table");if (!$result) { custom_error_handler($conn, $sql);}PDO提供数据库抽象层,支持多种数据库系统,代码示例如下:
try { $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT id, name FROM users"; $stmt = $conn->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($result as $row) { echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>"; }} catch(PDOException $e) { echo "连接失败: " . $e->getMessage();}$conn = null;总结