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

如何修复PHP中.date('Y-m-d')在MySQL WHERE子句的查询失效问题?

修复方案

核心问题分析

原代码直接将PHP生成的日期字符串拼接进SQL语句,不仅存在SQL注入风险,还可能因PHP与MySQL时区不一致、字符串格式匹配问题导致查询无结果。以下是具体修复方案:

  • 使用MySQL内置日期函数替代PHP的date()
    让MySQL自身获取当前日期,避免跨语言的时区偏差,同时简化语句:

    <?php 
      include 'admin/db_connect.php';
      $movies = $conn->query("SELECT * FROM movies WHERE CURDATE() BETWEEN DATE(date_showing) AND DATE(end_date)");
    ?>
    
  • 采用预处理语句(参数绑定)
    彻底避免字符串拼接带来的格式错误和注入风险,确保日期参数正确传递:

    <?php 
      include 'admin/db_connect.php';
      $today = date('Y-m-d');
      $stmt = $conn->prepare("SELECT * FROM movies WHERE ? BETWEEN DATE(date_showing) AND DATE(end_date)");
      $stmt->bind_param("s", $today);
      $stmt->execute();
      $movies = $stmt->get_result();
    ?>
    
  • 统一PHP与MySQL的时区设置
    若两者时区不一致,生成的日期会存在偏差(比如PHP用东八区、MySQL用UTC,日期会差一天)。可以在PHP开头添加时区设置:

    date_default_timezone_set('Asia/Shanghai'); // 根据实际业务时区调整
    

    或者在MySQL查询中转换时区:

    SELECT * FROM movies WHERE CONVERT_TZ(CURDATE(), '+00:00', '+08:00') BETWEEN DATE(date_showing) AND DATE(end_date)
    
  • 验证日期字段的存储格式
    检查movies表中date_showing和end_date的实际类型,确保是DATE/DATETIME类型,或能被MySQL的DATE()函数正确解析。可先执行以下SQL验证转换结果:

    SELECT date_showing, end_date, DATE(date_showing), DATE(end_date) FROM movies LIMIT 10;
    

    若转换后出现NULL,说明字段格式有误,需调整存储格式或转换逻辑。

  • 调整日期比较逻辑(按需)
    若存在边界日期匹配问题(比如影片当天结束但查询不到),可显式指定闭区间比较:

    <?php 
      include 'admin/db_connect.php';
      $movies = $conn->query("SELECT * FROM movies WHERE CURDATE() >= DATE(date_showing) AND CURDATE() <= DATE(end_date)");
    ?>
    

内容的提问来源于stack exchange,提问作者Md. Arian Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:27:35