AJAX, PHP, MySQL - Actualización de registros

En esta oportunidad vamos a desarrollar un aplicación haciendo uso de AJAX para actualizar registros (UPDATE SET [...]) . Usaremos la tabla empleados, que hemos venido usando en los artículos anteriores.

Objetivo

Lo que deseamos lograr es: En la página principal se muestre una lista de todos lo empleados registrados y que al hacer clic en el Nro Identificador de éste se active un formulario para realizar los cambios necesarios de sus datos, al hacer clic en el boton Actualizar, el formulario desaparecerá y el registro se actualizará. La aplicación que desarrollaremos no será muy elaborada, pero cumplirá con nuestro objetivo descrito.

Desarrollo

Entonces empecemos primero dando una explicación general del desarrollo, de acuerdo al objetivo:

  • Realizaremos un script en PHP que conectará con la BD y realizará una consulta de todos los empleados. Pero además se nos pide que al hacer clic en ID del empleado se active un formulario y se muestren los datos del empleado seleccionado. Para capturar el ID crearemos una función en JavaScript, y para mostrar los datos del empleado seleccionado en un formulario crearemos un script en PHP.
  • El formulario contendrá un boton Actualizar que realizará la accción de guardar los cambios del empleado. Para el envio de los datos haremos uso de una función en JavaScript y para realizar la actualización de los datos, un script en PHP con la sentencia UPDATE.
  • Y por supuesto todo lo antes descrito haciendo uso del objeto XMLHttpRequest.

Funciones en JavaScript

ajax.js » Contiene 3 funciones. 1) Crea el objeto XMLHttpRequest dependiendo del navegador, 2) Enviará los datos del empleado para que se guardados y 3) Realiza una consulta del empleado mediante su ID.

function objetoAjax(){
var xmlhttp=false;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function enviarDatosEmpleado(){
//donde se mostrará lo resultados
divResultado = document.getElementById('resultado');
divFormulario = document.getElementById('formulario');
//valores de los inputs
id=document.frmempleado.idempleado.value;
nom=document.frmempleado.nombres.value;
dep=document.frmempleado.departamento.value;
suel=document.frmempleado.sueldo.value;

//instanciamos el objetoAjax
ajax=objetoAjax();
//usando del medoto POST
//archivo que realizará la operacion
//actualizacion.php
ajax.open("POST", "actualizacion.php",true);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
//mostrar los nuevos registros en esta capa
divResultado.innerHTML = ajax.responseText
//mostrar un mensaje de actualizacion correcta
divFormulario.innerHTML = "<p style="border:1px solid red; width:400px;">La actualizaci&oacute;n se realiz&oacute; correctamente</p>";
}
}
//muy importante este encabezado ya que hacemos uso de un formulario
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//enviando los valores
ajax.send("idempleado="+id+"&nombres="+nom+"&departamento="+dep+"&sueldo="+suel)
}
function pedirDatos(idempleado){
//donde se mostrará el formulario con los datos
divFormulario = document.getElementById('formulario');

//instanciamos el objetoAjax
ajax=objetoAjax();
//uso del medotod GET
ajax.open("GET", "consulta_por_id.php?idemp="+idempleado);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
//mostrar resultados en esta capa
divFormulario.innerHTML = ajax.responseText
//mostrar el formulario
divFormulario.style.display="block";
}
}
//como hacemos uso del metodo GET
//colocamos null
ajax.send(null)
}

Scripts en PHP: Consultas y Actualización de registros

consulta.php » Se conecta con la base de datos, realiza la consulta de todos los empleados y los muestra en una tabla. Hay que notar que en los items de la columna Código se agregar en el evento onclick la función pedirDatos().

<?php
//Configuracion de la conexion a base de datos
$bd_host = "localhost";
$bd_usuario = "root";
$bd_password = "";
$bd_base = "ribosomatic";
$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
//consulta todos los empleados
$sql=mysql_query("SELECT * FROM empleados",$con);
//muestra los datos consultados
//haremos uso de tabla para tabular los resultados
?>
<table>
<tr>
<td>Codigo</td>
<td>Nombres</td>
<td>Departamento</td>
<td>Sueldo</td>
</tr>
<?php
while($row = mysql_fetch_array($sql)){
echo " <tr>";
//mediante el evento onclick llamaremos a la funcion PedirDatos(), la cual tiene como parametro
//de entrada el ID del empleado
echo " <td><a style="text-decoration:underline;cursor:pointer;" onclick="pedirDatos('".$row['idempleado']."')">".$row['idempleado']."</a></td>";
echo " <td>".$row['nombres']."</td>";
echo " <td>".$row['departamento']."</td>";
echo " <td>".$row['sueldo']."</td>";
echo " </tr>";
}
?>
</table>

