PDO / SQLite:覆盖两个相关数据库的单个查询

4

背景

在处理 Feeddemon 的两个 SQLite 数据库(tags.fdbfeeds.fdb)时,我创建了这个有效的原始查询语句(使用 Firefox 的便捷插件 SQLite Manager 进行测试):

SELECT tbl_tags.tag_name, feeds.tbl_posts.link
FROM tbl_tags
INNER JOIN feeds.tbl_posts
ON tbl_tags.fd_postid=feeds.tbl_posts.fd_postid
ORDER BY tbl_tags.tag_name

它主要查询Feeddemon的tags.fdb和附加的feeds.fdb数据库文件(使用SQLite的特性ATTACH feeds.fdb AS feeds)。它列出所有带有标签名称和超链接的标记帖子。正如您所看到的,数据库内容是由fd_postid相关的。
一个可视化的例子: tags.fdb的tbl_tags表内容:
fd_postid tag_name
1         rainbow
2         orange
5         green

feeds.fdb 的 tbl_posts 表内容:

fd_postid link
1         google.com
2         stackoverflow.com
3         microsoft.com
4         slashdot.org
5         techcrunch.com

按标签名称排序的查询结果:

green    techcrunch.com    
orange   stackoverflow.com
rainbow  google.com

问题

我该如何使用PHP中的PDO实现单个内部连接查询以涵盖多个相关数据库?

在PDO中连接两个数据库也会创建两个对象:

$db1 = new PDO('sqlite:tags.fdb');
$db2 = new PDO('sqlite:feeds.fdb');

但是如果我想查询,我必须指定一个单一的对象:

$result = $db1->query('SELECT * FROM sometable');

那么我该如何弥补差距并使用一个查询来针对两个数据库?或者我可以直接在PDO中使用SQLite的ATTACH database AS alias功能吗?如果可以,怎么做呢?但这可能被认为是不好的实践,对吧?因为PDO旨在与数据库无关。我认为这位用户最终也在寻找同样的东西,但从未真正得到工作代码示例的要点:如何在同一foreach循环中连接两个PDO对象?注意:回答时请考虑到我是一个前端/图形人员,只是大约两个月前开始学习PHP/PDO/SQLite。这个问题可能超出了我的经验水平。我很惊讶自己成功地使原始查询工作。但我正在学习...
1个回答

4

要在SQLite中从一个查询中访问多个数据库,您需要使用ATTACH命令。

使用PDO时,它的工作方式与执行任何其他SQL命令相同;您只需指定不同的文件名(如果需要,还可以指定目录):

$db = new PDO('sqlite:tags.db');
$db->exec('ATTACH \'feeds.db\' as feeds');
$result = $db->query('SELECT tbl_tags.tag_name, feeds.tbl_posts.link ...');

虽然PDO旨在基本上独立于实际数据库,但是在打开数据库时无法避免指定sqlite:,而可以使用的实际SQL语言取决于数据库。出于实际目的,ATTACH命令在逻辑上是打开数据库的一部分,feeds.tbl_posts只是表名。

注意:SQLite在所有已附加的数据库中搜索表名,因此您可以省略唯一表名的数据库名称。


就是这样!非常感谢!我之前已经尝试过这个,但没有在ATTACH命令中转义'。修复后,我发现了一些奇怪的东西(对我来说):它似乎在我的Web服务器的根安装目录中寻找feeds.fdb,而不是我执行php脚本的同一目录(就像tags.fdb一样)。为了测试您的解决方案,我通过将feeds.fdb暂时移动到安装目录中来解决了这个问题...但那似乎是一个非常糟糕的解决方案。我会继续查找为什么会这样。但是非常感谢您解决我的问题! - Miletos
这个方法给我报错 Could not find driver ... PDO->__construct('sqlite:... - ashleedawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接