我们在一个场景中说:$ids = 2,3
。但由于某种原因,记录会被返回,如果:$ids = 2
。
我认为完整代码在这一行中存在一些问题,因为当我回显$ids
时,它返回2,3
,但实际查询返回就好像只有一个id一样。即它仅从一个课程(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;
}
P.S。在mysql workbench中手动运行这个查询会返回我的两个记录(1个来自课程id 2,另一个来自课程3),我在操作符中用(2,3)替换,但在php执行中我只返回一个记录。
如果我对php courseid IN(2,3)
中的值进行硬编码,例如:
$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
或IN
运营商或$statement->execute
存在问题。
修改
我已经阅读了这个骗局,但我不知道从哪里开始命名占位符来实现同样的目标。我的问题是,当我同时命名参数和IN运算符时,dupe仅使用IN运算符和位置占位符。
修改2
我读过第二个傻瓜,它没有关系,我的问题使用IN和命名占位符的混合,链接的问题没有解决这个问题,但是,我现在已经在答案中得到了解决方案。 / p>