Update de registros en tablas relacionadas

Hola eJavi!
¿Te acuerdas de mi? Me ayudaste con el modo de
Realizar un formulario listando las categorías y que me permitiera
Mediante un array seleccionar más de una categoría a la vez y que se
Guardara en las tablas relacionadas.
Bueno, pues después de solucionar esto me ocurrió la siguiente duda.
Para
¿Actualizar esos datos? Como tendría que hacerlo. Es decir, aparecería
El formulario con las categorías y los campos del formulario
Rellenados, pero para que aparezca seleccionada ala categoría en el que
Está y posteriormente si deseo cambiar de categorías... Como podría
¿Hacerlo?
Si hace falta te vuelvo a enviar las 300 lineas de código.. Ja, ja!
Te refresco un poco la memoria:
Es broma hombre..
Espero puedas ayudarme de nuevo majetón!
Saludos,
Beatriz

1 respuesta

Respuesta
1
El formulario te valdría el mismo recuperando los valores en los campos. ¿Cómo recuperas los valores de las categorías relacionadas? Pues tendrías que:
1) Recuperar todas las categorías en un array (este ya lo tenías)
2) Recuperar las categorías relacionadas con el producto que estás editando en otro array ($array_categorias_relacionadas).
3) Cada vez que vas a insertar un
<option>Categoria</option>
Pues comparas los dos arrays, hay una función en PHP, in_array (http://es.php.net/in_array), que te dice si un elemento está en un array entonces sería algo así:
if in_array($lcategoria_id, $array_ids_categorias_relacionadas) {
        <option selected>Categoria</option>
} else {
         <option>Categoria</option>
}
Vamos, la clave es crear un array de las relacionadas y luego utilizar la función in_array, para ver si pones la categoría como seleccionada o no.
¿Se ha entendido? No sé yo si me he explicado muy bien, a ver si te sirve.
Salud!
Hola eJavi!
Gracias por contestarme..
Bueno, ya se que te parezco un poco corta pero es que a mi los términos tan técnicos nunca me han entrado muy bien, pero ma o meno te he entendido...
1) Recuperar las categorias en un array..si lo del formulario con fcategoria_id[] eso lo tengo e incluso cargo los datos mediante la variable $fcategoria_id =   format_text($_POST['fcategoria_id']) ; y demás campos..mi pregunta es: a la hora de hacer el UPDATE en la tabla como tengo que hacerlo? igual que en el INSERT? Recuerda que tenia dos sentencias sql, una para insertar en la tabla del producto en cuestión y otro para la tabla relacionada que insertaba el id del producto y el id de la categoría.
2) ¿Eso de recuperar las categorías relacionadas con el producto que estoy editando te refieres a cargar datos actuales no?. Bien esto lo tengo hecho haciendo un select a la tabla de productos a la tabla de relación, cargando los campos así:
    $item_id = mysql_result($rs,0,"id");    
    $item_categoria_id = mysql_result($rs,0,"categoria_id");    
    $item_nombre = mysql_result($rs,0,"nombre");
Esto me chuta bien si es a esto a lo que te refieres
3)Y el tercer punto lo del formulario donde se listan las categorías es lo que me falta, porque había hecho un select así:
Hago un select de la tabla categorías y saco el id y el nombre de las categorías que es la variable $scategoria_id y le doy la condición,:
if ($scategoria_id == $item_categoria_id) $chek = " selected";
                        else $chek = "";
