假设一个场景:$ids = 2,3
。但由于某种原因,记录被返回,就像:$ids = 2
.
我相信完整代码中的这一行存在一些问题,因为当我回显时$ids
,它返回2,3
,但实际查询返回时就好像只有一个 id 一样。 IE。它仅返回一门课程(id 2)的事件。
$statement->execute(array("ids" => $ids, 'timestart' => $timestart, 'timeend' => $timeend))) {
我的完整代码:
$ids = array_map(function($item) { return $item->id; }, $entitlementsVOs);
$ids = implode(', ', $ids); //echo shows 2,3
$timestart = isset($_GET['start']) && $_GET['start'] != "" ? $_GET['start'] : null;
$timeend = isset($_GET['end']) && $_GET['end'] != "" ? $_GET['end'] : null;
$statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(:ids) AND timestart >= :timestart AND timestart + timeduration <= :timeend");
$statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));
if($statement->execute(array("ids" => $ids, 'timestart' => $timestart, 'timeend' => $timeend))) {
return $statement->fetchAll();
} else {
return null;
}
附注在 mysql 工作台中手动运行此查询返回我的两条记录(一条来自课程 id 2,另一条来自课程 3),我用 (2,3) 替换运算符,但在 php 执行中我只得到一条记录。
如果我在 php 中硬编码这些值courseid IN(2,3)
, e.g.:
$statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(2,3) AND timestart >= :timestart AND timestart + timeduration <= :timeend");
我得到了我的期望,所以我相信两者都存在一些问题implode
, or IN
运算符或$statement->execute
.
Edit:
我已经读过这个骗局,但我不知道从哪里开始使用命名占位符来完成同样的任务。我的问题是,当我同时命名参数和 IN 运算符时,欺骗者仅将 IN 运算符与位置占位符一起使用。
Edit 2
我已经阅读了第二个骗局,它不相关,我的问题混合使用了 IN 和命名占位符,链接的问题没有解决这个问题,但是,我现在在答案中找到了解决方案。