Tema: FAQ's de PHP
Ver Mensaje Individual
  #86 (permalink)  
Antiguo 26/10/2003, 02:15
Cluster
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Tema: Formularios

Pregunta: Como gestionar acciones a los registros seleccionados con checbox (estilo web-mails tipo Hotmail).

Respuesta:

La técnica se basa en crear arrays (arreglos, matrices ..) desde el nombre de los checkbox que vamos a usar. De esta forma, agrupamos conjuntos de checkbox relacionados, quedando de esta forma para PHP un array con el nombre que definamos en el tag name= del objeto de formulario <input type="checkbox" ...>

Para ello, se usa como nombre del checbox:
name="nombre_checbox[]"

El [] indica que estamos creando un array de indice automático y que comienza por 0. A cada llamada de ese <input> de checbox se gerará un nuevo indice.

A su vez, en el <input> de checbox, definimos un value= de valor igual al valor que queremos que tome cuando esté seleccionado.

A todo esto, debemos englobarlo todo en un tag de furmulario común, quedando algo así:

formulario.html
Código PHP:
<form action="script.php" method="post">
  
<input type="checkbox" name="seleccion[]" value="1">
  
<input type="checkbox" name="seleccion[]" value="2">
  
<input type="checkbox" name="seleccion[]" value="3">
<
input type="submit" name="Submit" value="Enviar">
</
form
Así, en "script.php" recibiremos un array de nombre variable $seleccion (o mejor por $_POST['seleccion']) .. como array que es lo puedes recorrer con cualquier tipo de bucle (recomendable un foreach()). Ejemplo:

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

Si tubieramos más grúpos de checbox, tan sólo tendríamos que cambiar el nombre del array checbox y recoger en nuestro script.php dichos arrays.

Una utilidad práctica a esta forma de trabajar con checkbox y arrays sería la de realizar un sencillo script donde podamos seleccionar vários registros de una tabla que deseamos realizar una acción sobre ellos; por ejemplo, borrarlos.

formulario.php
Código PHP:
<?
// Realizar la conexión a la BD .. Seleccionar la BD a usar.

// Ejecutar la consulta para obtener los datos de la BD.
$resultado=mysql_query("SELECT * FROM tabla");

// Se inicial el formulario
echo "<form action=\"procesar.php\" method=\"post\"> \n";

// Extraemos y componemos los checbox dinámicos de los datos de nuestra tabla de la BD.
while ($row mysql_fetch_array($resultado)){
  echo 
"<input type=\"checkbox\" name=\"seleccion[]\" value=\"".$row['id']."\">".$row['nombre']."<br>";
}

// Cerramos el formulario y ponemos nuestro botón de Submit.
echo "<input type=\"submit\" name=\"Submit\" value=\"Enviar\">";
echo 
"</form>";
?>
Y un ejemplo de borrado de los registros seleccionados. (recuerda que sólo pasan en el array los checbox seleccionados).

Mysql (para el ejemplo) dispone del comando SQL "IN(lista de valores separados por comas)" para aplicar condicionales tipo ... WHERE IN (1,3,25,53,8). Usamos implode() para conctenar los elementos del array con el separador coma (,)

procesar.php
Código PHP:
<?
// Generamos una lista de los ID's (campo value= ..) que tenemos en nuestro array.
$lista=implode(',',$_POST['seleccion']);

// Y lo aplicamos al SQL correspondiente y ejecutamos la consulta.
mysql_query("DELETE FROM tabla WHERE id IN(".$lista.")");

?>
Para este caso particular no es necesario de un bucle adicional para leer el valor de los checbox seleccionados por qué aplicamos el "implode()" para tal fin.

Si deseamos o tenemos que realizar un proceso intermédio entre la lectura de cada uno de estos valores de forma individual, sólo tenemos que usar el bucle foerach() por ejemplo como se citó en el primer ejemplo.

Un saludo,

PD: 03/11/2003. Código corregido en la generación de $lista (había un par de parentesis de más). Gracias jpinedo por reportar el error.
PD: 18/03/2004. Código corregido en formulario.php (faltó un echo y unas comillas al transcribir la FAQ al mensaje del foro). Gracias Gerald por reportar el error.

Última edición por Cluster; 30/12/2005 a las 13:15