Foros del Web » Programando para Internet » PHP »

Borrar registro Fkey de 2 tablas Php

Estas en el tema de Borrar registro Fkey de 2 tablas Php en el foro de PHP en Foros del Web. Hola !!!!. a todo forosdelweb :) Bien me surge una duda. ¿Cómo hago para eliminar un cliente de una tabla y en otra tabla se ...
  #1 (permalink)  
Antiguo 08/04/2014, 14:24
Avatar de HackID1  
Fecha de Ingreso: febrero-2013
Ubicación: En Update
Mensajes: 492
Antigüedad: 11 años, 10 meses
Puntos: 17
Pregunta Borrar registro Fkey de 2 tablas Php

Hola !!!!. a todo forosdelweb :)

Bien me surge una duda.
¿Cómo hago para eliminar un cliente de una tabla y en otra tabla se eliminen todos los trabajos realizados a dicho cliente?.

El error que me sucede es que como es FOREIGN KEY no me permite borrarla. :(


En si tengo 2 tablas.

clientes
----------
codcliente (PK)
nombre
email

trabajos
----------
codtrabajos (PK)
codcliente (FK)
descripcion


Ahora he creado un formulario donde puedas insertar: o Codigo del cliente o Nombre. Una vez insertado uno de los 2, se procede a mostrar los datos de la tabla y un botón para eliminar ese registro.


Cuando doy al botón de eliminar registro este no se borra.

Lo he intentado creando 2 consultas, porque de otro modo siempre me sale error de foreign key :( .

Por favor necesito ayuda llevo mirando por Google pero no he dado con la solución y no se como borrar ese dato por php.


Otra duda. como puedo hacer para elegir en mi formulario entre borrar por Nombre o idcliente ?? en el mismo programa, lo he intentado con un if ... else pero no ha funcionado,





Dejo aqui los programas.

----------borrar.php

Código HTML:
Ver original
  1. <h2 align="center" > Cliente eliminar.</h2>
  2.            
  3.             <form action="eliminarcliente2.php" method="post" >
  4.            
  5.                 Elija cliente a eliminar
  6.                 <br/>
  7.                 Obligatorio uno de los 2 campos para realizar la b&uacute;squeda.
  8.                 <br/><br/>
  9.                
  10.                 <label>(*) C&oacute;digo Cliente: </label>
  11.                 <input type="text" name="codcliente" maxlength="50"
  12.                     onfocus="restaurar2()"  />
  13.                 <br/><br/>
  14.                    
  15.                 <label>(*) Nombre: </label>
  16.                 <input type="text" name="nombre" maxlength="50"
  17.                     onfocus="restaurar2()"  />
  18.                 <br/><br/>
  19.                
  20.                 <input name="enviar" type="submit" value="Enviar datos."/>
  21.                
  22.             </form>



Aqui hago un input hidden al final del form para pasar el idcliente por medio de el a la otra página php y asi proceder después al borrado de ese cliente.

------eliminarcliente2.php

Código PHP:
Ver original
  1. <h2 align="center" > Eliminar clientes.</h2>
  2.            
  3.            
  4.             <?php
  5.             /* eliminar cliente 2 */
  6.  
  7.             $codcliente = $_POST['codcliente'] ;
  8.  
  9.  
  10.         if ($codcliente != "" || $codcliente != 0) {
  11.             include('abre_conexion.php');  
  12.  
  13.                 $query = "select * from $tabla_db1 where codcliente = '$codcliente'";
  14.                 $result = mysql_query($query);
  15.  
  16.             while ($registro = mysql_fetch_array($result)){
  17.  
  18.             echo "
  19.  
  20.             <div align='center'>
  21.                 <table border='0' width='600' style='font-family: Verdana; font-size: 8pt' id='table1'>
  22.                     <tr>
  23.                         <td colspan='2'><h3 align='center'>Datos cliente a eliminar </h3></td>
  24.                     </tr>
  25.                     <tr>
  26.                         <td colspan='2'>En los campos puede ver los valores actuales.</td>
  27.                     </tr>
  28.                     <form method='POST' action='eliminarcliente3.php'>
  29.                     <tr>
  30.                         <td width='50%'>&nbsp;</td>
  31.                         <td width='50%'>&nbsp;</td>
  32.                     </tr>
  33.                     <tr>
  34.                         <td width='50%'><p align='center'><b>C&oacute;digo: </b></td>
  35.                         <td width='50%'><p align='center'><input type='text' name='codcliente' size='20' value='".$registro['codcliente']."' readonly='readonly'></td>
  36.                     </tr>
  37.                     <tr>
  38.                         <td width='50%'><p align='center'><b>Fecha Alta: </b></td>
  39.                         <td width='50%'><p align='center'><input type='text' name='fecha_alta' size='20' value='".$registro['fecha_alta']."' readonly='readonly'></td>
  40.                     </tr>
  41.                     <tr>
  42.                         <td width='50%'><p align='center'><b>Nombre: </b></td>
  43.                         <td width='50%'><p align='center'><input type='text' name='nombre' size='20' value='".$registro['nombre']."' readonly='readonly'></td>
  44.                     </tr>
  45.                     <tr>
  46.                         <td width='50%'><p align='center'><b>Apellido: </b></td>
  47.                         <td width='50%'><p align='center'><input type='text' name='apellido' size='20' value='".$registro['apellido']."' readonly='readonly'></td>
  48.                     </tr>
  49. <input type='hidden' name='codcliente' value='$codcliente'>
  50.                     <tr>
  51.                         <td width='100%' colspan='2'>
  52.                         <p align='center'>
  53.                         <input type='submit' value='Eliminar' name='B1'></p>
  54.                         </td>
  55.                     </tr>
  56.                     </form>
  57.                 </table>
  58.             </div>
  59.             ";
  60.             }
  61.             include('cierra_conexion.php');  
  62.         }
  63.         else {
  64.        
  65.             echo "Error en la conexi&oacute;n a la base de datos. " ;
  66.         }
  67.            
  68.             ?>




En este fichero como ven he intentado esa forma ejecutando primero borrar en tabla clientes y luego en tabla trabajos pero no he podido, debido a las FOREIGN KEY.

------------------------eliminarcliente3.php


Código PHP:
Ver original
  1. <?php
  2.                 // Eliminar en funcion del codcliente que recibimos
  3.  
  4.                 $codcliente = $_POST['codcliente'];
  5.                
  6.                 $fecha_alta = $_POST['fecha_alta'] ;
  7.                 $nombre = $_POST['nombre'] ;
  8.                 $apellido = $_POST['apellido'] ;
  9.                
  10.                 include('abre_conexion.php');  
  11.  
  12.                 $sql="  DELETE *
  13.                         FROM trabajos
  14.                         WHERE codcliente = '$codcliente'
  15.                
  16.                     ";
  17.                    
  18.                 $sql=" DELETE *
  19.                         FROM clientes
  20.                         WHERE codcliente = '$codcliente'
  21.                
  22.                     ";
  23.                        
  24.                 if(!mysql_query($sql)) echo mysql_error();
  25.  
  26.                 include('cierra_conexion.php');  
  27.  
  28.                 echo "
  29.                     <div align='center'>
  30.                         <p>Los datos han sido actualizados con exito.</p>
  31.  
  32.                         <p><a href='javascript:history.go(-1)'>VOLVER ATRÁS</a></p>
  33.  
  34.                         <p><a href='javascript:history.go(-2)'>INICIO</a></p>
  35.                     </div>
  36.                 ";
  37.                 ?>


La parte de introducir un nombre y que te salgan los datos de ese nombre , para después presionar el botón borrar no he podido conseguirlo.

Espero puedann ayudarme muchisimas gracias a todos!!! Si me pueden ayudar con eso, de poder elegir entre escribir el idcliente o el nombre (del cliente) en el formulario de borrado lo agradezco no he podido ver la forma.

Saludos!!!
__________________
Puntuar +1 es buena forma de dar las gracias. :P
Your Time is limited, so don't waste it living someone else´s life.
Por: HackID1
  #2 (permalink)  
Antiguo 09/04/2014, 02:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: Borrar registro Fkey de 2 tablas Php

Solo debes definir la FK como ON DELETE CASCADE, esto provocará que al eliminar un elemento de la tabla refrenciada (un cliente en tu caso) se eliminen todos los registros que lo referencian (los trabajos en tu caso).

No debes modificar la consulta debes modificar la definición de la tabla.
Código MySQL:
Ver original
  1. alter table trabajos
  2.   drop constraint FK_Nombre_de_la_FK_a_Clientes;
  3.  
  4. alter table trabajos
  5.   add constraint FK_Clientes
  6.       foreign key (idCliente)
  7.       references Clientes(idCliente)
  8.       on delete cascade
  9.       on update cascade;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 09/04/2014, 09:34
Avatar de HackID1  
Fecha de Ingreso: febrero-2013
Ubicación: En Update
Mensajes: 492
Antigüedad: 11 años, 10 meses
Puntos: 17
Respuesta: Borrar registro Fkey de 2 tablas Php

Hola quim gracias por tu ayuda, lo he solucionado.

Primero mirando el nombre de la foreign key con el comando.

show table trabajos ;

La respuesta es esta:

trabajos CREATE TABLE `trabajos` (
`codtrabajo` int(11) NOT NULL AUTO_INCREMENT,
`codcliente` int(11) NOT NULL,
`tipo_trabajo` varchar(20) DEFAULT NULL,
`estado` varchar(20) DEFAULT NULL,
`descripcion` text,
`precio` decimal(6,2) DEFAULT NULL,

PRIMARY KEY (`codtrabajo`),
KEY `codcliente` (`codcliente`),
CONSTRAINT `trabajos_ibfk_1` FOREIGN KEY (`codcliente`) REFERENCES `clientes` (`codcliente`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1



El comando que realice para cambiar el nombre y poner ON DELETE CASCADE ON UPDATE CASCADE es este:

Código SQL:
Ver original
  1. ALTER TABLE trabajos
  2.   DROP FOREIGN KEY trabajos_ibfk_1;
  3.  
  4.  
  5. -- luego cambio el nombre y defino esas 2 condiciones que me has dicho.
  6.  
  7. ALTER TABLE trabajos
  8.   ADD CONSTRAINT FK_Clientes
  9.       FOREIGN KEY (codcliente)
  10.       REFERENCES clientes(codcliente)
  11.       ON DELETE cascade
  12.       ON UPDATE cascade;

Bueno con esto se supone que al borrar un registro de la tabla clientes, este también borrara todos los campos relacionados con el en la tabla trabajos no?
lo probaré y comento.

Muchas gracias amigo!!! algo más que aprendo hoy. saludos!! y gracias por vuestra ayuda a todos.
__________________
Puntuar +1 es buena forma de dar las gracias. :P
Your Time is limited, so don't waste it living someone else´s life.
Por: HackID1

Última edición por HackID1; 09/04/2014 a las 09:40
  #4 (permalink)  
Antiguo 09/04/2014, 09:47
Avatar de HackID1  
Fecha de Ingreso: febrero-2013
Ubicación: En Update
Mensajes: 492
Antigüedad: 11 años, 10 meses
Puntos: 17
Respuesta: Borrar registro Fkey de 2 tablas Php

Correcto se borro directamente cuando elimine por ejemplo el cliente:

DROP FROM clientes WHERE codcliente = 8

Pues se ellimino el cliente 8 que se llamaba marcos.
Y se borraron los registros en tabla trabajos relacionados con el.
:)
Magnifico muchisimas gracias !!!!!.
Si puedes ayudarme con la consulta que hice en el foro sql lo agradezco un saludo amigo algo más que me ayudan a solucionar.
__________________
Puntuar +1 es buena forma de dar las gracias. :P
Your Time is limited, so don't waste it living someone else´s life.
Por: HackID1

Etiquetas: borrado, delete, foreignkey, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:03.