繁体   English   中英

联盟 Select 在 PDO 不工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM