You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将面向对象风格mysqli日历查询代码改写为过程化风格并解决报错

mysqli过程化写法改写方案

报错根因

你改写的代码中使用了带预处理占位符?的SQL语句直接传入mysqli_query()执行,而mysqli_query()无法解析预处理占位符,导致查询执行失败返回布尔值false,mysqli_fetch_assoc()接收到不符合要求的布尔类型参数就触发了类型错误。

正确改写代码

过程化写法同样需要遵循预处理查询的执行逻辑,完整代码如下:

function build_calendar($month, $year) {
    // 建立数据库连接
    $connection = mysqli_connect('localhost', 'root', '', 'ems');
    // 连接错误校验
    if (mysqli_connect_errno()) {
        die("数据库连接失败:" . mysqli_connect_error());
    }

    $booked_dates = [];
    $sql = "SELECT event_date FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date) = ?";

    // 初始化预处理语句
    $stmt = mysqli_prepare($connection, $sql);
    // 绑定参数,ss代表两个字符串类型参数
    mysqli_stmt_bind_param($stmt, 'ss', $month, $year);

    // 执行语句并处理结果
    if (mysqli_stmt_execute($stmt)) {
        $result = mysqli_stmt_get_result($stmt);
        while ($row = mysqli_fetch_assoc($result)) {
            $booked_dates[] = $row['event_date'];
        }
        // 释放结果资源
        mysqli_free_result($result);
    }

    // 关闭预处理语句与数据库连接
    mysqli_stmt_close($stmt);
    mysqli_close($connection);

    return $booked_dates;
}

额外优化建议

  • 原OOP代码中SELECT *可以替换为SELECT event_date,只查询需要的字段可以提升查询效率
  • 必须保留预处理逻辑,不要为了图方便直接把$month和$year拼接进SQL语句,否则会有SQL注入风险

内容的提问来源于stack exchange,提问作者tea-codes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:54:03