Pero esté en el producto que esté siempre sale seleccionada la primera categoría y otra cosa, si cambio de categoría no realiza el cambio, se cambia el resto de campos del producto pero no de la categoría y mucho menos seleccionar más categorías..
No sé si me he explicado bien...;)
Creo que mi problema reside también en el UPDATE a las tablas.. no sé si lo estoy haciendo del todo bien, lo que es seguro que el UPDATE a la tabla de productos la hago bien, porque no sale error pero en cuanto pongo lo de la categoría que me indicaste en el INSERT me sale lo de claves foráneas y eso..
Si consigo terminar esto bien, ¿te prometo que no te molestaré más por lo menos a ti vale? Es que es lo último que me queda para terminar el proyecto... y si quieres te mando una caja de bombones!
¿Qué te parece el trato? Je, je!
Bueno, que muchas gracias por ayudarme en serio, espero tu respuesta de nuevo.
Mil gracias
Beatriz
Hola de nuevo Javi,
Mira que estoy intentando lo que me has dicho, pero creo que me falta algo, concretamente recoger el valor de las categorías que no me sale..
No sé como hacerlo.. no sé por qué no me recupera las categorías relacionadas. Creo que eso es lo único que me falta por hacer porque el UPDATE en la tabla de productos me lo hace bien, ahora falta ver si me lo hace en la tabla relacionadas.
He hecho lo que me has dicho pero nada.. he sacado el sql en pantalla para ver que recoge, y justo la variable que se supone tiene que recoger el valor de la categoría está vacía.
Te pongo como cojo los valores actuales de los campos:
$id = $_GET['id'];   
    $rs=mysql_query("SELECT * FROM $fpcfontana_productos, $fpcfontana_productos_categorias WHERE $fpcfontana_productos.producto_id=fpcfontana_productos_categorias.producto_id
    AND  $fpcfontana_productos.producto_id = '$id'") or die(mysql_error());
    $item_categoria = mysql_result($rs,0,"categoria_id");//este es lo que no me recoge..creo que lo hago mal
    $item_id = mysql_result($rs,0,"id");  
$item_nombre= mysql_result($rs,0,"id"); 
etc, etc
Tampoco en la función in_array me sale seleccionada la categoría y creo que es por eso porque no hago bien la relación del producto con las categorías relacionadas.. así que ya no sé que más probar..
Seguro que tu ves el error.. dime por fa donde estoy errando.
Espero tu respuesta y gracias de nuevo
Saludos,
Beatriz
Es que creo que la consulta esta mal. ¿Por qué no accedes simplemente a la tabla relacionada?
$rs = mysql_query("SELECT categoria_id FROM $fpcfontana_productos_categorias WHERE producto_id = '$id'");
Y de esta consulta te saldrían ya las categorías seleccionadas.
Si no te funciona esto pásame el código entero otra vez modificado y a ver si veo algo.
Saludoooos
Hola JAvi,
Referente a lo que me comentas, decirte que no puedo hacer eso puesto que esa consulta es para cargar los datos recogido en el formulario o lo que es lo mismo, para sacar todos los campos del producto de la tabla productos, si hago lo que tu me dices, me da error, porque no se cargaría ningún valor del formulario. Recuerda que estamos editando..
Bueno, he modificado cosas y ya sé por qué no me cogía la categoría.. era porque no le había asignado bien la variable de id de la categoría.. bueno, que ya me la coge.
Lo que sigue sin hacer es quedarse seleccionada cuando entro a editar ese producto, ¿supuestamente deberían de quedarse seleccionadas aquellas categorías en las que se encuentra el producto no? Bueno, pues o lo hace.
Ahora creo que el problema lo tengo en el UPDATE, porque edito un producto selecciono otra categoría y me cambia las id´s de las categorías de todos los productos que contiene la tabla relacionada. No sé si me explico, es como si cogiera la id de la categoría que he seleccionado a la hora de editar y me lo cambia en todos los demás productos! Menudo horror!
¿Te paso el código a ver si ves tu algo vale?
///CODIGO PAGINA
<?
$modificar = tomar_variable ('modificar');
if ($modificar) {
    // Cargar Imagen (si corresponde)
    if ($userfile1)    {
        $fimagen1 = img_upload ('1', $productos_upload, $img_productos_ancho, $img_productos_alto, "Si", "Si", $img_productos_tbancho, $img_productos_tbalto);
        $fimagen1tb = "tb_" . $fimagen;
    }
    if ($userfile2)    {
        $fimagen2 = img_upload ('2', $productos_upload, $img_productos_ancho, $img_productos_alto, "Si", "Si", $img_productos_tbancho, $img_productos_tbalto);
        $fimagen2tb = "tb_" . $fimagen;
    }
    if ($userfile3)    {
        $fimagen3 = img_upload ('3', $productos_upload, $img_productos_ancho, $img_productos_alto, "Si", "Si", $img_productos_tbancho, $img_productos_tbalto);
        $fimagen3tb = "tb_" . $fimagen;
    }
    // Cargar Datos
    $fnombre =      format_text($_POST['fnombre']) ;
    $fcategoria_id =   format_text($_POST['fcategoria_id']) ;
    $fdescripcion = format_text($_POST['fdescripcion']) ;
    $ftalla =      format_text($_POST['ftalla']) ;
    $fprecio =      format_text($_POST['fprecio']) ;
    $ftipo =      format_text($_POST['ftipo']) ;
    $fdia =         $fecha_actual_dia;
    $fmes =         $fecha_actual_mes;
    $fanio =        $fecha_actual_anio;
    //$fdia =         format_text($_POST['fdia']) ;
    //$fmes =         format_text($_POST['fmes']) ;
    //$fanio =        format_text($_POST['fanio']) ;
    // Validations
        $error_message = "";
        if (($fnombre == "") || ($fcategoria_id == ""))  $error_message .= "
<li>Debe completar todos los datos del formulario. </li>
";
        if ($fimagen == "E") $error_message .= "
<li>No se pudo cargar la imagen, verifique la existencia de la misma </li>
";
    if ($error_message) {
        // 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><?echo $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 {
        // Actualizar Imagen
        if (($fimagen1 != "E") && ($fimagen1 != "")) {
            $filename = $productos_upload . $fimagena1;
            if ((file_exists($filename)) && ($fimagena1 != "")) unlink($filename);
            $filename = $productos_upload . "tb_" . $fimagena1;
            if ((file_exists($filename)) && ($fimagena1 != "")) unlink($filename);
        }
        else {
            $fimagen1= $fimagena1;
            $fimagen1tb= "tb_" . $fimagena1;
        }
        if (($fimagen2 != "E") && ($fimagen2 != "")) {
            $filename = $productos_upload . $fimagena2;
            if ((file_exists($filename)) && ($fimagena2 != "")) unlink($filename);
            $filename = $productos_upload . "tb_" . $fimagena2;
            if ((file_exists($filename)) && ($fimagena2 != "")) unlink($filename);
        }
        else {
            $fimagen2= $fimagena2;
            $fimagen2tb= "tb_" . $fimagena2;
        }
        if (($fimagen3 != "E") && ($fimagen3 != "")) {
            $filename = $productos_upload . $fimagena3;
            if ((file_exists($filename)) && ($fimagena3 != "")) unlink($filename);
            $filename = $productos_upload . "tb_" . $fimagena3;
            if ((file_exists($filename)) && ($fimagena3 != "")) unlink($filename);
        }
        else {
            $fimagen3= $fimagena3;
            $fimagen3tb= "tb_" . $fimagena3;
        }
        // Actualizar base de datos
        $query1=mysql_query("UPDATE $tabla_productos SET producto_nombre='$fnombre',  producto_fecha_dia='$fdia', producto_fecha_mes='$fmes', producto_fecha_anio='$fanio', producto_tipo='$ftipo', producto_descripcion='$fdescripcion', producto_talla='$ftalla', producto_precio='$fprecio', producto_imagen1='$fimagen1', producto_imagen1tb='$fimagen1tb', producto_imagen2='$fimagen2', producto_imagen2tb='$fimagen2tb', producto_imagen3='$fimagen3', producto_imagen3tb='$fimagen3tb' WHERE producto_id='$id'") or die(mysql_error());
         for ($i=0;$i<count($fcategoria_id);$i++)    
        {     
        $query2=mysql_query("UPDATE fpcfontana_productos_categorias SET categoria_id='$fcategoria_id[$i]', producto_id='$id'") or die (mysql_error());
        }
    ?>
<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_exito.gif" width="22" height="20" hspace="4" align="absmiddle"></b><b class="txt_verde_tit">
            La imagen ha sido modificada.</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 {
    // Cargar datos actuales
    $id = $_GET['id'];
    $rs=mysql_query("SELECT * FROM $tabla_productos, $tabla_productos_categorias WHERE $tabla_productos.producto_id=$tabla_productos.producto_id
    AND $tabla_productos.producto_id='$id'") or die(mysql_error());
    $nombre = format_text(mysql_result($rs,0,"producto_nombre"));
    $tipo = format_text(mysql_result($rs,0,"producto_tipo"));
    $precio = format_text(mysql_result($rs,0,"producto_precio"));
    $dia = format_text(mysql_result($rs,0,"producto_fecha_dia"));
    $mes = format_text(mysql_result($rs,0,"producto_fecha_mes"));
    $anio = format_text(mysql_result($rs,0,"producto_fecha_anio"));
    $descripcion = format_text(mysql_result($rs,0,"producto_descripcion"));
    $categoria_id = format_text(mysql_result($rs,0,"categoria_id"));
    $imagen1 = format_text(mysql_result($rs,0,"producto_imagen1"));
    $imagenm1 = $productos_upload . format_text(mysql_result($rs,0,"producto_imagen1"));
    $imagen2 = format_text(mysql_result($rs,0,"producto_imagen2"));
    $imagenm2 = $productos_upload . format_text(mysql_result($rs,0,"producto_imagen2"));
    $imagen3 = format_text(mysql_result($rs,0,"producto_imagen3"));
    $imagenm3 = $productos_upload . format_text(mysql_result($rs,0,"producto_imagen3"));
    ?>
            <!-- 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="modificar" type="hidden" value="go">            
            <input name="id" type="hidden" value="<?=$id;?>">            
            <input name="fimagena1" type="hidden" value="<?=$imagen1;?>">
            <input name="fimagena2" type="hidden" value="<?=$imagen2;?>">
            <input name="fimagena3" type="hidden" value="<?=$imagen3;?>">
<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">Nombre</td>
<td class="tabla_g_itb"> <input name="fnombre" type="text" class="form" value="<?=$nombre;?>" size="30"></td>
</tr>
<!--
<tr>
<td class="tabla_g_itb">Fecha</td>
<td class="tabla_g_itb">
              <input name="fdia" type="text" class="form" value="<?=$dia;?>" size="3"> /
              <input name="fmes" type="text" class="form" value="<?=$mes;?>" size="3"> /
              <input name="fanio" type="text" class="form" value="<?=$anio;?>" size="6"></td>
</tr>
-->
<tr>
<td class="tabla_g_itb">Categoría</td>
<td class="tabla_g_itb">
             <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");
                    if (in_array($lcategoria_id,$categoria_id)) {
                    ?>
                      <option selected="selected" value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                      <?  }
                    else {
                    ?>
                    <option value="<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                    <? }
                  }
            }
            ?>
        </select></td>
</tr>
<tr>
<td class="tabla_g_itb">Tipo</td>
<td class="tabla_g_itb">
        <select name="ftipo" class="form">
        <option<?if ($tipo == "Normal") echo " selected";?>>Normal</option><option<?if ($tipo == "Oferta") echo " selected";?>>Oferta</option><option<?if ($tipo == "Novedad") echo " selected";?>>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="<?=$precio;?>" size="30"></td>
</tr>
<tr>
<td class="tabla_g_itb" width="100">Descripción</td>
<td class="tabla_g_itb"><textarea rows="15" name="fdescripcion" cols="47" class="form" style="width:98%"><?=$descripcion;?></textarea></td>
</tr>
<tr>
<td class="tabla_g_itb">Imagen</td>
<td class="tabla_g_itb">
              <input type="file" name="userfile1" class="form" size="20"><?if ($imagen1) { ?>Ver
                Actual  <a target="_blank" href="<?=$imagenm1;?>"> <img src="images/ico_descarga.gif" width="16" height="20" align="middle" border="0"></a>
                  Borrar  <a href="<?=$url_this;?>?id=<?=$id;?>&borrarimg=1"> <img src="images/ico_borrar.gif" align="middle" border="0"></a><br>
                Nota: No seleccionar nuevo archivo si no se desea modificar.<?}?></td>
</tr>
<tr>
<td class="tabla_g_itb">Imagen</td>
<td class="tabla_g_itb">
              <input type="file" name="userfile2" class="form" size="20"><?if ($imagen2) { ?>Ver
                Actual  <a target="_blank" href="<?=$imagenm2;?>">
                <img src="images/ico_descarga.gif" width="16" height="20" align="middle" border="0"></a>
                  Borrar  <a href="<?=$url_this;?>?id=<?=$id;?>&borrarimg=2"> <img src="images/ico_borrar.gif" align="middle" border="0"></a><br>                
                Nota: No seleccionar nuevo archivo si no se desea modificar.<?}?></td>
</tr>
<tr>
<td class="tabla_g_itb">Imagen</td>
<td class="tabla_g_itb">
              <input type="file" name="userfile3" class="form" size="20"><?if ($imagen3) { ?>Ver
                Actual  <a target="_blank" href="<?=$imagenm3;?>">
                <img src="images/ico_descarga.gif" width="16" height="20" align="middle" border="0"></a>
                  Borrar  <a href="<?=$url_this;?>?id=<?=$id;?>&borrarimg=3"> <img src="images/ico_borrar.gif" align="middle" border="0"></a><br>
                Nota: No seleccionar nuevo archivo si no se desea modificar.<?}?></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 CODIGO PAGINA
De nuevo mil gracias
BEA
Está ya complicado el código ¿eh? No me extraña que te estés volviendo loca...
A ver, esto no está bien:
if (in_array($lcategoria_id,$categoria_id))
Tu en $categoria_id tienes la categoría a la que pertenece el producto y eso no tiene que ser. En $categoria_id debes tener un array con todas las categorías a las que ese producto pertenece. Eso lo sacas de aquí:
$rs = mysql_query("SELECT categoria_id FROM $fpcfontana_productos_categorias WHERE producto_id = '$id'");
$categoria_id = fetch_array($rs);
Entonces tu con:
while (($ix+1)< $cantx) {
Recorres todas las categorías disponibles en la base de datos
Y con
if (in_array($lcategoria_id,$categoria_id))
Miras si cada una de esas categorías se encuentra en el array de categorías seleccionadas, es decir, si se encuentra en la tabla $fpcfontana_productos_categorias
A ver si ya lo consigues, estás cerca.
Bueno Javi...
Ahora no me lista las categorías.. hay que joderse!
No sé que leches hago mal pero no sale.. y tampoco me recoge más de una categoría, he conseguido que me modifique una pero no si selecciono dos categorías solo modifica una y claro, he pensado, ¿como narices va a añadir una nueva si lo que le estoy diciendo es UPDATE en vez de INSERT? ¿Esto sería imposible no? Es decir, si un producto pertenece a una categoría y al editarlo quieres que pertenezca a 2, con el UPDATE no valdría, ¿tendría que haber un INSERT también no? Bueno.. no sé.. ya veré como hago esto, pero lo que te quería comentar es que ahora con lo que me has dicho no me lista las categorías.. Me salta el error que puse yo "No hay categorías para listar"
¿Alguna idea? Seguiré haciendo pruebas, no me doy por vencida..
Gracias por tu paciencia,
saludos,
Bea
Hola de nuevo eJavi,
He conseguido algo.. ma o meno..
He he hecho esto:
$rsx=mysql_query("SELECT * FROM fpcfontana_productos, fpcfontana_productos_categorias, fpcfontana_categorias WHERE fpcfontana_producto.producto_id=fpcfontana_productos_categorias.producto_id AND
 fpcfontana_productos_categorias.categoria_id=fpcfontana_categorias.categoria_id AND fpcfontana_productos.producto_id=$id") or die(mysql_error());
$quant = mysql_num_rows($rsx);
        $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_l" . $idioma_activo);
                    if (in_array($lcategoria_id,$categoria)) {
                    ?>
                          <option selected="selected" value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                          <?  }
                    else {
                        ?>
                         <option value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                         <? }
                 }
            }
            ?>
Y ahora lo que hace es listar solo las categorías en las que ese producto este, el resto de categorías no las lista. Bueno, algo es algo, lo que me falta es poner eso que me has puesto tu seguido del SELECT: $categoria_id = fetch_array($rs);
que no sé donde ponerlo porque en cuanto lo pongo desaparece medio formulario..no sé.
SEguiré haciendo pruebas pero si me indicaras mejor... gracias de nuevo
Beatriz
A ver es que tienes que hacer dos consultas.
En la consulta de ahora, estás recogiendo las categorías que están relacionadas no algún producto, lo que tienes que hacer son dos consultas:
1) Que te recoja todas las categorías
2) Otra que te recoja las categorías seleccionadas para ese producto.
Entonces recorres todas las categorías y para cada una:
SI la categoría está relacionada con el producto la muestras como seleccionada
SINO la muestras sin seleccionar.
Sobre el UPDATE, en este caso efectivamente no te sirve. Lo mejor es lo siguiente:
1) ELIMINAR TODOS LOS REGISTROS DE LA TABLA producto_categoria que tengan el id_producto
2) Insertar un registro nuevo por cada categoría seleccionada.
El día que acabes de hacer esto avísame, y abro una botella de champán a la vez que tu ;)
Si dudas de cómo codificarlo dímelo.
Joder que si tío!
Una botella no 2! Madre del amor hermoso lo que me está costando!
Bueno, te pongo lo que he hecho, que ya te he pillado.. ya decía yo que no podía ser, no sabia que había que hacer 2 sentencias.. en fin!
Bueno he puesto esto:
<select multiple name="fcategoria_id[]" class="form">
            <?
             $rss=mysql_query("SELECT * FROM $tabla_categorias ORDER BY categoria_orden ASC") or die(mysql_error());
            $is = 0;  
            $cants = mysql_num_rows($rss);                
            if  ($cants <= 0) echo "<option value=''>No hay Categorias para listar.</option>";
            else {
                $is=-1;
                while (($is+1)< $cants) {
                    $is++;
                    $categoria_id=mysql_result($rss,$is,"categoria_id");
                    $categoria_nombre=mysql_result($rss,$is,"categoria_nombre_l1");
                        ?>
                          <option value = "<?=$categoria_id;?>"> <?=$categoria_nombre;?></option>
                          <?
    $rsx=mysql_query("SELECT categoria_id FROM fpcfontana_productos_categorias    WHERE  fpcfontana_productos.producto_id='$id'") or die(mysql_error());
            $cantx = mysql_num_rows($rsx);                
                $ix=-1;
                while (($ix+1)< $cantx) {
                    $ix++;
                    $lcategoria_id=mysql_result($rsx,$ix,"categoria_id");
                    $lcategoria_nombre=mysql_result($rsx,$ix,"categoria_nombre_l" . $idioma_activo);
                    if (in_array($lcategoria_id,$categoria_id)) {
                    ?>
                          <option selected="selected" value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                          <?  }
                    else {
                        ?>
                         <option value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                         <? }
                        }
                 }
            }
            ?>
