Foros del Web » Programando para Internet » PHP »

Guardar un array de checkbox

Estas en el tema de Guardar un array de checkbox en el foro de PHP en Foros del Web. Tengo un formulario en PHP con un array de checkbox y necesito guardar tanto los que están marcados como los que no lo están. Código ...
  #1 (permalink)  
Antiguo 25/08/2006, 11:22
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Antigüedad: 17 años, 7 meses
Puntos: 1
Guardar un array de checkbox

Tengo un formulario en PHP con un array de checkbox y necesito guardar tanto los que están marcados como los que no lo están.

Código PHP:
<input type=checkbox name='opcion[]'>
<
input type=checkbox name='opcion[]'>
<
input type=checkbox name='opcion[]'
Alguién sabe como hacerlo??
  #2 (permalink)  
Antiguo 25/08/2006, 11:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Debes definir "values" a tus checkbox ..

Código PHP:
<input type=checkbox name='opcion[]' value="opcion1"
<
input type=checkbox name='opcion[]' value="opcion2"
<
input type=checkbox name='opcion[]' value="opcion3"
Tu navegador sólo enviará los datos que se seleccionaron .. es decir los valores de los checkbox que se seleccionaron en un array.

Ese array lo puedes recorrer con un bucle foreach() simple:

Código PHP:
foreach($_POST['opcion'] as $opcion){
   echo 
$opcion."<br>";

Si tu quieres saber los que seleccionastes y los que no seleccionastes, previamente PHP "debe" saber el total de "opciones" que como "universo" puede tener ese "array".

Es decir .. tus "opciones" (checkbox) deberías generarlos con PHP .. tal vez de datos que vengan de un array o de una Consulta SQL a a una BBDD (o a "mano" pero replicando sus valores en un array en PHP mínimo).

Por ejemplo:

Código PHP:
$opciones=array('opcion1','opcion2','opcion3');

foreach (
$opciones as $valor){
  echo 
"<input type=\"checkbox\" name=\"opcion[]\" value=\"".$valor."\">\n";

En tu script de proceso .. tendrás el array $opciones (con el total de elementos y valores que puedas tener) y en $_POST['opcion'] tendrás otro array .. pero con los elementos que -sólo se seleccionaron-

Ahora es cosa de que recorras con un bucle foreach() por ejemplo el array que contiene todas las opciones y compares con el que sólo tiene las seleccionasdas para poder decir "esta se seleccionó y la otra no ..".

Código PHP:
foreach ($opciones as $opcion){
      if (
in_array($opcion,$_POST['opcion'])){
         echo 
$_POST['opcion']." --> SI<br>";
      } else {
         echo 
$_POST['opcion']." --> NO<br>";           
      }

PD: asumo un formulario con method=POST para los ejemplos ...
PD2: No he probado la última parte (verificación de los seleccionados o no ...).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 25/08/2006, 12:45
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Antigüedad: 17 años, 7 meses
Puntos: 1
Si exacto, mediante un formulario con method=POST.

En el ejemplo que me has puesto...

Código PHP:
$opciones=array('opcion1','opcion2','opcion3'); 

foreach (
$opciones as $valor){ 
  echo 
"<input type=\"checkbox\" name=\"opcion[]\" value=\"".$valor."\">\n"

Estoy de acuerdo que en $_POST['opcion'] únicamente me guardará los elementos que se han seleccionado y por esto necesito obtener un array $opciones.

Ahora bien, el problema lo tengo en el array $opciones, porque no se como rellenarlo. Te comento mi caso:

Tengo una lista desplegable con un máximo de 7 opciones. Entonces dependiendo de las opciones, creo el formulario con tantos checkboxs como opciones elegidas. Estoy intentando guardar en un array supongamos $opciones, los valores del array checkbox pero únicamente me coge el valor del primer checkbox y me repite su valor tantas veces como opciones elegidas.

Una vez pueda conseguir los valores de todos los checkboxs en el array $opciones seguiría con lo que me has indicado.

Saludos.
  #4 (permalink)  
Antiguo 25/08/2006, 12:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Expón el código que usas .. tal vez ahí se vea claro tu fallo.

pero según comentas .. en el bucle que crea tus N elementos de formulario con un bucle (supongo que un for()?) .. ahí es donde debes crear tu array .. el detalle estará ya que tu array no es fija (como para meterla en un config.php por ejemplo y llamarla en los dos scripts de proceso o en el que uses ya definida y fija) .. tendrás que propagar ese array (con los N elementos que se formaron) al script de proceso de los checkboxs, esto lo puedes hacer por el URL también (en un campo hidden del formulario y serializado) o bien en una variable de sesión por ejemplo.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 25/08/2006, 16:53
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Antigüedad: 17 años, 7 meses
Puntos: 1
Si he probado de crear un <input type=text hidden> y poner aquí el valor del checkbox, incluso también he probado usando una variable $_SESSION, pero el problema es el mismo ya que no lleno bien el array $opciones.

Te expongo el código:

Código PHP:
<?php

$numSesiones 
$_POST['numSesiones'];   //obtengo las sesiones deseadas
for ($i=0$i<=$numSesiones-1;$i++){
    
printf("<table>
    <tr><td><input type='checkbox' name='opcion[]' value='true' checked /></td>
    </tr></table>"
);
    
$opciones[$i]=$opcion;   //el array valores de cada checkbox
}

foreach(
$opciones as $clave=>$valor){  //muestro el contenido de opciones
    
print"La matriz es:".$valor."<br>";
}        
?>
Me muestra siempre el contenido del primer array del checkbox. Y aquí es donde me encallado.

Saludos.
  #6 (permalink)  
Antiguo 25/08/2006, 18:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
En el "value" de tus checkbox es donde debes poner tu valor que al seleccionar es lo que implicarà esa selecciòn .. no un "true" .. eso ya lo sabes si pasa a PHP al ser seleccionada.

Tampoco puedes con un bucle for() ir generando N inputs de ese estilo con la opción "checked" .. fijate en el còdigo HTML que generas ..

Tampoco debes componer en HTML una "tabla" por lìnea que armas .. debe ser sòlo una "fila" en HTML.

Y no uses "printf()" .. eso es complicarte la vida, meter el "motor" de expresiones regulares para una tarèa que es muhco màs simple y natural con un "echo" y concatenando.

Código PHP:
<?
$numSesiones 
$_POST['numSesiones'];   //obtengo las sesiones deseadas 

echo "<table><tr>";
for (
$i=0$i<=$numSesiones-1;$i++){ 
    echo 
"<td><input type=\"checkbox\" name=\"opcion[]\" value=\"".$opciones[$i]."\"  /></td>\n";
}
echo 
"</tr></table>";
?>

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 26/08/2006, 16:29
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Antigüedad: 17 años, 7 meses
Puntos: 1
Muchas gracias por la gran ayuda. Por fín me ha salido.
Expongo el código que he usado:

Código PHP:
<?php
session_name
('opciones');    //defino la session como “opciones”
session_start();             //inicio la session que me servirá para guardar 
                             //el array $opciones

$numSesiones $_POST['numSesiones'];  //obtengo las sesiones deseadas
$oper $_POST['oper'];                //obtengo el caso para el switch

if (isset($_POST['oper'])) $oper $_POST['oper'];
    
switch(
$oper)
{

case 
"alta":        //en el caso de alta dibujo el formulario

for ($i=0$i<=$numSesiones-1;$i++){    
    
$opciones[$i]=$i;        //pongo el valor de la posición en cada checkbox
    
echo"<table><tr>    
     <td><input type=\"checkbox\" name=\"opcion[]\" value=\""
.$opciones[$i]."\" /></td>
     </tr></table>"
;            
}
$_SESSION['opciones']=$opciones;  //asigno la variable SESSION con el array
                                  //$opciones obtenido

break;



case 
"guardar":    //caso guardar donde recupero tanto los checkboxs que están
                   //marcados como los que no lo están

$i=0;            //inicializo a 0
//compruebo que la sesion exista y que no estén vacíos los arrays de sesion y opcion
if (isset($_SESSION['opciones']) && (!empty($_SESSION['opciones'])) && (!empty($opcion))){
    foreach (
$_SESSION['opciones'] as $opcion){
        if (
in_array($opcion,$_POST['opcion']))
            
$_POST['opcion2'][$i]="SI";
        else
            
$_POST['opcion2'][$i]="NO";
        
$i++;
    }
}else{  
//significa que no hay marcado ningún checkbox con lo que relleno el 
        //array de todos los checkbox conforme no están marcados.
     
for ($j=0$j<=$numSesiones-1;$j++)
        
$_POST['opcion2'][$j]="NO";
}
break;

}  
//fin del switch

//para ver los datos del formulario enviados a través de POST
echo"Datos enviados: <pre>";
print_r($_POST);
echo
"</pre>";        
?>
PD: He tenido que asignar los valores a otro array: $_POST['opcion2'] debido a que con $_POST['opcion'] no lo hacía bien.

PD2: En el caso de no haber ningún checkbox marcado he realizado un for para llenar el contenido del array a “no”.

PD3: Para mostrar el formulario el <table> lo he puesto dentro del for, ya que sino no me dejaba la linea de separacion.

Muchas gracias. Espero le sirva a más de uno.

Saludos.
  #8 (permalink)  
Antiguo 26/08/2006, 20:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Si con tu array "opcion2" estás generando un array para luego recorrerlo y hacer algùn otro proceso .. No corresponde que lo hagas en $_POST (que es el array superglobal que PHP usa para indicar los datos que por ese mètodo te lleguen a tu script.

Usa tus própios arrays:

$opcion2[$i]="SI"; .. o lo que corresponda para darle valor.

Realmente el proceso que hagas lo podrìas (y deberìas) hacerlo en esos bucles que ya procesas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 27/08/2006, 15:49
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Antigüedad: 17 años, 7 meses
Puntos: 1
Tienes toda la razón. Usaré el array:

$opcion2[$i]="SI" en lugar utilizar $_POST['opcion2']=SI";

para realizar el proceso que hago después en estos bucles.

Gracias y un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:15.