19 dic 2016

Select dinamico AJAX, PHP, MYSQL

El día de hoy les traigo un tutorial sobre como usar AJAX para cambiar las opciones de un SELECT SELECT dependiendo de la opción seleccionada en el otro SELECT

¡ Bueno manos a la obra !

los archivos empleados para realizar este proyecto fueron los siguientes:



En la carpeta 'core' encontramos 2 archivos  el archivo 'config,php' en el cual establecemos las variables para la conexin a la base de datos a continuación el archivo 'config.php'´



//Datos de configuracion de la base de datos
define('HOST', 'localhost');
define('USER', 'root');
define('PASSWORD', '');
define('DATABASE', 'countries');


Seguido de este archivo tenemos el archivo 'conexion.php', en este archivo usamos los datos de configuración del archivo 'config.php' para establecer la conexión a  la base de datos.



require_once 'config.php';

class conexion
{
    private $host;
    private $user;
    private $password;
    private $database;
    private $conexion;

    /**
     * conexion constructor.
     */
    public function __construct()
    {
        $this->host = HOST;
        $this->user = USER;
        $this->password = PASSWORD;
        $this->database = DATABASE;

        $this->conexion = new mysqli($this->host, $this->user, $this->password, $this->database);
        if($this->conexion->connect_errno){
            echo "Lo sentimos, no se ha podido establecer conexion a la base de datos";
            exit;
        }
    }

    public function query($sql){
       return $this->conexion->query($sql);
    }

    public function close(){
        $this->conexion->close();
    }


}

En este archivo se encuentra la clase que se encarga de gestionar la conexión a la base de datos.

En este archivo encontramos que en el constructor de la clase de inicia la conexión a la base de datos, tenemos el método query($sql), el cual se encarga de gestionar las consultas a la base de datos y el metido close() el cual cierra la conexión sobre la misma.

El siguiente archivo a analizar es el archivo 'functions.php' en este archivo encontramos dos funciones las cuales usamos en este ejemplo


require_once 'core/conexion.php';

function getEstados($id_pais)
{

    $conexion = new conexion();
    $result = $conexion->query("SELECT * FROM estado WHERE estado.ID_PAIS = $id_pais");
    $registros = [];

    while ($row = $result->fetch_assoc()) {
        $registros[] = $row;
    }

    $conexion->close();

    print json_encode($registros);

}


function getPaises()
{

    $conexion = new conexion();
    $result = $conexion->query("SELECT * FROM pais");

    $registros = [];

    while ($row = $result->fetch_assoc()) {
        $registros[] = $row;
    }

    $conexion->close();

    print json_encode($registros);
}


la tarea de estas funciones es obtener es respectivamente obtener los estados de un pais, y los paises que se encuentran en la base de datos y luego mediante la funcion json_enconde() devolvemos estos datos usando formato JSON.



Seguido de este archivo encontramos otro llamado 'bootstrap.php'.




require_once 'functions.php';

if (!empty($_GET)) {

    switch ($_GET['consulta']) {
        case 'paises':
            getPaises();
            break;
        case 'estados':
            $id_pais = $_GET['pais'];
            getEstados($id_pais);
            break;
        default:
            echo json_encode(['ERROR'=>'PETICION NO ENCONTRADA']);
            break;
    }

}

La función de este archivo es muy importante ya que en este archivo nos encargamos de recibir algunos parámetros vía GET para devolver los datos que se solicitan por el usuario, por ejemplo para obtener todos los paises la URL de petición seria como esta: 


midominio.com/bootstrap.php?consulta=paises



Si quisieramos obtener todos los estados de un país la petición seria de esta forma:



midominio.com/bootstrap.php?consulta=estados&pais=1



El archivo que veremos a continuación es el archivo que es mostrado al cliente (navegador web) para la visualización de los datos este es el archivo index.html



<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Select dinamico</title>
    <style>
        .container{
            margin: 0 auto;
            border: 1px solid black;
            padding: 2%;
            font-size: 20px;
            width: 50%;
        }

        .container > select,input{
            margin: 0px;
            width: 100%;
        }
    </style>
</head>
<body>
<div class="container">
    <label for="pais">Pais</label>
    <select id="pais"></select>
    <br>
    <br>
    <label for="estado">Estado</label>
    <select id="estado"></select>
