如何将面向对象风格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
相关产品推荐
相关产品推荐

