具有命名占位符的PDO预处理语句IN子句无法按预期工作

时间:2015-04-30 20:58:15

标签: php mysql database pdo in-operator

我们在一个场景中说:$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");

我得到了我所期待的内容,因此我认为implodeIN运营商或$statement->execute存在问题。

修改

我已经阅读了这个骗局,但我不知道从哪里开始命名占位符来实现同样的目标。我的问题是,当我同时命名参数和IN运算符时,dupe仅使用IN运算符和位置占位符。

修改2

我读过第二个傻瓜,它没有关系,我的问题使用IN和命名占位符的混合,链接的问题没有解决这个问题,但是,我现在已经在答案中得到了解决方案。 / p>

0 个答案:

没有答案