Borrar registros de tablas relacionadas

Me gustaría que alguien me indicara que pasos debo seguir para eliminar un registro de 2 tablas a la vez.
Mi caso es que estoy trabajando con tablas relacionadas, y lógicamente, a la hora de eliminar un producto de la tabla productos, tengo que eliminar a su vez el registro de la tabla relacionada.
EL caso es que utilizo una función, pero solo sé eliminar los registros de una tabla a la vez, no de 2. Por lo que esa función no me sirve. Si alguien sabe como hacerlo de manera automática o algo así os lo agradecería.

1 Respuesta

Respuesta
1
La forma para trabajar de esta manera suele ser la siguiente.
Si trabajas con Mysql, deberías definir las tablas como tipo InnoDB. Una vez hecho esto deberías establecer integridad referencial, es decir, especificar que una y otra tabla están relacionadas por una determinada clave.
Una vez defines la clave ajena, cada vez que elimines un registro de la primera (siempre que hayas especificado en la clave ajena ON DELETE CASCADE, es decir, que cuando borres un registro de la tabla primaria se borre en la secundaria) se borrará de la segunda.
Hola ejavi!
Gracias por contestar.
¿No sabia muy bien como hacer lo de ON DELETE CASCADE y mira que he mirado ejemplos por ahí eh? Pero a mi no me salía, así que lo que he hecho ha sido utilizar dos sentencias sql de eliminación.
Dentro de la función he creado primero la sentencia que elimina el registro de la tabla relacionada y después seguido otra sentencia que elimina el registro de la tabla de productos.
Gracias por la sugerencia de todas maneras.
¿Oye y ya que estoy puedo hacerte otra pregunta?
COmo podría hacer para que un producto pertenezca a muchas categorías a la vez. ¿Tipo Wordpress?
¿Qué en el formulario de inserción del producto listes las categorías con un checkbox al lado de cada una y puedas seleccionar más de una categoría y que se guarde el producto con su id en la tabla productgos y a su vez en la tabla de relación se guarden los campos de id de categoría y de id de producto tantas veces como se hayan seleccionado las categorías..?
No sé si me he explicado bien
Es decir, si selecciono categoria1 y categoria2, se debería de guardar en la tabla que las relaciona categoria1+producto1 y otro registro con categoria2+producto1
Esto se hacerlo con una categoría pero no con más de una.. no sé como tengo que hacer el formulario y mucho menos crear la sentencia insert para que lo guarde todo a la vez..
¿Me puedes ayudar please?
Gracias y un saludo,
Beatriz
Pues lo que has hecho es una posible solución, aunque la adecuada era la que te comentaba en mi solución ya que garantizas la integridad de la base de datos a través de su motor. Pero eso vale también ;)
A ver, para lo que me comentas deberías tener tres tablas:
- Producto
- Categoría
- producto_categoria
En producto_categoria tendrías dos campos producto_id y categoria_id, de esta manera, ya puedes relacionar el mismo producto con varias categorías en base de datos.
Para crear el formulario deberías, para el caso de las categorías, crear algo parecido a esto:
// CREAMOS FORMULARIO
<form method="post" action="">
<p>Introducir las categorias:</p>
// CREAMOS UN SELECT MULTIPLE (Esto te devuelve un array con las opciones seleccionadas)
       <select multiple name="categorias_producto[]">
           <?php
               // RECOGEMOS LAS CATEGORIAS DE LA BASE DE DATOS Y PARA CADA UNA
               // CREAMOS UNA OPCION EN EL SELECT
               $query = "SELECT * from categorias"
               $result = mysql_query($query);
               while ($row = mysql_fetch_assoc($result)) {
                          echo '<option value="'.$row['id_categoria'].'">'.$row['nombre'].'</option>';
               }
           ?>
         </select>
      <input type="submit" value="Submit" />
