使用SQL的日期过滤器功能不起作用

时间:2019-04-02 22:29:15

标签: php sql database filter

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

我通过以下查询执行此操作:

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);
}

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

1 个答案:

答案 0 :(得分:1)

由于该列为Datetime,因此在您的sql中,您正在注入timestamp值,从而导致您的结果始终为空。

相反,您可以使用gmdate将给定的Date转换为具有相同格式'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);
    }