Mira a ver que tengo mal porque sale el formulario cortado justo por las categorías y solo sale una categoría, Y da igual en que producto este porque siempre sale la misma.
Estoy ahi ahi tio!! en serio creo que me falta poco para conseguirlo pero nada...
Miramelo porfa porque que ya ni veo!!
Gracias
Beatriz
El select este:
$rsx=mysql_query("SELECT categoria_id FROM fpcfontana_productos_categorias    WHERE  fpcfontana_productos.producto_id='$id'") or die(mysql_error());
Lo tienes que poner fuera del WHILE, porque tu primero reocges las categorías antes del while y luego dentro, solo las comparas.
A ver.... son DOS consultas, pero un solo WHILE. Te lo pongo en pseudocodigo
1) Recoges las categorías
2) Recoges las categorías relacionadas con el producto (de product_category)
3)
WHILE categorias
        IF (categorias IN categorias_relacionadas)
             echo <option selected>
        ELSE
            echo <option>
Mira.. no me sale..
Ya se que tengo que aprender pero ya no sé ni lo que hago..
Ahora no aparece ninguna categoría...
Lo he puesto así:
<?
             $rss=mysql_query("SELECT * FROM fpcfontana_categorias ORDER BY categoria_orden DESC") or die (mysql_error());
             $is=0;
             $quant=mysql_num_rows($rss);
             $categoria_id=mysql_result($rss, $is, 'categoria_id');
            $rsx=mysql_query("SELECT categoria_id FROM fpcfontana_productos_categorias  WHERE  fpcfontana_productos.producto_id='$id'") or die(mysql_error());
            $cantx = mysql_num_rows($rsx);                
                $ix=-1;
                while (($ix+1)< $cantx) {
                    $ix++;
                    $lcategoria_id=mysql_result($rsx,$ix,"categoria_id");
                    $lcategoria_nombre=mysql_result($rsx,$ix,"categoria_nombre_l1");
                    if (in_array($lcategoria_id,$categoria_id)) {
                    ?>
                          <option selected="selected" value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                          <?  }
                    else {
                        ?>
                         <option value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                         <? }
                        }
             //    }
            //}
            ?>
