Appearance
12.2 执行查询 mysqli_query
mysqli_query 函数介绍
mysqli_query 函数用于执行 SQL 查询,它可以执行各种类型的 SQL 语句,包括 SELECT、INSERT、UPDATE、DELETE 等。
基本语法
过程式风格
php
$result = mysqli_query($conn, $sql);面向对象风格
php
$result = $conn->query($sql);执行 SELECT 查询
基本查询
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 执行查询
$sql = "SELECT id, username, email FROM users";
$result = $conn->query($sql);
// 检查查询是否成功
if (!$result) {
die('查询失败: ' . $conn->error);
}
// 处理结果
if ($result->num_rows > 0) {
// 输出数据
while ($row = $result->fetch_assoc()) {
echo "id: " . $row["id"] . " - 用户名: " . $row["username"] . " - 邮箱: " . $row["email"] . "<br>";
}
} else {
echo "0 结果";
}
// 释放结果集
$result->free();
// 关闭连接
$conn->close();
?>使用 fetch_row
php
// 使用 fetch_row 获取索引数组
while ($row = $result->fetch_row()) {
echo "id: " . $row[0] . " - 用户名: " . $row[1] . " - 邮箱: " . $row[2] . "<br>";
}使用 fetch_object
php
// 使用 fetch_object 获取对象
while ($row = $result->fetch_object()) {
echo "id: " . $row->id . " - 用户名: " . $row->username . " - 邮箱: " . $row->email . "<br>";
}执行 INSERT 查询
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 插入数据
$sql = "INSERT INTO users (username, email, password) VALUES ('user3', 'user3@example.com', 'password123')";
if ($conn->query($sql) === TRUE) {
echo "新记录插入成功,ID: " . $conn->insert_id;
} else {
echo "插入失败: " . $conn->error;
}
$conn->close();
?>执行 UPDATE 查询
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 更新数据
$sql = "UPDATE users SET age = 26 WHERE id = 1";
if ($conn->query($sql) === TRUE) {
echo "记录更新成功,影响行数: " . $conn->affected_rows;
} else {
echo "更新失败: " . $conn->error;
}
$conn->close();
?>执行 DELETE 查询
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 删除数据
$sql = "DELETE FROM users WHERE id = 3";
if ($conn->query($sql) === TRUE) {
echo "记录删除成功,影响行数: " . $conn->affected_rows;
} else {
echo "删除失败: " . $conn->error;
}
$conn->close();
?>执行多个查询
使用 mysqli_multi_query
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 多个 SQL 语句
$sql = "INSERT INTO users (username, email, password) VALUES ('user4', 'user4@example.com', 'password123');";
$sql .= "INSERT INTO users (username, email, password) VALUES ('user5', 'user5@example.com', 'password456');";
if ($conn->multi_query($sql)) {
do {
// 存储结果集
if ($result = $conn->store_result()) {
$result->free();
}
} while ($conn->more_results() && $conn->next_result());
echo "多个记录插入成功";
} else {
echo "执行失败: " . $conn->error;
}
$conn->close();
?>错误处理
方法一:使用错误检查
php
<?php
require_once 'db.php';
$conn = getDbConnection();
$sql = "SELECT * FROM non_existent_table";
$result = $conn->query($sql);
if (!$result) {
die('查询失败: ' . $conn->error);
}
// 处理结果...
$conn->close();
?>方法二:使用异常
php
<?php
require_once 'db.php';
// 启用异常
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$conn = getDbConnection();
$sql = "SELECT * FROM non_existent_table";
$result = $conn->query($sql);
// 处理结果...
$conn->close();
} catch (mysqli_sql_exception $e) {
die('查询失败: ' . $e->getMessage());
}
?>预处理语句
为了防止 SQL 注入,应该使用预处理语句:
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 准备语句
$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $username, $email, $password);
// 设置参数并执行
$username = "user6";
$email = "user6@example.com";
$password = "password789";
$stmt->execute();
echo "新记录插入成功";
$stmt->close();
$conn->close();
?>事务处理
php
<?php
require_once 'db.php';
$conn = getDbConnection();
// 开始事务
$conn->begin_transaction();
try {
// 执行多个操作
$conn->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$conn->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 提交事务
$conn->commit();
echo "事务执行成功";
} catch (mysqli_sql_exception $e) {
// 回滚事务
$conn->rollback();
echo "事务执行失败: " . $e->getMessage();
}
$conn->close();
?>结果集处理
1. 获取结果集信息
php
// 获取行数
$num_rows = $result->num_rows;
// 获取字段数
$num_fields = $result->field_count;
// 获取字段信息
$fields = $result->fetch_fields();
foreach ($fields as $field) {
echo "字段名: " . $field->name . ",类型: " . $field->type . "<br>";
}2. 移动结果集指针
php
// 移动到第一行
$result->data_seek(0);
// 移动到指定行
$result->data_seek(5);3. 转换为数组
php
// 获取所有行到数组
$rows = [];
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
// 或者使用 mysqli_fetch_all(需要 PHP 5.3.0+)
$rows = $result->fetch_all(MYSQLI_ASSOC);最佳实践
- 使用预处理语句:防止 SQL 注入攻击
- 错误处理:使用 try-catch 或错误检查
- 释放结果集:使用
free()释放结果集内存 - 关闭连接:操作完成后关闭数据库连接
- 事务处理:对于多个相关操作,使用事务确保数据一致性
- 参数绑定:使用参数绑定而非字符串拼接
练习
- 执行 SELECT 查询,获取并显示用户列表
- 执行 INSERT 查询,插入新用户
- 执行 UPDATE 查询,更新用户信息
- 执行 DELETE 查询,删除用户
- 使用预处理语句执行查询
- 使用事务处理多个操作