</form>
// PARA PROCESAR EL FORMULARIO RECORRES EL ARRAY DE OPCIONES DEVUELTO
<?php 
categorias_producto=$_POST["categorias_producto"];
//recorremos el array de cervezas seleccionadas. No olvidarse q la primera posición de un array es la 0
for ($i=0;$i<count($categorias_producto);$i++)    
{     
// AQUI GRABARIAS EL PRODUCT_ID Y LA CATEGORIA_ID ($cervezas[$i])
}
No sé si se entiende bien, espero que sí. Si tienes más dudas, por aquí sigo.
Hola!
Jo que guay! Creo que se por donde vas pero para que me resulte más fácil entenderte te paso el código de mi formulario a ver que te parece.
Efectivamente tengo 3 tablas:
-Categorías
-Productos
-categorias_productos
En la de categorias_productos tengo la id de la tabla producto y la id de la tabla categorías.
Y me chuta todo bien como te he dicho antes seleccionando una sola categoría.
En mi formulario tengo un select donde listo todas las categorías y ayer mismo enredando vi que tenia la opción de selección múltiple, pero no sabía seguir.. creo entenderte pero te pongo mi código de mi formulario para que veas si tengo algo más. De todas maneras te aviso que es algo diferente.. digo la manera de mostrar los resultados.. a lo que me has puesto.
¿Bueno me dices como puedo hacer el cambio vale?
Es este:
<select name="fcategoria" class="form">
          <option value "#"> - Seleccionar - </option>
            <?
            $rsx=mysql_query("SELECT * FROM $tabla_empresasprofesionales_categorias  ORDER BY categoria_orden ASC") or die(mysql_error());
            $ix = 0;  
            $cantx = mysql_num_rows($rsx);                
            if  ($cantx <= 0) echo "<option value=''>No hay Categorias para listar.</option>";
            else {
                $ix=-1;
                while (($ix+1)< $cantx) {
                    $ix++;
                    $lcategoria_id=mysql_result($rsx,$ix,"categoria_id");
                    $lcategoria_nombre=mysql_result($rsx,$ix,"categoria_nombre_l1");
                        ?>
                          <option value = "<?=$lcategoria_id;?>"> <?=$lcategoria_nombre;?></option>
                          <?
                 }
            }
            ?>
        </select>
Ahora no sé como tengo que poner lo que me has dicho tu chato, je, je!
Estoy expectante!
Saludos,
Beatriz
Pues a ver todo eso te valdría si están bien las consultas. Solo tendrías que cambiar:
<select name="fcategoria" class="form">
por
<select multiple name="fcategoria[]" class="form">
para que se puedan seleccionar varias categorias.
Luego como te he dicho para grabar recogerías el array con:
categorias_producto=$_POST["fcategoria"];
for ($i=0;$i<count($categorias_producto);$i++)    
{     
// AQUI GRABARIAS EL PRODUCT_ID Y LA CATEGORIA_ID ($categorias_producto[$i])
}
Bueno.. javi.. ¿te pillo un cacho pero mi problema es que donde pongo el resto?
Lo del select lo pillo pero el resto...que lo pongo dentro del select o fuera??
Yo cargo los datos al principio del archivo que a su vez está dentro de una función llamada agregar.
¿Te importa si te pongo todo el código de la página? Quizás me puedas indicar mejor..
Siento ser tan pesada pero es que ahora mismo estoy un poco saturadilla de tantos intentos que estoy haciendo y no me da para más... snif!
////CODIGO DE PAGINA///////
<?php
// Set permissions
$page_access = "Admin";
// Datos de la pagina
$pagina_seccion = "Productos";
$pagina_nombre = "Nuevo Producto";
// Header Selection
include_once ('inc/page_header_admin.inc.php');
// Seleccion de Modulo
$mod_id = 1;
// Inicializacion de variables
$productos_upload = "../" . $productos_upload;
$categoria = tomar_variable('categoria');
// Fechas
   $fecha_actual_dia = date("j");
   $fecha_actual_mes = date("n");
   $fecha_actual_anio = date("Y");
?>
<table width="95%"  border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="84%" class="rutanavegacion">
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="70%" align="left"> <?=$pagina_seccion;?> » <?=$pagina_nombre;?> </td>
<td width="30%" align="right"> <img src="images/ico_reloj.gif" width="17" height="17" hspace="3" align="absmiddle"><?=$fecha_hora;?> </td>
</tr>
</table>
</td>
</tr>
</table>
<table width="95%"  border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="84%" align="left" valign="top" class="base">
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="194" valign="top" class="fdo_botonera">
<div id=navcontainer2>
<ul id=navlist>
<LI><a href=productos.php>LISTAR PRODUCTOS</a></LI>
                <LI><a href=productos_alta.php>NUEVO PRODUCTO</a></LI>
                <LI><a href=productos_categorias.php>LISTAR CATEGORÍAS</a></LI>
                <LI><a href=productos_categorias_alta.php>NUEVA CATEGORÍA</a></LI>
