> Manuales > Taller de PHP

A veces nos facilita las cosas que se puedan editar a la vez varios registros de una base de datos. Vemos como recibir con un bucle todos los registros a editar y hacer el update.

En el manual básico de PHP ya se explicó como realizar una edición de los datos de una tabla de base de datos . En el ejemplo visto en ese artículo se podía seleccionar un registro, para editar sus datos. Pero imaginemos que necesitamos editar decenas o cientos de registros, entonces puede ser demasiado laborioso tener que editar los registros de uno en uno. En esos casos, tal vez nos interese hacer algo para que se puedan editar varios registros a la vez.

Lo que vamos a hacer es un sistema de edición que permita actualizar varios registros de la base de datos en una única acción, es decir, construir un formulario que muestre varios registros para editar, con un único botón de submit para enviar el formulario completo. La dificultad estriba en recibir del formulario todos los registros a editar y realizar el update para cada uno de ellos.

Tenemos una tabla de la base de datos con números de teléfono y nombres de contacto.
En este caso, para simplificar, vamos a editar los registros de 10 en 10. Tendremos que mostrar un formulario con los 10 primeros teléfonos y un enlace para ver los 10 siguientes, siempre que queden registros por mostrar en la base de datos.

Podemos ver el ejemplo en marcha para hacernos una idea exacta de nuestros objetivos.

En el script vamos a tener dos partes: una en la que se muestra el formulario y otra en la que se hacen los distintos update a partir de los datos recogidos. Toda la lógica la vamos a concentrar en una única página, donde, si no se reciben datos de formulario, se muestra el formulario. Si se han recibido datos de un formulario, entonces se deben actualizar los registros.

Mostrar el formulario

Lo primero que debemos de hacer es saber a partir de qué registro se debe mostrar el formulario. Porque podemos desear mostrar los primeros 10 valores o un conjunto de registros posterior.

if (isset($_GET["id_mostrar"]))
   $id_mostrar = $_GET["id_mostrar"];
else
   $id_mostrar = 0;


Con estas líneas vemos si recibimos por GET un identificador a partir del que mostrar los registros. Si no se recibe nada, se entiende que se desea recibir los registros desde el principio (id=0).

Para mostrar el formulario tenemos que recibir de la base de datos los registros a mostrar. Para ello se realiza una consulta de selección, limitando a 10 el número de registros a recibir.

$ssql="select * from manual_php where id>$id_mostrar limit 10";
$result=mysql_query($ssql);


Ahora, haremos un formulario para editar los teléfonos. Para cada registro, se mostrará una línea con el teléfono y el nombre de la persona. Cada línea tendrá unos campos de formulario, para el identificador del registro y para el número de teléfono. El campo donde se guarda el identificador lo haremos con un hidden y el teléfono con un campo de texto. Para nombrar los campos de formulario utilizaremos un numero, para que no sean siempre los mismos, porque si se llaman todos los campos igual, a la hora de recibirlos podemos tener problemas. El código que queremos generar tendrá una forma como esta:

<input type=hidden name='id1' value='1'>
Daniel
<input type=text name='telefono1' value='0147852'>

<input type=hidden name='id2' value='2'>
Claudio
<input type=text name='telefono2' value='9876654'>

...

<input type=hidden name='id10' value='88'>
María
<input type=text name='telefono10' value='000000'>


Vemos que el primer identificador tiene nombre "id1", el Segundo "id2" y así sucesivamente. Los números de teléfono también tienen campos con nombres distintos: "telefono1", "telefono2"... No vamos a dar opción a editar los nombres de contacto en este formulario, para simplificar las cosas.

Para generar el código del formulario utilizaremos un script PHP como el siguiente:

echo "<form action='edicion_a_la_vez.php' method=post>";
echo "\n<table align=center>";
echo "\n<tr><td><b>Nombre</b></td><td><b>Teléfono</b></td></tr>";

$i = 1;
while ($fila=mysql_fetch_array($result)){
   echo "\n<input type=hidden name='id$i' value='" . $fila["id"] . "'>";
   echo "<tr>";
   echo "<td>" . $fila["nombre"] . "</td>";
   echo "<td><input type=text name='telefono$i' value='" . $fila["telefono"] . "'></td>";
   echo "</tr>";
   $i++;
$ultimo_mostrado = $fila["id"];
}

echo "\n<tr><td colspan=2 align=center><input type='submit' value='Editar todos'></td></tr>";
echo "\n</table>";
echo "\n</form>";

Por último, mostraremos un enlace para ver los siguientes registros, si es que se han mostrado registros en esta página. Utilizamos la variable $ultimo_mostrado, para saber a partir de qué registro continuar.

