【发布时间】:2015-07-10 17:47:13
【问题描述】:
假设在一个场景中:$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 工作台中手动运行此查询返回我的两条记录(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 运算符时,受骗者仅将 IN 运算符与位置占位符一起使用。
编辑 2
我已经阅读了第二个骗局,它不相关,我的问题同时使用了 IN 和命名占位符,链接的问题没有解决这个问题,但是,我现在在答案中找到了解决方案。
【问题讨论】:
-
您需要尽可能多的占位符来绑定 IN 子句中的值!
-
您的
$ids作为字符串传递给 MySQL,而不是转换为 MySQL“数组”。实际上,您是在告诉 MySQL 这样做:courseid IN('2,3'),它只是一个值,与所需的courseid IN(2,3)不同 -
@MonkeyZeus 感谢您的帮助,在使用
$ids时请您帮忙解答一下@ -
@Rizier123 我已经命名了参数以及 IN 运算符,所以它不是完全重复的,或者请链接相关的。
-
courseid IN($ids)会起作用,但它会让你对 SQL 注入持开放态度。您需要为每个 ID 添加一个参数,例如courseid IN(:id1, :id2)
标签: php mysql database pdo in-operator