【问题标题】:Delete all child nodes and parent nodes using with PHP recursive function使用 PHP 递归函数删除所有子节点和父节点
【发布时间】:2021-09-08 17:38:41
【问题描述】:

我在使用 PHP 递归函数删除所有子节点和父节点时遇到问题。数据库表结构遵循树形结构。

下面是示例表结构:

MySQL Table: folders

id    name    parentid
1      A1         0
2      A1-1       1
3      A1-2       2
4      A1-3       3
5      A2         0
6      A2-1       5
7      A2-2       6
8      A2-3       7
id = the id of the category
name= folder name
parent = the id of the parent category

根据表格:文件夹。比如我要删除id是1,下面的子节点(id是2,3,4)就应该删掉。

我按照下面的示例编码来执行删除递归函数,但无法工作并崩溃。

<?php
function remrecurs($id) {
    $qlist= mysqli_query($sql_connection,"SELECT * FROM folders WHERE parentid='$id'");
    if (mysqli_num_rows($qlist)>0) {
        while($curitem = mysqli_fetch_assoc($qlist)) {
remrecurs($curitem['id']);
} 
} mysqli_query($sql_connection,"DELETE FROM folders WHERE id='$id'"); 
}
  remrecurs(1);
?>

【问题讨论】:

标签: php recursion sql-delete


【解决方案1】:

您提到的问题的逻辑是正确的,但您的代码实现不正确。

您正在使用$sql_connection,但该变量在您的函数中不可用。假设$sql_connection,要在函数中使用它,您需要将其设为global

此外,正如@Dharman 在他们的评论中提到的那样,在查询中使用参数时,您应该始终使用准备好的语句。

此外,在调试时,请始终确保使用 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 添加正确的错误报告信息,以便您可以快速识别查询问题。

我已重构您的代码以使递归正常工作:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
function remrecurs($id) {
    global $sql_connection;
    $query = "SELECT id FROM folders WHERE parentid=?";
    if ($stmt = $sql_connection->prepare($query)) {
        $stmt->bind_param('i', $id);
        $stmt->execute();
        $result = $stmt->get_result();
        while ($data = $result->fetch_assoc()) {
            remrecurs($data['id']);
        }
    }
    $delete = 'DELETE FROM folders WHERE id = ?';
    $stmt = $sql_connection->prepare($delete);
    $stmt->bind_param('i', $id);
    $stmt->execute();
}
remrecurs(1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2013-02-04
    • 2022-07-08
    • 1970-01-01
    相关资源
    最近更新 更多