Dudas con una Seleccion de checkbox. PHP y Mysql

Hola a todos,

mi intencion es tener una lista de noticias con los campos Selección, Título, Fecha y Accion. Pues bien en el "GNoticias-action.php" me gustaría que se comprobase que han sido seleccionadas(mediante checkbox's) entre 2 y 4, y cambiar el estado en la BD de esas 2-4 Noticias ponerlo a 1(1=activo).
Esta tarea que a priori pensaba sencilla, ahora no sé como hacerlo, pues el campo del checkbox al que he llamado "selección", es igual para todas las noticias, entonces no podría saber cuales poner el estado a 1 y cuales no, igual que tampoco sabría como comprobar que no he marcado mas de 2 y menos de 4.

si alguien lo pudiese revisar se lo agradecería muchísimo, ya que no funciona. Y como pongo al final en //comentario me gustaria tambien que las noticias NO seleccionadas se pusiesen a estado 0

Alguien tiene idea de como solucionarlo?

Muchísimas gracias!.

GNoticias.php: Archivo con el formulario para seleccionar las noticias.
<?php include_once('../General/cabecera.php');?>

 <section id="principal">
        <div id="Admin_Noticias">
      <h1>Gestión de Noticias</h1>     
      <p>En esta página podrás gestionar las noticias, modificando o eliminando las existentes. Además seleccionaremos entre 2-4 Noticias para que estén visible para los usuarios de nuestro sistema.</p>
      <p>Pulse <a href="admin_GNoticias_nueva.php">aquí</a> para insertar una nueva noticia en el sistema.</p>
 
<!-- Estado 1= Visible, Estado 0= Oculta--> 
 <form name="noticias" method="post" action="admin_GNoticias-action.php"  target="a">         
 <table class="table" width="500" border="1" align="left" cellpadding="5" cellspacing="0">
    <tr>
        <th class="td" width="100">Selección</th>
        <th class="td" width="200">Título</th>
        <th class="td" width="100" >Fecha</th>
        <th class="td" width="100">Accion</th>
    </tr>
<?php 
 $res= mysql_query("SELECT * FROM noticias ORDER BY fecha_reg");
 
 if(mysql_num_rows($res)>0){
            while($r=mysql_fetch_assoc($res))
            {   
                $seleccionado=mysql_query("SELECT estado FROM noticias WHERE id_noticia= '".$r['id_noticia']."'");// La noticia aparece seleccionada si lo estaba.
                    ?>        
                <tr>
                    <td><input <?php if($seleccionado==1){?> checked <?php }?> type="checkbox" value="1" id="seleccion"/></td>
                       <td><?php echo $r['titulo'];?></td>
                    <td><?php echo date("d/m/Y", strtotime($r['FECHA']));?></td>
                    <td><!-- Imagenes con enlace para eliminar, y modificar noticias-->  </td>
                </tr>
<?php          }?>
                <tr>        
                    <td style="text-align:left" colspan="7"> <input type="submit" name="submit"  value="Guardar" /></td>
               </tr>
<?php         }else{ ?>
                <tr>        
                    <td colspan="7"> <?php echo "Inserte su primera noticia.. " ?> </td>
               </tr>
    <?php    } ?>
</table>
</form>            
     
        </div>   
            
      </section>
<?php include_once('../General/footer.php');?> 

GNoticias-action.php: action del archivo Gnoticias.php que modifica la BD
<?php
        if(isset($_POST['submit']))
        {    
            $res= mysql_query("SELECT * FROM noticias");
            $contador=0; 

             if(mysql_num_rows($res)>0){
            while(mysql_fetch_assoc($res))  
            {    
                if($_POST['seleccion']==1)
                        $contador= $contador+1;      //Contabilizamos que hay entre 2 y 4 noticias seleccionadas

            }
                if($contador>=2 and $contador<=4){
                    
                    if(mysql_num_rows($res)>0){
                        while($r=mysql_fetch_assoc($res))
                        {    
                            if($_POST['seleccion']==1){
                                $sql =mysql_query("UPDATE noticias SET estado=1 WHERE id_noticia='".$r['id_noticia']."'");
                                die("<script>alert('Noticias seleccionadas con éxito.'); parent.location.href='admin_GNoticias.php'</script>");
                                exit;    
                            }
                        }
                    }
                }else
                    echo("<script>alert('Debe seleccionar entre 2 y 4 noticias.');parent.location.href='admin_GNoticias.php'</script>"); 
            }
        
        //Me guistaria poner el resto de noticias con estado=0 como lo hago?    
    }
?> 
Bueno he pensado que llevar la cuenta de mas de 2 y menos de 4 seleccionadas mediante checkbox es innecesario...

Pero es muy importante el tema de que las noticias seleccionadas mediante checkbox se cambie el campo seleccion a 1 y las no seleccionadas se cambien a 0. Si no sabes la respuesta a lo que busco, se te ocurre alguna otra alternativa?

La cuestión es que las noticias que seleccione con el checkbox serán las visibles para los usuarios de la web. 1=mostrar, 0 = oculta, pero claro si se te ocurre alguna otra posibilidad para llevarlo a cabo... sería genial!

Gracias y saludos foreros!!
Hola:

No entendí mucho lo que quieres, pero lo que entendí es que necesitas asociar el ID de la noticia con que se muestre o no. Se pueden pasar Arrays hacia los scripts PHP, así podrías hacerlo.

Lee esto y ve si te sirve (mientras intento entender el código XD).

Saludos.
Te explico de nuevo.
Tengo un formulario con una lista de 5 noticias, cuyo primer campo es un checkbox. Si el checkbox esta seleccionado=Noticia visible(estado=1), sino lo está=Noticia oculta(estado=0).
Pues bien mi duda va encaminada hacia el action de este formulario, ya que, tras pulsar en el submit del formulario, el action me gustaria que actualizase el campo estado, poniendolo a 1 si estaba el checkbox seleccionado, o poniendolo a 0 si no lo estaba.

He estado mirando el enlace que me has puesto sobre el array. Y creo que me viene muy bien para lo que quiero. Y he actualizado mi codigo intentando que en MyArray[]Se guarde el valor 1 o 0, que posteriormente al hacer la consultamysql para actualizar el estado de la noticia lo coja de ahi directamente. Lo que no estoy seguro es si guardo correctamente en MyArray[] con value=0 y value=1 dentro de la etiqueta <input>, según el caso.
Tampoco estoy seguro si en el action realizo bien el recorrido de MyArray.En definitiva este codigo ahora mismo no funciona. Pero espero que me puedas ayudar... GRACIASSSSSS

noticias.php
 <form name="noticias" method="post" action="Noticias-action.php"  target="a">         
 <table class="table" width="800" border="1" align="left" cellpadding="5" cellspacing="0">
    <tr>
        <th class="td" width="70">Selección</th>
    	<th class="td" width="550">Título</th>
        <th class="td" width="70" >Fecha</th>
        <th class="td" width="110">Accion</th>
    </tr>
<?php 
 $res= mysql_query("SELECT * FROM noticias ORDER BY id_noticia");
 
 if(mysql_num_rows($res)>0){
			while($r=mysql_fetch_assoc($res))
			{   
				$seleccionado=mysql_query("SELECT * FROM noticias WHERE id_noticia= '".$r['id_noticia']."'"); // La noticia aparece seleccionada si estado =1.
				$selec = mysql_fetch_assoc($seleccionado);		
            	<tr>
    				<input <?php if($selec['estado']==1){?> checked value="1"<?php }else {?>value="0" <?php }?> name="MiArray[]" type="checkbox" id="seleccion"/></td>
   					<td><?php echo $r['titulo'];?></td>
					<td style="text-align:center"><?php echo date("d/m/Y", strtotime($r['fecha_reg']));?></td>
                                        <td style="text-align:center">
                    	                        <a href="GNoticias_modificar.php?id_noticia=<?php echo $r['id_noticia'];?>"><img src="../Imagenes/Lapiz-20.png"  alt="Modificar Noticia"></a> 
						<a href="GNoticias-action.php?id_noticia=<?php echo $r['id_noticia'];?>"><img src="../Imagenes/Cancelar-20.png"  alt="Eliminar Noticia"></a> 
                         	<input type="hidden" value="<?php echo $r['id_noticia'];?>" id="id_noticia">
                    </td>
				</tr>
<?php 		 }?>
				<tr>		
            		<td style="text-align:left" colspan="7"> <input type="submit" name="submit"  value="Guardar" /></td>
               </tr>
<?php 		}
</table>
</form> 

noticias-action.php
	<?php
include_once('../General/config1.php');
include_once('../General/funciones.php');
		
		if(isset($_POST['submit']))
		{	
			if (isset($_POST["MiArray"]) && is_array($_POST["MiArray"]) && count($_POST["MiArray"]) > 0) 
			{ 
			  $res= mysql_query("SELECT * FROM noticias ORDER BY id_noticia");
			  if(mysql_num_rows($res)>0){
					$i=0;
					while($r=mysql_fetch_assoc($res))
					{						
						$sql =mysql_query("UPDATE noticias SET estado='".$_POST["MiArray['".$i."']"]."' WHERE id_noticia='".$r['id_noticia']."'"); 
						$i++;							  
					}
					die("<script>alert('Noticias seleccionadas con éxito.'); parent.location.href='GNoticias.php'</script>");
					exit;
				}
			}
		}
?>
No da ningun erros, simplemente no concuerdan los checkbox seleccionados o checked, con el resultado del campo "estado". Por ejemplo he hecho una prueba con las 5 noticias poniendolas todas marcadas. y solamente la última noticia acaba con estado a 1.

He seguido haciendo pruebas y normalmente se ponen todas a estado =0.

Como te dije tengo dudas de que el error venga al recorrer MiArray[]: $sql =mysql_query("UPDATE noticias SET estado='".$_POST["MiArray['".$i."']"]."' WHERE id_noticia='".$r['id_noticia']."'");

O tb de esta suposicion: <input <?php if($selec['estado']==1){?> checked value="1"<?php }else {?>value="0" <?php }?> name="MiArray[]" type="checkbox" id="seleccion"/>

Ese if sirve para que si el estado en la base de datos PREVIAMENTE es 1 aparezca marcado y por tanto con value=1 y sino, aparezca sin marcar y con value=0.

Bueno releyendo esta ultima suposicion me acabo de dar cuenta de la enorme equivocacion. Ya que, if($selec['estado']==1){?> checked sirve para que aparezca el checkbox marcado o sin marcar previamente. y el value=1 o =0 se supone que es el valor que quiero guardar en MyArray[0]..MyArray[1]..MyArray[2].. Por tanto la suposicion no es valida. ya que a priori puede estar marcado una noticia, y yo querer desmarcarla y darle a guardar y se guardaría con estado =1, cuando finalmente no estaba marcado y deberia guardar estado=0


Pero lo raro es que ni el error viene solamente de ahi. pues cambio en la base de datos todas las noticias a estado=1, y al cargar la pagina aparecen todos los checkbox marcados. le doy a guardar sin hacer ningun cambio y aparecen despues todas desmarcadas.

Sin lógica!!!! Ves algo en el codigo¿?
Haz esto para leer los datos desde la base de datos:

<?php
  $out = '<input type="checkbox"';
  
  if( $selec['estado'] == 1 )
    $out .= ' checked="checked" value="1"';
  else
    $out .= ' value="0"';

  $out .= ' name="MiArray[]" id="seleccion" />';
  echo $out;
?>

Esto lo debes poner dentro del bucle para recorrer los resultados. En cuanto a guardar los datos, lo revisé (más de una vez XD) y esta bien.
Lo acabo de probar, y tiene exactamente el mismo funcionamiento que con el código anterior. Como te dije en el último comentario, aunque lo expliqué bastante mal.... la siguiente suposicion está mal:

 <?php
  $out = '<input type="checkbox"';
  
  if( $selec['estado'] == 1 )                 //Con este if comprobamos PREVIAMENTE si el checkbox debe salir marcado
    $out .= ' checked="checked" value="1"';    //y con esto indicamos que debe salir marcado, y k a POSTERIORI, lo que se guardará en MyArray[] será 1!! y esto no es correcto.... pues a PRIORI, salió checked  
  else         //porque asi estaba en la BD, pero yo lo he podido desmarcar el checkbox, y darle a guardar, ahi entonces estaremos guardando value=1, cuando debí haber guardado value=0. No se si me he explicado mejor..
    $out .= ' value="0"';

  $out .= ' name="MiArray[]" id="seleccion" />';
  echo $out;
?> 

Pero lo raro es que el error NO viene solamente de ahi. Pues cambio en la base de datos todas las noticias a estado=1, y al cargar la pagina aparecen todos los checkbox marcados(A PRIORI $selec['estado'] == 1), le doy a guardar sin hacer ningun cambio( $out .= ' checked="checked" value="1"';) y al mirar la base de datos las veo todas las noticias con estado=0.

Si a la hora de guardar los datos todo funciona correctamente, no sé de donde viene el error ='(
Acabo de hacer una nueva prueba que siempre sea value=1:

if( $selec['estado'] == 1 )
	$out .= ' checked="checked"';
$out .= ' value="1" name="MiArray[]" id="seleccion" />';
echo $out;

Pues bien tras señalarlas todas, en la BD todas tienen estado=0. bufffffffffffffff
¿Cómo funciona tu base de datos? O sea, que estructura tiene la tabla para ser más específico. Ejemplo:

noticia_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
titulo VARCHAR(400) NOT NULL,
cuerpo TEXT NOT NULL...
TABLE `noticias` (
`id_noticia` int(10) NOT NULL AUTO_INCREMENT,
`titulo` varchar(100) NOT NULL,
`url` varchar(255) NOT NULL,
`fecha_reg` datetime NOT NULL,
`estado` tinyint(3) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_noticia`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
Jajajaj, aún sigo pensando que esta bien XD. Si todos los valores estado vuelven a 0 es porque estas asignando 0 cuando el valor no se especifique: `estado` tinyint(3) NOT NULL DEFAULT '0'; esto significa que el valor no se esta asignando :P en tu script.

No sé como ayudarte sin ver el código completo y funcionando. Lo que podría hacer es conectarme contigo a través de Teamviewer. Este programa me permitiría ver tu computador y controlarlo, así podría ver el sitio en funcionamiento y encontrar los problemas :P.

Después de encontrar la solución (si es que la encontramos XD) la puedes poner aquí, por si alguien más tiene el mismo problema.

Saludos.