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 Comentarios formato RSS

  1. avatar javi 2010-08-20 05:03:43 87 a mi no me funciona cuando llama a la funcion pedirDatos, no me mete nada en la capa formulario
  2. avatar Carlos 2010-08-11 11:44:59 86 Hola gracias por esta ayuda pero tras mirar el codigo mil veces no encuentro como haces para capturar el id haciendo clic, no veo ningun evento onclick.. ¿Podeis aclararlo? Gracias
  3. avatar Sol 2010-06-01 20:14:47 85 Hola Amigos.
    El codigo anterior esta genial me ha funcionado muy bien pero tengo una gran duda como hago esto mismo pero enviando las filas de una tabla que se llena con un while. Ayudenme por favor lo he intentado de mil manera y no me funciona. estoy desesperada.

    Gracias
  4. avatar Alejandro 2010-05-31 15:32:26 84 Esto me parece bien, solo tengo una consulta. como puedo modificar la consulta de empleados de tal forma que me muestre en pantalla los nuevos registros que se han incluido, o sea, que sin tener que repetir la consulta, me muestre si hay registros nuevos en la tabla de empleados.
    Lo he intentado con un refresh a la pagina cada 15 segundos, pero es molesto, pues la pantalla tiene un leve parpadeo. He leido que Ajax es ideal para esto.

    Saludos
  5. avatar jose aviña 2010-05-03 12:05:19 83 Gracias por la ayuda.
  6. avatar Frajaloto 2010-04-28 13:01:32 82 Para el amigo eduardo el problema se resuelve cambiando las " por ' quedando de esta manera

    echo "<td><a style='text-decoration:underline;cursor:pointer;' onclick='pedirDatos(".$row['idempleado'].")'>".$row['idempleado']."</a></td>";
  7. avatar Luis 2010-04-27 12:46:52 81 Si lo siento de netrada no habia entendido bien el ejemplo, ya lo entendi, gracias por el ejemplo.
  8. avatar Luis 2010-04-27 12:21:03 80 Hola muchachos de Ribosomatic, antes que nada gracias por los aportes que le dan a la sociedad.

    Resulta que probé este ejemplo y me funcionan bien los archivos excepto el "consulta_por_id.php", el cual me manda un error en la consulta.

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ....

    Entonces he estado buscando, pero no es ningún problema de usuario, password o privilegios de usuario, ya que el otro ejemplo funciona perfecto.

    y en la linea que marca el error es esta:

    $row = mysql_fetch_array($sql);

    entonces no se que este mal, me podrían echar una mano?

    Gracias y saludos.
  9. avatar María 2010-04-18 12:36:56 79 Hola!
    Estoy aprendiendo PHP y me parece fabulsa la programacionde php con ajax, solo que me surgio un pequeño inconveniente, talves sea pura vanidad, pero quiero iluminar el renglon del empleado a modificar. Ya lo intente pero solo se ilumina en la plantilla o e el frame de la consulta.php (con ayuda de una funcion) No se como hacerle para que los renglones e vean iuminados en la platilla principal (empleados_actualizacion.php)
    Si alguien puede ayudarme se los agradecere.
    Atte: María
  10. avatar Luchardi 2010-02-18 11:13:14 78 En IE6 no me funcionaba, asi que reemplace con esta funcion que encontre en alguna página los innerHTML.
    Cada divFormulario.innerHTML = ajax.responseText lo reemplace por divFormulario.innerHTML = ajax.responseText
    Creo que no funciona cuando viene codigo html en el ajax.responseText (por lo menos a mi me fallaba en esos casos y funcionaba en el resto).

    La funcion que encontre es la siguiente:
    function replace_html(el, html) {
    if( el ) {
    var oldEl = (typeof el === "string" ? document.getElementById(el) : el);
    var newEl = document.createElement(oldEl.nodeName);

    // Preserve any properties we care about (id and class in this example)
    newEl.id = oldEl.id;
    newEl.className = oldEl.className;

    //set the new HTML and insert back into the DOM
    newEl.innerHTML = html;
    if(oldEl.parentNode)
    oldEl.parentNode.replaceChild(newEl, oldEl);
    else
    oldEl.innerHTML = html;

    //return a reference to the new element in case we need it
    return newEl;
    }
    };

    La agregue al final del ajax.js.
    Saludos

Dejar un comentario