Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: zellion en 31 Mayo 2011, 17:40 pm



Título: Funcion que falla y borra una tabla entera
Publicado por: zellion en 31 Mayo 2011, 17:40 pm
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


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: Shell Root en 31 Mayo 2011, 22:20 pm
Deberías de poner algunos datos, para hacerle pruebas.
Código
  1. function dbConnection(){
  2.  $handler = mysql_connect("127.0.0.1", "root", "root");
  3.  mysql_select_db("dbPoC");
  4.  return $handler;
  5. }
  6.  
  7. function dbDisconnect( $connection ){
  8.  mysql_close( $connection );
  9. }
  10.  
  11. function searchChild( $idChild ){
  12.  try{
  13.    $connection = dbConnection();
  14.    $SQL = "SELECT * FROM snd_familia WHERE(id_padre = '".$idChild."');";
  15.    $query = mysql_query($SQL, $connection);
  16.    while($row = mysql_fetch_array($query, MYSQL_ASSOC)){
  17.      $data[] = $row;
  18.    }
  19.    return $data;
  20.    dbDisconnect($connection);
  21.  }catch(Exception $ex){
  22.    print "<b>Error: </b>".mysql_error();
  23.  }
  24. }
  25.  
  26. function deleteRow( $idFamily ){
  27.  try{
  28.    $connection = dbConnection();
  29.    $SQL = "DELETE FROM snd_familia WHERE (id_familia= '".$idFamily."');";
  30.    mysql_query($SQL, $connection);
  31.    dbDisconnect($connection);
  32.  }catch(Exception $ex){
  33.    print "<b>Error: </b>".mysql_error();
  34.  }
  35. }
  36.  
  37. function deleteRecord($id){
  38.  $data = searchChild($id);
  39.  deleteRow($id);
  40.  for($i = 0;$i<=count($data);$i++){
  41.    deleteRow($data[$i]['id_familia']);
  42.  }
  43. }


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: Nakp en 1 Junio 2011, 04:02 am
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


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: zellion en 1 Junio 2011, 09:58 am
 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
  1. <?php
  2.      function borrarRegistro($id)
  3.      {      
  4.         $datos = $this->buscarHijo($id);
  5.  
  6.         $this->borrar($id);
  7.  
  8.         $total = count($datos);
  9.         for($i = 0;$i<=$total;$i++)
  10.         {
  11.            $this->borrar($datos[$i][id_familia]);
  12.            if(isset($datos))
  13.            {
  14.               $this->borrarRegistro($datos[$i][id_familia]);
  15.            }
  16.         }                  
  17.      }
  18. ?>
  19.  
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 :(.


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: Shell Root en 1 Junio 2011, 17:24 pm
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


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: zellion en 1 Junio 2011, 17:56 pm
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 :(.


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: ~ Yoya ~ en 1 Junio 2011, 18:41 pm
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.


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: Nakp en 1 Junio 2011, 22:14 pm
Pues para mi es un problema de logica :P esto deberia resolver el problema sin programar la logica de datos en la de negocios :)

(https://lh3.googleusercontent.com/-mropXqDFCgM/TeadEn2OUSI/AAAAAAAAAT8/9Do5LbmZtvc/s800/Pantallazo.png)

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
  1. CREATE TABLE IF NOT EXISTS `test`.`familia` (
  2. `idfamilia` INT(11) NOT NULL AUTO_INCREMENT ,
  3. `nombre` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
  4. `idpadre` INT(11) NULL ,
  5. PRIMARY KEY (`idfamilia`) ,
  6. INDEX `fk_familia_familia` (`idpadre` ASC) ,
  7. CONSTRAINT `fk_familia_familia`
  8. FOREIGN KEY (`idpadre` )
  9. REFERENCES `test`.`familia` (`idfamilia` )
  10. ON DELETE CASCADE
  11. ON UPDATE CASCADE)
  12. ENGINE = InnoDB
  13. DEFAULT CHARACTER SET = utf8
  14. COLLATE = utf8_unicode_ci;
  15.  

que conste que lo he probado antes :xD con los mismos datos que has puesto :P


Título: Re: Funcion que falla y borra una tabla entera
Publicado por: zellion en 2 Junio 2011, 11:47 am
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.