¿Qué tengo mal? ya lo he sacado del While!
¿Qué desesperación, pero mil gracias eh? Que conste..
Bea
A ver... a la función IN_ARRAY le tienes que pasar un id y un array, tu le estás pasando dos ids. Te marco en negrita lo que he cambiado.
Msyql_fetch_array, coge el resultado de la consulta y lo mete en un array, que es el que necesitas para la función IN_ARRAY como segundo parámetro
A ver como va, si no entiendes algo de lo que he cambiado dímelo
<?
         $rss=mysql_query("SELECT * FROM fpcfontana_categorias ORDER BY categoria_orden DESC") or die (mysql_error());
         $is=0;
         $quant=mysql_num_rows($rss);
         $rsx=mysql_query("SELECT categoria_id FROM fpcfontana_productos_categorias  WHERE  fpcfontana_productos.producto_id='$id'") or die(mysql_error());
         $categoria_id=mysql_fetch_array($rsx);
         $cantx = mysql_num_rows($rsx);                
         $ix=-1;
         while (($ix+1)< $cantx) {
                    $ix++;
                    $lcategoria_id=mysql_result($rss,$ix,"categoria_id");
                    $lcategoria_nombre=mysql_result($rss,$ix,"categoria_nombre_l1");
                    if (in_array($lcategoria_id,$categoria_id))  ?>
                           <option selected="selected" value = "<?=$lcategoria_id;?>"> 
                                        <?=$lcategoria_nombre;?>
                           </option>
                          <?  }
                    else {
                        ?>
                         <option value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
                         <? }
                        }
             //    }
            //}
            ?>
