gpt4 book ai didi

mysql - 如何编写一个在未找到某些内容时不会失败的连接?

转载 作者:行者123 更新时间:2023-11-29 08:19:50 25 4
gpt4 key购买 nike

我正在尝试使用 SEF URL 确定用户所在的页面。它的工作原理如下:

public function getIdsByPath(array $path, $langId) {
$select = 'SELECT ';
$from = ' FROM pages t0 ';
$where = 'WHERE ';

for($i = 0; $i < count($path); $i++) {
$ii = $i - 1;
if($i > 0) {
$select .= ', ';
$from .= "LEFT JOIN pages t$i ON (t$i.pid = t$ii.id) ";
$where .= ' AND ';
}
$select .= "t$i.id";
$where .= "t$i.alias = ?";
}
$where .= " AND t0.pid = ?";
$q = $this->db->prepare($select.$from.$where);

for($i = 0; $i < count($path); $i++) {
$q->bindValue($i + 1, $path[$i]);
}
$q->bindValue($i + 1, $langId);
$q->execute();
return $q->fetch(PDO::FETCH_NUM);
}

此方法的目的是遍历页面层次结构并验证其是否正确。然而,问题在于,由于层次结构以 SEF URL 的形式呈现,例如 path/to/page/module/action/123 在某些时候 explode('/')前面提到的字符串不再代表页面,而是代表其他变量。

如果我将整个字符串 path/to/page/module/action/item/123 提供给该方法,则查询将找不到任何内容,因为 JOIN陈述。我也尝试了我能想到的所有其他JOIN。他们所有人都确定,由于没有找到所有东西,因此什么也没有找到。

如果首先通过关键字从 URL 中检测到其他变量,则整个方法可以很好地工作,但这会导致更详细的 URL,这是我不希望的。 path/to/page/some-module/edit/123 将更改为 path/to/page/module/some-module/action/edit/item/123。不太好。

有没有一种方法可以JOIN内容,以便MySQL能够连接它能连接的东西,而忽略其余的东西?我描述的这个方法不应该说“我要告诉你这个页面层次结构是否有效”,而应该说“我要告诉你这个页面层次结构在哪一点上有效。”

感谢任何帮助。

最佳答案

问题是,虽然您使用的是 LEFT JOIN,但由于您在 WHERE 子句中为每个表指定了一个值,因此您强制每个表都有一条记录,这会呈现与 INNER 相同的结果加入。

因此,改变

$where .= "t$i.alias = ?";

$where .= "(t$i.alias = ? OR t$i.id IS NULL)";

这将允许您利用 LEFT JOIN 并“跳过”不匹配的表,同时仍然返回找到的结果。

然后,您的 SELECT 将返回找到的页面的 id,然后为与页面不对应的其余值返回 null。

关于mysql - 如何编写一个在未找到某些内容时不会失败的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19721679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com