Autor
|
Tema: Funcion que falla y borra una tabla entera (Leído 4,409 veces)
|
zellion
Desconectado
Mensajes: 78
|
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
|
Deberías de poner algunos datos, para hacerle pruebas. function dbConnection(){ return $handler; } function dbDisconnect( $connection ){ } function searchChild( $idChild ){ try{ $connection = dbConnection(); $SQL = "SELECT * FROM snd_familia WHERE(id_padre = '".$idChild."');"; $data[] = $row; } return $data; dbDisconnect($connection); }catch(Exception $ex){ } } function deleteRow( $idFamily ){ try{ $connection = dbConnection(); $SQL = "DELETE FROM snd_familia WHERE (id_familia= '".$idFamily."');"; dbDisconnect($connection); }catch(Exception $ex){ } } function deleteRecord($id){ $data = searchChild($id); deleteRow($id); for($i = 0;$i<=count($data);$i++){ deleteRow($data[$i]['id_familia']); } }
|
|
« Última modificación: 31 Mayo 2011, 22:41 pm por Shell Root »
|
En línea
|
Te vendería mi talento por poder dormir tranquilo.
|
|
|
Nakp
casi es
Ex-Staff
Desconectado
Mensajes: 6.336
he vuelto :)
|
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
|
|
|
En línea
|
Ojo por ojo, y el mundo acabará ciego.
|
|
|
zellion
Desconectado
Mensajes: 78
|
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 , he estado 3 días con la maldita función . 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. <?php function borrarRegistro($id) { $datos = $this->buscarHijo($id); $this->borrar($id); for($i = 0;$i<=$total;$i++) { $this->borrar($datos[$i][id_familia]); { $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 . 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
|
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
|
Te vendería mi talento por poder dormir tranquilo.
|
|
|
zellion
Desconectado
Mensajes: 78
|
Shell ¿te borro también los nietos? Si es asi la ley de murphy se esta ensañando . 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
Mensajes: 1.125
|
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
Mensajes: 6.336
he vuelto :)
|
Pues para mi es un problema de logica 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 he aqui el sql 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 con los mismos datos que has puesto
|
|
|
En línea
|
Ojo por ojo, y el mundo acabará ciego.
|
|
|
zellion
Desconectado
Mensajes: 78
|
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 .
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Que falla en la funcion?
PHP
|
Alex_bro
|
0
|
1,581
|
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,387
|
31 Julio 2010, 13:05 pm
por kinos
|
|
|
Problema con tabla dentro de funcion
Programación C/C++
|
HIPOCROFILO
|
3
|
4,046
|
19 Octubre 2010, 21:12 pm
por Oblivi0n
|
|
|
Mi funcion de borrar falla
Programación C/C++
|
Evox4
|
0
|
1,814
|
10 Octubre 2016, 02:13 am
por Evox4
|
|
|
Ayuda con php , borra tabla de DB tras INSERT *
PHP
|
JazzTA
|
7
|
3,195
|
13 Octubre 2019, 10:45 am
por JazzTA
|
|