consulta_por_id.php » Este script realiza la consulta del empleado por su ID y el resultado los muestra en un formulario, listo para ser modificado. Note que en la etiqueta de inicio de <form>, hacemos uso del evento onsubmit para llamar a la función enviarDatosEmpleado().

<?php
//Configuracion de la conexion a base de datos
$bd_host = "localhost";
$bd_usuario = "root";
$bd_password = "";
$bd_base = "ribosomatic";
$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
//consulta los datos del empleado por su id
$idemp=$_GET['idemp'];
$sql=mysql_query("SELECT * FROM empleados WHERE idempleado=$idemp",$con);
$row = mysql_fetch_array($sql);
//valores de las consultas
$nom=$row['nombres'];
$dep=$row['departamento'];
$suel=$row['sueldo'];
//muestra los datos consultados en los campos del formulario
?>
<form name="frmempleado" action=""
onsubmit="enviarDatosEmpleado(); return false">
<input name="idempleado" type="hidden" value="<?php echo $idemp; ?>" />
<p>Nombres
<input name="nombres" type="text" value="<?php echo $nom; ?>" />
</p>
<p>Departamento
<select name="departamento">
<?php
echo "<option value="".$dep."">".$dep."</option>"
?>
<option value="Informatica">Informatica</option>
<option value="Contabilidad">Contabilidad</option>
<option value="Administracion">Administracion</option>
<option value="Logistica">Logistica</option>
</select>
</p>
<p>Sueldo <strong>S/.</strong>
<input name="sueldo" type="text" value="<?php echo $suel; ?>" />
</p>
<p>
<input type="submit" name="Submit" value="Actualizar" />
</p>
</form>

actualizacion.php » Este script realiza un UPDATE del registro que vamos a modificar, y luego llama al script consulta.php que mostrará todos los registros, incluido pues el recientemente modificado.

<?php
//Configuracion de la conexion a base de datos
$bd_host = "localhost";
$bd_usuario = "root";
$bd_password = "";
$bd_base = "ribosomatic";
$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
//variables POST
$idemp=$_POST['idempleado'];
$nom=$_POST['nombres'];
$dep=$_POST['departamento'];
$suel=$_POST['sueldo'];
//actualiza los datos del empleados
$sql="UPDATE empleados SET nombres='$nom', departamento='$dep', sueldo='$suel' WHERE idempleado=$idemp";
mysql_query($sql,$con);
include('consulta.php');
?>

Página principal

empleados_actualizacion.php » Esta es la pagina principal. Llamamos al archivo JavaScript, también hacemos un include del archivo consulta.php.

<html>
<head>
<title>Registro con AJAX</title>
<script language="JavaScript" type="text/javascript" src="ajax.js"></script>
</head>
<body>
<h2>Modificar datos del empleado</h2>
<p>Clic en el c&oacute;digo del empleado para modificar sus datos. </p>
<div id="formulario">
</div>
<div id="resultado"><?php include('consulta.php');?></div>
</body>
</html>

Como mencione antes, la aplicación desarrollada es bien sencilla y he tratado de ser lo mas explicativo posible, pero si no estuviera claro pueden comentarlo. El archivo en .zip puedes descargarlo y probarlo. Puede ver la puesta en marcha de esta aplicación en la nueva sección Ejemplos.

Actualización [18.11.06]

La aplicación no funcionaba perfectamente en Internet Explorer , me di cuenta de ello gracias a los comentarios, así que probe la solución de Erick Blanco, la de usar el metodo POST en lugar de GET, para enviar el id del empleado en la función pedirDatos del archivo ajax.js, como también en el archivo consulta_por_id.php para recibir ese dato. 

La función pedirDatos, del archivo ajax.js queda así:

function pedirDatos(idempleado){
    //donde se mostrará el formulario con los datos
    divFormulario = document.getElementById('formulario');
   
    //instanciamos el objetoAjax
    ajax=objetoAjax();
   
    ajax.open("POST", "consulta_por_id.php");
    ajax.onreadystatechange=function() {
        if (ajax.readyState==4) {
            //mostrar resultados en esta capa
            divFormulario.innerHTML = ajax.responseText
            //mostrar el formulario
            divFormulario.style.display="block";
        }
    }
   
    ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    //enviando los valores
    ajax.send("idemp="+idempleado)
}

