如题,代码如下:function delNodes($id,$Conn){
$sql="select * from tvmenu where bid='$id'";
$result_sun=mysql_query($sql,$Conn);
$num=mysql_num_rows($result_sun);
if($num>0){
for($i=0;$i<$num;$i++){
$rs=mysql_fetch_array($result_sun);
delNodes($rs["id"],$Conn);
}
}else{
$sql="delete FROM tvmenu WHERE id='$id'";
$qu=mysql_query($sql,$Conn);
if($qu){
$del="";
echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
}
}
}
delNodes($b,$Conn);数据表如下:
id bid name
1 0 电视1
2 0 电视2
3 1 电视3
4 1 电视4
5 2 电视5
24 23 4444
7 3 电视7
8 3 电视8
9 3 电视9
10 5 电视10
11 5 电视11
12 5 电视12
22 12 2222
23 22 3333
$sql="select * from tvmenu where bid='$id'";
$result_sun=mysql_query($sql,$Conn);
$num=mysql_num_rows($result_sun);
if($num>0){
for($i=0;$i<$num;$i++){
$rs=mysql_fetch_array($result_sun);
delNodes($rs["id"],$Conn);
}
}else{
$sql="delete FROM tvmenu WHERE id='$id'";
$qu=mysql_query($sql,$Conn);
if($qu){
$del="";
echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
}
}
}
delNodes($b,$Conn);数据表如下:
id bid name
1 0 电视1
2 0 电视2
3 1 电视3
4 1 电视4
5 2 电视5
24 23 4444
7 3 电视7
8 3 电视8
9 3 电视9
10 5 电视10
11 5 电视11
12 5 电视12
22 12 2222
23 22 3333
解决方案 »
- IFRAME 中$_GET['page']的问题
- 文件权限问题???
- 我抓狂了,要杀人了.耐性都给磨光了。大家帮忙解决一下。避免我去犯罪
- 我读数据库信息 明显字段名字都写错了。但是程序不报错,只是显示不错来而已。我想知道怎么让热爱报错!!!
- 像动网那样的论坛有没有PHP版本的下载?
- 分享中文日历,解决日期问题
- http://www.a.com/web能不能转到http://www.a.com/com/web啊?
- 难道这个问题没有人会解决?
- Help me :PHPeditor到底怎么使用? 怎么配置?
- PHPSESSID 重复,浏览器出现多个PHPSESSID。
- 开启xdebug进行测试开发,apache占用内存越来越大
- 关于搜索日期显示的问题
然后进行遍历查找属于他的子类的key
数据库查询只要一次.但是取出来的数据要也要循环遍历
然后del in id(id列表)注意这种批量删除可能会出错而回滚
而且你这个逻辑上有很大问题。1.每一次进入这个函数不管是干什么都要先查询一次,很浪费。
2.你这是2个不同表之间的操作,参数$id有2个作用,阅读性不好,以后再看这个代码你肯定忍不住将他们封装成2个函数。
3.你需要明确区别每次进来的是id还是bid……这个函数本身阅读性就不好。
4.你每次进来首先会将$id理解为bid,那么如果tvmenu下有多个id、bid同样的情况,就是误删。考虑到你现在在学习使用递归,那就帮你改一下……/**
*
* @param <int> $id
* @param <array> $Conn
* @param <bool> $is_id
*/
function delNodes($id, $Conn, $is_id = false) {
if ($is_id) {
$sql = "select * from tvmenu where bid='$id'";
$result_sun = mysql_query($sql, $Conn);
$num = mysql_num_rows($result_sun); //获取tvmenu下的数据总数
if ($num > 0) { //如果有就递归
for ($i = 0; $i < $num; $i++) {
$rs = mysql_fetch_array($result_sun);
delNodes($rs["id"], $Conn,true); //通过第三个参数说明这是一个id字段
}
}
} else {
$sql = "delete FROM tvmenu WHERE id='$id'";
$qu = mysql_query($sql, $Conn);
if ($qu) {
$del = "";
echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
}
}
}
delNodes($b,$Conn);
但字段不同,而字段内容都是整数,原来的检测方式容易出现重复而误删。增加参数$is_id来判断是id字段的处理还是bid字段的处理较好。
mysql_select_db("tree"); //打开数据库
mysql_query("SET NAMES 'utf8'"); //避免乱码
$b=trim($_GET["b"]); //删除子类及自身函数
function delNodes($id,$Conn){
$sql="select * from tvmenu where bid='$id'";
$result_sun=mysql_query($sql,$Conn);
$num=mysql_num_rows($result_sun); //查询该分类下子类数量
if($num>0){
while($rs=mysql_fetch_array($result_sun)){ //循环调用递归
delNodes($rs["id"],$Conn);
}
}else{
$sql="delete FROM tvmenu WHERE id='$id'";
$qu=mysql_query($sql,$Conn); //如果没有子类,直接删除
if($qu){
$del="";
echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
//exit;
}
}
}
delNodes($b,$Conn); tvmenu数据表如下:
野蛮点的作法可以是:(伪代码:)SQL:删除该id节点;
do{
SQL:删除父节点不存在的节点;
check affect row, if affected_row==0 break;
}
11和12删掉了没有?
如果删10或11这样底层的能删掉吗?
加一句echo $id; 在函数入口, 看你函数的递归调用情况,是否中途停止了等.....
自己做点调试其实很有趣
采用算法计算出对于子分类下的ID
找到后采用SQL的in 删除
你这样肯定要干死服务器
最多执行两次SQL
第一次 查询分类
第二次删数据
我认真看了一下,你不需要用递归啊,而且在这个循环里用递归是不理想的,不太合适。你还是老实的像我这样写吧。/**
*
* @param <int> $id
* @param <array> $Conn
* @param <bool> $is_id
*/
function delNodes($id, $Conn, $is_id = false) {
if ($is_id) {
$sql = "select * from tvmenu where bid='$id'"; //获取所有要删除的id
$result_sun = mysql_query($sql, $Conn);
$num = mysql_num_rows($result_sun); //获取tvmenu下的数据总数
while ($row = mysql_fetch_array($result_sun)) {
$sql = "delete FROM tvmenu WHERE id='{$row['id']}'";
$qu = mysql_query($sql, $Conn);
if ($qu) {
$del = "";
echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
}
}
}
}