</div>
</body>
<script>

    window.addEventListener('load', function () {
        consultar_paises();
        document.querySelector('#pais').addEventListener('change', consultar_estados);
    });

    function consultar_paises() {

        var solicitud = new XMLHttpRequest();

        solicitud.addEventListener('load', function () {

            var select_paises = document.querySelector('#pais');
            var obj_response = JSON.parse(this.responseText);

            for (var i = 0; i < obj_response.length; i++) {

                var option = document.createElement('option');

                option.setAttribute('value', obj_response[i].ID);
                option.innerHTML = obj_response[i].NOMBRE;

                select_paises.appendChild(option);

            }
        });

        solicitud.open('GET', 'bootstrap.php?consulta=paises');
        solicitud.send();

    }

    function consultar_estados() {

        var id_pais = this.value;

        var solicitud = new XMLHttpRequest();

        solicitud.addEventListener('load', function () {

            var select_estados = document.querySelector('#estado');
            var obj_response = JSON.parse(this.responseText);

            select_estados.innerHTML = "";

            for (var i = 0; i < obj_response.length; i++) {

                var option = document.createElement('option');

                option.setAttribute('value', obj_response[i].ID);
                option.innerHTML = obj_response[i].NOMBRE;

                select_estados.appendChild(option);

            }
        });

        solicitud.open('GET', "bootstrap.php?consulta=estados&pais=" + id_pais);
        solicitud.send();
    }

</script>
</html>

Este es el archivo encargado de mostrar al usuario toda la información e interactuar con el para obtener esta.
tenemos dos SELECT html de los cuales en uno se mostraran los paises y en el otro los estados del país seleccionado.

para lograr esto agregamos una escucha al evento 'change' del campo 'pais' la cual ejecuta una petición AJAX para obtener los estados del país seleccionado mediante la función consultar_estados() luego que la petición AJAX es ejecutada los resultados son recorridos en un blucle for para crear los objetos option necesarios para mostrar todos los estados del pais seleccionado luego estos se añaden al campor 'estados ';

Muchas gracias por leer este tutorial.
Espero los haya ayudado ¡ Saludos !

25 nov 2016

Calcular la edad con MySQL

Hoy les traigo una forma muy sencilla de calcular la edad partiendo de la fecha de nacimiento en MySQL

SELECT FLOOR(TIMESTAMPDIFF(DAY , '1994-06-10', CURDATE() ) /365 ) AS EDAD;

La función TIMESTAMPDIFF Calcula la Diferencia entre dos fechas sus parámetros son los siguientes: 

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)


El parámetro unit es el que se encarga de establecer el formato de salida de la operación, los valores posibles son HOUR, DAY,  YEAR

los siguientes dos parametros son la fecha de inicio y al fecha final, en este ejemplo la fecha de Inicio es la fecha de nacimiento y la fecha final es obtenida usando la función CURDATE() la cual nos proporciona la fecha actual.


la funcion FLOOR() usada en este ejemplo se encarga de redondear el resultado de la división, ya que el resultado de la función  TIMESTAMPDIFF está dado en días los cuales tenemos que dividir entre 365 para obtener la edad en años.

30 sept 2016

Javascript, Calcular la edad con la fecha de nacimiento

Calcular la edad sabiendo la fecha de nacimiento es otra de las tareas comunes en el desarrollo de un proyecto.

usando Javascript podemos calcular la edad facilmente


function Edad(FechaNacimiento) {

    var fechaNace = new Date(FechaNacimiento);
    var fechaActual = new Date()

    var mes = fechaActual.getMonth();
    var dia = fechaActual.getDate();
    var año = fechaActual.getFullYear();

    fechaActual.setDate(dia);
    fechaActual.setMonth(mes);
    fechaActual.setFullYear(año);

    edad = Math.floor(((fechaActual - fechaNace) / (1000 * 60 * 60 * 24) / 365));
   
    return edad;
}

Usando esta función podemos obtener la edad sabiendo la fecha de nacimiento.

Ejemplo supongamos que tenemos un input tipo 'date' en nuestra web

<input type='date' id='fechaNace'>

Nuestra función para calcular la fecha de nacimiento la usaríamos de la siguiente forma


 
var fecha = document.getElementById('fechaNace').value;

//Ejemplo 
// fecha =  '1994-06-10';

var edad = Edad(fecha);

//edad = 22;

Ejemplo de uso

29 sept 2016

Javascript, Funcion para obtener la hora actual

Tener la hora actual siempre disponible es muy importante en nuestra web, por eso una funcion para realizar este trabajo es indispensable en nuestro proyecto. por eso hoy quiero mostrarles una función hecha para este proposito


function horaActual() {

    var hActual = new Date();

    var minutes = (hActual.getMinutes().toString().length == 1) ? ('0' + hActual.getMinutes()) : (hActual.getMinutes());
    var horas = (hActual.getHours().toString().length == 1) ? ('0' + hActual.getHours()) : (hActual.getHours());

    return (horas) + ":" + (minutes);
}

Con esta función obtenemos la fecha actual del sistema.

Su forma de uso es muy sencilla, supongamos que en nuestra pagina tenemos un input tipo 'time'


<input type='time' id='mihora'>

Usando javascript 



document.getElementById('mihora').value = horaActual();

¡listo!, ya tenemos la hora actual en nuestro campo de fecha.

De forma opcional si deseas usarla con jQuery seria de la siguiente forma:



$('#mihora').val(horaActual());

28 sept 2016

Javascript, funcion para obtener la fecha actual

Tener una función que nos retorne la fecha actual es indispensable en nuestros proyectos, por eso hoy les traigo está función la cual pueden usar en cualquiera de sus proyectos web

function FechaActual() {

    var fActual = new Date();

    var dia = (fActual.getDate().length==1)?('0'+fActual.getDate()):(fActual.getDate());
    var mes = ((fActual.getMonth()+1) > 9 )?(fActual.getMonth()+1):('0'+(fActual.getMonth()+1));
    var año = fActual.getFullYear();

    return (año + "-" + mes + "-" + dia).toString();
}


Supongamos que tenemos un campo llamado 'miFecha'



<input type="date" id="miFecha">

Usando jQuery para establecer la fecha actual en el campo 'miFecha' seria de la siguiente manera



$("#miFecha").val(FechaActual());



¡listo! con eso tenemos la fecha actual en nuestro input

si prefieres la puedes usar sin jQuery de la siguiente forma:



document.getElementById('miFecha').value = FechaActual();

y de esta sencilla forma obtendras la fecha actual en tu campo fecha.

Si quieres poner la fecha actual a todos los campos tipo fecha en tu pagina, usando jQuery lo puedes
hacer de una forma muy sencilla

$("input[type='date']").each(function () {
    $(this).val(FechaActual());
});


¡listo! con eso tendrás todos tus campos tipo fecha con la fecha actual.

Gracias .. Espero les ayude en sus proyectos.






29 jun 2016

Paginado simple usando JavaScript

Paginar los resultados de una consulta ofrece mayor organización y mayor comodidad al momento de visualizar los datos, para hacernos una idea imaginemos una consulta que de como resultados mil registros en una pagina web, buscar información en esta lista seria realmente buscar una aguja en un pajar, ahora imaginemos la misma consulta pero dividida en paginas de 50 registros, buscar información acerca de un registro seria tarea mucho mas fácil, por esta razón en este tutorial haremos un paginado sencillo pero eficiente el cual podrás usar fácilmente en tu web

Bueno ¡ Manos a la obra !

Para este ejemplo utilizaremos una pequeña base de datos llamada contactos  en la cual inserte algunos registros para ver el funcionamiento del paginado.

A continuación el código de creación de la base de datos.

--------------------------------------------------------------------------------------------------------------
CREATE DATABASE IF NOT EXISTS `contactos`;

USE `contactos`;

CREATE TABLE IF NOT EXISTS `contacto` (
  `id` int(11) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `telefono` int(15) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `direccion` varchar(50) DEFAULT NULL
)

--------------------------------------------------------------------------------------------------------------------------

Para este proyecto he creado la siguiente estructura de carpetas



En la carpeta "core" se encuentran todos los archivos de PHP los cuales hacen lo siguiente:
el archivo conexión.php es el encargado de establecer la conexión a la base de datos como se muestra a continuación

-------------------------------------------------------------------------------------------------------------  
<?php
require_once('config.php');

class conexion{

    private $db;

    public function conexion(){
        $this->db = new mysqli(HOST, USER, PASS, DB);
    }

    public function getConexion(){
        
        if($this->db->connect_errno){
            echo "Error en la Conexion con la base de datos";
        }
        else{
            return $this->db;
        }
    }

    public function closeConexion(){
        $this->db->close();
    }

}
?>
--------------------------------------------------------------------

Esta clase hace uso de los valores establecidos en el archivo config.php en el cual se establecen los parámetros de conexión a la base de datos como se muestra a continuación

--------------------------------------------------------------------------------------------------------------------------
<?php
const HOST = "localhost";
const DB = "contactos";
const USER = "root";
const PASS = "";

?>
---------------------------------------------------------------------------------------------------------------

Siguiendo con los archivos de la carpeta core encontramos el archivo Consulta.php este archivo recibe varios parámetros, el parámetro acción que determina la tarea que realizara este script, las cuales son dos "contar" y "consultar".

otro parámetro de este archivo es el parámetro cantidad, el cual determina la cantidad de registros a devolver y por ultimo el parámetro inicio el cual determina desde que registros se devolverán los resultados

A continuación el archivo Consulta.php

---------------------------------------------------------------------------------------------------------------

<?php

require_once("conexion.php");

