viernes, 25 de octubre de 2019

Diferencias SQL en MySQL, SQL Server, Oracle, PostgreSQL y SQLite

Veremos un diagrama EER de dos tablas y como se realizan las declaraciones de las mismas en los distintos gestores de bases de datos:

  • MySql y MariaBD
  • Oracle
  • SQL Server
  • PostgreSQL
  • SQLite


MySql y MariaBD



Oracle



SQL Server



PostgreSQL

CREATE TABLE public."Usuarios"
(
    id serial NOT NULL,
    dni character(8) NOT NULL,
    nombres character varying(100) NOT NULL,
    apellidos character varying(150) NOT NULL,
    fecha_nacimiento date NOT NULL,
    PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
);

ALTER TABLE public."Usuarios"
    OWNER to postgres;


INSERT INTO Usuarios(
 dni, nombres, apellidos, fecha_nacimiento)
 VALUES ('71700011', 'Alan Damian', 'Toledo Higuchi', '1990-10-01');


SQLite

lunes, 21 de octubre de 2019

Creando una vista en MySQL

Diagrama EER

En este ejemplo vamos a implementar el código SQL para MySQL de la siguientes tablas que tenemos según el diagrama EER:



Lo que deseamos es crear una vista, esta vista actúa como una tabla que nosotros podemos personalizar a partir de consultas SELECT, son muy útiles para representar información de dos o más tablas que se relacionan en una sola. Ojo una vista no es una tabla propiamente dicha y solo se le puede aplicar SELECT, es decir solo ver sus datos, no se puede agregar, actualizar o eliminar registros de una vista, estos son registros de sus respectivas tablas y ahí se deben ejecutar dichas sentencias


Código SQL

Primero debemos tener la consulta que deseamos convertir en una vista, en este caso relacionar un pago con un inquilino, de forma que yo pueda ver el código del pago, el DNI del inquilino, sus nombres y apellidos en un solo campo, el pago que realizo, la fecha y hora (por separado) que lo hizo. El código resultante será el siguiente:

SELECT 
  pagos.idpagos,
  inquilinos.dni,
  CONCAT_WS(" ", inquilinos.nombres, inquilinos.paterno, inquilinos.materno),
  pagos.monto
  DATE(pagos.fecha),
  TIME(pagos.fecha)
FROM pagos INNER JOIN inquilinos 
  ON pagos.inquilino = inquilinos.idinquilinos

  • La función "CONCAT_WS" nos permite concatenar dos o más campos, indicando como primer parámetro el caracter de separación, en este caso el espacio en blanco (" ").
  • Podemos extraer la fecha de un DATETIME con la función YEAR.
  • Podemos extraer la hora de un DATETIME con la función TIME.
Ahora debemos asignar un "alias" a cada campo para tener un mejor orden:

SELECT 
  pagos.idpagos id,
  inquilinos.dni dni,
  CONCAT_WS(" ", inquilinos.nombres, inquilinos.paterno, inquilinos.materno) datos,
  pagos.monto monto
  DATE(pagos.fecha) fecha,
  TIME(pagos.fecha) hora
FROM pagos INNER JOIN inquilinos 
  ON pagos.inquilino = inquilinos.idinquilinos


Ahora podemos proceder a crear la vista anteponiendo lo siguiente: "CREATE VIEW ________ AS" de la siguiente manera

CREATE VIEW pagos_view AS
SELECT 
  pagos.idpagos id,
  inquilinos.dni dni,
  CONCAT_WS(" ", inquilinos.nombres, inquilinos.paterno, inquilinos.materno) datos,
  pagos.monto monto,
  DATE(pagos.fecha) fecha,
  TIME(pagos.fecha) hora
FROM pagos INNER JOIN inquilinos 
  ON pagos.inquilino = inquilinos.idinquilinos

  • El nombre de la vista es "pagos_view".
  • Podemos aplicarle consultas SELECT donde el nombre de los campos son los "alias" que le elegimos.

Probando

SELECT * FROM pagos_view;


Nos debe devolver algo así:

id dni datos monto fecha hora
1 31378082 LUISA PAUCAR NARRO 400.00 2019-10-21 21:34:35
2 43331042 AUGUSTO SOTOMAYOR NARVAJO 300.00 2019-10-18 18:30:00

Creando una tabla con clave foránea en MySQL

Diagrama EER

En este ejemplo vamos a implementar el código SQL para MySQL de la siguientes tablas que tenemos según el diagrama EER. Si quieres el código SQL de la tabla "inquilinos" has clic aquí


Código SQL

El código resultante será el siguiente:

CREATE TABLE IF NOT EXISTS pagos (
   idpagos INT NOT NULL AUTO_INCREMENT,
   inquilino INT NOT NULL,
   monto DECIMAL(10,2) NOT NULL,
   fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (idpagos),
   CONSTRAINT fk_pago_inquilino
     FOREIGN KEY (inquilino)
     REFERENCES inquilinos (idinquilinos)
       ON DELETE NO ACTION
       ON UPDATE NO ACTION
)ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


  • El campo "inquilino" sera nuestra clave foránea, lo que significa que estará vinculado a la tabla "inquilinos", de tal manera que para agregar un pago, primero debemos tener por lo menos un inquilino, ya que el campo es "NOT NULL".
  • La clave "fk_pago_inquilino" es el nombre de la clave foránea debe ser única, lo que implica que no se podrá repetir este nombre en ningún campo o nombre de relación de esta base de datos.
  • Se usa las siguientes sentencias:
    • ON DELETE NO ACTION: Implica que si se desea eliminar un registro de "inquilinos" que tenga por lo menos un pago, saltará un error y no dejará borrarlo.
    • ON UPDATE NO ACTION: Implica que si se desea actualizar la clave primaria de un registro de "inquilinos" que tenga por lo menos un pago, saltará un error y no dejará cambiar la clave, pero ¿Por qué querríamos hacer eso?
  • ENGINE = InnoDB, nos garantiza que podremos utilizar claves foráneas y soporte del "commit" y "rollback"
  • DEFAULT CHARACTER SET = utf8; nos permite ingresar caracteres especiales como la "ñ" o vocales tildadas a nuestros registros.


Insertando datos de prueba

INSERT INTO pagos(inquilino, monto, fecha) 
   VALUES (1,400,CURRENT_TIMESTAMP),
          (2,300,"2019-10-18 18:30:00");

  • En el caso del campo "fecha", se emplea en el primer caso "CURRENT_TIMESTAMP" que devuelve la fecha y hora actual para el servidor MySQL, en el segundo caso se especifica la fecha y hora en el formato "YYYY-MM-DD HH:MM:SS".


viernes, 11 de octubre de 2019

Creando una tabla en MySQL

Diagrama EER

En este ejemplo vamos a implementar el código SQL para MySQL de la siguiente tabla que tenemos según el diagrama EER


Código SQL

El código resultante será el siguiente:

