Comunidad de diseño web y desarrollo en internet online

Problemas con chexbox creados dinámicamente al enviarlos por POST

Citar            
MensajeEscrito el 17 Feb 2013 08:42 pm
Saludos comunidad. Tengo un problema curioso al trabajar con varios checkbox creados dinámicamente.

Hago una consulta a la bd y por medio de un while genero un listado de usuarios cada uno con su respectivo checkbox. Uso una función check para que, si en la bd aparece activado, ponga el checked="checked" o de lo contrario no ponga nada.

Código PHP :

while($dat = mysql_fetch_array($res)){
  echo $dat['usuario']; 
  echo "<input type='hidden' name='usuario[]' value=' ".$dat['usuario']." '>";
  echo "<input type='checkbox' name='selec[]' value='1'". check($dat['selec']);
}
Hasta aquí bien. Genera la lista y los usuarios que están activados aparecen con su tiquet y los que no, no. El problema me surge al enviar el formulario:

Código PHP :

$usuario = $_POST['usuario'];
$i = -1;
foreach ($usuario as $key => $value){
  $i++;
  $usuario = $_POST['usuario'][$i];
  $selec = $_POST['selec'][$i];

  if (empty($selec)){
    $selec = '0';
  } else {
    $selec = $_POST['selec'][$i];
  }
  
  echo "usuario: ".$usuario.". estado: ".$selec;
}
Lo anterior presenta los siguientes problemas:

1. Arroja un Notice: Undefined offset en ésta línea: $selec = $_POST['selec'][$i];
por lo que me veo obligado a ponerle un @ para evitar el mensaje. Asumo que ocurre debido a que los checkbox vacíos no envían valor alguno. He probado varias formas pero no logro que el checkbox no seleccionado me envíe el valor 0 para no recibir la advertencia.

2. El listado de usuarios lo despliega bien, sin embargo, los checkbox marcados los pone siempre al inicio, independientemente de a quién corresponden. Por ejemplo:

Como es en realidad:
usuario: 1. estado: 0
usuario: 2. estado: 0
usuario: 3. estado: 1
usuario: 4. estado: 0
usuario: 5. estado: 1

Como lo muestra el script anterior:
usuario: 1. estado: 1
usuario: 2. estado: 1
usuario: 3. estado: 0
usuario: 4. estado: 0
usuario: 5. estado: 0

Probé cambiando el checkbox por un input tipo text y ahí funciona a la perfección, es decir, muestra el estado de cada usuario como corresponde a la info de la bd. Es más, el Notice: Undefined offset tampoco aparece. Sin embargo, necesito que sea con un input tipo checkbox.

Espero haber sido claro. Llevo varios días buscando y no logro dar con el problema. Agradeceré cualquier sugerencia. De antemano muchas gracias.

¡Buena Caza!

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 18 Feb 2013 12:24 pm
Los checkbox que no han sido tildados no se envían al servidor. Los checkbox que sí son tildados generan, en tu caso, el array correspondiente pero el índice del array es numérico, consecutivo y basado en 1.

Y ahí está el problema. Asumes que el índice del array con los checkbox se corresponde con el ID del usuario y no es así.

La solución: Ignora el valor del índice del array $_POST['selec'], es nada más que para armar el array. En los value de los chechbox pon el valor del ID del usuario. De esta forma en el array $_POST['selec'] tendrás los IDs de los usuarios que sí tienen tilde, el resto puedes asumir que no lo tiene.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 18 Feb 2013 04:13 pm
Gracias DriverOp. Me hago una idea del cómo hacerlo. Lo probaré más tarde y luego comento cómo me fue.

:wink:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.