我想从带有递归功能的多级菜单中删除类别。为了更仔细地了解情况,让我们先来看看mysql表结构
CREATE TABLE IF NOT EXISTS menu(
id INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
p_id INT(5),
sort_id INT(5) NOT NULL,
title VARCHAR(50) CHARSET utf8 COLLATE 'utf8_unicode_ci' NOT NULL,
);
在检索时看起来像这样
id | p_id | sort_id | title |
1 | 0 | 1 | root1 |
2 | 1 | 1 | sub of root1
3 | 0 | 2 | root2 |
4 | 2 | 1 | sub of "sub of root1"
... | ... | ... | ....
etc ...
我为删除类别编写了php脚本,这里是=>
function del_cat($connection,$id){
if (!$connection->connect_errno){
if ($connection->set_charset("utf8")){
if ($r = $connection->query("SELECT id FROM menu WHERE p_id=" . $id . "")){
if ($r->num_rows>0){
while ($row = $r->fetch_assoc()){
del_cat($connection,$row['id']);
}
} else {
$connection->query("DELETE FROM menu WHERE id=" . $id . "");
}
$r->free();
}
}
}
}
$connection
变量只是一个mysql连接对象,而$id
在表中是id
。
当我删除一行时(我的意思是当类别没有子类,子类别时),它可以正常工作,例如1 | 0 | 1 | root1 |
,但是当我想删除例如{{1}时它不会删除子类别的类别。知道如何解决这个问题吗?感谢
答案 0 :(得分:1)
删除仅在else
中,因此您永远不会删除父类别。我认为你需要这样的东西:
del_cat($connection, $row['id']);
$connection->query("DELETE ...");
} else {
$connection->query("DELETE ...");
顺便说一下,你应该转义ID输入。