首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归删除mysql表中的父子关系

问使用递归删除mysql表中的父子关系
EN

Stack Overflow用户
提问于 2012-05-28 00:24:44
回答 2查看 557关注 0票数 0

我在运行这个函数时遇到了问题。这是我的数据库设计

我在一个应用程序中工作,当用户删除父类别时,所有子类别也会被删除,依此类推。例如:

当用户单击我的应用程序中的"Test1“类别时,"Test1.1”和"Test1.1.1“将被删除,因为它在"Test1”类别下。

​

​

这是我的数据库设计(上图)。

这是我写的代码:

代码语言:javascript
复制
function DeleteProjectPhotos( $cat_id ) {
        $sql = "SELECT * FROM project_category WHERE category_id = '$cat_id'"; 
        $query = mysql_query( $sql ) or die( mysql_error() );
        if( mysql_num_rows( $query ) > 0 ) {
            $sql = "SELECT * FROM project_category WHERE parent_id = '$cat_id'"; 
            $query = mysql_query( $sql ) or die( mysql_error() );
            if( mysql_num_rows( $query ) > 0 ) {
                while( $row = mysql_fetch_assoc( $query ) ) {
                    $this->DeleteProjectPhotos( $row['category_id'] );
                }
            } else {
                $sql = "DELETE FROM project_category WHERE category_id = '$cat_id'";
                $query = mysql_query( $sql ) or die( mysql_error() );
            }
        }
    }

但我认为这里的整个逻辑都是错误的,因为当我试图删除category_id 33时,所有的东西都不会被删除。请教我怎么做这件事。

我们将非常感谢您的帮助,并将给予您回报!

谢谢!:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-28 02:00:55

代码语言:javascript
复制
<?php

$catID = $_GET['catID']; 
deleteCategory($catID);

function connect(){

  $host = 'localhost';
  $dbName = 'sony';
  $userName = 'root';
  $password = '';

  $conn = new PDO("mysql:host=$host;dbname=$dbName",$userName,$password);
  $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

  return $conn;
  }

  $stmt = '';
 function deleteCategory($catID){

  $conn = connect();
  $tableName = 'childparent';

  $sql = "select catID from $tableName where parentID = :catID";

  global $stmt;
  $stmt = $conn->prepare($sql);


      $idsToDelete = getChilds($catID);
      $idsToDelete[] = $catID;
  //print_r($idsToDelete);

  $delExp = '';
  foreach($idsToDelete as $id)
     $delExp .= " catID=$id or";
  $delExp = preg_replace('/or$/','',$delExp);

  if($delExp != ''){

      $delSql = "delete from $tableName where $delExp";
      //echo $delSql;

       $delStmt = $conn->prepare($delSql);
       $delStmt->execute(); 

      }






  }

 $collectedIDs = array();

 function getChilds($catID){

 global $stmt,$collectedIDs;

 $stmt->bindValue(':catID',$catID);

 $stmt->execute();

 $childCatIDs = array();
 while($row = $stmt->fetch(pdo::FETCH_ASSOC)){

    $childCatIDs[] = $row['catID'];
    $collectedIDs[] = $row['catID'];    
 }

 //print_r($childCatIDs);
 //die();
 if(!empty($childCatIDs)){
        foreach($childCatIDs as $cid)
            getChilds($cid);

 }

 return $collectedIDs;


  }



?>
票数 1
EN

Stack Overflow用户

发布于 2012-05-28 00:41:31

如果你不想要触发器,你可以在delete类别上尝试http://php.net/manual/en/function.mysql-affected-rows.php,你会得到它的id,当有一个返回值的时候,你可以尝试通过目录或家长来删除

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10775486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档