elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Funcion que falla y borra una tabla entera
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funcion que falla y borra una tabla entera  (Leído 4,119 veces)
zellion

Desconectado Desconectado

Mensajes: 78



Ver Perfil
Funcion que falla y borra una tabla entera
« 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


En línea

Shell Root
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.723


<3


Ver Perfil WWW
Re: Funcion que falla y borra una tabla entera
« Respuesta #1 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. }


« Última modificación: 31 Mayo 2011, 22:41 pm por Shell Root » En línea

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.
Nakp
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: Funcion que falla y borra una tabla entera
« Respuesta #2 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
En línea

Ojo por ojo, y el mundo acabará ciego.
zellion

Desconectado Desconectado

Mensajes: 78



Ver Perfil
Re: Funcion que falla y borra una tabla entera
« Respuesta #3 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 :(.
« Última modificación: 1 Junio 2011, 17:52 pm por zellion » En línea

Shell Root
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.723


<3


Ver Perfil WWW
Re: Funcion que falla y borra una tabla entera
« Respuesta #4 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
En línea

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

Desconectado Desconectado

Mensajes: 78



Ver Perfil
Re: Funcion que falla y borra una tabla entera
« Respuesta #5 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 :(.
En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 1.125



Ver Perfil
Re: Funcion que falla y borra una tabla entera
« Respuesta #6 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.
En línea

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
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: Funcion que falla y borra una tabla entera
« Respuesta #7 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 :)



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
En línea

Ojo por ojo, y el mundo acabará ciego.
zellion

Desconectado Desconectado

Mensajes: 78



Ver Perfil
Re: Funcion que falla y borra una tabla entera
« Respuesta #8 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Que falla en la funcion?
PHP
Alex_bro 0 1,493 Último mensaje 11 Abril 2009, 16:03 pm
por Alex_bro
no me borra la tabla haciendo delete on cascade tabla n:m
Bases de Datos
kinos 2 4,124 Último mensaje 31 Julio 2010, 13:05 pm
por kinos
Problema con tabla dentro de funcion
Programación C/C++
HIPOCROFILO 3 3,731 Último mensaje 19 Octubre 2010, 21:12 pm
por Oblivi0n
Mi funcion de borrar falla
Programación C/C++
Evox4 0 1,617 Último mensaje 10 Octubre 2016, 02:13 am
por Evox4
Ayuda con php , borra tabla de DB tras INSERT *
PHP
JazzTA 7 2,794 Último mensaje 13 Octubre 2019, 10:45 am
por JazzTA
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines