Guardar valor 0 de un checkbox no seleccionado

Necesito que al deseleccionar un checkbox me guarde en la base de datos que el id de ese checkbox se guarde valor 0.Tengo un UPDATE para guardar los registros seleccionados con checkbox con valor 1, pero no me guarda su valor cuando lo deselecciono.
<td align="center" class="<?echo $styleaux;?>"><input type="checkbox" <?=$marcada;?> name="tipo[]" value='<?=$id;?>'>
<input type="hidden" <?=$marcada;?> name="tipoh[]" value="<?=$id;?>"/></td>
<? } } ?>
Y este es el UPDATE a la base de datos:
if(isset($_POST['tipo'])) {
foreach ($_POST['tipo'] as $id) {
$sql1=mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='1' WHERE id='$id'");
}} else {
//aqui es donde estoy intentando hacer que si se deselecciona un checkbox que
// ya estaba seleccionado me cambie el valor a cero pero no me sale
foreach ($_POST['tipoh'] as $id) { $sql2=mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='0' WHERE id='$id' ");}
}

1 respuesta

Respuesta
1
¿Cómo estás?, bueno mira es imposible enviar por POST el valor de un checkbox no seleccionado, lo que se suele hacer son algunos artilugios, uno de los cuales puede ser por Javascript, donde vayas guardando en algún campo hidden los estados de cada uno y eso luego lo envías, pero me parece que depender de javascripts no es lo más seguro ya que se puede deshabilitar sin problemas desde el browser, por lo que mi sugerencia va por otro lado.
Lo que te propongo es que actualices todos los campos que fuesen seleccionados a 1 y todos los demás a 0, para eso usas la cláusula IN y NOT IN de sql, te envío un ejemplo para que lo corras, yo usé un array a modo de ejemplo de carga de datos, reemplázalo por la consulta a tu tabla:
checkbox_envia.php:
<?php
$ofertas = array(3 => 'Motorola', 5 => 'Nokia', 8 => 'Samsung', 10 => 'HTC', 11 => 'ZTE', 14 => 'Blackberry');
echo '<form name="envia" action="checkbox_recibe.php" method="POST">';
foreach ($ofertas as $codigo => $descripcion) {
echo '<input type="checkbox" name="ofertas[]" value="' . $codigo . '">' . $descripcion . "<br>\n";
}
echo '<input type="submit" name="enviar" value="Guardar">';
echo '</form>';
?>
checkbox_recibe.php
<?php
if ($_POST['ofertas']) {
$in_clause = '(';
foreach ($_POST['ofertas'] as $codigo) {
$in_clause .= $codigo . ', ';
}
//quito la última coma que queda demás y cierro paréntesis
$in_clause = substr_replace($in_clause, ')', -2);
echo "UPDATE filmbd_ofertas_pruebas SET oferta_tipo='1' WHERE id IN ". $in_clause;
echo "<br>";
echo "UPDATE filmbd_ofertas_pruebas SET oferta_tipo='0' WHERE id NOT IN ". $in_clause;
}
?>
De esta manera corres sólo dos sql, el que pone a 1 los marcados y el que coloca todos los demás a 0, y no un UPDATE por cada registro como intentabas hacerlo.
Hola majetón!
Muchas gracias en contestar!
A ver, he entendido bastante bien lo queme quieres exponer pero hay un punto en el que me pierdo. Donde me dices que reemplace el array por mi consulta a la tabla, ¿te refieres a que dentro de ese array meta el "SELECT * FROM ..."?
Esto no me queda claro, ¿es eso lo que me quieres decir?
Aclarame este punto y lo pruebo y te digo a ver que tal me ha ido.
De nuevo millones de gracias, eres un solete!
Hola de nuevo,
Bueno he estado haciendo pruebas y me sale a medias, como lo del array no sé muy bien donde ponerlo, he dejado el código de esta manera:
...(etc)
<?
}
else {
// Actualizar base de datos
if ($_POST['tipo']) {
$in_clause = '(';
foreach ($_POST['tipo'] as $id) {
$in_clause .= $id . ', ';
}
//quito la última coma que queda demás y cierro paréntesis
$in_clause = substr_replace($in_clause, ')', -2);
mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='1' WHERE id IN ". $in_clause);
mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='0' WHERE id NOT IN ". $in_clause);
}
?>
<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 oferta ha sido modificada.</b><br>
<br></P>
<P></P>
<P align="right">
<a href="ofertas2.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="modificar" type="hidden" value="go" />
<tr>
<td width="10%" align="center" class="tabla_w_idb"><strong>DESTACAR OFERTA</strong></td>
<td width="25%" align="center" class="tabla_w_idb"><span class="txt_verde_mini"><b>TITULO</b></span></td>
<td width="17%" align="center" class="tabla_w_idb"><b>FECHA</b></td>
<td width="16%" align="center" class="tabla_w_idb"><b>VISUALIZAR</b></td>
<td width="16%" align="center" class="tabla_w_idb"><b>MODIFICAR</b></td>
<td width="16%" align="center" class="tabla_w_idb"><b>ELIMINAR</b></td>
</tr>
<?
// Cargar Datos
$rs=mysql_query("SELECT * FROM filmbd_ofertas_pruebas WHERE oferta_especial='0' ORDER BY datetime DESC") or die(mysql_error());
$quant = mysql_num_rows($rs);
// Listar Datos
if ($quant <= 0) {
?>
<tr>
<td colspan="5" class="tabla_w_idb">No hay noticias para listar.</td>
</tr>
<?
}
else {
$styleaux = "tabla_w_itb";
$i=-1;
while (($i+1)< $quant) {
$i++;
$id = mysql_result($rs,$i,"id");
$titulo_oferta = mysql_result($rs,$i,"titulo_oferta");
$destacada = mysql_result($rs,$i,"oferta_tipo");
$columna2 = mysql_result($rs,$i,"datetime");
$columna3 = "<a href='ofertas_ver.php?id=$id'><img border='0' src='images/ico_lupa.gif' alt='Visualizar'></a>";
$columna4 = "<a href='ofertas_editar.php?id=$id'><img border='0' src='images/bt_editar.gif' alt='Editar'></a>";
$columna5 = "<a href='$url_this?eliminar=$id'><img border='0' src='images/bt_borrar.gif' alt='Eliminar'></a>";
if ($destacada == '1') {
$marcada="checked";
}
else{
$marcada="";
}
// Cambiar estilo de la fila
if ($styleaux == "tabla_g_itb") $styleaux = "tabla_w_itb";
else $styleaux = "tabla_g_itb";
?>
<tr>
<td align="center" class="<?echo $styleaux;?>">
<? $tipo=array($id);
foreach ($tipo as $id ) { ?>
<input type="checkbox" <?=$marcada;?> name="tipo[]" value='<?=$id;?>'>
<? } ?></td>
<td align="left" class="<?echo $styleaux;?>"><?=$titulo_oferta;?></td>
<td align="center" class="<?echo $styleaux;?>"><?=$columna2;?></td>
<td align="center" class="<?echo $styleaux;?>"><?=$columna3;?></td>
<td align="center" class="<?echo $styleaux;?>"><?=$columna4;?></td>
<td width="16%" align="center" class="<?echo $styleaux;?>"><?=$columna5;?></td>
</tr>
<? } } ?>
<tr>
<td class="tabla_boton" colspan="6"> <input type="image" value="Enviar" name="B1" src="images/bt_enviar.gif" align="right" /> </td>
</tr>
</form>
</table>
<!-- fin de Form -->
<? } ?>
Ya sé que no es como me dijiste pero por no sabes la ilusión que me hace que por lo menos me sale, a medias pero me sale.
Me recoge bien los checkbox que corresponden a las id´s de las ofertas seleccionadas y me las guarda en la base de datos, incluso también al deseleccionar una o varias me las deselecciona, queda valor a 0, lo curioso es que si solo queda una seleccionada no puedo desmarcarla y que queden todas desmarcadas, siempre me queda una.
Sé que lo que me falta es lo del array por eso te pongo el código para que por favor, si eres tan amable indicarme donde ponerlo, es lo que me tiene un poco loca.
Pero tío! Me puedo dar con un canto en los dientes, ya has hecho que consiga mucho más!
Espero tus noticias, y de nuevo millones de gracias.
Hola Experto!
Necesito que me contestes a la pregunta anterior, no me funciona lo que me propones y ya se me agotan las ideas.
¿Puedes ayudarme por favor?, me urge bastante!
Muchas gracias y por favor contesta.
A ver si entendí bien, te anda todo perfecto, ¿sólo qué cuando dejas sólo una seleccionada no funciona? ¿Y qué pasa cuando dejas todas desmarcadas?
Hola de nuevo!
Y gracias por contestar.
No el problema es cuando dejo todas sin desmarcar que siempre me queda una. Es decir, si tengo 3 marcadas y elimino las 3 no me desmarca ninguna de las 3 al igual que si solo tengo una marcada y quiero desmarcarla tampoco me la desmarca. Pero si tengo 3 y desmarco 2 si que me desmarca esas 2. no sé si me explico bien, es como si no pudiera dejar ninguna desmarcada.
¿Qué solución le ves?
Gracias de nuevo
Ah! Ya entendí, el problema es simple, al no seleccionar ningún elemento o sea dejar todos deseleccionados, el $_POST['tipo'] no existe y no entra por el if, lo que podrías hacer es agregar un campo del tipo hidden y preguntar tanto por $_POST['tipo'] y por ese campo por ej supone que se el campo hidden le llames "enviado":
if ($_POST['tipo'] && $_POST['enviado']) {
//Entra cuando al menos hay un seleccionado
$in_clause = '(';
foreach ($_POST['tipo'] as $id) {
$in_clause .= $id . ', ';
}
//quito la última coma que queda demás y cierro paréntesis
$in_clause = substr_replace($in_clause, ')', -2);
mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='1' WHERE id IN ". $in_clause);
mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='0' WHERE id NOT IN ". $in_clause);
} else (!$_POST['tipo'] && $_POST['enviado']) {
//Entra cuando deseleccion todos en ese caso todos los registros los pones a 0
mysql_query("UPDATE filmbd_ofertas_pruebas SET oferta_tipo='0' ")
}
Muchas gracias!
Ya funciona todo correctamente. Lo único que en tu último ejemplo te faltaba una cosita:
...
En vez de esto
else (!$_POST['tipo'] && $_POST['enviado']) {
era esto:
elseif (!$_POST['tipo'] && $_POST['enviado']) {
Y ha ido todo estupendo!
De nuevo millones de gracias! Eres fantástico!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas