Funcion que falla y borra una tabla entera

Iniciado por zellion, 31 Mayo 2011, 17:40 PM

0 Miembros y 1 Visitante están viendo este tema.

zellion

Hola chic@s, tengo hecha una función que borra lo que no debe. Os explico que debería de hacer: Es una función que borra un registro de una base de datos (Mysql) y tiene mas registro que dependa de ella, también se tendrían que borrar.

Pero lo que sucede es que se cepilla toda la tabla, estuve depurando el programa y no veo ningún fallo, haber si vosotros podéis verlo.

Esta es la tabla:

CREATE TABLE snd_familia (
id_familia int(4) auto_increment primary key,
nombre_familia varchar(15) NOT NULL,
id_padre int(4) NOT NULL);

El campo ip_padre se relaciona con el campo id_familia, sacando la información de este último. Yo lo haría con dos tablas, pero tengo que hacerla en una.

Aqui os pongo las funciones que utilizo:

      function buscarHijo($id_familia)
      {
         try
         {
            global $config;
            $db = new ConexionBD();
            $db->conectar();
            
            $query = sprintf("select * from %sfamilia where id_padre = ('%s')",
            mysql_real_escape_string($config['tbl_prefix']),
            mysql_real_escape_string($id_familia));
            $sql = mysql_query($query);
            
            while($row = mysql_fetch_assoc($sql))
            {
               $datos[] = $row;
            }                     
            return $datos;         
            $db->desconectar();
         }catch(Exception $e){
            echo "Ocurrio un error: " . mysql_error();
         }
      }

      function borrar($id_familia)
      {
         try{
            global $config;
            $db = new ConexionBD();
            $db->conectar();            
               $query=sprintf("DELETE FROM %sfamilia WHERE id_familia= ('%s')",
               mysql_real_escape_string($config['tbl_prefix']),
               mysql_real_escape_string($id_familia));
               mysql_query($query);
               $db->desconectar();            
         }catch(Exception $e){
            echo "Ocurrio un error: " . mysql_error();
            }
      }

      function borrarRegistro($id)
      {      
         $datos = $this->buscarHijo($id);

         $this->borrar($id);
         
         $total = count($datos);
         for($i = 0;$i<=$total;$i++)
         {
            $this->borrar($datos[$i][id_familia]);
            if(isset($datos))
            {
               $this->borrado($datos[$i][id_familia]);
            }
         }                  
      }  

Gracias por leer el tema y si algo no se entiende o veis como se puede mejorar, ponedlo por favor. Que llevo poco con este lenguaje jeje.

Un saludo

Shell Root

#1
Deberías de poner algunos datos, para hacerle pruebas.
Código (php) [Seleccionar]
function dbConnection(){
  $handler = mysql_connect("127.0.0.1", "root", "root");
  mysql_select_db("dbPoC");
  return $handler;
}

function dbDisconnect( $connection ){
  mysql_close( $connection );
}

function searchChild( $idChild ){
  try{
    $connection = dbConnection();
    $SQL = "SELECT * FROM snd_familia WHERE(id_padre = '".$idChild."');";
    $query = mysql_query($SQL, $connection);
    while($row = mysql_fetch_array($query, MYSQL_ASSOC)){
      $data[] = $row;
    }
    return $data;
    dbDisconnect($connection);
  }catch(Exception $ex){
    print "<b>Error: </b>".mysql_error();
  }
}

function deleteRow( $idFamily ){
  try{
    $connection = dbConnection();
    $SQL = "DELETE FROM snd_familia WHERE (id_familia= '".$idFamily."');";
    mysql_query($SQL, $connection);
    dbDisconnect($connection);
  }catch(Exception $ex){
    print "<b>Error: </b>".mysql_error();
  }
}

function deleteRecord($id){
  $data = searchChild($id);
  deleteRow($id);
  for($i = 0;$i<=count($data);$i++){
    deleteRow($data[$i]['id_familia']);
  }
}

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Nakp

pues hasta donde te he etendido, asi "habladito" alguien puede ser padre de varias familias, y si se "dan" a la familia puede que el padre quede en la base de datos.. pero si eliminas al padre se van las familias??? no bastaria con un where para cada campo?

