我有一个网站,我在那里加载各种活动,这些活动都有特定的日期。我想过滤这些日期。
我通过以下查询执行此操作:
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);
}
所有活动的页面加载工作正常,但是如果我选择一个特定的日期,则包含活动的数组将保持为空,并且不会加载任何活动。
答案 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);
}