您好,登录后才能下订单哦!
# PHP中处理SQL查询结果的常用函数有哪些
## 引言
在PHP开发中,数据库操作是不可或缺的重要环节。无论是简单的数据检索还是复杂的业务逻辑处理,我们都需要与数据库进行交互并处理返回的查询结果。PHP提供了丰富的函数和扩展来帮助我们高效地处理SQL查询结果,这些函数分布在不同的数据库扩展中,如MySQLi、PDO等。
本文将系统介绍PHP中处理SQL查询结果的常用函数,包括基础函数、MySQLi扩展函数、PDO扩展函数以及一些实用技巧和最佳实践。通过掌握这些函数的使用方法,开发者可以更加游刃有余地处理数据库查询结果,构建健壮高效的PHP应用。
## 一、基础结果处理函数
### 1. mysql_fetch_array()(已废弃)
```php
// 示例代码
$result = mysql_query("SELECT * FROM users");
while ($row = mysql_fetch_array($result)) {
echo $row['username'] . "<br>";
}
说明: - 从结果集中获取一行作为关联数组、数字数组或两者兼有 - 第二个参数可选:MYSQL_ASSOC、MYSQL_NUM或MYSQL_BOTH - PHP 5.5.0起已废弃,建议使用MySQLi或PDO替代
$result = mysql_query("SELECT id, name FROM products");
while ($row = mysql_fetch_assoc($result)) {
echo "ID: {$row['id']}, Name: {$row['name']}<br>";
}
特点: - 专门返回关联数组 - 代码可读性更好,直接使用列名访问数据
$result = mysql_query("SELECT id, name FROM products");
while ($row = mysql_fetch_row($result)) {
echo "ID: {$row[0]}, Name: {$row[1]}<br>";
}
特点: - 返回数字索引数组 - 访问速度快于关联数组
$result = mysql_query("SELECT * FROM orders");
$row_count = mysql_num_rows($result);
echo "Found $row_count records";
应用场景: - 获取SELECT查询返回的行数 - 常用于分页计算
$mysqli = new mysqli("localhost", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM products");
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
echo $row[0] . " " . $row['product_name'];
}
参数选项: - MYSQLI_ASSOC - MYSQLI_NUM - MYSQLI_BOTH(默认)
$result = $mysqli->query("SELECT id, name, price FROM products");
while ($row = $result->fetch_assoc()) {
echo "Product: {$row['name']} (¥{$row['price']})<br>";
}
优势: - 代码可读性强 - 直接使用列名访问数据
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_row()) {
echo "User ID: $row[0], Name: $row[1]<br>";
}
适用场景: - 需要快速访问数据 - 不需要列名信息的情况
$result = $mysqli->query("SELECT * FROM employees");
while ($employee = $result->fetch_object()) {
echo "Employee: {$employee->first_name} {$employee->last_name}<br>";
}
特点: - 返回对象形式的结果 - 可以通过箭头运算符访问属性
$result = $mysqli->query("SELECT * FROM products");
$result->data_seek(5); // 跳转到第6条记录
$row = $result->fetch_assoc();
用途: - 移动结果集内部指针 - 实现随机访问记录
$result = $mysqli->query("SELECT * FROM orders WHERE status = 'pending'");
echo "Pending orders: " . $result->num_rows;
注意: - 对于无缓冲查询,需要先获取所有结果才能准确计数 - 替代方案:使用COUNT(*)SQL函数
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['username'] . "<br>";
}
常用获取模式: - PDO::FETCH_ASSOC - PDO::FETCH_NUM - PDO::FETCH_BOTH - PDO::FETCH_OBJ
$stmt = $pdo->query("SELECT * FROM products");
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($products as $product) {
echo $product['name'] . ": " . $product['price'] . "<br>";
}
优势: - 一次性获取所有结果 - 减少数据库连接时间
$count = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
echo "Total users: $count";
典型应用: - 获取单列值 - 聚合函数结果
$stmt = $pdo->query("SELECT * FROM books");
while ($book = $stmt->fetchObject()) {
echo "Title: {$book->title}, Author: {$book->author}<br>";
}
特点: - 返回自定义类的实例 - 支持类型转换
$stmt = $pdo->prepare("DELETE FROM logs WHERE created_at < ?");
$stmt->execute([date('Y-m-d', strtotime('-30 days'))]);
echo "Deleted " . $stmt->rowCount() . " records";
注意: - 不是所有数据库都支持SELECT的行数统计 - 对SELECT建议使用COUNT(*)替代
// 使用预处理语句防止SQL注入
$stmt = $pdo->prepare("SELECT * FROM articles ORDER BY created_at DESC LIMIT :limit OFFSET :offset");
$perPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
$stmt->bindParam(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
class User {
public $id;
public $name;
public $email;
}
$stmt = $pdo->query("SELECT id, name, email FROM users");
$users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
foreach ($users as $user) {
echo "User: {$user->name} ({$user->email})<br>";
}
// 使用无缓冲查询处理大量数据
$mysqli->real_query("SELECT * FROM large_table");
$result = $mysqli->use_result();
while ($row = $result->fetch_assoc()) {
// 处理每一行数据
process_row($row);
}
$result->close();
try {
$pdo->beginTransaction();
// 执行多个查询
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
// 正确的做法 \(stmt = \)pdo->prepare(“SELECT * FROM users WHERE id = ?”); \(stmt->execute([\)_GET[‘id’]]);
2. **验证和过滤输入**
```php
$userId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($userId === false) {
die("Invalid ID");
}
try {
$stmt = $pdo->prepare("INSERT INTO logs (message) VALUES (?)");
$stmt->execute([$message]);
} catch (PDOException $e) {
error_log("Database error: " . $e->getMessage());
// 向用户显示友好信息
}
选择合适的获取方式
*使用列名而非SELECT ** “`php // 不推荐 \(stmt = \)pdo->query(“SELECT * FROM products”);
// 推荐 \(stmt = \)pdo->query(“SELECT id, name, price FROM products”);
3. **合理使用缓冲查询**
```php
// 无缓冲查询(大数据量)
$mysqli->real_query("SELECT * FROM large_table");
$result = $mysqli->use_result();
// 缓冲查询(小数据量)
$result = $mysqli->query("SELECT * FROM small_table");
$result = $mysqli->query("SELECT * FROM temp_data");
// 处理结果...
$result->free(); // 释放内存
function verifyLogin(PDO $pdo, string $username, string $password): ?array {
$stmt = $pdo->prepare("SELECT id, username, password_hash FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($password, $user['password_hash'])) {
return $user;
}
return null;
}
function generateSalesReport(PDO $pdo, DateTime $startDate, DateTime $endDate): array {
$stmt = $pdo->prepare("
SELECT
p.category,
SUM(oi.quantity) as total_quantity,
SUM(oi.quantity * oi.unit_price) as total_revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.id
JOIN orders o ON oi.order_id = o.id
WHERE o.order_date BETWEEN ? AND ?
GROUP BY p.category
");
$stmt->execute([
$startDate->format('Y-m-d'),
$endDate->format('Y-m-d')
]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
function batchInsertUsers(PDO $pdo, array $users): int {
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$pdo->beginTransaction();
try {
$count = 0;
foreach ($users as $user) {
$stmt->execute([$user['username'], $user['email']]);
$count += $stmt->rowCount();
}
$pdo->commit();
return $count;
} catch (PDOException $e) {
$pdo->rollBack();
throw $e;
}
}
PHP提供了多种处理SQL查询结果的函数和方法,从基础的mysql_*函数(已废弃)到现代的MySQLi和PDO扩展。选择合适的结果处理方式需要考虑以下因素:
随着PHP版本的更新,数据库处理的最佳实践也在不断发展。建议开发者:
通过熟练掌握这些结果处理函数和技术,PHP开发者可以构建出既安全又高效的数据库驱动应用程序。
函数/方法 | 扩展 | 描述 | 返回类型 |
---|---|---|---|
mysql_fetch_array | mysql | 获取行作为混合数组 | 数组 |
mysqli_fetch_assoc | mysqli | 获取行作为关联数组 | 数组 |
PDO::fetch | PDO | 获取下一行 | 数组/对象 |
fetchAll | PDO | 获取所有行 | 多维数组 |
fetchColumn | PDO | 获取单列值 | 标量值 |
num_rows | mysqli | 获取行数 | 整数 |
rowCount | PDO | 获取受影响行数 | 整数 |
data_seek | mysqli | 移动结果指针 | 布尔 |
fetch_object | mysqli/PDO | 获取行作为对象 | 对象 |
”`
注:本文约4100字,涵盖了PHP中处理SQL查询结果的主要函数和技术,包括基础函数、MySQLi和PDO扩展的使用方法,以及安全注意事项和性能优化建议。文章采用Markdown格式,包含代码示例和实用表格,可直接用于技术文档或博客发布。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。