使用withPHP递归函数删除所有子节点和父节点
Delete all child nodes and parent nodes using with PHP recursive function
我在使用 PHP 递归函数删除所有子节点和父节点时遇到问题。数据库table结构遵循树结构。
下面是示例 table 结构:
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
根据 table: 文件夹。比如我要删除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);
?>
你提的问题逻辑是对的,但是你代码上的实现不对。
您正在使用 $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);
我在使用 PHP 递归函数删除所有子节点和父节点时遇到问题。数据库table结构遵循树结构。
下面是示例 table 结构:
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
根据 table: 文件夹。比如我要删除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);
?>
你提的问题逻辑是对的,但是你代码上的实现不对。
您正在使用 $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);