CREATE TABLE IF NOT EXISTS inquilinos (
  idinquilinos INT NOT NULL AUTO_INCREMENT,
  dni VARCHAR(8) NOT NULL,
  nombres VARCHAR(150) NOT NULL,
  paterno VARCHAR(150) NOT NULL,
  materno VARCHAR(150) NOT NULL,
  telefono VARCHAR(40) NULL,
  correo VARCHAR(200) NULL,
  deuda DECIMAL(10,2) NOT NULL,
  fecha_ingreso DATE NOT NULL,
  PRIMARY KEY (idinquilinos),
  UNIQUE INDEX dni_UNIQUE (dni ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


  • El campo "idinquilinos" sera "AUTO_INCREMENT", lo que significa que iniciará en 1 y cada registro que se inserte generará automáticamente un nuevo valor sin que necesitemos especificarlo. Al ser un dato numérico simple y no un código se obtiene mayor velocidad en consultas a la base de datos.
  • El campo "idinquilinos" sera "PRIMARY KEY", lo que implica que será la clave primaria es decir cada registro tendrá un único identificador que es este campo y nos servirá para realizar búsquedas o emplearlo como referencias para claves foráneas a otras tablas.
  • El campo "dni" es de tipo "UNIQUE", lo que implica que no se podrá repetir este valor en ningún registro de esta tabla.
  • ENGINE = InnoDB, nos garantiza que podremos utilizar claves foráneas y soporte del "commit" y "rollback"
  • DEFAULT CHARACTER SET = utf8; nos permite ingresar caracteres especiales como la "ñ" o vocales tildadas a nuestros registros.


Insertando datos de prueba

INSERT INTO inquilinos(dni, nombres, paterno, materno, 
telefono, fecha_ingreso, correo, deuda) VALUES 

('31378082','LUISA', 'PAUCAR','NARRO','999888777',
'2018-01-28','lpaucar@mail.com',0.00),

('43331042','AUGUSTO','SOTOMAYOR','NARVAJO','900800700',
'2019-10-08','asoto@mail.com',0.00);


lunes, 19 de agosto de 2019

Imágenes, sonidos, mapas y video en HTML5

Imágenes en HTML5

El uso de imágenes en HTML se realiza mediante la etiqueta "img", se establece las siguientes propiedades

  • Fuente: src=""
  • Alto: height=""
  • Ancho: width=""
  • Descripción: alt=""

Ejemplo:

<img src="https://www.blogger.com/img/blogger-logotype-color-black-1x.png"
     width="200" 
     height="50" 
     alt="logo de Blogger"/>

En este caso establecemos como fuente de la imagen el logo de Blogger mediante su URL que apunta a un archivo de imagen (pero se puede llamar archivos locales por ejemplo: src="img/foto.png"), un alto de 50px, ancho de 200 px y una descripción que indica que es el logo de Blooger y quedaría de la siguiente manera:

logo de Blogger

Nota: La descripción es muy importante hoy en día, pues permite que personas con cualquier dificultad visual mediante su navegador y las extensiones para estos casos les indiquen de que se trata aquella imagen que no puedan visualizar.



Sonidos en HTML5

El uso de sonidos mediante la etiqueta "audio" es sencillo y la interfaz viene por defecto en cada navegador que permite su uso. Tiene como atributos:
  • Controles: controls
  • Reproducción automática: autoplay
  • Repetición automática: loop
  • Pre-carga: preload, para archivos pesados, que puede tomar tres valores:
    • Primer caso: preload = "none", no se almacena en el Buffer el archivo.
    • Segundo caso: preload = "auto", almacena el archivo.
    • Tercer caso: preload = "metada", solo almacena metadatos.

Ejemplo:

<audio src="audio.ogg" controls autoplay loop>
   <p>Mensaje en caso no se pueda reproducir en un navegador</p>
</audio>

En este caso establecemos como fuente un archivo llamado audio.ogg con los controles, reproducción automática y repeticiones activadas.


Nota: Los formatos más comunes y soportados son ogg y mp3, pero no los únicos.



Mapas en HTML5

Su inserción es mucho más efectiva empleando servicios de terceros como Google Maps

Ejemplo:

<iframe src="https://www.google.com/maps/embed?
pb=!1m18!1m12!1m3!1d124130.9974978055!2d-72.00929001754207!3d-
13.529842657332434!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3
!1m2!1s0x916dd5d826598431%3A0x2aa996cc2318315d!2sCusco!5e0!3m2
!1ses-419!2spe!4v1566252558372!5m2!1ses-419!2spe" 
   width="600" height="450" frameborder="0" 
   style="border:0" allowfullscreen></iframe>

En este caso empleamos el servicio de Google Maps para la ciudad de Cusco:




Video en HTML5

Se pueden implementar mediante la etiqueta "video" o desde un servicio de terceros como YouTube

Ejemplos:

<video controls>
  <source src="mine.mp4" type="video/mp4">
</video>

En este caso establecemos como fuente un archivo llamado mine.mp4. Podemos emplear también Youtube.

Tablas en HTML5

La etiqueta <table>

Para la construcción de tablas en HTML se emplea el elemento HTML Table, dentro de este se crea la cabecera, el cuerpo y pie de tabla.
  • Cabecera: <thead>
  • Cuerpo: <tbody>
  • Pie: <tfoot>
Dentro de la cabecera de la tabla se colocan los <tr> que son las filas y dentro de estas filas las columnas de las cabeceras que son los <th>

Dentro del cuerpo y/o del pie de la tabla se colocan los <tr> que son las filas y dentro de estas filas las columnas que son los <td>, su puede optar por colocar <th> en el pie de la tabla

Modificaciones básicas

A la etiqueta Table se le agrega una propiedad que es "border" indicando el grosor del borde, si este se omite la tabla aparecerá sin borde.

Por ejemplo el siguiente código consideramos un borde de 1px:

<table border="1">
    <thead>
        <tr>
            <th>Titulo 1</th>
            <th>Titulo 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Cuerpo 1.1</td>
            <td>Cuerpo 2.1</td>
        </tr>
        <tr>
            <td>Cuerpo 1.2</td>
            <td>Cuerpo 2.2</td>
        </tr>
        <tr>
            <td>Cuerpo 3.2</td>
            <td>Cuerpo 3.2</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th>Pie 1</th>
            <th>Pie 2</th>
        </tr>
    </tfoot>
</table>


Generaría lo siguiente:

Titulo 1 Titulo 2
Cuerpo 1.1 Cuerpo 2.1
Cuerpo 1.2 Cuerpo 2.2
Cuerpo 3.2 Cuerpo 3.2
Pie 1 Pie 2

Se puede observar que el contenido de los <th> aparece centrado y en negrita, que es una característica de esta etiqueta.

Etiqueta <caption>

A la tabla también se le puede agregar un título general mediante la etiqueta <caption>

Por ejemplo el siguiente código consideramos un borde de 1px:
<table border="1">
    <caption>Título de la tabla</caption>
    <thead>
        <tr>
            <th>Titulo 1</th>
            <th>Titulo 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Cuerpo 1.1</td>
            <td>Cuerpo 2.1</td>
        </tr>
        <tr>
            <td>Cuerpo 1.2</td>
            <td>Cuerpo 2.2</td>
        </tr>
        <tr>
            <td>Cuerpo 3.2</td>
            <td>Cuerpo 3.2</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th>Pie 1</th>
            <th>Pie 2</th>
        </tr>
    </tfoot>
</table>


Generaría lo siguiente:

Título de la tabla
Titulo 1 Titulo 2
Cuerpo 1.1 Cuerpo 2.1
Cuerpo 1.2 Cuerpo 2.2
Cuerpo 3.2 Cuerpo 3.2
Pie 1 Pie 2

La propiedad colspan

Mediante esta propiedad una columna puede ocupar el espacio de más de 1 columna.

Por ejemplo el siguiente código consideramos un borde de 1px:

<table border="1">
    <caption>Título de la tabla</caption>
    <thead>
        <tr>
            <th>Titulo 1</th>
            <th>Titulo 2</th>
            <th>Titulo 3</th>
            <th>Titulo 4</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Cuerpo 1.1</td>
            <td>Cuerpo 2.1</td>
            <td colspan="2">Cuerpo 3</td>
        </tr>
        <tr>
            <td colspan="4">Cuerpo 2.1</td>
        </tr>
        <tr>
            <td>Cuerpo 3.1</td>
            <td colspan="3">Cuerpo 3.2</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th colspan="2">Pie 1</th>
            <th colspan="2">Pie 2</th>
        </tr>
    </tfoot>
</table>


Generaría lo siguiente:

Título de la tabla
Titulo 1 Titulo 2 Titulo 3 Titulo 4
Cuerpo 1.1 Cuerpo 2.1 Cuerpo 3
Cuerpo 2.1
Cuerpo 3.1 Cuerpo 3.2
Pie 1 Pie 2

domingo, 18 de agosto de 2019

Caracteres especiales en HTML

Tabla de caracteres especiales en HTML



Nombre Símbolo Código
Signo ampersand & &amp;
Comillas dobles " &quot;
Signo "menor que" < &lt;
Signo "mayor que" > &gt;
Espacio en blanco &nbsp;
Apertura de exclamación ¡ &iexcl;
Apertura de interrogación ¿ &iquest;
Signo del centavo ¢ &cent;
Signo de la Libra Esterlina £ &pound;
Signo de divisa general ¤ &curren;
Signo de Yen ¥ &yen;
Barra vertical dividida ¦ &brvbar;
Signo de sección § &sect;
Diéresis ¨ &uml;
Signo de copyright © &copy;
Indicador ordinal femenino ª &ordf;
Indicador ordinal masculino º &ordm;
Comillas angulares de apertura « &laquo;
Comillas angulares de cierre » &raquo;
Signo de negación (angular) ¬ &not;
Signo de registrado ® &reg;
Raya superior ¯ &macr;
Signo de grado ° &deg;
Signo de más o menos ± &plusmm;
Superíndice uno ¹ &sup1;
Superíndice dos - cuadrado ² &sup2;
Superíndice tres - cubo ³ &sup3;
Acento agudo ´ &acute;
Signo de micro µ &micro;
Signo de fin de párrafo &para;
Punto medio · &middot;
Cedilla ¸ &cedil;
Un cuarto ¼ &frac14;
Un medio ½ &frac12;
Tres cuartos ¾ &frac34;
A mayúscula con acento grave À &Agrave;
A minúscula con acento grave à &agrave;
A mayúscula con acento agudo (tilde) Á &Aacute;
A minúscula con acento agudo (tilde) á &aacute;
A mayúscula con acento circunflejo  &Acirc;
A minúscula con acento circunflejo â &acirc;
A mayúscula con virgulilla à &Atilde;
A minúscula con virgulilla ã &atilde;
A mayúscula con diéresis Ä &Auml;
A minúscula con diéresis ä &auml;
A mayúscula con anillo Å &Aring;
A minúscula con anillo å &aring;
E mayúscula con acento grave È &Egrave;
E minúscula con acento grave è &egrave;
E mayúscula con acento agudo (tilde) É &Eacute;
E minúscula con acento agudo (tilde) é &eacute;
E mayúscula con acento circunflejo Ê &Ecirc;
E minúscula con acento circunflejo ê &ecirc;
E mayúscula con diéresis Ë &Euml;
E minúscula con diéresis ë &euml;
I mayúscula con acento grave Ì &Igrave;
I minúscula con acento grave ì &igrave;
I mayúscula con acento agudo (tilde) Í &Iacute;
I minúscula con acento agudo (tilde) í &iacute;
I mayúscula con acento circunflejo Î &Icirc;
I minúscula con acento circunflejo î &icirc;
I mayúscula con virgulilla Ĩ &Itilde;
I minúscula con virgulilla ĩ &itilde;
I mayúscula con diéresis Ï &Iuml;
I minúscula con diéresis ï &iuml;
O mayúscula con acento grave Ò &Ograve;
O minúscula con acento grave ò &ograve;
O mayúscula con acento agudo (tilde) Ó &Oacute;
O minúscula con acento agudo (tilde) ó &oacute;
O mayúscula con acento circunflejo Ô &Ocirc;
O minúscula con acento circunflejo ô &ocirc;
O mayúscula con virgulilla Õ &Otilde;
O minúscula con virgulilla õ &otilde;
O mayúscula con barra inclinada Ø &Oslash;
O minúscula con barra inclinada ø &oslash;
O mayúscula con diéresis Ö &Ouml;
O minúscula con diéresis ö &ouml;
U mayúscula con acento grave Ù &Ugrave;
U minúscula con acento grave ù &ugrave;
U mayúscula con acento agudo (tilde) Ú &Uacute;
U minúscula con acento agudo (tilde) ú &uacute;
U mayúscula con acento circunflejo Û &Ucirc;
U minúscula con acento circunflejo û &ucirc;
U mayúscula con diéresis Ü &Uuml;
U minúscula con diéresis ü &uuml;
Diptongo AE mayúscula Æ &AElig;
Diptongo AE minúscula æ &aelig;
C mayúscula con cedilla Ç &Ccedil;
C minúscula con cedilla ç &ccedil;
Ñ mayúscula Ñ &Ntilde;
Ñ minúscula ñ &ntilde;

viernes, 12 de julio de 2019

Login PHP y MySQL - contraseña encriptada

Base de datos

Creamos una base de datos (blog) y una tabla para almacenar el usuario y otra tabla relacionada llamada tipos_usuario cada uno con sus respectivos campos, entre ellos a la clave (en este caso se puede emplear MySQL o MariaBD).

-- -----------------------------------------------------
-- Tabla tipos_usuario
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS tipos_usuario (
  id INT NOT NULL AUTO_INCREMENT,
  nombre VARCHAR(30) NOT NULL,
  descripcion TEXT NULL,
  PRIMARY KEY (id)
)ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

-- -----------------------------------------------------
-- Tabla usuarios
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS usuarios (
  id INT NOT NULL AUTO_INCREMENT,
  dni VARCHAR(16) NOT NULL UNIQUE,
  nombres VARCHAR(150) NOT NULL,
  paterno VARCHAR(100) NOT NULL,
  materno VARCHAR(45) NOT NULL,
  correo VARCHAR(150) NOT NULL UNIQUE,
  clave BLOB NOT NULL,
  tipo INT NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT fk_usuario_tipo
    FOREIGN KEY (tipo)
    REFERENCES tipos_usuario (id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

-- -----------------------------------------------------
-- Insertando datos de inicialización
-- -----------------------------------------------------
INSERT INTO tipos_usuario(nombre) VALUES ("ADMINISTRADOR");

INSERT INTO usuarios(dni, nombres, paterno, materno, correo, clave, tipo)
       VALUES ('10101010','PAUL', 'GARCIA', 'MATTOS', 
       'paul@example.com', AES_ENCRYPT('2022','2022'), 1);

-- Recuperando el usuario
SELECT * FROM usuarios 
 	WHERE AES_DECRYPT(clave, '2022') = '2022';

-- Recuperando la clave
SELECT AES_DECRYPT(clave, '2022') AS clave FROM usuarios;

Archivos de conexión y configuración

Definimos los parámetros de la conexión a MySQL en el archivo config.php

<?php
date_default_timezone_set("America/Lima");
define("HOST", "localhost");
define("USUARIO", "root");    # Usuario root
define("CLAVE", "");          # Sin contraseña
define("BASE_DATOS", "blog"); # Nombre de la base de datos
define("PUERTO", "3306");     # 3306 - MySQL, 3307 - MariaBD
?>

Creamos el archivo que contiene las funciones de conexión desconexión y consultas a la base de datos conexion.php

<?php
include_once ("config.php");
$cnx = "";

# Conexión a la Base de Datos
function conectar() {
    global $cnx;
    $cnx = mysqli_connect(HOST,USUARIO,CLAVE,
           BASE_DATOS, PUERTO);
    mysqli_query($cnx, "set names utf8");
}

# Liberar la conexion con la base de datos
function desconectar() {
    global $cnx;
    mysqli_close($cnx);
}

# Ejecutar "SELECT"
function consultar($sql) {
    global $cnx;
    $result = mysqli_query($cnx, $sql);
    $salida = array();
    while ($fila = mysqli_fetch_assoc($result)) {
        $salida[] = $fila;
    }
    mysqli_free_result($result);
    unset($fila);
    return $salida;
}
?>

Formulario HTML

Creamos un formulario HTML para hacer las pruebas que llamaremos login.html en el que se verificará que el DNI y la clave coinciden. Sin embargo, se puede reemplazar DNI por correo, ya que ambos son de tipo UNIQUE en la base de datos

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Login con PHP y MySQL</title>
    </head>
    <body>
        <form method="post" action="login_procesar.php">
            DNI: <input type="text" name="txtDni"><br />
            Clave: <input type="password" name="txtClave"><br />
            <input type="submit" value="Ingresar">
        </form>           
    </body>
</html>

Documento PHP de validación

El documento PHP que valida el DNI y contraseña ingresado en el formulario llamado login_procesar.php

<?php
include_once('conexion.php');

$dni = $_POST['txtDni'];
$pass = $_POST['txtClave'];

$sql = "SELECT * FROM usuarios WHERE dni = '$dni' AND "
        . "AES_DECRYPT(clave, '$pass') = '$pass';";

conectar();
$registro = consultar($sql);
desconectar();

if (count($registro) == 1) {
    var_dump($registro[0]);
    echo "Acceso concedido";
    // header('location:  intranet.php');
} else {
    echo "Error en acceso";
    // header('location:  error.php');
}
?>

Para realizar el proceso de login se debe llamar a la página http://localhost/blog/login y colocar las credenciales indicadas. El resultado en pantalla si las credenciales son correcta debe ser algo similar a:

D:\wamp64\www\blog\login_procesar.php:15:
array (size=8)
  'id' => string '1' (length=1)
  'dni' => string '10101010' (length=8)
  'nombres' => string 'PAUL' (length=4)
  'paterno' => string 'GARCIA' (length=6)
  'materno' => string 'MATTOS' (length=6)
  'correo' => string 'paul@example.com' (length=16)
  'clave' => string 'YC�Ft��l�L�6�a�' (length=16)
  'tipo' => string '1' (length=1)
  
Acceso concedido

Estructura del proyecto

sábado, 29 de junio de 2019

Correo con PHP (SENDMAIL y WAMP)

Correo con php

Cómo hacerlo de manera sencilla:

  • Primero de qué dominio vienes (ejemplo: hotmail.com)
  • Cuál es el dns, que lleva a la ip (ejemplo: 127.0.0.1)
  • Este control puede marcar el correo como SPAM, por no pasar estas reglas de control
  • Con un dominio válido, se puede pasar los controles


Otra forma es encajonando el php con un dominio de correo (ejemplo: gmail, outlook)

En XAMPP, algunos WAMP, existe la carpeta sendmail. Que es un producto con dll y ejecutables, se puede descargar de internet y configurarlo en WAMP o XAMPP a la vez, en caso no venga instalado.

Descargarlo de sendmail.exe: https://www.glob.com.au/sendmail/

SENDMAIL

Una vez descargado se encontrarán los siguientes archivos:



Los dll y archivos de configuración mínimos necesarios para correr SENDMAIL en WAMP son:



Configuración

En php.ini

Cambiar las líneas:
SMTP = localhost
smtp_port = 25
sendmail_from ="admin@wampserver.invalid"
; sendmail_path =

Por:
; SMTP = localhost
; smtp_port = 25
; sendmail_from ="admin@wampserver.invalid"
sendmail_path = "E:/wamp64/sendmail/sendmail.exe - t"

La ruta: "E:/wamp64/sendmail/sendmail.exe - t" dependerá de donde se descomprimió el SENDMAIL.

En sendmail.ini

Cambiar las líneas:
smtp_server=mail.mydomain.com
smtp_port=25
; default_domain=
auth_username= 
auth_password=
force_sender=

Por:
smtp_server=smtp.gmail.com
smtp_port=587
default_domain=localhost
auth_username=correo@dom.com 
auth_password=contraseña
force_sender=correo@dom.com

Guardar los archivos modificados y reiniciar el WAMP

Prueba


Crear el siguiente archivo (correo.php) y ejecutarlo:
<?php
$destino="tu_correo@dom.com";
$titulo="Prueba de correo";
$mensaje="Este el el mensaje de prueba";

$x = mail($destino, $titulo, $mensaje);
if($x==1){
    echo "Mensaje enviado";
} else {
    echo "Error al enviar";
}

Puede ser que no se envíe el correo, llegará al correo (que se configuró en el SENDMAIL) el siguiente mensaje:

Permitir que envíe y funcionará

jueves, 27 de junio de 2019

Grabar y mostrar imágenes con PHP y MySQL


El presente tutorial nos mostrará como almacenar imágenes en MySQL utilizando PHP

Herramientas usadas

  • WAMP - Versión 3.1.7
  • Apache - Versión 2.4.37
  • PHP - Versión 7.3.1
  • MySQL - Versión 5.7.24
  • MariaBD - Versión 10.3.12
Se puede utilizar MySQL o MariaBD, simplemente cambiar el puerto 3306 del MySQL por el 3307 de MariaBD.

Base de datos utilizada

-- TABLA ESTADO 
CREATE TABLE estado ( 
   id INT NOT NULL AUTO_INCREMENT ,
   nombres VARCHAR(100) NOT NULL ,
   PRIMARY KEY (id)
)ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;
/* DATOS DE INICIO */
INSERT INTO estado(nombres) VALUES 
   ('soltero'), 
   ('casado'), 
   ('divorciado'), 
   ('viudo')

-- TABLA PERSONAS 
CREATE TABLE personas ( 
   id INT NOT NULL AUTO_INCREMENT ,
   paterno VARCHAR(150) NOT NULL , 
   materno VARCHAR(150) NOT NULL , 
   nombres VARCHAR(100) NOT NULL , 
   estado INT NOT NULL ,
   foto MEDIUMBLOB NULL , 
   fecha_nacimiento DATE NOT NULL , 
   PRIMARY KEY (id),                 /* CLAVE PRIMARIA */
   CONSTRAINT fk_estado              /* CLAVE FORÁNEA  */
      FOREIGN KEY (estado)
      REFERENCES estado (id)
      ON DELETE NO ACTION
      ON UPDATE NO ACTION
)ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;

-- DATOS DE PRUEBA
INSERT INTO personas(paterno, nombres, materno, 
                     estado, fecha_nacimiento) VALUES
   ('Flores','Lucero','Diaz',1 ,'2000-06-05'),
   ('Mesa','Flor','Ochoa',4 ,'1990-01-01'),
   ('Vela','Mario','Roca',2 ,'1985-12-15'),
   ('Ruiz','Pedro','Gamboa',3 ,'2002-02-24')

--VISTA A DETALLE
CREATE VIEW personas_detalle AS
SELECT personas.id id, personas.paterno paterno, 
       personas.materno materno, personas.nombres nombres,
       estado.nombres estado ,personas.foto foto, 
       personas.fecha_nacimiento fecha_nacimiento
FROM personas INNER JOIN estado ON personas.estado = estado.id


Creando el archivo de configuración

Creamos el documento: config.php
<?php
date_default_timezone_set("America/Lima");
define("DB_HOST", "localhost");
define("DB_USER", "root");   # Usuario root
define("DB_PASSWORD", "");   # Sin contraseña
define("DB_NAME", "blog");   # Nombre de la base de datos
define("DB_PORT", "3306");   # Puerto 3306 - MySQL, 3307 - MariaBD


Creando la conexión y funciones básicas

Existen dos formas, de crear el archivo de conexión:
  • Mediante un archivo simple de conexión
  • Mediante una clase
Y existen dos formas de realizar la conexión:
  • Usando mysqli
  • Usando PDO
En este caso haremos el más sencillo que es un archivo simple y mysqli
Creamos un archivo llamado: biblioteca_mysql.php

<?php
include_once('config.php');
$cnx = '';

/**
 * Función para Conectarse a la base de datos
 */
function bd_conectar() {
    global $cnx;
    $cnx = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);
    mysqli_query($cnx, "set names utf8");
}

/**
 * Función para desconectarse de la base de datos
 */
function bd_desconectar() {
    global $cnx;
    mysqli_close($cnx);
}

/**
 * Función para realizar consultas (SELECT) a la base de datos
 */
function bd_consultar($sql) {
    global $cnx;
    $bolsa = mysqli_query($cnx, $sql);
    $salida = array();
    if ($bolsa != null) {
        while ($row = mysqli_fetch_assoc($bolsa)) {
            $salida[] = $row;
        }
        mysqli_free_result($bolsa);
    } else {
        $salida = false;
    }
    unset($row);
    return $salida;
}

/**
 * Función para ejecuciones INSERT, UPDATE o DELETE a la base de datos
 */
function bd_ejecutar($sql) {
    global $cnx;
    $exito = mysqli_query($cnx, $sql);
    if ($exito) {
        return true;
    } else {
        return false;
    }
}


Función para cargar la imagen

Creamos un archivo que permite insertar y editar registros: editar_grabar.php


<?php
include_once 'biblioteca_mysql.php';
$id = $_POST['txtid'];
$pat = $_POST['txtpat'];
$mat = $_POST['txtmat'];
$nom = $_POST['txtnom'];
$fec = $_POST['txtcum'];
$est = $_POST['cboestado'];

$existFoto = false;

if (file_exists($_FILES['foto']['tmp_name'])) {
    #Extraemos el contenido de la imagen
    $fp = fopen($_FILES['foto']['tmp_name'], 'rb');
    $imagen = fread($fp, filesize($_FILES['foto']['tmp_name']));
    $imagen = addslashes($imagen);
    fclose($fp); #Cerramos imagen
    $existFoto = true;
}

if ($_POST['txtid'] == '') {
    $sql = "INSERT INTO personas (paterno, materno, nombres, estado";
    $sql .= ($existFoto) ? ", foto" : "";
    $sql .= ", fecha_nacimiento) values('$pat','$mat','$nom','$est'";
    $sql .= ($existFoto) ? ", '$imagen'" : "";
    $sql .= ",'$fec ')";
} else {
    $id = $_POST['txtid'];
    $sql = "UPDATE personas SET paterno = '$pat', materno = '$mat',";
    $sql .= " nombres = '$nom', fecha_nacimiento = '$fec', ";
    $sql .= "estado = $est";
    $sql .= ($existFoto) ? ", foto = '$imagen'" : "";
    $sql .= " WHERE id = $id";
}

unset($existFoto);

bd_conectar();
if (bd_ejecutar($sql)) {
 bd_desconectar();
 header('location: index.php');
} else {
 echo "Error al procesar el registro:<br/>";    
 echo '<a href="index.php">Regresar</a>';
 bd_desconectar();
}


Función para mostrar la imagen

Agregamos la función bd_ejecutar al archivo llamado: mostrar_imagen.php


<?php
include_once 'biblioteca_mysql.php';
$id=$_GET['id'];
bd_conectar();
$sql="SELECT foto FROM personas WHERE id='$id'";
$rpta=mysqli_query($cnx,$sql);
$pers=mysqli_fetch_assoc($rpta);
header("Content-type: image/png");
echo $pers['foto'];
bd_desconectar();


Creando una interfaz (Tablas y formularios)

Creamos un archivo llamado: personas.php
Aquí llamamos al documento PHP que contiene las funciones de conexión y para ejecutar sentencias SQL, recorriendola mediante un FOREACH en una tabla.

<?php
include_once 'biblioteca_mysql.php';
$sql = "SELECT * FROM personas_detalle";
bd_conectar();
$registros = bd_consultar($sql);
bd_desconectar();
?>
<!DOCTYPE html>
<html>
<head>
    <title>Reporte de inscritos</title>
</head>
<body><br/><br/>
<a class="boton" href="nuevo_formulario.html">Nuevo Registro</a><br/>
<table>
    <caption><b>Reporte de Personas</b></caption>
    <thead>
        <th>ID</th>
        <th>APELLIDO PATERNO</th>
        <th>APELLIDO MATERNO</th>
        <th>NOMBRES</th>
        <th>CUMPLEAÑOS</th>
        <th>ESTADO CIVIL</th>
        <th>FOTO</th>
        <th>ACCIONES</th>
    </thead>
    <tbody>
        <?php foreach ($registros as $persona) {?>
        <tr> 
          <td><?= $persona['id'] ?></td>
          <td><?= $persona['paterno'] ?></td>
          <td><?= $persona['materno'] ?></td>
          <td><?= $persona['nombres'] ?></td>
          <td><?= $persona['fecha_nacimiento'] ?></td>
          <td><?= strtoupper($persona['estado']) ?></td>
          <td>
            <img 
                src="mostrar_imagen.php?id=<?= $persona['id']; ?>"
            height="50"/>
          </td>
          <td>
            <a href="editar_formulario.php?id=<?= $persona['id'] ?>">
               EDITAR
            </a>
            <a href="borrar.php?id=<?= $persona['id'] ?>" 
               onclick="return confirm('¿Deseas borrar el registro?')">
               BORRAR
            </a>
          </td>
        </tr>
        <?php } ?>
    </tbody>
</table><br/>
</body>
</html>


Creamos un archivo llamado: editar_formulario.php

<?php
include_once 'biblioteca_mysql.php';
$rotulo = "AGREGAR";
if (isset($_GET['id'])){
 $id = $_GET['id'];$sql = "SELECT * FROM personas WHERE id = $id";
 $rotulo = "MODIFICAR"; 
 bd_conectar();
 $registros = bd_consultar($sql);
 $persona = $registros[0];
 unset($registros);
 bd_desconectar();
}else {
    $persona = null;
}
?>
<!DOCTYPE html>
<html>
<head>
    <title><?= $rotulo ?> PERSONA</title>
</head>
<body>
<form enctype="multipart/form-data" name="formulario_grabar_editar" 
         method="POST" action="editar_grabar.php">
    <input type="text" name="txtid"  value="<?= $persona['id']?>" 
           hidden="hidden" readonly="readonly"><br/>
    Apellido paterno:<br/>
 <input type="text" name="txtpat" value="<?= $persona['paterno']?>"
           placeholder="Ingrese su apellido paterno" maxlength="25"><br/>
    <br/>Apellido materno:<br/>
 <input type="text" name="txtmat" value="<?= $persona['materno']?>"
           placeholder="Ingrese su apellido materno" maxlength="25"><br/>
    <br/>Nombres:<br/>
 <input type="text" name="txtnom" value="<?= $persona['nombres']?>"
           placeholder="Ingrese sus nombres" maxlength="25"><br/>
    <br/>Fecha de nacimiento:<br/>
 <input type="date" name="txtcum" value="<?= $persona['fecha_nacimiento']?>"
           placeholder="Ingrese su fecha de nac."><br/>
    <br/>Seleccionar estado civil: 
    <select name="cboestado">
        <option>Seleccione</option>  
        <option value="1" <?=$persona['estado']==1 ? 'selected' : '' ?> >
                   Soltero</option>
        <option value="2" <?=$persona['estado']==2 ? 'selected' : '' ?> >
                   Casado</option>
        <option value="3" <?=$persona['estado']==3 ? 'selected' : '' ?> >
                   Divorciado</option>
        <option value="4" <?=$persona['estado']==4 ? 'selected' : '' ?> >
                   Viudo</option>
  
    </select><br/>    
    Foto:<input type="file" name="foto">
    <br/><br/>
    <input type="submit" name="btnGrabar" value="<?= $rotulo ?>">
</form>
</body>
</html>



Resultado

Página Index

Lo ideal es subir las imágenes al servidor y almacenar la URL en la base de datos, pero en caso de imágenes de alto valor o muy "sensibles". Se puede optar por almacenar dicha imagen u otro tipo de archivo como un instalador en la base de datos.


lunes, 24 de junio de 2019

CRUD con PHP y MySQL

Herramientas usadas

  • WAMP - Versión 3.1.7
  • Apache - Versión 2.4.37
  • PHP - Versión 7.3.1
  • MySQL - Versión 5.7.24
  • MariaBD - Versión 10.3.12
Se puede utilizar MySQL o MariaBD, simplemente cambiar el puerto 3306 del MySQL por el 3307 de MariaBD.

Base de datos utilizada

/* TABLA USUARIOS */
CREATE TABLE usuarios ( 
   id INT NOT NULL AUTO_INCREMENT , 
   dni CHAR(8) NOT NULL , 
   nombres VARCHAR(100) NOT NULL , 
   apellidos VARCHAR(150) NOT NULL , 
   fecha_nacimiento DATE NOT NULL , 
   PRIMARY KEY (id), 
   UNIQUE uq_dni (dni)
)ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;

/* DATOS DE PRUEBA */
INSERT INTO usuarios( dni, nombres, apellidos, fecha_nacimiento) VALUES 
('45115544','Lucero','Flores Diaz','2000-06-05'),
('22455544','Flor','Mesa ochoa','1990-01-01'),
('49814422','Mario','Vela Roca','1985-12-15'),
('77115004','Pedro','Ruiz Gamboa','2002-02-24')


Creando el archivo de configuración

Creamos el documento: config.php
<?php
date_default_timezone_set("America/Lima");
define("DB_HOST", "localhost");
define("DB_USER", "root");   # Usuario root
define("DB_PASSWORD", "");   # Sin contraseña
define("DB_NAME", "blog");   # Nombre de la base de datos
define("DB_PORT", "3306");   # Puerto 3306 - MySQL, 3307 - MariaBD


Creando la conexión

Existen dos formas, de crear el archivo de conexión:
  • Mediante un archivo simple de conexión
  • Mediante una clase
Y existen dos formas de realizar la conexión:
  • Usando mysqli
  • Usando PDO
En este caso haremos el más sencillo que es un archivo simple y mysqli
Creamos un archivo llamado: lib_mysql.php

<?php
include_once('config.php');
$cnx = '';

/**
 * Función para Conectarse a la base de datos
 */
function bd_conectar() {
    global $cnx;
    $cnx = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);
    mysqli_query($cnx, "set names utf8");
}

/**
 * Función para desconectarse de la base de datos
 */
function bd_desconectar() {
    global $cnx;
    mysqli_close($cnx);
}


Funciones CRUD

  • C - Create - INSERT
  • R - Read - SELECT
  • U - Update - UPDATE
  • D - Delete - DELETE


Leer Registros (SELECT)

Agregamos la función bd_consultar al archivo llamado: lib_mysql.php
/**
 * Función para realizar consultas (SELECT) a la base de datos
 */
function bd_consultar($sql) {
    global $cnx;
    $bolsa = mysqli_query($cnx, $sql);
    $salida = array();
    if ($bolsa != null) {
        while ($row = mysqli_fetch_assoc($bolsa)) {
            $salida[] = $row;
        }
        mysqli_free_result($bolsa);
    } else {
        $salida = false;
    }
    unset($row);
    return $salida;
}


Crear, actualizar y eliminar registros (INSERT, UPDATE, DELETE)

Agregamos la función bd_ejecutar al archivo llamado: lib_mysql.php
/**
 * Función para ejecuciones UPDATE o DELETE a la base de datos
 */
function bd_ejecutar($sql) {
    global $cnx;
    $exito = mysqli_query($cnx, $sql);
    if ($exito) {
        return true;
    } else {
        return false;
    }
}


Creando una interfaz (Tablas y formularios)

Creamos un archivo llamado: index.php
Aquí llamamos al documento PHP que contiene las funciones de conexión y para ejecutar sentencias SQL, recorriendola mediante un FOREACH en una tabla.

<?php
include_once 'lib_mysql.php';

try {
    bd_conectar();
} catch (Exception $e) {
    die($e->getMessage());
}
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>CRUD con PHP y MySQL</title>
  </head>
  <body>
    <a href="modificar.php">Nuevo Registro</a>
    <table border="1" style="border-collapse: collapse; width: 100%;">
      <thead>
        <th>DNI</th>
        <th>NOMBRES</th>
        <th>APELLIDOS</th>
        <th>FECHA DE NACIMIENTO</th>
        <th colspan="2">ACCIONES</th>
      </thead>
      <tbody>
        <?php
        $registros = bd_consultar("SELECT * FROM usuarios");
        if (!$registros) {
            ?>
           <tr> 
             <td colspan="6"><?= "No hay registros" ?></td>
           </tr> 
           <?php
           } else {
             foreach ($registros as $persona) {
           ?>
              <tr> 
                <td style="text-align: center"><?= $persona['dni'] ?></td>
                <td><?= $persona['nombres'] ?></td>
                <td><?= $persona['apellidos'] ?></td>
                <td style="text-align: center">
                  <?= $persona['fecha_nacimiento'] ?>
                </td>
                <td style="text-align: center">
                  <a href="modificar.php?id=<?= $persona['id'] ?>">
                    Editar</a>      
                </td>
                <td style="text-align: center">
                  <a href="eliminar.php?id=<?= $persona['id'] ?>"
                  onclick="return confirm('¿Seguro que deseas eliminar?');">
                    Borrar</a> 
                </td>
              </tr>
              <?php
                }
            }
            bd_desconectar()
            ?>
    </tbody>
  </table>
</body>
</html>


Creamos un archivo llamado: modificar.php

<?php
include_once 'lib_mysql.php';
$rotulo = "AGREGAR";
if (isset($_GET['id'])){
 $id = $_GET['id'];
 $sql = "SELECT * FROM usuarios WHERE id = $id";
 $rotulo = "MODIFICAR"; 
 bd_conectar();
 $registros = bd_consultar($sql);
 $persona = $registros[0];
 unset($registros);
 bd_desconectar();
}else {
    $persona = null;
}
?>
<!DOCTYPE html>
<html>
<head>
    <title><?= $rotulo ?> USUARIOS</title>
</head>
<body>
   <h1><?= $rotulo ?> USUARIOS</h1>
   <form name="InsUpd" method="POST" action="editar_grabar.php">
 <input type="text" name="txtId"  value="<?= $persona['id']?>"
        hidden="hidden"/>
 DNI:<br/>
 <input type="text" name="txtDni" value="<?= $persona['dni']?>"
 placeholder="Ingrese su DNI" required="required"/><br/>
 <br/>Apellidos:<br/>
 <input type="text" name="txtApe" value="<?= $persona['apellidos']?>"
 placeholder="Ingrese sus apellidos" required="required"/><br/>
 <br/>Nombres:<br/>
 <input type="text" name="txtNom" value="<?= $persona['nombres']?>"
 placeholder="Ingrese sus nombres" required="required"/><br/>
 <br/>Fecha de nacimiento:<br/>
 <input type="date" name="txtFec" 
        value="<?= $persona['fecha_nacimiento']?>" required="required"/>
        <br/><br/>
 <br/><input type="submit" name="btnGrabar" value="<?= $rotulo ?>">
   </form>
</body>
</html>


Creamos un archivo llamado: editar_grabar.php para enviar la información a la base de datos

<?php
include_once 'lib_mysql.php';
$dni = $_POST['txtDni'];
$apellidos = $_POST['txtApe'];
$nombres = $_POST['txtNom'];
$fecha = $_POST['txtFec'];

if ( $_POST['txtId'] == '' ) {
  $sql = "INSERT INTO usuarios (dni, nombres, apellidos, fecha_nacimiento)";
  $sql .= "values('$dni','$nombres','$apellidos','$fecha')";
} else { 
  $id = $_POST['txtId'];
  $sql = "UPDATE usuarios SET dni = '$dni', nombres = '$nombres',"
  . " apellidos = '$apellidos', fecha_nacimiento = '$fecha' WHERE id = $id";
}
bd_conectar();
if (bd_ejecutar($sql)) {
   bd_desconectar();
   header('location: index.php');
} else {
   echo "Error al procesar el registro:<br/>";    
   echo '<a href="index.php">Regresar</a>';
   bd_desconectar();
}


Creamos un archivo llamado: eliminar.php

<?php
include_once 'lib_mysql.php';
$id = $_GET['id'];
$sql = "DELETE FROM usuarios WHERE id = $id";
bd_conectar();
if (bd_ejecutar($sql)){
    header('location: index.php');
} else{
    echo "Error al eliminar el registro:<br/>";
    echo '<a href="index.php">Regresar</a>';
}

Resultado

Página Index

Estructura de archivos


miércoles, 5 de junio de 2019

Instalación de WAMP

WAMP

Es una colección de programas para Microsoft Windows, incluye:
  • Apache
  • MySql - MariaBD
  • Php

¿Cómo funciona la magia?

Apache recibe archivos .php, los entrega como se los envían, para que se puede ejecutar el código, el servidor debe tener instalado PHP, de manera que el compilador lo procesa y se lo entrega a APACHE para que devuelva HTML en lugar de código PHP.


La instalación de WAMP


Descarga WAMP desde su página oficial: clic

Antes de iniciar la instalación o si ya lo hiciste, te informará que debes estar actualizado en los Runtimes, inclusive te mostrará los enlaces oficiales de descarga de estos.



Una vez actualizados todos los Runtimes se procede con la instalación en un directorio de raiz, es decir debe estar dentro de una de las unidades de la computadora y no dentro de una carpeta como "Archivos de programas"

Ya estaría instalado WAMP


Iniciar WAMP

Simplemente se busca el ejecutable del WAMP o doble clic en el icono del escritorio.

Luego WAMP comenzará a iniciar sus servicios, cargará el APACHE, PHP y MySQL con MariaBD y sus colores en el icono de la parte inferior derecha de la pantalla iran cambiando sus colores entre rojo (sin servicios activos), naranja (algunos servicios activos) y verde (todos los servicios activos).

Para comprobar su funcionamiento se debe ingresar "localhost" en la barra de direcciones del navegador


Cambiar el puerto por defecto si este está ocupado

No siempre cargarán todos los servicios y la causa más probable es que los puertos que deseemos usar estén ocupados. Por ejemplo, Apache usa el puerto 80, MySQL usa el 3306 y MariaBD el 3307, pero Skype, IIS, Teamviewer, reporting service (SQL server) también utilizan el puerto 80. Si esto sucede se debe modificar en el archivo de configuración del Apache colocándolo en un puerto libre.

Debemos verificar los puertos usado en la computadora:
  1. Ingresar al CMD como administrador
  2. Ingresar netstat -nab | more
  3. Verificar el puerto 80
  4. Si este puerto está ocupado se debe modificar el archivo de configuración del Apache




Modificar en el archivo httpd.conf las líneas:

#Listen 12.34.56.78:80
Listen 0.0.0.0:80
Listen [::0]:80

Por:

#Listen 12.34.56.78:80
Listen 0.0.0.0:85
Listen [::0]:85

Guardar el archivo y reiniciar todos los servicios, luego al ingresar desde el navegador colocar "localhost:85"


Nota: si en lugar de 85 se uso otro número de puerto como 86 u 83 en el archivo de configuración del Apache, colocar en el navegador "localhost:86" o "localhost:83" según corresponda.

¿Quieres verlo en vídeo?


🙈🙉🙊

viernes, 31 de mayo de 2019

Operadores aritméticos y logicos en PHP

Operadores aritméticos

Los operadores aritméticos son:

Operación Operador en PHP Ejemplo
Adición + 10 + 2 = 12
Sustracción - 10 - 2 = 8
Multiplicación * 10 * 2 = 20
División / 10 / 2 = 5
Potencia ** 10 ** 2 = 100

Ejemplo en código:
<?php
#Adición
$suma = 2 + 4 ;
var_dump($suma) ;

#Sustracción
$resta = 2 - 4 ;
var_dump($resta) ;

#Multiplicación
$producto = 2 * 4 ;
var_dump($producto) ;

#División
$cociente = 2 / 4 ;
var_dump($cociente) ;

#Potencia
$potencia = 2 ** 4 ;
var_dump($potencia) ;
?>

Operadores lógicos


Los operadores lógicos de PHP son

Operador Operador en PHP Ejemplo
Conjunción ( y ) && true && true == true
true && false == false
false && true == false
false && false == false
Disyunción ( o ) ||
true || true == true
true || false == true
false || true == true
false || false == false
Negación ( no ) ! ! true == false
! false == true


Además, las comparaciones numéricas

Operador Operador en PHP Ejemplo
Mayor >12 > 10 (true)
20 > 30 (false)
Mayor o igual >= 12 >= 12 (true)
12 >= 10 (true)
Menor <2 < 10 (true)
12 < 10 (false)
Menor o igual <=2 <= 10 (true)
10 <= 10 (true)
Igual == "hola" ==  "hola" (true)
12 == 10 (false)
Diferente !=12 != 10 (verdadero)
12 != 12 (false)


Ejemplo en código:
<?php
#Saber si un número es menor de 100 y mayor o igual de 10
if ($num >=10 && $num < 100) {
   echo "Cumple la condición" ;
}
?>

miércoles, 22 de mayo de 2019

Creación de un Menú con responsive design usando HTML + CSS + JS

Se empleará la librería de JQuery para generar el siguiente menú responsivo:

Código HTML

Se construye un menú con los diversos elementos de HTML como "nav", "ul" y "li".


<!DOCTYPE html>
<html>
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta name="author" content="Jhon Paul">
   <title>Menú</title>
   <!-- CSS -->
   <link rel="stylesheet" href="menu.css">
   <!-- JS -->
   <script 
     src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js">
   </script>
   <script src="menu.js"></script> 
 </head>
 <body style="font-family: calibri, arial;">
   <div class="menu">
 <div class="menu_bar">
            <a href="#" style="color: white;">Menu</a>
        </div>
 <nav class="menu" style="margin: 0 auto;" >
     <ul>
  <li class="menu"><a href="#">Menu 01</a>
  </li><li class="menu">
   <a href="#">Menu 02</a>
   <ul class="submenu">                                    
     <li><a href="#">Submenu 02.01</a></li>
     <li><a href="#">Submenu 02.02</a></li>
     <li><a href="#">Submenu 02.03</a></li>
                               </ul>
  </li><li class="menu">
   <a href="#">Menu 03</a>
   <ul class="submenu">        
     <li><a href="#">Submenu 03.01</a></li>
     <li><a href="#">Submenu 03.02</a></li>                                    
   </ul>
  </li><li class="menu">
   <a href="#">Menu 04</a>
   <ul class="submenu">
     <li><a href="#">Submenu 04.01</a></li> 
   </ul>    
  </li>    
     </ul>
 </nav>
  </div>
 </body>
</html>


Código CSS

Se añade reglas AT para controlar los redimensionamientos de la pantalla


a{text-decoration: none;}
@media only screen and (min-width: 1px){
    .menu_bar {
        display:block;
        text-align: right;
    }
 
 .menu_bar a {
  background:#000000;
        padding: 0.7rem;
 }
  
    nav.menu {
        width: 100%;
    }
 
    nav.menu ul li {
        display: block;
        border-bottom:1px solid white;
    }

    nav.menu ul li a {
        display: block;
        font-size: 1rem;
        position: relative;
        color: white;
        box-sizing: border-box;
        background:black;
        padding: 0.5rem 0;
    }

    .submenu {
        display: none;
    }

    nav.menu ul {
        list-style: none;
        padding: 0;
        text-align: center;
    }
}

@media only screen and (min-width: 460px){   
    nav.menu ul li a {
        font-size: 1.2rem;
        padding: 0.8rem 0;
    }
}

@media only screen and (min-width: 768px){
    .menu_bar {
        display:none;
    }
    nav.menu{
        display: initial;
    }
    nav.menu ul li:hover .submenu {
        display:block;
    }

nav.menu {
 display: block;
 margin: 0;
 padding: 0;
 list-style: none;
}
 nav.menu ul {
  list-style: none;
  margin: 0;
  padding: 0;
 }

 nav.menu > ul > li {
  float: left;
 }
 
     nav.menu ul li a {
                display: block;
  margin: 0;
  padding: 15px 20px;
  color: #FFFFFF;
  background-color: #333333;
            }
 
     nav.menu > ul > li > ul {
  display: none;
     }

     nav.menu > ul > li:hover > ul {
  list-style: none;
  display: block;
  position: absolute;
     }
 
     nav.menu a:hover {
  background-color: #C80000;
            } 
}

Código JS

Finalmente, código JS para controlar el despliegue del menú en pantallas pequeñas.

$(document).ready(function () {
    $('.menu_bar').click(function () {
        $('nav.menu').slideToggle();
    });
    $(window).resize(function () {
        if (eval($('body').width()) > 750) {
            $('nav.menu').show();
        }else{
            $('nav.menu').hide();
        }
    });
});

viernes, 17 de mayo de 2019

Métodos de entrada y salida de JavaScript

Métodos de entrada

PROMPT

En JavaScript tenemos el método prompt(), que tiene tres variantes según la cantidad de parámetros:

Sin parámetros Un parámetro Dos parámetros
  prompt();
  prompt('Ingrese su edad');
  prompt('Ingrese su edad','18');

  • Cuando no tiene parámetros muestra una ventana flotante que pide ingresar un dato.
  • Cuando tiene un parámetro muestra la ventana flotante con un texto, que es el que colocamos como argumentos.
  • Cuando tiene dos parámetros muestra la ventana flotante, el título o texto sobre la caja de texto y un valor por defecto en la caja de texto.

CONFIRM

En JavaScript tenemos el método confirm(), que permite al usuario elegir una opción entre Ok (aceptar) o Cancel (Cancelar), especialmente útil para evitar que acciones no deseadas se ejecuten al dar un clic por error o mostrar un mensaje previo a la confirmación de una acción. Por ejemplo:
El siguiente código utiliza la función Confirm cuando se presiona el botón.

<script>
   function test(){
     let eleccion = confirm("Elige una opción\n\nSabiamente");
     if (eleccion == true) {
        alert("Elegiste Aceptar");
     } else {
        alert("Elegiste Cancelar");
     } 
   }
</script>

<button onclick="test();">Botón confirm</button>

Notas:
para insertar saltos de línea usamos \n dentro de la cadena de texto, para un espacio de tabulación \t
El valor que la función confirm devuelve es un valor lógico (verdadero o falso)



Métodos de salida

ALERT

La función por excelencia para mostrar un mensaje es Alert(); que nos permite desplegar una ventana flotante con el mensaje que deseemos, este mensaje puede ser cualquier tipo de variable, pero se mostrará convertido a texto. Ejemplo:


<button onclick="alert('Yo soy un alert');">Botón alert</button>



miércoles, 1 de mayo de 2019

Formularios en HTML5

Los formularios envían datos a través de los métodos POST y GET, por ello es necesario que los diversos elementos que contendrán los datos que serán enviados se encuentren dentro de las etiquetas FORM

Estructura básica

Todo formulario debe encontrarse entre las etiquetas Form, luego los diversos elementos pueden encontrarse como mejor deseemos, pero lo recomendable es seguir una serie de estándares como utilizar los Fieldset como contenedores de los diversos elementos que pueden ser etiquetas, cajas de texto, botones, etc.

Ejemplo en código:

<form>
  <fieldset>
     Ingrese su usuario:<br/>
     <input type="text" /><br/>
     Ingrese su clave:<br/>
     <input type="password" /><br/><br/>
     <input type="submit" value="Enviar"/>
  </fieldset>                
</form>

Resultado visual:

Ingrese su usuario:

Ingrese su clave:



Títulos, textos, cajas de texto y botones básicos

Podemos colocar un título para cada Fieldset mediante la etiqueta Legend, textos de guía con la etiqueta Label y diversas cajas de texto con la etiqueta Input. Además, botones que pueden ser creados con la misma etiqueta Input o Button.

Ejemplo en código:

<form>
  <fieldset>
     <legend>Titulo</legend>
     <label>Ingrese su usuario:</label><br/>
     <input type="text" /><br/>
     <label>Ingrese su clave:</label><br/>
     <input type="password" /><br/><br/>
     <button>ENVIAR</button>
  </fieldset>
</form>

Resultado visual:


Titulo






Diversos tipos de campos para ingresar información

Tenemos los diferentes tipos con sus respectivas propiedades

Texto normal

Ejemplo en código:

<form>
  <fieldset>
     <legend>INPUT</legend>
     Texto normal: <br/>
     <input type="text"/><br/>
     Texto con valor: <br/>
     <input type="text" value="valor"/><br/>
     Texto solo de lectura: <br/>
     <input type="text" value="no puedes cambiarme" readonly/><br/>
     Texto con placeholder: <br/>
     <input type="text" placeholder="Ingresa tu nombre"/><br/>
     Texto requerido u obligatorio: <br/>
     <input type="text" placeholder="Dale clic a enviar" required/><br/>
     Texto multilíneas: <br/><textarea></textarea><br/>
     <button type="submit">ENVIAR</button>
  </fieldset>
</form>

Resultado visual:


INPUT Texto normal:

Texto con valor:

Texto solo de lectura:

Texto con placeholder:

Texto requerido u obligatorio:

Texto multilíneas:



Texto para contraseñas

Ejemplo en código:

<form>
  <fieldset>
     <legend>CONTRASEÑAS</legend>
     Contraseña: <br/>
     <input type="password" placeholder="Ingresa tu clave" required/><br/>
     <button type="submit">ENVIAR</button>
  </fieldset>
</form>

Resultado visual:

CONTRASEÑAS Contraseña:


Calendario fecha y hora

Ejemplo en código:

<form>
  <fieldset>
     <legend>FECHAS Y HORAS</legend>
     Fecha: <br/>
     <input type="date"/><br/>
     Hora: <br/>
     <input type="time"/><br/>     
  </fieldset>
</form>

Resultado visual:
FECHAS Y HORAS Fecha:

Hora:



Carga de archivos

Ejemplo en código:

<form>
  <fieldset>
     <legend>ARCHIVOS</legend>
     Cargar un archivo: <br/>
     <input type="file" name="archivo"/><br/>
     <button type="submit">ENVIAR</button>
  </fieldset>
</form>

Resultado visual:
ARCHIVOS Cargar un archivo:



Numérico

Ejemplo en código:

<form>
  <fieldset>
     <legend>NÚMEROS</legend>
     Números enteros:<br/>
     <input type="number"/><br/>
     Números con decimales:<br/>
     <input type="number" min="-10" max="20" step="0.01"/><br/>
     Números de tres en tres:<br/>
     <input type="number" step="3"/><br/>
  </fieldset>
</form>

Resultado visual:
NÚMEROS Números enteros:

Números con decimales:

Números de tres en tres:



Colores

Ejemplo en código:

<form>
  <fieldset>
     <legend>COLORES</legend>
     Selecciona un color<br/>
     <input type="color"/><br/>
  </fieldset>
</form>

Resultado visual:

COLORES Selecciona un color



Barras deslizables

Ejemplo en código:

<form>
  <fieldset>
     <legend>BARRAS DESLIZABLES</legend>
     Mueva las barras: <br/>
     <input type="range"/><br/>
     <input type="range" min="0" max="100" step="10"/><br/>
     <input type="range" min="1" max="5" step="1"/><br/>
  </fieldset>
</form>

Resultado visual:

BARRAS DESLIZABLES Mueva las barras:





Botones

Tenemos tres tipos:

Input type submit

Ejemplo en código:

<form>
  <fieldset>     
     <input type="submit" value="Presioname"/><br/>
  </fieldset>
</form>

Resultado visual:




Button type submit

Ejemplo en código:

<form>
  <fieldset>     
     <button type="submit">Presioname</button>
  </fieldset>
</form>

Resultado visual:



Input type reset
Ejemplo en código:

<form>
  <fieldset>     
     <input type="text" value="Hola"/><br/>     
     <input type="date"/><br/>     
     <input type="reset"/><br/>
  </fieldset>
</form>

Resultado visual:






CheckBox y RadioButton

Un checkbox permite seleccionar diversos elementos de una lista, mientras RadioButton elegir un elemento de una serie de valores

Ejemplo en código:

<form>
  <fieldset>
    <legend>Radio Button</legend>
    <label>¿Qué comida que desagrada más?</label><br/><br/>
    <input type="radio" name="comidaNo"><label>Escabeche</label><br/>
    <input type="radio" name="comidaNo"><label>Arroz árabe</label><br/>
    <input type="radio" name="comidaNo"><label>Cebiche</label><br/>
    <input type="radio" name="comidaNo"><label>Tocosh</label><br/><br/>
    <button type="submit">Elegir</button>     
  </fieldset>
  <br/>
  <fieldset>
    <legend>CheckBox</legend>
    <label>¿Qué comidas que te gustan?</label><br/><br/>
    <input type="checkbox" name="comida"><label>Escabeche</label><br/>
    <input type="checkbox" name="comida"><label>Arroz árabe</label><br/>
    <input type="checkbox" name="comida"><label>Cebiche</label><br/>
    <input type="checkbox" name="comida"><label>Tocosh</label><br/><br/>
    <button type="submit">Elegir</button>     
  </fieldset>
</form>

Resultado visual:

Radio Button







CheckBox








Listas desplegables

Conocidas como los Combobox en lenguajes de programación como Visual, Java, etc. permiten desplegar una serie de valores y elegir uno de ellos, la ventaja de este frente al RadioButton es que se puede desplegar mucha más información sin usar demasiado espacio en la página.


Ejemplo en código:

<form>
  <fieldset>
     <legend>Seleccionar una ingeniería</legend>
        <select><option>Ingeniería ambiental</option>
        <option>Ingeniería eléctrica</option>
        <option>Ingeniería informática</option>
        <option>Ingeniería de minas</option>
        <option>Ingeniería química</option>
        <option selected="selected">Ingeniería de software</option>
     </select>    
  </fieldset>
</form>

Resultado visual:

Seleccionar una ingeniería