让我们在一个场景中说:$ids = 2,3
. 但由于某种原因,记录被返回,好像:$ids = 2
.
我相信完整代码的这一行存在一些问题,因为当我 echo 时$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;
}
ps 在 mysql 工作台中手动运行此查询会返回我的两条记录(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
, orIN
运算符 or存在一些问题$statement->execute
。
编辑:
我已经阅读了欺骗,但我不知道从哪里开始使用命名占位符来完成相同的操作。我的问题是,当我同时命名参数和 IN 运算符时,受骗者仅将 IN 运算符与位置占位符一起使用。
编辑 2
我已经阅读了第二个骗局,它不相关,我的问题同时使用了 IN 和命名占位符,链接的问题没有解决这个问题,但是,我现在在答案中找到了解决方案。