Ahora en el archivo consulta_por_id.php, reemplazamos está linea:

$idemp=$_GET['idemp'];

por esta otra:

$idemp=$_POST['idemp'];

Como verán hacemos uso del metodo POST en lugar de GET. En lo personal, uso el método POST para envio de valores por formulario y GET para envio por URL. Pero vale la pena probar con los dos métodos. Si no funciona uno, funcionará el otro. Mil disculpas por la tardía solución. El archivo del ejemplo está corregido.

Descargar ejemplo: Actualización de datos en AJAX

Comentarios

  1. avatar Erik Blanco Bates 2009-05-05 22:16:58 65 hola Zarina Fuentes pos yo no utilize ninguna pero puedes usar la de sajax que es buena pero puedes usar jquery con Mooltools incorporando ajax separado
  2. avatar Zarina Fuentes 2009-05-05 08:10:07 64 Lo que me gustaria saber es que libreria utilizas para ajax, ya que he visto muchas. Por ahí me dijeron que prototype esta pasada de moda. La verdad es que quiero aprender a incorporar ajax en php, pero aun no decido que libreria puedo utilizar.
  3. avatar Erik Blanco 2009-04-15 13:52:17 63 hola froilan lozada imprime tu variable echo $row["idempleado"]; para ver que tienes si contiene algun id y fijarte que el idempleado debe estar definido en la consulta del select ok Saludos
  4. avatar froilan lozada 2009-04-12 07:53:53 62 Hola, soy de venezuela, baje el archivo que dice actualizado y y lo aplique a una base de datos que tengo solo agregue nuevo campos a los archivo el consulta.php me mmuesta mis datos, sin embargo cuando me coloco el el id de mis datos no sucede nada, no veo como consulta.php llama al ajax.js para usar la función pedirDatos. Me pueden ayudar
  5. avatar Danny 2009-03-09 10:46:10 61 Excelente explicacion, muchas gracias x compartir ese conocimiento!!!
  6. avatar Angel 2008-12-28 18:31:50 60 Gracias Amigo, Excelente los codigos. Era justo lo que requeria. Soy nuevo en esto de la programación pero es excelente.

    Si puede echarme la manito en lo siguiente:

    Tengo un select, necesito capturar el valor en una variable php, para luego hacer una consulta en una base de datos, ¿como la captura en la misma página?
  7. avatar OSCAR 2008-12-10 14:25:18 59 NOC' xQ' NO FUNCIONA YA MIRE TODO NOC' EN Q' PARTE ESTE EL ERROR LO ESTUVE MODIFICANDO PARA ADAPTARLO A MI PAGINA PERO NO SIRVE
    LOS CAMPOS LOS CAMBIE X LOS DE LA BASE D' DATOS MIA PERO NO SIRVE.

    EL CARGA LOS DATOS PARA EMPEZAR A MODIFICARLOS CUANDO LE DOY ACTUALIZAR DICE' Q' SI LO ACTUALIZO CUANDO ENREALIDAD NO HISO NADA, NOC' Q' MAS HACER

    GRACIAS POR CUALQUIER AYUDA
  8. avatar Rocio 2008-09-04 17:11:33 58 Hola, oye esta super bien la opción que nos das pero yo tengo un problema no me esta actualizando la tabla aunque me dice que si se realizo el cambio ojala me pudieras ayudar con esto te lo agradezco mucho.
  9. avatar Jimmy Cesar Yataco tasayco 2008-06-20 08:42:32 57 Hola soy de Perú los codigos estan muy buenos espero que nos puedan seguir apoyando como lo viene hacienod gracias
  10. avatar Frederic 2008-03-23 01:09:55 56 Hola, en mi caso tanto me funciona usando GET como POST en ambos navegadores, pero yo necesito otra aplicación que consiste en rellenar una select a partir de una base de datos, tengo dos selects, uno con provincias y otro con municipios. El objetivo consiste en rellenar la select de municipios dependiendo del valor selecionado en provincias. El codigo me funciona a la perfeccion en Firefox, pero en iExplorer no me carga la select. Sería correcto en el script php devolver: echo "<option value=\"$id\">".htmlentities($name)."</option>";
    Muchas gracias!

Dejar un comentario