if (isset($ultimo_mostrado))
   echo "\n<br><a href='edicion_a_la_vez.php?id_mostrar=" . $ultimo_mostrado . "'>Ver los 10 siguientes</a>";


Recibir los datos y hacer los UPDATE

Ahora vamos a mostrar la manera de recibir los datos del formulario y generar los update. Como tenemos hasta 10 registros por recibir, realizaremos un bucle FOR desde 1 hasta 10, con lo cual se podrán recibir todos los valores, concatenando el nombre del campo con el contador del for, desde 1 hasta 10.

Puede que en algunos casos no nos llegue el formulario con los 10 registros, porque haya menos para editar en el formulario, así que realizamos primero una comprobación para ver si están declaradas las variables que deberían llegar por POST. Por ejemplo, si está declarada la variable $_POST["id1"], quiere decir que estamos recibiendo datos también en $_POST["telefono1"].

for ($i=1;$i<=10;$i++){
   //para cada uno de los elementos que puede haber en el formulario
   if (isset($_POST["id" . $i])){
      //es que este registro estaba en el formulario
      $id = $_POST["id" . $i];
      $telefono = $_POST["telefono" . $i];
      $ssql = "update manual_php set telefono='$telefono' where id=$id";
      if (mysql_query($ssql))
         echo "<br>Teléfono actualizado con éxito";
      else
         echo "<br>Teléfono NO actualizado";
   }
}


En definitiva, se hace un bucle de 1 a 10 para recibir los datos que haya, si es que nos han llegado del formulario. Para cada registro que hemos detectado que nos llega por el formulario, se genera y ejecuta el update correspondiente, con lo que se irán actualizando los valores de la tabla.

El código completo

Mostramos el código completo de este ejemplo, para verlo de una manera global y asegurarnos que todo el mundo lo copia perfectamente:

<HTML>
<HEAD>
<TITLE>edicion_a_la_vez.php</TITLE>
</HEAD>
<BODY>
<h1 align="center">Edición de varios registros a la vez</h1>
<br>
<br>
<?
//Conexion con la base
require ($raiz . "../../../../librerias/principales.php");
$conn = mysql_conexion();

if (!$_POST){
   //si no recibo datos de POST, muestro el formulario

   //es posible que recibamos un id a partir del que hay que mostrar los datos
   if (isset($_GET["id_mostrar"]))
      $id_mostrar = $_GET["id_mostrar"];
   else
      $id_mostrar = 0;

   //extraemos de la base de datos los registros a mostrar
   //Ejecutamos la sentencia SQL, limitando la búsqueda a 10 registros
   $ssql="select * from manual_php where id>$id_mostrar limit 10";
   $result=mysql_query($ssql);

   echo "<form action='edicion_a_la_vez.php' method=post>";
   echo "\n<table align=center>";
   echo "\n<tr><td><b>Nombre</b></td><td><b>Teléfono</b></td></tr>";

   $i = 1;
   while ($fila=mysql_fetch_array($result)){
      echo "\n<input type=hidden name='id$i' value='" . $fila["id"] . "'>";
      echo "<tr>";
      echo "<td>" . $fila["nombre"] . "</td>";
      echo "<td><input type=text name='telefono$i' value='" . $fila["telefono"] . "'></td>";
      echo "</tr>";
      $i++;
      $ultimo_mostrado = $fila["id"];
   }

   echo "\n<tr><td colspan=2 align=center><input type='submit' value='Editar todos'></td></tr>";
   echo "\n</table>";
   echo "\n</form>";

   //si se han mostrado registros, pongo el enlace para ver los siguientes
   if (isset($ultimo_mostrado))
      echo "\n<br><a href='edicion_a_la_vez.php?id_mostrar=" . $ultimo_mostrado . "'>Ver los 10 siguientes</a>";
   }else{

   //es que he recibido datos de formulario, entonces tengo que recibirlos y actualizar la base de datos
   for ($i=1;$i<=10;$i++){
      //para cada uno de los elementos que puede haber en el formulario
      if (isset($_POST["id" . $i])){
         //es que este registro estaba en el formulario
         $id = $_POST["id" . $i];
         $telefono = $_POST["telefono" . $i];
         $ssql = "update manual_php set telefono='$telefono' where id=$id";
         if (mysql_query($ssql))
            echo "<br>Teléfono actualizado con éxito";
         else
            echo "<br>Teléfono NO actualizado";
      }
   }
      echo "\n<p><a href=edicion_a_la_vez.php>Volver</a>";
   }
?>
</BODY>
</HTML>

Para finalizar, podemos ver el ejemplo en marcha en una página aparte.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual