Veremos los algoritmos necesarios para implementar la recuperación e impresión de datos en una tabla HTML (CRUD)
La información se encuentra almacenada en una base de datos de MySQL llamada 'base1'. Crearemos un archivo que recupere la conexión a la base de datos y la retorne:
conexion.php<?php function retornarConexion() { $server="localhost"; $usuario="root"; $clave=""; $base="base1"; $con=mysqli_connect($server,$usuario,$clave,$base) or die("problemas") ; mysqli_set_charset($con,'utf8'); return $con; } ?>
El segundo archivo que interviene en la recuperación de datos del servidor es 'datos.php' y tiene por objetivo retornar un objeto JSON con todos los registros de artículos de la tabla 'articulos':
datos.php<?php header('Content-Type: application/json'); require("conexion.php"); $conexion = retornarConexion(); switch ($_GET['accion']) { case 'listar': $datos = mysqli_query($conexion, "select codigo,descripcion,precio from articulos"); $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC); echo json_encode($resultado); break; case 'agregar': $respuesta = mysqli_query($conexion, "insert into articulos(descripcion,precio) values ('$_POST[descripcion]',$_POST[precio])"); echo json_encode($respuesta); break; case 'borrar': $respuesta = mysqli_query($conexion, "delete from articulos where codigo=$_GET[codigo]"); echo json_encode($respuesta); break; case 'consultar': $datos = mysqli_query($conexion, "select codigo,descripcion,precio from articulos where codigo=$_GET[codigo]"); $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC); echo json_encode($resultado); break; case 'modificar': $respuesta = mysqli_query($conexion, "update articulos set descripcion='$_POST[descripcion]', precio=$_POST[precio] where codigo=$_GET[codigo]"); echo json_encode($respuesta); break; } ?>
Podemos probar si realmente nos retorna en formato JSON escribiendo en el navegador este archivo pasando por el método GET la solicitud de 'listar':
Como podemos comprobar lo primero que indicamos a PHP es que retornará un archivo con formato JSON y no HTML:
header('Content-Type: application/json');
Seguidamente importamos el archivo que contiene la función que se conecta a la base de datos y la llamamos:
require("conexion.php"); $conexion = retornarConexion();
Mediante la sentencia switch verificamos si el parámetro que llega es la cadena 'listar':
switch ($_GET['accion']) { case 'listar': $datos = mysqli_query($conexion, "select codigo,descripcion,precio from articulos"); $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC); echo json_encode($resultado); break;
En caso afirmativo como vemos llamamos a mysqli_query recuperando todas las filas de la tabla artículos y convirtiendo el dato devuelto por la función mysqli_fetch_all a formato JSON mediante la función json_encode.
El dato retornado por la función json_encode lo volcamos mediante el comando echo.
Ahora veamos el archivo 'index.html' donde mostramos todos los registros de la tabla 'articulos':
index.html<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Crud</title> <link href="bootstrap-4.3.1/css/bootstrap.min.css" rel="stylesheet"> <link href="datatables/datatables.min.css" rel="stylesheet"> <script src="js/jquery-3.4.1.js"></script> <script src="js/popper.min.js"></script> <script src="bootstrap-4.3.1/js/bootstrap.min.js"></script> <script src="datatables/datatables.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-12"> <table class="table table-striped table-bordered table-hover" id="tablaarticulos"> <thead> <tr> <td>Código</td> <td>Descripción</td> <td>Precio</td> <td>Modificar</td> <td>Borrar</td> </tr> </thead> </table> <button class="btn btn-sm btn-primary" id="BotonAgregar">Agregar artículo</button> </div> </div> <!-- Formulario (Agregar, Modificar) --> <div class="modal fade" id="FormularioArticulo" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <input type="hidden" id="Codigo"> <div class="form-row"> <div class="form-group col-md-12"> <label>Descripción:</label> <input type="text" id="Descripcion" class="form-control" placeholder=""> </div> </div> <div class="form-row"> <div class="form-group col-md-12"> <label>Precio:</label> <input type="number" id="Precio" class="form-control" placeholder=""> </div> </div> <div class="modal-footer"> <button type="button" id="ConfirmarAgregar" class="btn btn-success">Agregar</button> <button type="button" id="ConfirmarModificar" class="btn btn-success">Modificar</button> <button type="button" class="btn btn-success" data-dismiss="modal">Cancelar</button> </div> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function() { let tabla1 = $("#tablaarticulos").DataTable({ "ajax": { url: "datos.php?accion=listar", dataSrc: "" }, "columns": [{ "data": "codigo" }, { "data": "descripcion" }, { "data": "precio" }, { "data": null, "orderable": false }, { "data": null, "orderable": false } ], "columnDefs": [{ targets: 3, "defaultContent": "<button class='btn btn-sm btn-primary botonmodificar'>Modifica?</button>", data: null }, { targets: 4, "defaultContent": "<button class='btn btn-sm btn-primary botonborrar'>Borra?</button>", data: null }], "language": { "url": "DataTables/spanish.json", }, }); //Eventos de botones de la aplicación $('#BotonAgregar').click(function() { $('#ConfirmarAgregar').show(); $('#ConfirmarModificar').hide(); limpiarFormulario(); $("#FormularioArticulo").modal('show'); }); $('#ConfirmarAgregar').click(function() { $("#FormularioArticulo").modal('hide'); let registro = recuperarDatosFormulario(); agregarRegistro(registro); }); $('#ConfirmarModificar').click(function() { $("#FormularioArticulo").modal('hide'); let registro = recuperarDatosFormulario(); modificarRegistro(registro); }); $('#tablaarticulos tbody').on('click', 'button.botonmodificar', function() { $('#ConfirmarAgregar').hide(); $('#ConfirmarModificar').show(); let registro = tabla1.row($(this).parents('tr')).data(); recuperarRegistro(registro.codigo); }); $('#tablaarticulos tbody').on('click', 'button.botonborrar', function() { if (confirm("¿Realmente quiere borrar el artículo?")) { let registro = tabla1.row($(this).parents('tr')).data(); borrarRegistro(registro.codigo); } }); // funciones que interactuan con el formulario de entrada de datos function limpiarFormulario() { $('#Codigo').val(''); $('#Descripcion').val(''); $('#Precio').val(''); } function recuperarDatosFormulario() { let registro = { codigo: $('#Codigo').val(), descripcion: $('#Descripcion').val(), precio: $('#Precio').val() }; return registro; } // funciones para comunicarse con el servidor via ajax function agregarRegistro(registro) { $.ajax({ type: 'POST', url: 'datos.php?accion=agregar', data: registro, success: function(msg) { tabla1.ajax.reload(); }, error: function() { alert("Hay un problema"); } }); } function borrarRegistro(codigo) { $.ajax({ type: 'GET', url: 'datos.php?accion=borrar&codigo=' + codigo, data: '', success: function(msg) { tabla1.ajax.reload(); }, error: function() { alert("Hay un problema"); } }); } function recuperarRegistro(codigo) { $.ajax({ type: 'GET', url: 'datos.php?accion=consultar&codigo=' + codigo, data: '', success: function(datos) { $('#Codigo').val(datos[0].codigo); $('#Descripcion').val(datos[0].descripcion); $('#Precio').val(datos[0].precio); $("#FormularioArticulo").modal('show'); }, error: function() { alert("Hay un problema"); } }); } function modificarRegistro(registro) { $.ajax({ type: 'POST', url: 'datos.php?accion=modificar&codigo=' + registro.codigo, data: registro, success: function(msg) { tabla1.ajax.reload(); }, error: function() { alert("Hay un problema"); } }); } }); </script> </body> </html>
<link href="datatables/datatables.min.css" rel="stylesheet"> <script src="datatables/datatables.min.js"></script>
Creamos una tabla HTML donde luego en forma dinámica el plug-in DataTables se encargará de agregar todas sus filas que serán recuperadas del servidor:
<table class="table table-striped table-bordered table-hover" id="tablaarticulos"> <thead> <tr> <td>Código</td> <td>Descripción</td> <td>Precio</td> <td>Modificar</td> <td>Borrar</td> </tr> </thead> </table>
Es importante definir la propiedad id="tablaarticulos", ya que la misma será referenciada desde JavaScript.
Creamos ahora un objeto de la clase 'DataTables' y le pasamos un objeto iniciando distintas propiedades que configurarán la tabla:
let tabla1 = $("#tablaarticulos").DataTable({ "ajax": { url: "datos.php?accion=listar", dataSrc: "" }, "columns": [{ "data": "codigo" }, { "data": "descripcion" }, { "data": "precio" }, { "data": null, "orderable": false }, { "data": null, "orderable": false } ], "columnDefs": [{ targets: 3, "defaultContent": "<button class='btn btn-sm btn-primary botonmodificar'>Modifica?</button>", data: null }, { targets: 4, "defaultContent": "<button class='btn btn-sm btn-primary botonborrar'>Borra?</button>", data: null }], "language": { "url": "DataTables/spanish.json", }, });
Si ejecutamos la aplicación veremos una salida similar a esta:
Mediante la propiedad "ajax" se le indica que archivo debe llamar para recuperar en formato JSON los datos a mostrar (es lo que probamos anteriormente solicitando al servidor el archivo "datos.php?accion=listar"):
"ajax": { url: "datos.php?accion=listar", dataSrc: "" },
En la propiedad "columns" indicamos cada uno de los campos a mostrar y si son columnas donde mostraremos botones inicializamos la propiedad "data" con el valor null:
"columns": [{ "data": "codigo" }, { "data": "descripcion" }, { "data": "precio" }, { "data": null, "orderable": false }, { "data": null, "orderable": false } ],
Mediante la propiedad "columnDefs" especificamos las columnas que mostrarán los botones de modificar y borrar:
"columnDefs": [{ targets: 3, "defaultContent": "<button class='btn btn-sm btn-primary botonmodificar'>Modifica?</button>", data: null }, { targets: 4, "defaultContent": "<button class='btn btn-sm btn-primary botonborrar'>Borra?</button>", data: null }],
Por último hemos configurado la propiedad "languaje" para recuperar los textos en castellano que muestra el plug-in DataTables:
"language": { "url": "DataTables/spanish.json", },
Disponemos de una gran cantidad de propiedades que podemos configurar cuando creamos un objeto de la clase DataTables, siempre debemos tener a mano la documentación oficial del plug-in DataTables.