Skip to content

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);

最佳实践

  1. 使用预处理语句:防止 SQL 注入攻击
  2. 错误处理:使用 try-catch 或错误检查
  3. 释放结果集:使用 free() 释放结果集内存
  4. 关闭连接:操作完成后关闭数据库连接
  5. 事务处理:对于多个相关操作,使用事务确保数据一致性
  6. 参数绑定:使用参数绑定而非字符串拼接

练习

  1. 执行 SELECT 查询,获取并显示用户列表
  2. 执行 INSERT 查询,插入新用户
  3. 执行 UPDATE 查询,更新用户信息
  4. 执行 DELETE 查询,删除用户
  5. 使用预处理语句执行查询
  6. 使用事务处理多个操作

© 2026 编程马·菜鸟教程 版权所有