Un problema común, es el de vincular listas... o tablas, grids, etc...
Los ejemplos mas básicos, son... el Explorador de archivos, y reporte de Base de datos, veamos....
Explorador de Archivos explorer.php Código PHP:
<?php
//primero, debemos saber que carpeta explorar... la definimos
define('EX_PATH', dirname(__FILE__)); // sin la barra final
// en los ejemplos usamos la ruta misma del script...
// pero puede ser cualquiera
?>
explorer.php Código PHP:
<?php
$path = EX_PATH;
if ( ! empty($_GET['dir']))
{
// sub carpeta a listar??
$path .= "/$_GET[dir]";
}
// la carpeta deberia ser "privada" de modo que solo funcione
// hasta donde nosotros queramos...
if ( ! is_dir($path))
{
die("No existe: $path");
}
// después, hacemos un iterador de archivos... algo muy conocido
$tmp = opendir($path);
// enlace "arriba"
$top = dirname(str_replace(EX_PATH, '', $path));
if ($top !== '/' && $top !== '.')
{
// eliminamos la carpeta privada del enlace...
$top = str_replace('\\', '/', trim($top, '/\\')); // DOS/*nix [fix]
echo '[<a href="', $_SERVER['PHP_SELF'], ! empty($top)? "?dir=$top": '', '">arriba</a>]';
}
// usamos una tabla y formulario, obvio!
?>
<form method="post"><table>
<thead>
<tr><th></th><th>nombre</th><th>tamaño</th><th>modificado</th></tr>
</thead>
<tfoot>
<td colspan="99"><input type="submit" value="Eliminar seleccionados"/>
</tfoot>
<?php
while (($old = readdir($tmp)) !== false)
{
// evitamos .. y .
if ($old !== '..' && $old !== '.')
{
// generamos el link por archivo/carpeta...
$file = "$path/$old";
$new = str_replace(EX_PATH, '', $file);
$new = str_replace('\\', '/', trim($new, '/\\')); // DOS/*nix [fix]
// eliminamos la carpeta privada del enlace...
?>
<tr>
<td><input type="checkbox" name="borrar[]" value="<?php echo $new; ?>"/></td>
<td><?php
// si es una carpeta lo mejor es crear un enlace, para
// continuar navegando sobre nuestra aplicacion...
if (is_dir($file))
{
echo '<a href="?dir=', $new, '">', $old, '</a>';
}
else
{
echo $old;
}
?></td>
<td><?php echo is_file($file)? ceil(filesize($file) / 1024) . ' KB': '-'; ?></td>
<td><?php echo is_file($file)? date('d-m-Y H:i:s', filemtime($file)): '-'; ?></td>
</tr>
<?php
// vinculamos la accion de eliminar en un checkbox
// de este modo, es mas precisa nuestra "accion"
// (ademas de transparente)
//
// en cualquier otra acción, simplemente... podemos
// utilizar un enlace comun y corriente....
}
}
?>
</table></form>
Reporte de BD report.php Código PHP:
<?php
// este reporte todos lo conocen, simplifiquemos...
while (($row = mysql_fetch_assoc($result)) !== false)
{
?>
<tr>
<td><input type="checkbox" name="borrar[]" value="<?php echo $row['id']; ?>" /></td>
<td><?php echo $row['titulo']; ?></td>
<td><a href="?accion=editar&id=<?php echo $row['id']; ?>">editar</a></td>
</tr>
<?php
}
?>
Y así es, las acciones basadas en enlaces (GET) son simples de realizar con
if-then-else o switch/case como con cualquier otra variable, etc, etc...
(
un ejemplo de acción por enlace fue... el mismo de cambiar carpeta con ?dir=)
Ahora, para la acción POST, en este caso del
checkbox (borrar) necesitamos hacer esto...
explorer.php Código PHP:
<?php
// explorador de archivos
if ( ! empty($_POST['borrar']))
{
// iteramos el "paquete"
foreach ($_POST['borrar'] as $old)
{
$file = str_replace('\\', '/', EX_PATH . "/$old"); // DOS/*nix [fix]
if (is_file($file))
{
var_dump($file); // borramos!!
// cambiar por unlink()
}
elseif (is_dir($file)) {
// recordemos que no se pueden eliminar carpetas
// que contengan archivos, para esto primero
// debemos eliminar todo su contenido
// y despues, eliminar...
//
// esto no esta implementado en el ejemplo, pero
// es muy sencillo de desarrollar para uds.
}
}
}
?>
report.php Código PHP:
<?php
// reporte de base de datos
if ( ! empty($_POST['borrar']))
{
// en este ejemplo, vamos a usar el operador IN de SQL
// ya que es mucho mas rapido que iterar por cada elemento...
$ids = join(',', $_POST['borrar']); // 1,15,4,66,9,...,N
$sql = "DELETE FROM tabla WHERE id IN($ids)";
mysql_query($sql) or die(mysql_error());
}
?>
Y eso es todo, tal ves un ejemplo mas completo puede hacer falta.... pero de verdad, que trate de simplificar la lógica (mas del explorador) de vincular cualquier dato...
Ya que esto no solo se aplica a Reportes, o Archivos.... de hecho, es un concepto básico en general de programación Web....
Pueden haber muchas acciones, varias a la ves, etc... todo depende de la creatividad de uno!
(
espero haberme explicado correctamente)
suerte!