explicalo con palabras porque para mi no parece sere problema de codigo sino de logica :P
Ojo por ojo, y el mundo acabará ciego.

zellion

#3
 id_familia      nombre_familia  id_padre

        1      |     Electronica     |        0      |
        2      |     Ordenador     |        1      |
        3      |     Monitor           |        2      |
        4      |     Fontaneria     |        0      |
        5      |     Carpinteria     |        0      |
        6      |      Mesa             |        5      |
        7      |     Teclado          |        2      |



Hola chicos, os dejo unos datos de prueba de la tabla en cuestión. Técnicamente si borro Electrónica, debería de  borrar también Ordenador, Monitor y Teclado, porque están relacionadas por una jerarquía.

Mientras que los demás registros no se deberían de borrar. Nakp si veo que es un problema de lógica me pego un tiro  :xD, he estado 3 días con la maldita función  ;D.

Shell Root estuve probando tu código y solo me borra un nivel, es decir no borra los nietos.

Acabo de ver un fallo, en mi codigo. (Por hacer copy-paste). Realmente en la ultima llamada se llama asi misma.
Código (php) [Seleccionar]

<?php
      
function borrarRegistro($id)
      {      
         
$datos $this->buscarHijo($id);

         
$this->borrar($id);
         
         
$total count($datos);
         for(
$i 0;$i<=$total;$i++)
         {
            
$this->borrar($datos[$i][id_familia]);
            if(isset(
$datos))
            {
               
$this->borrarRegistro($datos[$i][id_familia]);
            }
         }                  
      } 
?>


Intenté hacerlo recursivo para buscar hijos hasta que se hayan borrado todos los que estén relacionados. Muchas gracias a los dos, si conseguimos solucionarlo os invito a unas cañas  :P.

Un saludo.


Edito: Lo siento, pero no consigo que los datos de prueba estén bien cuadrados :(.

Shell Root

jojojo a mi me borro el padre y los que estaban de hijos. Por eso dije que deberías de poner datos para hacer pruebas :p
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

zellion

Shell ¿te borro también los nietos? Si es asi la ley de murphy se esta ensañando :xD. Es que al parecer al volverse a llamar la función a si misma, se debe de hacer una paja mental de proporciones épicas xD.

Es que utilizo el gedit para programar y para depurarlo, hojita de papel y boli :(.

~ Yoya ~

Te recomiendo Quanta Plus que es el que siempre uso.




Para este tipo de post, es preferible que uses como ejemplos los datos que pudieras sacar de la BD. Por ejemplo, crear un array multidimencional, asi estarias simulando la estructura de los datos que obtienes de la BD y seria mas facir para que podamos probar.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Nakp

Pues para mi es un problema de logica :P esto deberia resolver el problema sin programar la logica de datos en la de negocios :)



Lo unico que hice fue crear una foreign key a la primary key, delete on cascade, update on cascade :P he aqui el sql :)

Código (sql) [Seleccionar]
CREATE TABLE IF NOT EXISTS `test`.`familia` (
`idfamilia` INT(11) NOT NULL AUTO_INCREMENT ,
`nombre` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`idpadre` INT(11) NULL ,
PRIMARY KEY (`idfamilia`) ,
INDEX `fk_familia_familia` (`idpadre` ASC) ,
CONSTRAINT `fk_familia_familia`
FOREIGN KEY (`idpadre` )
REFERENCES `test`.`familia` (`idfamilia` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;


que conste que lo he probado antes :xD con los mismos datos que has puesto :P
Ojo por ojo, y el mundo acabará ciego.

zellion

Nakp eres un crack, estuve probando la base de datos y va perfecta. Eso pasa por fijarse solo en el código y no en la BBDD.

~ Yoya ~ probare el programa, pero el problema que estoy de practicas en una empresa y tengo que hacerlo con el gedit xD. Para la próxima intentare escribir en el post todo lo necesario  ;).


Muchas gracias a todos y cuando queráis os invito a esa caña que os debo  :xD.