eJavi,
me daba un error de sintáxis, creo que tienes mal la llave de if(in_array($lcategoria_id, $categoria_id)) ?> Aqui te faltaba la { y despues el ?>
Pero bueno que nada porque sale el formulario cortado por las categorías y sin ellas..
He entendido lo que has hecho pero no chuta..
Vaya... ¿qué fuerte no? Creo que esto se está convirtiendo ya en algo personal.. de verdad..
Bea
Paciencia, pequeño saltamontes... ¿Dónde te aparece cortado? ¿Has mirado la linea exacta en la que se corta? Te mando corregido el código, debería funcionar...
<?
$rss   = mysql_query("SELECT * FROM fpcfontana_categorias ORDER BY categoria_orden DESC") or die (mysql_error());
$is    = 0;
$cantx = mysql_num_rows($rss);
$rsx   = mysql_query("SELECT categoria_id FROM fpcfontana_productos_categorias  WHERE  fpcfontana_productos.producto_id='$id'") or die(mysql_error());
$arrCategorias = mysql_fetch_array($rsx);               
$ix=-1;
    while (($ix+1)< $cantx) {
        $ix++;
        $lcategoria_id     = mysql_result($rss,$ix,"categoria_id");
        $lcategoria_nombre = mysql_result($rss,$ix,"categoria_nombre_l1");
        if (in_array($lcategoria_id, $arrCategorias)) { ?>
            <option selected="selected" value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
    <?  } else { ?>
            <option value = "<?=$lcategoria_id;?>"><?=$lcategoria_nombre;?></option>
     <? }
    } ?>
Hola de nuevo eJavi,
Lo siento pero nada no chuta. Se corta justo donde antes, lista el formulario justo por la Categoría y se ve el select pero vacío sin el nombre de las categorías:
Quizás esté haciendo algo mal que no vea hijo no se..
SEguiré haciendo pruebas.. a ver si es que me he colado algo si se te ocurre algo me dices, ¿vale?
DE nuevo mil gracias,
Bea
Volviendo a analizar el código me ha dado por eliminar justo estas lineas:
$rsx   = mysql_query("SELECT categoria_id FROM filmbd_cat_empreprof  WHERE filmbd_empresasprofesionales.id='$id'")  or die (mysql_error());
            $arrCategorias = mysql_fetch_array($rsx); 
Y aparece todo el formulario! Pero claro está.. sin estar las categorías seleccionadas..
Y encima para más inri no me hace bien el UPDATE.. En serio que yo no sé que leches le está pasando a este proyecto, pero me está llevando por la calle de la amargura hijo!
Bea
Bea, prueba a ver el código fuente de la página (el que sale en el navegador), eso te puede dar pistas, si lo tienes pégalo aquí, te puede dar pistas de donde está el error.
También puedes depurar código. Imprime con print_r($arrCategorias) el array en pantalla y mira a ver si está lleno.
haz un echo("------>".$lcategoria_id."<------");
También no sé si tienes firebug, una herramienta para firefox. Te serviría de mucho.
Esto.. gracias por tus ánimos pero no sé muy bien donde poner el echo este que me dices.. y el firebug lo tengo pero no me sirve de nada, porque no aparece nada después de esta linea:
<select multiple name="fcategoria_id[]" class="form">
Sale el cierre de tablas de más abajo pero no sale nada más.
Acabo de ver el código fuente y mira lo que me sale:
Unknown column 'fpcfontana_productos.producto_id' in 'where clause'
Claro! Como leches le decimos que coja de la tabla relacionadas un campo que no existe! Hay que joderse! Pero que tonta que estoy!
Hago pruebas y te comento
Bea
Javi! Funciona!
¿Aunque no del todo eh?
Te cuento:
Tengo solo 2 productos y 2 categorías, donde uno de ellos se encuentra en las 2 categorías existentes y el otro solo en una, ¿ok?
Bien, cuando seleccionas el producto dentro de la categoría 1 (el producto que está en las 2 categorías), ¿lógicamente se deberían seleccionar las categorías en las que se encuentra este producto no? Bueno pues solo lo hace en la primera categoría, no sé por qué hace esa selección. Te vas a la 2ª categoría donde también esta este producto y sorpresa, ¿solo sale seleccionada la primera categoría cuando deberían de salir las 2 o por defecto al estar en la 2ª debería de estar seleccionada esta última no?
Buf! menudo lio te he metido.. ¿no? Bueno, ¿qué me dices?
Bea
A ver, a ver... que no me entero, pero tu estás editando los productos ¿no? Y dentro de los productos seleccionas las categorías al que pertenece el producto ¿no? ¿O me estás hablando de otra parte?
A ver a ver...
Te estoy hablando de editar el producto si.
Primero creo un nuevo producto y lo llamo POR y le asigno 1 o varias categorías.. ¿no? Esto lo hago con el INSERT, que esto me funciona todo perfecto.
Pero imaginate que ahora quiero que ese producto POR que acabo de crear lo quiero poner en una categoría más o bien cambiarlo de categoría... pues es cuando lo EDITO.
Y me lleva al formulario donde deberían de aparecer las categorías en las que el producto está dado de alta seleccionadas. Eso es en lo que hemos estado trabajando.. pero solo selecciona una no en todas en las que está.. ¿me explico?
Bea
Vale vale, sí, es que me había perdido esto que has dicho: "Te vas a la 2ª categoría donde también esta este producto"
¿Has comprobado que en la base de datos se guardan los valores bien en la tabla product_category? Porque igual lo que pasa es que no las está guardando bien cuando las seleccionas.
¿Cómo actualizas la tabla product_category?
Ese es el caso, el INSDET me funciona bien, quiero decir cuando creo un producto nuevo me selecciona todo bien.
Ahora está la última fase que es el UPDATE que no chuta.. no me guarda los cambios en las categorías pero si en el resto del formulario, como nombre, etc..
¿Me explico? lo que me falta arreglar es el UPDATE. Lo tengo así:
$sql1=mysql_query(" UPDATE fpcfontana_productos
  SET pdf='$fpdf', tipocliente='$ftipocliente', nombre='$fnombre', apellidos='$fapellidos', nombre_empresa='$fnombre_empresa', descripcion_breve='$fdescripcion_breve', descripcion_completa='$fdescripcion_completa',
        direccion='$fdireccion', cp='$fcp', poblacion='$fpoblacion', provincia='$fprovincia', tel1='$ftel1', tel2='$ftel2', email='$femail', web='$fweb',
        imagen1='$fimagen1' WHERE fpcfontana_productos.producto_id='$id' ") or die(mysql_error());
                 for ($i=0;$i<count($fcategoria_id);$i++)    
                {     
                    $sql="UPDATE fpcfontana_productos_categorias SET categoria_id='$fcategoria_id[$i]', id='$id' WHERE fpcfontana_productos_categorias.producto_id='$id'";
                    echo $sql;
                }
Vale eso es lo que te decía la última vez. La tabla producto_categoria no la actualices así.
Es que el update no te vale, porque si acabas de seleccionar una nueva categoría no puedes actualizar porque no existe.
Entonces borra primero los registros de la tabla para product_id y después la rellenas de nuevo con las que están seleccionadas.
Algo así (escribo pseudocodigo, pero lo pa que pilles la idea):
DELETE FROM fpcfontana_productos_categorias WHERE producto_id='$id'
for ($i=0;$i<count($fcategoria_id);$i++)    
{        
 INSERT INTO fpcfontana_productos_categorias VALUES('$fcategoria_id[$i]',$id);
}
Ok eJavi!
Ya está! Todo chuta casi perfecto.. pero..(como no tiene que haber un pero)
Me pasan dos cosas.. sigue sin aparecer seleccionadas todas las categorías en las que está ese producto.. ¿por qué? ¿Si debería de hacerlo no?
Y por otro lado me he dado cuenta, que el BORRADO no me funciona bien, me elimina el producto en todas las categorías... buf! Vaya mierda.. y yo que pensaba que ya lo tenia todo! Hay que joderse!
Cuando quiero eliminar un producto que de una categoría en concreto me borra ese producto pero no solo de esa categoría sino de todas en las que se encuentre..
¿Me ayudas? ¿Más todavía? Je, je
Bea
¿No te aparecen seleccionadas? Y ¿Se está actualizando bien la tabla producto_categoria?
Sobre lo segundo que me comentas, pásame el query de borrado a ver como lo haces.
Si, si me aparecen seleccionadas, pero solo una de ellas. SI un producto está en 2 categorías, cuando lo editas debería de aparecer seleccionadas todas las categorías en las que esté el producto pero solo está seleccionada una de ellas, y principalmente es la primera categoría.
A ver.. yo hago un select donde listo todos las categorías. Eliges una categoría y se listan los productos de esa categoría, luego desde ahí puedo editar ese producto, que tengo un botón de editar que me lleva al formulario lleno pero con la categoría 1 seleccionada.. no sé si me explico..
Funciona bien a medias, porque tengo el produto2 que esta solo en la categoría 2 por ejemplo y aparece seleccionada esa categoría.. pero el producto que esta en las 2 categorías no aparecen las 2 categorías seleccionadas sino la primera..
Madre mía que royo te he metido hijo! ¿Me has entendido?
EL borrado, a ver lo que hago es una función con variables.. que igual no entiendes mucho, pero te lo pongo y te explico (no porque no sepas, sino porque no sabes de donde salen los valores, ¿vale?)
function eliminar_registroproducto_bd2 ($tipo, $id) {//la variable $tipo me recoge el valor de la tabla que yo ponga en el archivo donde listo los productos, sabes?
// Elimina un registro determinado (devuelve E en caso de error o no encontrado)
    // Inicializacion de variables
        // Variables globales
            global $tabla_productos;
            global $tabla_productos_categorias;
            global $productos_upload;
            $productos_upload = "../" . $productos_upload;
    $rs = mysql_query("select * from $tabla_productosWHERE producto_id = '$id'");
    $cant = mysql_num_rows($rs);
    if ($cant == 0) return "E";
    else {
        $imagen = $productos_upload . mysql_result($rs,0,"imagen1");
        //$imagentb = $productos_upload . mysql_result($rs,0,"imagen1tb");
        if ((file_exists($imagen)) && (mysql_result($rs,0,"imagen1")) != "") unlink ($imagen);
        //if ((file_exists($imagentb)) && (mysql_result($rs,0,"imagen1tb")) != "") unlink ($imagentb);
        // Eliminar registro de la base de datos    
        $query2=mysql_query("DELETE FROM $tabla_productos_categorias WHERE producto_id='$id'") or die(mysql_error());    
        $query1=mysql_query("DELETE FROM $tabla_productos WHERE producto_id='$id'") or die(mysql_error());
        return "";
    }
}
Ahí lo tienes majo
Bea
Oye Javi...
Ahora que estoy pensando quizás lo de que se elimine el producto de todas las categorías en las que se encuentre, ¿es hasta normal no?
Quiero decir, el Wordpress lo hace así. Lo que pasa que lista todos los productos y todas las categorías, no hace una selección. Y cuando eliminas un producto, lo borras de todas las categorías. Quiero decir, que tan malo no es... ¿no?
Si veo que no puedo sacarlo lo dejo así, total es un mal menor, puedo funcionar bien, puesto que si quiero que un producto solo aparezca en una categoría con editarlo y seleccionar la categoría en la que quiero que este ya me vale...
Bueno, ¿esto era solamente pensamiento míos eh?
Bea
¿Esto era solamente pensamiento míos eh?" Jajaja te estás empezando a desquiciar ¿eh? Claro que es normal, es que tu le estás diciendo:
$query1=mysql_query("DELETE FROM $tabla_productos WHERE producto_id='$id'") or die(mysql_error());
Entonces estás borrando los productos directamente.
Si quisieras simplemente borrar un producto de una categoría, sería
$query=mysql_query("
DELETE FROM $tabla_productos_categorias
WHERE producto_id='$id'" and categoria_id = X) or die(mysql_error());
Entonces el producto ya no estaría relacionado con esa categoría.
Je je! Pues si amigo mio.. un poco si que me estoy desquiciando..
La verdad es que ahora que me lo dices tu digo: ahhhhhhhhhhh!
Como narices no pienso en esas cosas.. ya te he dicho que a veces no me da..
Vale, ¿pues ese asunto arreglado y lo de las categorías? ¿Por qué no se seleccionan todas las categorías en las que está el producto? ¿No será porque me coge la id de la categoría en la que está en ese momento el producto y por eso solo selecciona esa no? No, no puede ser.. porque con la función que tu me has dicho recorre todas las categorías en las que se encuentra el producto.. ¿pero entonces eso quiere decir que no funciona del todo bien no?
Creo que otra vez me estoy desquiciando.. madre...
Bea
Hola de nuevo eJavi!
¿Qué tal? Aquí está la petarda de turno de nuevo..
Es que estaba haciendo lo del eliminado del producto y al parecer no sé por qué no me chuta bien.
Yo en la función de eliminar, lo tengo puestoasi:
$query1=mysql_query("DELETE FROM $tabla_productos WHERE producto_id='$id'") or die(mysql_error());
Pero realmente en el archivo que lista los productos por categorías donde tengo el botón de eliminar tengo este código:
$columna3 = "<a href='$url_this?categoria=$categoria&eliminar=$id'><img border='0' src='images/bt_borrar.gif' alt='Eliminar'></a>";
Tengo especificado que me coja la categoría en la que estoy en esos momentos pero no me hace caso, elimina todos los productos cuya id sea la que estoy borrando..
Por otro lado, no puedo poner lo que tu me pusiste porque me sale error de clave foránea:
Cannot delete or update a parent row: a foreign key constraint fails...
¿Por qué.. porque no hacemos referencia a la tabla de categorías? ¿Joder qué tiquismiquis son estas tablas de las narices no?
Saludos,
Bea
Hola Javi!
¿Qué tal? Como veo que no me respondes ( y lo entiendo..)je, je!
Te voy a finalizar la consulta porque creo que ya he abusado mucho de ti.
Mil gracias por toda tu paciencia y apoyo y que sepas que eres el mejor!
Abrazos
Beatriz

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas