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

通过SELECT查询检测事件时间冲突时mysqli_num_rows参数报错排查

解决 mysqli_num_rows() 参数错误及时间冲突查询问题

首先,你遇到的 mysqli_num_rows() expects param... 错误,本质是因为你传给这个函数的不是有效的mysqli结果集对象——大概率是你的查询执行失败返回了false,或者你误传了连接对象/其他变量。咱们一步步来解决:

第一步:先搞对时间冲突的查询逻辑

要判断新事件和已有事件是否冲突,核心是写出正确的WHERE条件。两个时间区间冲突的逻辑可以简化为:新事件的时间区间和已有事件的区间有重叠。对应的SQL条件(针对同一个讲师)应该是:

SELECT id FROM your_table_name
WHERE instructor_id = ? -- 替换成你的关联讲师字段名
AND NOT (
    -- 不冲突的两种情况:新事件在已有事件之前,或者新事件在已有事件之后
    ? <= start_date_time 
    OR ? >= end_date_time
)

注:这里的?是预处理占位符,用来安全代入用户输入的新事件结束时间、新事件开始时间,避免SQL注入。

第二步:正确执行MySQL查询并处理结果

下面是完整的代码示例,包含预处理、执行、结果判断的正确流程:

// 假设你已经有了mysqli连接对象$conn
$instructor_id = 1; // 替换成当前关联的讲师ID
$new_start = $_POST['start_date_time']; // 用户输入的新事件开始时间
$new_end = $_POST['end_date_time']; // 用户输入的新事件结束时间

// 1. 准备预处理语句
$sql = "SELECT id FROM your_table_name WHERE instructor_id = ? AND NOT (? <= start_date_time OR ? >= end_date_time)";
$stmt = mysqli_prepare($conn, $sql);

// 2. 绑定参数(i=整数,s=字符串;这里instructor_id是整数,时间是字符串)
mysqli_stmt_bind_param($stmt, "iss", $instructor_id, $new_end, $new_start);

// 3. 执行语句
mysqli_stmt_execute($stmt);

// 4. 获取结果集
$result = mysqli_stmt_get_result($stmt);

// 5. 检查冲突行数
$conflict_count = mysqli_num_rows($result);

// 6. 后续判断逻辑
if ($conflict_count > 0) {
    echo "该讲师在这个时间段已有安排!";
} else {
    echo "可以添加新事件!";
}

// 记得关闭语句和连接(按需)
mysqli_stmt_close($stmt);
mysqli_close($conn);

常见错误排查点

  1. 查询执行失败返回false:

    • 检查SQL语句是否有拼写错误(比如表名、字段名写错)。
    • 确认用户输入的时间格式是否和数据库中一致(必须是YYYY-MM-DD HH:MM:SS格式,否则会导致时间比较失效)。
    • 可以通过mysqli_error($conn)查看具体的SQL错误:
      if (!$stmt) {
          die("预处理失败: " . mysqli_error($conn));
      }
      
  2. 误传参数给mysqli_num_rows:

    • 确保你传的是mysqli_result对象(也就是上面代码中的$result),而不是连接对象$conn或者预处理语句$stmt。
  3. 没有使用预处理语句:

    • 直接把用户输入的时间拼到SQL里,不仅会有SQL注入风险,还可能因为时间里的特殊字符导致查询失败,最终返回false传给mysqli_num_rows引发错误。

额外提醒

  • 建议在接收用户输入时先验证时间格式,比如用DateTime类检查:
    try {
        $new_start_obj = new DateTime($new_start);
        $new_end_obj = new DateTime($new_end);
        // 确保结束时间晚于开始时间
        if ($new_end_obj <= $new_start_obj) {
            echo "结束时间必须晚于开始时间!";
            exit;
        }
    } catch (Exception $e) {
        echo "时间格式不正确,请输入YYYY-MM-DD HH:MM:SS格式!";
        exit;
    }
    

内容的提问来源于stack exchange,提问作者danny26b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:18:05