</ul>
</div>
</td>
<td valign="top">
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="40" class="titulos_internas"><span class="txt_big_azul"><?=$pagina_seccion;?> /</span> <?=$pagina_nombre;?> </td>
</tr>
<tr>
<td valign="top" class="contenido_internas"><br>
<?
$agregar = tomar_variable ('agregar');
if ($agregar) {
    // Cargar Imagen
    $fimagen1 = img_upload ('1', $productos_upload, $img_productos_ancho, $img_productos_alto, "Si", "Si", $img_productos_tbancho, $img_productos_tbalto);
    $fimagen1tb = "tb_" . $fimagen1;
    if ($userfile2) $fimagen2 = img_upload ('2', $productos_upload, $img_productos_ancho, $img_productos_alto, "Si", "Si", $img_productos_tbancho, $img_productos_tbalto);
    $fimagen2tb = "tb_" . $fimagen2;
    if ($userfile3) $fimagen3 = img_upload ('3', $productos_upload, $img_productos_ancho, $img_productos_alto, "Si", "Si", $img_productos_tbancho, $img_productos_tbalto);
    $fimagen3tb = "tb_" . $fimagen3;
    // Cargar Datos
    $fnombre =      format_text($_POST['fnombre']) ;
    $fdescripcion = format_text($_POST['fdescripcion']) ;
    $ftalla =      format_text($_POST['ftalla']) ;
    $fprecio =      format_text($_POST['fprecio']) ;
    $ftipo =      format_text($_POST['ftipo']) ;
    $fcodigo =      format_text($_POST['fcodigo']) ;
    $fdia =         $fecha_actual_dia;
    $fmes =         $fecha_actual_mes;
    $fanio =        $fecha_actual_anio;
    $fcategoria_id =   format_text($_POST['fcategoria_id']) ;
    // Validations
        $error_message = "";
        if (($fnombre == "") || ($fcategoria_id == ""))  $error_message .= "
<li>Debe completar todos los datos del formulario. </li>
";
        if (($fimagen1 == "E") || ($fimagen1 == "")) $error_message .= "
<li>No se pudo cargar la imagen, verifique la existencia de la misma </li>
";
    if ($error_message) {
        // Eliminar imagen temporal
        if (($fimagen1 != "") && ($fimagen1 != "E")) {
                $fimagen = $productos_upload . $fimagen1;
                $fimagentb = $productos_upload . $fimagen1tb;
                if (file_exists($fimagen)) unlink($fimagen);
                if (file_exists($fimagentb)) unlink($fimagentb);
        }
        if (($fimagen2 != "") && ($fimagen2 != "E")) {
                $fimagen = $productos_upload . $fimagen2;
                $fimagentb = $productos_upload . $fimagen2tb;
                if (file_exists($fimagen)) unlink($fimagen);
                if (file_exists($fimagentb)) unlink($fimagentb);
        }
        if (($fimagen3 != "") && ($fimagen3 != "E")) {
                $fimagen = $productos_upload . $fimagen3;
                $fimagentb = $productos_upload . $fimagen3tb;
                if (file_exists($fimagen)) unlink($fimagen);
                if (file_exists($fimagentb)) unlink($fimagentb);
        }
        // Dispay error
        $error_message = "
<ul>
" . $error_message . "
</ul>
";
        ?>
<div align="center">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="90%" id="AutoNumber1">
<tr>
<td width="100%" align="left">
              <DIV id=textcontent>
                <P><b><img src="images/ico_alerta.gif" width="22" height="20" hspace="4" align="absmiddle">
                Por favor verifique los siguientes errores:</b><br>
                <br><br><?=$error_message;?> </P>
<p> </p>
<P align="right">
                <a href="javascript:history.go(-1)">
                <img border="0" src="images/bt_volver.gif" align="right"></a>  <img src="images/spacer.gif" align="right" width="20" height="1"> 
                </p>
</DIV>
            </td>
</tr>
</table>
</div>
<?
    }
    else {
            // Agregar a la base de datos
            $query1=mysql_query("INSERT INTO $tabla_productos (producto_id, producto_mod_id, producto_codigo, producto_nombre, producto_fecha_dia, producto_fecha_mes, producto_fecha_anio, producto_tipo, producto_descripcion, producto_talla, producto_precio, producto_imagen1, producto_imagen1tb, producto_imagen2, producto_imagen2tb, producto_imagen3, producto_imagen3tb)
            VALUES ('', '$mod_id', '$fcodigo', '$fnombre', '$fdia', '$fmes', '$fanio', '$ftipo', '$fdescripcion', '$ftalla', '$fprecio', '$fimagen1', '$fimagen1tb', '$fimagen2', '$fimagen2tb', '$fimagen3', '$fimagen3tb')") or die (mysql_error());
            $rsx=mysql_query("SELECT producto_id FROM $tabla_productos ORDER BY producto_id DESC") or die (mysql_error());
             $ix=0;
             $quant=mysql_num_rows($rsx);
             $producto_id=mysql_result($rsx, $ix, 'producto_id');
            $query2=mysql_query("INSERT INTO fpcfontana_productos_categorias VALUES ('$fcategoria_id','$producto_id')") or die (mysql_error());
?>
<div align="center">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="90%" id="AutoNumber2">
<tr>
<td width="100%" align="left">    
          <DIV id=textcontent>
            <P><b><img src="images/ico_exito.gif" width="22" height="20" hspace="4" align="absmiddle"></b><b class="txt_verde_tit">
            El Producto ha sido agregado.</b><br>
            <br></P>
<p> </p>
<P align="right">
            <a href="productos.php">
            <img border="0" src="images/bt_continuar.gif" align="right"></a>  <img src="images/spacer.gif" align="right" width="20" height="1"> 
            </p>
</DIV>    
        </td>
</tr>
</table>
</div>
<?
    }
}
else {
?>              
            <!-- Comienzo de Form -->
<table width="100%"  border="0" cellpadding="0" cellspacing="0" bordercolor="#111111" class="tabla_g_idbt" style="border-collapse: collapse">
<form action="<?echo $url_this; ?>" method="post" enctype="multipart/form-data" name="form1">
 <input name="agregar" type="hidden" value="go">            
<tr>
<td colspan="2" class="tabla_w_idb"><span class="txt_verde_mini">
        <b><img src="images/ico_flecha_vde.gif" width="4" height="7" hspace="2">Datos de la Imagen </b></span></td>
</tr>
<tr>
<td class="tabla_g_itb">Código</td>
<td class="tabla_g_itb">
        <input name="fcodigo" type="text" class="form" value="" size="30"></td>
</tr>
<tr>
<td class="tabla_g_itb">Nombre</td>
<td class="tabla_g_itb"><input name="fnombre" type="text" class="form" value="" size="30"></td>
</tr>
<tr>
<td class="tabla_g_itb">Categorías</td>
<td class="tabla_g_itb">
    <!--    <select name="fcategoria_id" class="form">-->
        <select multiple name="fcategoria_id[]" class="form">
<?
        $rsx=mysql_query("SELECT * FROM $tabla_categorias ORDER BY categoria_orden ASC") or die(mysql_error());
            $ix = 0;  
            $cantx = mysql_num_rows($rsx);  
            if  ($cantx <= 0) echo "<option value=''>No hay Categorias para listar.</option>";
            else {
                $ix=-1;
                while (($ix+1)< $cantx) {
                    $ix++;
                    $lcategoria_id=mysql_result($rsx,$ix,"categoria_id");
                    $lcategoria_nombre=mysql_result($rsx,$ix,"categoria_nombre");
                      ?>
                      <option value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                      <?
                }
                }
            ?>        
</select>
</td>
<tr>
<td class="tabla_g_itb">Tipo</td>
<td class="tabla_g_itb">
        <select name="ftipo" class="form">
        <option>Normal</option>
        <option>Oferta</option>
        <option>Novedad</option>
        </select></td>
</tr>
<tr>
<td class="tabla_g_itb">Precio</td>
<td class="tabla_g_itb">
        <input name="fprecio" type="text" class="form" value="" size="30"></td>
</tr>
<tr>
<td class="tabla_g_itb">Descripción</td>
<td class="tabla_g_itb">
        <textarea rows="15" name="fdescripcion" cols="47" class="form" style="width:98%"></textarea></td>
</tr>
<tr>
<td class="tabla_g_itb">Imagen 1</td>
<td class="tabla_g_itb"><input type="file" name="userfile1" class="form" size="20"></td>
</tr>
<tr>
<td class="tabla_g_itb">Imagen 2</td>
<td class="tabla_g_itb">
        <input type="file" name="userfile2" class="form" size="20"></td>
</tr>
<tr>
<td class="tabla_g_itb">Imagen 3</td>
<td class="tabla_g_itb">
        <input type="file" name="userfile3" class="form" size="20"></td>
</tr>
<tr>
<td class="tabla_boton" colspan="2"><input type="image" value="Enviar" name="B1" src="images/bt_enviar.gif" align="right"> </a></td>
</tr>
</form>
</table>
<!-- fin de Form -->
<? } ?>
</table>
<div align="center"><br>
              </div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<?
include_once ('inc/page_footer_admin.inc.php');
?>
////// FIN DE PAGINA PHP/////////
Perdoname por adelantado por darte la soba tanto... si te parece que estoy abusando me lo dices... y me seguiré rompiendo los sesos por ahí.. ;)
Saludos,
Beatriz
Pues verás, lo siguiente que te he puesto es para grabar los productos relacionados con las categorías, así que debería ir en el archivo PHP que procesa el formulario, que es el que tenga la $url_this en el action del form.
<form action="<?echo $url_this; ?>" method="post" enctype="multipart/form-data" name="form1">
¿Tienes el código de esta?
Casi me da algo al ver las 300 líneas de código, je
Ja, ja!
Perdona Javi.. es que no sabia como explicártelo de la mejor manera posible para que me pudieras indicar mejor.. pero no te asustes... por dios!
A ver ese mismo archivo, en esas 300 lineas de código que has visto está el envío del formulario. Utilizo el mismo, tanto para cargar como para enviar.
La variable $url_this, es la que recoge la URL de ese mismo archivo, para que se cargue en el mismo cuando haya una acción.
¿Te ubicas ahora? Quizás para mi es fácil porque estoy harta de ver el mismo código pero para ti .. es normal que te hayas tirado de los pelos con tanto código..
Ja, ja! Sinceramente.. casi me meo de la risa al leer tu expresión...;)
Gracias de nuevo, intentaré ver como lo hago, pero si me pudieras ubicar mejor, que mejor.
Saludos,
Beatriz
Hola Javi!
¿Qué tal? Oye que ya no hace falta que me indiques donde poner el código que me dijiste.
Que ya he conseguido ponerlo donde corresponde... es que me había liado al estar todo seguido.. a veces no me llega el riego a la cabeza hijo! Ja, ja!
Bueno, pues que ya puedes olvidar las 300 líneas de código y relajarte que me has servido de gran ayuda, pero no te haces una idea de cuanto.
Muchas, muchas gracias majetón
Abrazos,
Beatriz
Ok, que no lo había visto. Pues sería algo así. Recorres el array de opciones y para cada una de ellas insertas un registro en fpcfontana_productos_categorias indexando por el array
<?
    }
    else {
            // Agregar a la base de datos
            $query1=mysql_query("INSERT INTO $tabla_productos (producto_id, producto_mod_id, producto_codigo, producto_nombre, producto_fecha_dia, producto_fecha_mes, producto_fecha_anio, producto_tipo, producto_descripcion, producto_talla, producto_precio, producto_imagen1, producto_imagen1tb, producto_imagen2, producto_imagen2tb, producto_imagen3, producto_imagen3tb)
            VALUES ('', '$mod_id', '$fcodigo', '$fnombre', '$fdia', '$fmes', '$fanio', '$ftipo', '$fdescripcion', '$ftalla', '$fprecio', '$fimagen1', '$fimagen1tb', '$fimagen2', '$fimagen2tb', '$fimagen3', '$fimagen3tb')") or die (mysql_error());
            $rsx=mysql_query("SELECT producto_id FROM $tabla_productos ORDER BY producto_id DESC") or die (mysql_error());
             $ix=0;
             $quant=mysql_num_rows($rsx);
             $producto_id=mysql_result($rsx, $ix, 'producto_id');
            $query2=mysql_query("INSERT INTO fpcfontana_productos_categorias VALUES ('$fcategoria_id','$producto_id')") or die (mysql_error());
        }   
      
         categorias_producto=$_POST["categorias_producto"];
         for ($i=0;$i<count($categorias_producto);$i++)  {     
                mysql_query("INSERT INTO fpcfontana_productos_categorias  VALUES ('".$categorias_producto."','".$producto_id."')") or die (mysql_error());
        }
?>

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas