[英]Union Select in PDO not working
我刚开始使用 PDO 发出数据库请求,需要一些帮助。 我有以下数据库调用:
$stmt1 = $pdo->prepare('
SELECT * FROM news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC
UNION
SELECT * FROM vs_news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC
');
$stmt1->bindParam(1, $col_start);
$stmt1->bindParam(2, $col_end);
$stmt1->execute();
我已经阅读了足够多的内容,认为 UNION 与 PDO 兼容,但我似乎无法正确获取代码,也找不到完整代码格式的示例。
两个表中的字段相同,并且 db 调用仅适用于一个或另一个表,但不适用于我展示的 UNION。
有人可以指出我的问题在哪里吗?
谢谢
使用 ? 意味着您需要为每个参数匹配一个参数?
使用这种方法:
$stmt1 = $pdo->prepare('
SELECT * FROM news WHERE pub_date >= :date1 AND pub_date < :date2 AND display = 1 ORDER BY pub_date DESC
UNION
SELECT * FROM vs_news WHERE pub_date >= :date1 AND pub_date < :date2 AND display = 1 ORDER BY pub_date DESC
');
$stmt1->bindParam(':date1', $col_start);
$stmt1->bindParam(':date2', $col_end);
$stmt1->execute();
也; 使用联合,请确保在两个查询中使用相同的列数。
为了在UNION
使用ORDER BY
,您应该将组件包含在()
。 除了按照注释中的建议绑定所有四个参数之外,或者按照其他地方的建议使用命名的占位符,还可以这样做:
$stmt1 = $pdo->prepare('
(SELECT * FROM news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC)
UNION
(SELECT * FROM vs_news WHERE pub_date >= ? AND pub_date < ? AND display = 1 ORDER BY pub_date DESC)
');
在MySQL UNION
语法参考中对此进行了描述。
我喜欢 Menztrual 的回答。 这是我最喜欢的一个,因为它让我可以更好地控制查询中元素的视觉分布,但是,有趣的部分出现在数据绑定之后,我总是发现必须为每个元素编写一个 bindParam 很复杂占位符
$stmt1->bindParam(':date1', $col_start);
$stmt1->bindParam(':date2', $col_end);
$stmt1->execute();
所以,我使用了一种更简单、更优雅的方法来做到这一点。 我将在这里留下一个更简单的绑定数组执行方式的示例,供任何尚不了解它的人使用。
$stmt1->execute([':date1'=>$col_start,':date2'=>$col_end]);
对于 PDO 上更酷的事实,我推荐这个网站:(唯一正确的)PDO 那里有很多有用的教程教程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.