$db = new conexion();

$conex = $db->getConexion();

if(!empty($_GET)){

if(!empty($_GET['accion'])){

switch($_GET['accion']){
case 'contar':

$sql = "SELECT COUNT(*) as total FROM contacto";
$result = $conex->query($sql);
$total = $result->fetch_assoc()['total'];
print $total;

break;
case 'consultar':

$sql = "SELECT  * FROM contacto LIMIT ".$_GET["inicio"].",".$_GET["cantidad"];

$result = $conex->query($sql);
$response = "<table class='table table-hover table-striped'>";
$response = $response."<thead>
<tr>
<td>#</td>
<td>Nombre</td>
<td>Telefono</td>
<td>Email</td>
<td>Direccion</td>
</tr>
</thead>";
while($row = $result->fetch_assoc()){
$response = $response."<tr><td>".$row['id']."</td>"
."<td>".$row['nombre']."</td>"
."<td>".$row['telefono']."</td>"
."<td>".$row['email']."</td>"
."<td>".$row['direccion']."</td></tr>";

}
$response = $response."</table>";
print $response;

break;
}


}
}


?>

---------------------------------------------------------------------------------------------------------------

La estructura de la pagina web es muy sencilla para los estilos de esta se utilizó el famoso bootstrap


---------------------------------------------------------------------------------------------------------------
Archivo index.html
---------------------------------------------------------------------------------------------------------------
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Paginacion </title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<script src="js/main.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="page-header">
<h1>Paginas</h1>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-2">
<label>Resultados por pagina</label>
<select id="results4page" class="form-control">
<option value="5" selected>5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="30">30</option>
</select>
</div>
<div class="col-md-4">
<br>
<label>Pagina Actual</label>
<span id="currentPage">1</span>
</div>
</div>
<div class="row">
<br>
<div class="col-md-8">
<div id="results"></div>
</div>
</div>
<div class="row">
<div class="col-md-8">
<nav>
<ul class="pagination" id="pages">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li id="next">
<a href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</body>

</html>
--------------------------------------------------------------------

en la carpeta "js" encontramos en archivo main.js este archivo es el encargado de  hacer las peticiones vía ajax al archivo Consulta.php.

A continuación el archivo main.js

---------------------------------------------------------------------------------------------------------------
function CreateButtons(numPages) {

var pages = document.querySelector("#pages");

var text = "<li> <a href=" + "\"#\"" + "aria-label=\"Previous\" onclick=\"Previous()\"><span aria-hidden=" + "\"true\"" + ">&laquo;</span></a></li>";

for (var i = 0 ; i<numPages ; i++){
text = text + "<li><a href=\"#\" onclick=\"getRecords("+parseInt(i+1) + ")\">"+parseInt(i+1) + "</a></li>";
}

text = text + "<li> <a href=" + "\"#\"" + "aria-label=\"Next\" onclick=\"Next()\" ><span aria-hidden=" + "\"true\"" + ">&raquo;</span></a></li>";

pages.innerHTML = text;


}

function SetPages() {

var numRegistros = 0;
var results4page = document.querySelector("#results4page").value;
var url = "/Paginator/core/Consulta.php?accion=contar";

var peticion = new XMLHttpRequest();
peticion.open("GET", url, true);

peticion.addEventListener("load", function(e) {

numRegistros = parseInt(e.target.responseText);
CreateButtons(Math.ceil(numRegistros/results4page));
numPages = Math.ceil(numRegistros/results4page);

}, false);

peticion.send(null);

}

function getRecords(pag) {

var results = document.querySelector("#results4page").value;
var inicio  = results * pag - results;

var url = "/Paginator/core/Consulta.php?accion=consultar&inicio="+inicio+"&cantidad="+results;

var peticion = new XMLHttpRequest();
peticion.open("GET", url, true);

peticion.addEventListener("load", function(e){

var datos = e.target.responseText;
document.querySelector("#results").innerHTML = datos;
document.querySelector("#currentPage").innerHTML =  pag;
currentPage = pag;
console.log(currentPage);

}, false);

peticion.send(null);

}

function Next(){
console.log(currentPage);
if( currentPage+1 < numPages ){
currentPage = currentPage+1;

getRecords(currentPage);
}

}

function Previous(){
console.log(currentPage);
if( (currentPage - 1) >= 1){
currentPage = currentPage - 1;

getRecords(currentPage);
}

}

window.addEventListener("load", function () {

currentPage = 1;
numPages = 0;

SetPages();
document.querySelector("#results4page").addEventListener("change", function(){
SetPages();
getRecords(1);
}, false);

getRecords(currentPage);


}, false);
---------------------------------------------------------------------------------------------------------------