【问题标题】:Date filter function with SQL doesn't work使用 SQL 的日期过滤功能不起作用
【发布时间】:2019-08-24 08:22:09
【问题描述】:

我有一个网站,我可以在其中加载各种活动,这些活动都有特定的日期。我想过滤这些日期。

我用这个查询来做到这一点:

function selectAllActivities($date = false){
    $sql = "SELECT * FROM `activities`
            INNER JOIN `locations` on `activities`.`location_id` = `locations`.`id`";
    if (!empty($date)){
        $sql .=  " WHERE `activities`.`start` >= :date AND `activities`.`start` < :next_day";
    }

    $stmt = $this->pdo->prepare($sql);
    $stmt->bindValue(':date', strtotime($date));
    $stmt->bindValue(':next_day', strtotime($date.'+1 day'));
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

如果没有给出日期,页面将加载所有活动,但如果有人想选择特定日期以查看该日期有哪些活动,我使用此代码:

public function index() {
    $activityDAO = new ActivityDAO();

    if (!empty($_GET['date'])) {
        $activities = $activityDAO->selectAllActivities($_GET['date']);
    } else {
        $activities = $activityDAO->selectAllActivities();
    }
    $this->set('activities',$activities);
}

所有活动的页面加载工作正常,但如果我选择特定日期,则包含活动的数组保持为空,不会加载任何活动。

【问题讨论】:

  • $_GET['date'] 是什么样的? activities.start 列是什么数据类型?
  • 你的错误检查代码在哪里
  • @RiggsFolly date = 'Y-m-d' and activities.start = 'Y-m-d-h-m'
  • 您是说activities.start 是文本数据类型,而不是日期、日期时间或时间戳?
  • @RiggsFolly 哦,不抱歉!它是一个日期数据类型

标签: php sql database filter


【解决方案1】:

由于该列是 Datetime ,因此在您的 sql 中,您正在注入时间戳值,因此您的结果始终为空。

相反,您可以使用gmdate 将给定的日期转换为具有相同格式的日期时间'Y-m-d-h-m'

 function selectAllActivities($date = false){
        $sql = "SELECT * FROM `activities`
                INNER JOIN `locations` on `activities`.`location_id` = `locations`.`id`";
        if (!empty($date)){
            $sql .=  " WHERE `activities`.`start` >= :date AND `activities`.`start` < :next_day";
        }
        $dateTime = gmdate("Y-m-d-h-m", strtotime($date));
        $dateTimeTomorrow=gmdate("Y-m-d-h-m", strtotime($date.'+1 day'));
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindValue(':date', $dateTime);
        $stmt->bindValue(':next_day', $dateTimeTomorrow);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

【讨论】:

  • 收到此错误:调用字符串上的成员函数 format()
  • 你试过第二种解决方案了吗?
  • 我将编辑我的答案,只允许第二个选项
猜你喜欢
  • 2014-03-28
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多