En este tutorial voy a compartir un fragmento de código que nos ayudará a la hora de realizar ciertas operaciones básicas en una base de datos MySQL, como lo es: crear, leer, actualizar y eliminar datos (CRUD por sus acrónimos en ingles).
La idea de este ejemplo es proporcionar la idea de manera básica a programadores principiantes, y que puedan tomarlo como una base para trabajar en sus proyectos web.
Características del tutorial:
- Insertar registros en la base de datos MySQL.
- Leer los registros de la base de datos y listarlos.
- Actualizar los registros.
- Eliminar los registros.
Tecnologías utilizadas:
- HTML
- PHP con MySQL
- jQuery
- Bootstrap
- CSS
- AJAX
CRUD de productos con PHP – MySQL – jQuery AJAX
Comencemos por crear nuestra aplicación web de demostración para aprender las operaciones CRUD, lo primero que vamos a ver es crear una base de datos y tablas requeridas. (si tienes tu base de datos lista en mysql, sigue adelante y crea la tabla usando el siguiente código sql). Estoy asumiendo que tienes una base de datos creada y lista para usar.
Crear la base de datos MySQL y tabla requerida:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
-- phpMyAdmin SQL Dump -- version 4.5.1 -- http://www.phpmyadmin.net -- -- Servidor: 127.0.0.1 -- Tiempo de generación: 22-01-2018 a las 03:27:31 -- Versión del servidor: 10.1.19-MariaDB -- Versión de PHP: 7.0.13 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Base de datos: `test_updateprod` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `tblprod` -- CREATE TABLE `tblprod` ( `id` int(10) UNSIGNED NOT NULL, `prod_code` varchar(20) NOT NULL, `prod_name` varchar(50) NOT NULL, `prod_ctry` varchar(50) NOT NULL, `prod_qty` int(20) NOT NULL, `price` decimal(12,2) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Volcado de datos para la tabla `tblprod` -- INSERT INTO `tblprod` (`id`, `prod_code`, `prod_name`, `prod_ctry`, `prod_qty`, `price`) VALUES (8, '002', 'Gardenia', 'PanaderÃa', 25, '2.50'), (9, '003', 'Coco Crunch', 'Cereales', 15, '5.25'), (10, '0001', 'Red Bull', 'Bebidas', 50, '1.25'), (11, '004', 'Queso Eden', 'Lácteos', 30, '3.25'), (12, '005', 'Kiwi', 'Frutas', 20, '2.00'), (13, '006', 'Porkchop', 'Carnes', 60, '4.25'), (14, '007', 'Pimienta negra', 'Especies', 5, '1.25'), (15, '008', 'Miel de aveja', 'Edulcorantes', 40, '3.00'), (16, '009', 'Coliflor', 'Vegetales', 15, '1.50'), (18, '0011', 'Uva ', 'Bebidas', 22, '0.50'), (19, '001', 'Quaker Oats', 'Cereales', 98, '3.25'), (21, '0015', 'Avena quaker', 'Cereales', 49, '4.25'); -- -- Índices para tablas volcadas -- -- -- Indices de la tabla `tblprod` -- ALTER TABLE `tblprod` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `id` (`id`), ADD UNIQUE KEY `book_id` (`prod_code`); -- -- AUTO_INCREMENT de las tablas volcadas -- -- -- AUTO_INCREMENT de la tabla `tblprod` -- ALTER TABLE `tblprod` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=22; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |
Estructura básica del index.php:
Crea el archivo llamado “index.php” e incluye los archivos básicos para que jQuery y Bootstrap funcionen, tal como se muestra a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>CRUD de productos con PHP - MySQL - jQuery AJAX </title> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Varela+Round"> <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <link rel="stylesheet" href="css/custom.css"> </head> <body> <div class="container"> <div class="table-wrapper"> <div class="table-title"> <div class="row"> <div class="col-sm-6"> <h2>Administrar <b>Productos</b></h2> </div> <div class="col-sm-6"> <a href="#addProductModal" class="btn btn-success" data-toggle="modal"><i class="material-icons"></i> <span>Agregar nuevo producto</span></a> </div> </div> </div> <div class='col-sm-4 pull-right'> <div id="custom-search-input"> <div class="input-group col-md-12"> <input type="text" class="form-control" placeholder="Buscar" id="q" onkeyup="load(1);" /> <span class="input-group-btn"> <button class="btn btn-info" type="button" onclick="load(1);"> <span class="glyphicon glyphicon-search"></span> </button> </span> </div> </div> </div> <div class='clearfix'></div> <hr> <div id="loader"></div><!-- Carga de datos ajax aqui --> <div id="resultados"></div><!-- Carga de datos ajax aqui --> <div class='outer_div'></div><!-- Carga de datos ajax aqui --> </div> </div> <!-- Edit Modal HTML --> <?php include("html/modal_add.php");?> <!-- Edit Modal HTML --> <?php include("html/modal_edit.php");?> <!-- Delete Modal HTML --> <?php include("html/modal_delete.php");?> <script src="js/script.js"></script> </body> </html> |
Ahora que hemos creado el archivo index.php, debemos crear un directorio llamado “html“, y en dicho directorio vamos a crear los archivos siguientes:
modal_add.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<div id="addProductModal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <form name="add_product" id="add_product"> <div class="modal-header"> <h4 class="modal-title">Agregar Producto</h4> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> </div> <div class="modal-body"> <div class="form-group"> <label>Código</label> <input type="text" name="code" id="code" class="form-control" required> </div> <div class="form-group"> <label>Producto</label> <input type="text" name="name" id="name" class="form-control" required> </div> <div class="form-group"> <label>Categoría</label> <input type="text" name="category" id="category" class="form-control" required> </div> <div class="form-group"> <label>Stock</label> <input type="number" name="stock" id="stock" class="form-control" required> </div> <div class="form-group"> <label>Precio</label> <input type="text" name="price" id="price" class="form-control" required> </div> </div> <div class="modal-footer"> <input type="button" class="btn btn-default" data-dismiss="modal" value="Cancelar"> <input type="submit" class="btn btn-success" value="Guardar datos"> </div> </form> </div> </div> </div> |
modal_delete.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<div id="deleteProductModal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <form name="delete_product" id="delete_product"> <div class="modal-header"> <h4 class="modal-title">Eliminar Producto</h4> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> </div> <div class="modal-body"> <p>¿Seguro que quieres eliminar este registro?</p> <p class="text-warning"><small>Esta acción no se puede deshacer.</small></p> <input type="hidden" name="delete_id" id="delete_id"> </div> <div class="modal-footer"> <input type="button" class="btn btn-default" data-dismiss="modal" value="Cancelar"> <input type="submit" class="btn btn-danger" value="Eliminar"> </div> </form> </div> </div> </div> |
modal_edit.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<div id="editProductModal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <form name="edit_product" id="edit_product"> <div class="modal-header"> <h4 class="modal-title">Editar Producto</h4> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> </div> <div class="modal-body"> <div class="form-group"> <label>Código</label> <input type="text" name="edit_code" id="edit_code" class="form-control" required> <input type="hidden" name="edit_id" id="edit_id" > </div> <div class="form-group"> <label>Producto</label> <input type="text" name="edit_name" id="edit_name" class="form-control" required> </div> <div class="form-group"> <label>Categoría</label> <input type="text" name="edit_category" id="edit_category" class="form-control" required> </div> <div class="form-group"> <label>Stock</label> <input type="number" name="edit_stock" id="edit_stock" class="form-control" required> </div> <div class="form-group"> <label>Precio</label> <input type="text" name="edit_price" id="edit_price" class="form-control" required> </div> </div> <div class="modal-footer"> <input type="button" class="btn btn-default" data-dismiss="modal" value="Cancelar"> <input type="submit" class="btn btn-info" value="Guardar datos"> </div> </form> </div> </div> </div> |
Lo que hemos hecho anteriormente es crear 3 archivos que contienen formularios que son cargados desde el archivo “index.php”, a manera de ventanas modales. Ahora vamos a crear una carpeta llamada css y en dicha carpeta crear un archivo llamado “custom.css”, el cual se encarga de dar estilos css personalizados a las tablas html que se ha utilizado para este ejemplo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
body { color: #566787; background: #f5f5f5; font-family: 'Varela Round', sans-serif; font-size: 13px; } .table-wrapper { background: #fff; padding: 20px 25px; margin: 30px 0; border-radius: 3px; box-shadow: 0 1px 1px rgba(0,0,0,.05); } .table-title { padding-bottom: 15px; background: #435d7d; color: #fff; padding: 16px 30px; margin: -20px -25px 10px; border-radius: 3px 3px 0 0; } .table-title h2 { margin: 5px 0 0; font-size: 24px; } .table-title .btn-group { float: right; } .table-title .btn { color: #fff; float: right; font-size: 13px; border: none; min-width: 50px; border-radius: 2px; border: none; outline: none !important; margin-left: 10px; } .table-title .btn i { float: left; font-size: 21px; margin-right: 5px; } .table-title .btn span { float: left; margin-top: 2px; } table.table tr th, table.table tr td { border-color: #e9e9e9; padding: 12px 15px; vertical-align: middle; } table.table tr th:first-child { width: 60px; } table.table tr th:last-child { width: 100px; } table.table-striped tbody tr:nth-of-type(odd) { background-color: #fcfcfc; } table.table-striped.table-hover tbody tr:hover { background: #f5f5f5; } table.table th i { font-size: 13px; margin: 0 5px; cursor: pointer; } table.table td:last-child i { opacity: 0.9; font-size: 22px; margin: 0 5px; } table.table td a { font-weight: bold; color: #566787; display: inline-block; text-decoration: none; outline: none !important; } table.table td a:hover { color: #2196F3; } table.table td a.edit { color: #FFC107; } table.table td a.delete { color: #F44336; } table.table td i { font-size: 19px; } table.table .avatar { border-radius: 50%; vertical-align: middle; margin-right: 10px; } .pagination { float: right; margin: 0 0 5px; } .pagination li a { border: none; font-size: 13px; min-width: 30px; min-height: 30px; color: #999; margin: 0 2px; line-height: 30px; border-radius: 2px !important; text-align: center; padding: 0 6px; } .pagination li a:hover { color: #666; } .pagination li.active a, .pagination li.active a.page-link { background: #03A9F4; } .pagination li.active a:hover { background: #0397d6; } .pagination li.disabled i { color: #ccc; } .pagination li i { font-size: 16px; padding-top: 6px } .hint-text { float: left; margin-top: 10px; font-size: 13px; } /* Custom checkbox */ .custom-checkbox { position: relative; } .custom-checkbox input[type="checkbox"] { opacity: 0; position: absolute; margin: 5px 0 0 3px; z-index: 9; } .custom-checkbox label:before{ width: 18px; height: 18px; } .custom-checkbox label:before { content: ''; margin-right: 10px; display: inline-block; vertical-align: text-top; background: white; border: 1px solid #bbb; border-radius: 2px; box-sizing: border-box; z-index: 2; } .custom-checkbox input[type="checkbox"]:checked + label:after { content: ''; position: absolute; left: 6px; top: 3px; width: 6px; height: 11px; border: solid #000; border-width: 0 3px 3px 0; transform: inherit; z-index: 3; transform: rotateZ(45deg); } .custom-checkbox input[type="checkbox"]:checked + label:before { border-color: #03A9F4; background: #03A9F4; } .custom-checkbox input[type="checkbox"]:checked + label:after { border-color: #fff; } .custom-checkbox input[type="checkbox"]:disabled + label:before { color: #b8b8b8; cursor: auto; box-shadow: none; background: #ddd; } /* Modal styles */ .modal .modal-dialog { max-width: 400px; } .modal .modal-header, .modal .modal-body, .modal .modal-footer { padding: 20px 30px; } .modal .modal-content { border-radius: 3px; } .modal .modal-footer { background: #ecf0f1; border-radius: 0 0 3px 3px; } .modal .modal-title { display: inline-block; } .modal .form-control { border-radius: 2px; box-shadow: none; border-color: #dddddd; } .modal textarea.form-control { resize: vertical; } .modal .btn { border-radius: 2px; min-width: 100px; } .modal form label { font-weight: normal; } |
Conexión de nuestra con la base de datos
Para conectarme con la base de datos mysql, he usado la extensión mysqli y realizado una conexión a manera de procedimientos, el código empleado en el archivo “conexion.php” es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php /*------------------------- Autor: Obed Alvarado Web: obedalvarado.pw Mail: info@obedalvarado.pw ---------------------------*/ // DB credentials. define('DB_HOST','localhost'); define('DB_USER','root'); define('DB_PASS',''); define('DB_NAME','test_updateprod'); # conectare la base de datos $con=@mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); if(!$con){ die("imposible conectarse: ".mysqli_error($con)); } if (@mysqli_connect_errno()) { die("Conexión falló: ".mysqli_connect_errno()." : ". mysqli_connect_error()); } ?> |
Ahora que ya nos hemos conectado a la base de datos, se procede a crear un nuevo directorio llamado js, dentro del cual he creado un archivo llamado “script.js”. Dicho archivo es llamado desde el index.php y se encarga de gestionar mediante jquery y ajax todas las peticiones a nuestro servidor en tiempo real y sin tener que recargar la pagina por cada acción que realicemos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
$(function() { load(1); }); function load(page){ var query=$("#q").val(); var per_page=10; var parametros = {"action":"ajax","page":page,'query':query,'per_page':per_page}; $("#loader").fadeIn('slow'); $.ajax({ url:'ajax/listar_productos.php', data: parametros, beforeSend: function(objeto){ $("#loader").html("Cargando..."); }, success:function(data){ $(".outer_div").html(data).fadeIn('slow'); $("#loader").html(""); } }) } $('#editProductModal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) // Button that triggered the modal var code = button.data('code') $('#edit_code').val(code) var name = button.data('name') $('#edit_name').val(name) var category = button.data('category') $('#edit_category').val(category) var stock = button.data('stock') $('#edit_stock').val(stock) var price = button.data('price') $('#edit_price').val(price) var id = button.data('id') $('#edit_id').val(id) }) $('#deleteProductModal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) // Button that triggered the modal var id = button.data('id') $('#delete_id').val(id) }) $( "#edit_product" ).submit(function( event ) { var parametros = $(this).serialize(); $.ajax({ type: "POST", url: "ajax/editar_producto.php", data: parametros, beforeSend: function(objeto){ $("#resultados").html("Enviando..."); }, success: function(datos){ $("#resultados").html(datos); load(1); $('#editProductModal').modal('hide'); } }); event.preventDefault(); }); $( "#add_product" ).submit(function( event ) { var parametros = $(this).serialize(); $.ajax({ type: "POST", url: "ajax/guardar_producto.php", data: parametros, beforeSend: function(objeto){ $("#resultados").html("Enviando..."); }, success: function(datos){ $("#resultados").html(datos); load(1); $('#addProductModal').modal('hide'); } }); event.preventDefault(); }); $( "#delete_product" ).submit(function( event ) { var parametros = $(this).serialize(); $.ajax({ type: "POST", url: "ajax/eliminar_producto.php", data: parametros, beforeSend: function(objeto){ $("#resultados").html("Enviando..."); }, success: function(datos){ $("#resultados").html(datos); load(1); $('#deleteProductModal').modal('hide'); } }); event.preventDefault(); }); |
Script PHP para leer registros existentes de la base de datos:
Para poder leer los archivos de la base de datos lo haremos mediante una petición ajax al servidor, dicha petición se realiza desde el archivo script.js.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$(function() { load(1); }); function load(page){ var query=$("#q").val(); var per_page=10; var parametros = {"action":"ajax","page":page,'query':query,'per_page':per_page}; $("#loader").fadeIn('slow'); $.ajax({ url:'ajax/listar_productos.php', data: parametros, beforeSend: function(objeto){ $("#loader").html("Cargando..."); }, success:function(data){ $(".outer_div").html(data).fadeIn('slow'); $("#loader").html(""); } }) } |
La función JavaScript load(); se encarga de realizar una petición a un archivo llamado “listar_productos.php“, que lo hemos colocado dentro del directorio ajax. El código es mostrado a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
<?php /* Connect To Database*/ require_once ("../conexion.php"); $action = (isset($_REQUEST['action'])&& $_REQUEST['action'] !=NULL)?$_REQUEST['action']:''; if($action == 'ajax'){ $query = mysqli_real_escape_string($con,(strip_tags($_REQUEST['query'], ENT_QUOTES))); $tables="tblprod"; $campos="*"; $sWhere=" tblprod.prod_name LIKE '%".$query."%'"; $sWhere.=" order by tblprod.prod_name"; include 'pagination.php'; //include pagination file //pagination variables $page = (isset($_REQUEST['page']) && !empty($_REQUEST['page']))?$_REQUEST['page']:1; $per_page = intval($_REQUEST['per_page']); //how much records you want to show $adjacents = 4; //gap between pages after number of adjacents $offset = ($page - 1) * $per_page; //Count the total number of row in your table*/ $count_query = mysqli_query($con,"SELECT count(*) AS numrows FROM $tables where $sWhere "); if ($row= mysqli_fetch_array($count_query)){$numrows = $row['numrows'];} else {echo mysqli_error($con);} $total_pages = ceil($numrows/$per_page); //main query to fetch the data $query = mysqli_query($con,"SELECT $campos FROM $tables where $sWhere LIMIT $offset,$per_page"); //loop through fetched data if ($numrows>0){ ?> <div class="table-responsive"> <table class="table table-striped table-hover"> <thead> <tr> <th class='text-center'>Código</th> <th>Producto </th> <th>Categoría </th> <th class='text-center'>Stock</th> <th class='text-right'>Precio</th> <th></th> </tr> </thead> <tbody> <?php $finales=0; while($row = mysqli_fetch_array($query)){ $product_id=$row['id']; $prod_code=$row['prod_code']; $prod_name=$row['prod_name']; $prod_ctry=$row['prod_ctry']; $prod_qty=$row['prod_qty']; $price=$row['price']; $finales++; ?> <tr class="<?php echo $text_class;?>"> <td class='text-center'><?php echo $prod_code;?></td> <td ><?php echo $prod_name;?></td> <td ><?php echo $prod_ctry;?></td> <td class='text-center' ><?php echo $prod_qty;?></td> <td class='text-right'><?php echo number_format($price,2);?></td> <td> <a href="#" data-target="#editProductModal" class="edit" data-toggle="modal" data-code='<?php echo $prod_code;?>' data-name="<?php echo $prod_name?>" data-category="<?php echo $prod_ctry?>" data-stock="<?php echo $prod_qty?>" data-price="<?php echo $price;?>" data-id="<?php echo $product_id; ?>"><i class="material-icons" data-toggle="tooltip" title="Editar" ></i></a> <a href="#deleteProductModal" class="delete" data-toggle="modal" data-id="<?php echo $product_id;?>"><i class="material-icons" data-toggle="tooltip" title="Eliminar"></i></a> </td> </tr> <?php }?> <tr> <td colspan='6'> <?php $inicios=$offset+1; $finales+=$inicios -1; echo "Mostrando $inicios al $finales de $numrows registros"; echo paginate( $page, $total_pages, $adjacents); ?> </td> </tr> </tbody> </table> </div> <?php } } ?> |
El archivo anterior se conecta con la base de datos y realiza una consulta a nuestra tabla. También nos devuelve los registros paginados, ya que hace una include de un archivo nombrado “pagination.php“, siempre dentro del directorio ajax.
pagination.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?php function paginate($page, $tpages, $adjacents) { $prevlabel = "‹ Anterior"; $nextlabel = "Siguiente ›"; $out = '<ul class="pagination pull-right">'; // previous label if($page==1) { $out.= "<li class='page-item disabled'><a>$prevlabel</a></li>"; } else if($page==2) { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load(1)'>$prevlabel</a></li>"; }else { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load(".($page-1).")'>$prevlabel</a></li>"; } // first label if($page>($adjacents+1)) { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load(1)'>1</a></li>"; } // interval if($page>($adjacents+2)) { $out.= "<li class='page-item'><a>...</a></li>"; } // pages $pmin = ($page>$adjacents) ? ($page-$adjacents) : 1; $pmax = ($page<($tpages-$adjacents)) ? ($page+$adjacents) : $tpages; for($i=$pmin; $i<=$pmax; $i++) { if($i==$page) { $out.= "<li class='active page-item'><a>$i</a></li>"; }else if($i==1) { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load(1)'>$i</a></li>"; }else { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load(".$i.")'>$i</a></li>"; } } // interval if($page<($tpages-$adjacents-1)) { $out.= "<li class='page-item'><a>...</a></li>"; } // last if($page<($tpages-$adjacents)) { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load($tpages)'>$tpages</a></li>"; } // next if($page<$tpages) { $out.= "<li class='page-item'><a href='javascript:void(0);' onclick='load(".($page+1).")'>$nextlabel</a></li>"; }else { $out.= "<li class='disabled page-item'><a>$nextlabel</a></li>"; } $out.= "</ul>"; return $out; } ?> |
Ahora que hemos realizado y paginado una consulta a la base de datos, así es como se mostrarán los datos en el navegador web:
Script PHP para guardar registros en la base de datos:
Para poder almacenar los datos en nuestra base de datos mysql, vamos a crear dentro del directorio ajax, un archivo llamado “guardar_producto.php“. Su código es mostrado a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php if (empty($_POST['name'])){ $errors[] = "Ingresa el nombre del producto."; } elseif (!empty($_POST['name'])){ require_once ("../conexion.php");//Contiene funcion que conecta a la base de datos // escaping, additionally removing everything that could be (html/javascript-) code $prod_code = mysqli_real_escape_string($con,(strip_tags($_POST["code"],ENT_QUOTES))); $prod_name = mysqli_real_escape_string($con,(strip_tags($_POST["name"],ENT_QUOTES))); $prod_ctry = mysqli_real_escape_string($con,(strip_tags($_POST["category"],ENT_QUOTES))); $stock = intval($_POST["stock"]); $price = floatval($_POST["price"]); // REGISTER data into database $sql = "INSERT INTO tblprod(id, prod_code, prod_name, prod_ctry, prod_qty, price) VALUES (NULL,'$prod_code','$prod_name','$prod_ctry','$stock','$price')"; $query = mysqli_query($con,$sql); // if product has been added successfully if ($query) { $messages[] = "El producto ha sido guardado con éxito."; } else { $errors[] = "Lo sentimos, el registro falló. Por favor, regrese y vuelva a intentarlo."; } } else { $errors[] = "desconocido."; } if (isset($errors)){ ?> <div class="alert alert-danger" role="alert"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>Error!</strong> <?php foreach ($errors as $error) { echo $error; } ?> </div> <?php } if (isset($messages)){ ?> <div class="alert alert-success" role="alert"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Bien hecho!</strong> <?php foreach ($messages as $message) { echo $message; } ?> </div> <?php } ?> |
El formulario que captura los datos desde una ventana modal es el siguiente:
Script PHP para actualizar los registros de la base de datos:
Para poder actualizar los registros dentro de la base de datos, es necesario crear siempre dentro del directorio ajax, un archivo llamado “editar_producto.php” y colocamos el código siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php if (empty($_POST['edit_id'])){ $errors[] = "ID está vacío."; } elseif (!empty($_POST['edit_id'])){ require_once ("../conexion.php");//Contiene funcion que conecta a la base de datos // escaping, additionally removing everything that could be (html/javascript-) code $prod_code = mysqli_real_escape_string($con,(strip_tags($_POST["edit_code"],ENT_QUOTES))); $prod_name = mysqli_real_escape_string($con,(strip_tags($_POST["edit_name"],ENT_QUOTES))); $prod_ctry = mysqli_real_escape_string($con,(strip_tags($_POST["edit_category"],ENT_QUOTES))); $stock = intval($_POST["edit_stock"]); $price = floatval($_POST["edit_price"]); $id=intval($_POST['edit_id']); // UPDATE data into database $sql = "UPDATE tblprod SET prod_code='".$prod_code."', prod_name='".$prod_name."', prod_ctry='".$prod_ctry."', price='".$price."', prod_qty='".$stock."' WHERE id='".$id."' "; $query = mysqli_query($con,$sql); // if product has been added successfully if ($query) { $messages[] = "El producto ha sido actualizado con éxito."; } else { $errors[] = "Lo sentimos, la actualización falló. Por favor, regrese y vuelva a intentarlo."; } } else { $errors[] = "desconocido."; } if (isset($errors)){ ?> <div class="alert alert-danger" role="alert"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>Error!</strong> <?php foreach ($errors as $error) { echo $error; } ?> </div> <?php } if (isset($messages)){ ?> <div class="alert alert-success" role="alert"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Bien hecho!</strong> <?php foreach ($messages as $message) { echo $message; } ?> </div> <?php } ?> |
El formulario que muestra los datos a actualizar, es mostrado a continuación:
Script PHP eliminar registros de la base de datos:
Se debe crear un archivo en el directorio ajax, y nombrarlo “eliminar_producto.php“, y pegar el código siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?php if (empty($_POST['delete_id'])){ $errors[] = "Id vacío."; } elseif (!empty($_POST['delete_id'])){ require_once ("../conexion.php");//Contiene funcion que conecta a la base de datos // escaping, additionally removing everything that could be (html/javascript-) code $id_producto=intval($_POST['delete_id']); // DELETE FROM database $sql = "DELETE FROM tblprod WHERE id='$id_producto'"; $query = mysqli_query($con,$sql); // if product has been added successfully if ($query) { $messages[] = "El producto ha sido eliminado con éxito."; } else { $errors[] = "Lo sentimos, la eliminación falló. Por favor, regrese y vuelva a intentarlo."; } } else { $errors[] = "desconocido."; } if (isset($errors)){ ?> <div class="alert alert-danger" role="alert"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>Error!</strong> <?php foreach ($errors as $error) { echo $error; } ?> </div> <?php } if (isset($messages)){ ?> <div class="alert alert-success" role="alert"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Bien hecho!</strong> <?php foreach ($messages as $message) { echo $message; } ?> </div> <?php } ?> |
Para eliminar un registro es necesario confirmar el cuadro de dialogo.
Finalmente hemos terminado con la función CREAR, LEER, ACTUALIZAR y ELIMINAR, puedes probar el código completo, descargando todos los archivos fuente, en el enlace a continuación.