gpt4 book ai didi

php - 如何使用 PHP 递归地从 MySQL 中子元素为 null 的祖先获取值

转载 作者:行者123 更新时间:2023-11-30 01:12:00 28 4
gpt4 key购买 nike

我不确定这是否完全符合我的措辞方式,但我们开始吧:我试图弄清楚如何在 php 中创建一个递归循环,该循环基本上检查子列是否为空 - 如果该子元素列具有空值,则它使用父 id 递归地遍历其祖先,直到找到具有该列的值,然后将该父值放入原始子列中。我对此感到非常困惑,因为我刚刚开始使用 php,但我对数据库和 mysql 有深入的了解。任何帮助和代码示例都会很棒。

最佳答案

关于使用邻接列表模型存储分层数据的警告:它牺牲了创建和更新表的便利性,但再次获取数据时缺乏效率。我个人用过Closure Tables在我的项目中,因为尽管弄清楚如何获取数据以及如何更新它们非常疯狂,但再次取出数据的效率要高得多。如果您有闭包表,则可以使用一个查询来获取包含信息的节点的所有父节点的列表,并使用 ORDER BY Distance LIMIT 1 来获取您想要的答案的父节点。使用Nested Sets也可能是一种选择,尽管我对它们了解较少。在继续之前,您应该研究这些内容并考虑您的选择。

这是您现在拥有的邻接列表:

$target = 4; //whatever ID
$db = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
$statement = $db->prepare("SELECT ParentID, Audience FROM things WHERE ChildID = ?");

$audience = NULL;
$ChildID = $target; // starts as same value
while(!isset($audience) || !isset($ChildID)) { //This assumes that the top ParentID is null; you might have to adjust it
$statement->bind_param('i', $ChildID);
$statement->execute();
$result = $statement->get_result();
while($row = $result->fetch_assoc()){
if(!isset($row['Audience']) && !isset($audience)) {
$ChildID = isset($row['ParentID'])?$row['ParentID']:NULL;
} else {
$audience = $row['Audience'];
}
}
$result->free();
}

if(isset($audience)) {
if($target == $ChildID) { //it was found on that first try
echo $audience.' was found for '.$target;
} else {
$statement = $db->prepare("UPDATE things SET Audience = ? WHERE ChildID = ?");
$statement->bind_param('si', $audience, $target);
$statement->execute();
echo $audience.' was set for '.$target;
}
} else {
echo 'No audience was found or set for '.$target;
}


$db->close();

请注意,bind_param 的第一个参数关心绑定(bind)事物的类型(字符串、整数、小数、blob)。你可能得查一下。

关于php - 如何使用 PHP 递归地从 MySQL 中子元素为 null 的祖先获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389923/

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