Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales | RSS
Desde 0 | HTML | CSS | ASP | PHP | AJAX | Javascript | Diseño web | Promoción web | Ganar dinero
Directorio | Manuales | Scripts | FAQs | Programas | Artículos Copyleft | Actualidad | La Cosecha | Colabora
Registrarse | Vuestras páginas | Foros del web | Lista de correo | Boletín de novedades
Generador METAs | Compras | Busca cursos
Alojamiento | Dominios.es | Micropagos SMS | Buscadores | Patentes, marcas | Creación web | Multimedia | Videos
Desarrollo Freelance | Buscar proyectos | Buscar profesionales | Solicitar desarrollo

Edición con PHP de varios registros de la base de datos de una sola vez


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.


02/3/06 - 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.

 Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 1 categoria relacionada
+ 1 comentario (Añadir)
+ 13 comentarios no revisados

 Autoría, licencia y acciones sobre este artículo

Informe de Miguel Angel Alvarez*
Director de DesarrolloWeb.com

Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

* Para consultas técnicas utilizar la lista de correo.

Versión imprimible Versión imprimible del artículo
Enviar artículo por e-mail Enviar artículo por e-mail
Añadir un comentario al artículo Publicar un comentario del artículo

Manuales relacionados con este artículo
Dentro de Taller de PHP

Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en Scripts en PHP


 Comentarios de los visitantes
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
Se muestra un comentario revisado

 Comentario de Piero Recchia
07/3/06 
El articulo esta bueno pero creo que tiene un detalle. En el bucle for deberia inicializar la variable $i con $id_mostrar ya que si lo haces con uno cuando se envie el grupo del 11 al 20 la condicion if (isset($_POST["id" . $i])) nunca va a ser cierta. Corrigeme se me equivoco.

RESPUESTA

No es necesario, el código está probado. Tenemos en el formulario una serie de input que tienen nombre desde id1 hasta id10, independientemente del value de esos input, que si corresponde con el identificador del registro que se está mostrando. Con lo cual, a la hora de recoger los valores, en el for, hay que recogerlos por su nombre desde id1 hasta id10.

Esto se ve más claro si echas un vistazo al código fuente del formulario generado por PHP.

<form action='edicion_a_la_vez.php' method=post>
<table align=center>
<tr><td><b>Nombre</b></td><td><b>Teléfono</b></td></tr>
<input type=hidden name='id1' value='13'><tr><td>Gerardo</td><td><input type=text name='telefono1' value='miamiguete'></td></tr>
<input type=hidden name='id2' value='3'><tr><td>Miguel Angel</td><td><input type=text name='telefono2' value='78787878787878'></td></tr>
<input type=hidden name='id3' value='14'><tr><td>Lopez</td><td><input type=text name='telefono3' value='7887854545'></td></tr>
<input type=hidden name='id4' value='6'><tr><td>Lo que sea</td><td><input type=text name='telefono4' value='qwqwq'></td></tr>
<input type=hidden name='id5' value='8'><tr><td>Ana</td><td><input type=text name='telefono5' value='227777851q5q55'></td></tr>
<input type=hidden name='id6' value='9'><tr><td>Pedro</td><td><input type=text name='telefono6' value='9832000000000000'></td></tr>
<input type=hidden name='id7' value='11'><tr><td>ping</td><td><input type=text name='telefono7' value='0033441100001144'></td></tr>
<tr><td colspan=2 align=center><input type='submit' value='Editar todos'></td></tr>
</table>
</form>


Añadir un comentario al artículo Añadir un comentario del artículo
 Comentarios sin revisar
Entre los comentarios no revisados puede haber algunos interesantes que se hayan enviado recientemente.
 Se han encontrado 13 comentarios sin revisar

Ver el comentario no revisadoVer los comentarios no revisados
Añadir un comentario al artículo Añadir un comentario del artículo



Enlaces:
Maestrosdelweb
  Ir arriba

Manuales relacionados
+Taller de PHP
Categorías
+Scripts en PHP

Lectura recomendada

Compra este libro en Agapea, la librería urgente a domicilio.

Tienda DesarrolloWeb

DesarrolloWeb.com | Copyright | Anunciese | Acerca de | Datos legales | Contacta | Por GuiarteMultimedia