Mostrando entradas con la etiqueta php. Mostrar todas las entradas
Mostrando entradas con la etiqueta php. Mostrar todas las entradas

jueves, 16 de julio de 2020

Cargar datos en una lista desplegable con PHP

Supongamos que queremos agregar un registro a una tabla que se relaciona mediante una clave foránea con otra, solo requiere que se le ingrese el código o id, pero colocar ello en una caja de texto es incómodo, lo ideal sería desplegar en una lista desplegable vertical los registros de la tabla cuyo identificador o código queremos mostrar. Ilustremos ello con un ejemplo:


Sin lista desplegable Con lista desplegable

Agregar datos







Agregar datos








Trabajaremos con las siguientes tablas:




Ahora vamos a crear ese formulario donde se puedan cargar los datos de "inquilinos" y enviar el "id" a través de un formulario web. Este ejemplo no emplea programación orientada a objetos y nos limitamos a enviar la información.

Creamos el formulario en el archivo"pagoIns.php"
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form class="jpcss" method="post" action="agregar_pago.php">    
            <fieldset>
                <legend>INGRESAR ABONO</legend><br> 
                Ingrese al aportante: <select name="personas">
                    <!--Aquí ira el código PHP-->
                </select><br><br>
                Ingrese el importe: S/ 
                <input type="number" name="importe" min="0.01" step="0.01" value="0.01"><br>  
                <br><br>
                <button onclick="return confirm('¿Seguro que deseas ingresar el pago?')">
                    INGRESAR
                </button>  
            </fieldset>
        </form>
    </body>
</html>

Ahora vamos a realizar tanto la conexión como la consulta SQL en código PHP
<?php
#Parámetros de la BD
$cfg['h'] = 'localhost';  #hostname
$cfg['u'] = 'root';       #usuario
$cfg['p'] = '';           #contraseña (password)
$cfg['b'] = 'blog';       #base de datos
$cfg['r'] = '3306';       #puerto 
#Conexión
$cnx = mysqli_connect($cfg['h'], $cfg['u'], $cfg['p'], $cfg['b'], $cfg['r']);
mysqli_query($cnx, "set names utf8");

#Consulta SQL
$sql = "SELECT idinquilinos id, "
        . "CONCAT_WS (' ',nombres,paterno,materno) "
        . "datos FROM inquilinos;";

#Capturando los datos
$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);
?>

Ese código lo colocaremos al inicio de la siguiente forma. Agregando el código que muestra los datos en la lista desplegable.
<?php
#Parámetros de la BD
$cfg['h'] = 'localhost';  #hostname
$cfg['u'] = 'root';       #usuario
$cfg['p'] = '';           #contraseña (password)
$cfg['b'] = 'blog';       #base de datos
$cfg['r'] = '3306';       #puerto 
#Conexión
$cnx = mysqli_connect($cfg['h'], $cfg['u'], $cfg['p'], $cfg['b'], $cfg['r']);
mysqli_query($cnx, "set names utf8");

#Consulta SQL
$sql = "SELECT idinquilinos id, "
        . "CONCAT_WS (' ',nombres,paterno,materno) "
        . "datos FROM inquilinos;";

#Capturando los datos
$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);
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form class="jpcss" method="post" action="agregar_pago.php">    
            <fieldset>
                <legend>INGRESAR ABONO</legend><br> 
                Ingrese al aportante: <select name="personas">
                    <!--Código PHP-->                    
                    <?php
                    if ($salida) {
                        foreach ($salida as $persona) {
                            ?>
                            <option value="<?= $persona['id'] ?>">
                                    <?= $persona['datos'] ?>
                            </option>
                        <?php }
                    }
                    ?>                
                </select><br><br>
                Ingrese el importe: S/ 
                <input type="number" name="importe" min="0.01" step="0.01" value="0.01"><br>  
                <br><br>
                <button onclick="return confirm('¿Seguro que deseas ingresar el pago?')">
                    INGRESAR
                </button>  
            </fieldset>
        </form>
    </body>
</html>

Entre las líneas 42 y 51 se aprecia el código que despliega los datos en la lista desplegable pudiendo obtener el efecto deseado. Se emplea antes del foreach un condicional, en caso la tabla se encuentre vacía u ocurra un error.

viernes, 19 de junio de 2020

Biblioteca gráfica ImageGD en PHP

PHP tiene su propia librería gráfica (al 2020 aún en desarrollo) que permite generar gráficos rectangulares, circulares, lineales y textuales. Además, usar colores en el formato RGB para estos.

Sobre esta biblioteca el manual de PHP menciona:
"PHP no está limitado a crear únicamente salidas HTML. También se puede usar para crear y manipular ficheros de imágenes en una variedad de diferentes formatos de imagen, incluyendo GIF, PNG, JPEG, WBMP y XPM. Aún más práctico es que PHP puede transferir flujos de imagen directamente al navegador. Necesitará compilar PHP con la biblioteca de funciones de imágenes GD para que esto funcione. GD y PHP también pueden requierir otras bibliotecas, dependiendo de los formatos de imagen con los que se quiera trabajar".
Esta biblioteca permite crear imágenes de tipo:
  • JPEG
  • GIF
  • PNG
  • SWF
  • TIFF
  • JPEG2000


Creando una imagen con "imagecreatetruecolor"

<?php

# Definir el tipo de contenido de la página
header("content-type:image/png");

#Crear la imagen con dimensiones de 200px por lado
$imagen = imagecreatetruecolor(200, 200);

# Mostrar la imagen en formato PNG
imagepng($imagen);

# Liberar memoria
imagedestroy($imagen);

?>


Creando colores con "imagecolorallocate"

<?php

# Permite definir un color RGB
$colorRojo= imagecolorallocate($imagen, 255, 0, 0);

# Permite definir un color RGB
$colorBlanco= imagecolorallocate($imagen, 255, 255, 255);

# Permite definir un color RGB
$colorAmarillo= imagecolorallocate($imagen, 255, 255, 0);

?>


Creando figuras

Tenemos diversos métodos para crear figuras con y sin relleno como:


Figuras sin relleno
  • imagearc — Dibuja un arco parcial
  • imageellipse — Dibuja una elipse
  • imagepolygon — Dibuja un polígono
  • imagerectangle — Dibuja un rectángulo
Figuras con relleno
  • imagefilledarc — Dibuja un arco parcial y rellenarlo
  • imagefilledellipse — Dibuja una elipse con relleno
  • imagefilledpolygon — Dibuja un polígono con relleno
  • imagefilledrectangle — Dibuja un rectángulo con relleno


<?php

# Definir el tipo de contenido de la página
header("content-type:image/png");

#Crear la imagen con dimensiones de 200px por lado
$imagen = imagecreatetruecolor(200, 200);

# Permite definir un color RGB
$colorAmarillo= imagecolorallocate($imagen, 255, 255, 0);
$colorRojo= imagecolorallocate($imagen, 255, 0, 0);

# Gráfica de un rectángulo
imagerectangle($imagen, 10, 10, 190, 190, $colorAmarillo);

# Gráfica de un rectángulo con color de relleno
imagefilledrectangle($imagen, 40, 40, 160, 160, $colorRojo); 

# Mostrar la imagen en formato PNG
imagepng($imagen);

# Liberar memoria
imagedestroy($imagen);

?>


IMAGELINE

Esta función permite la creación de líneas con la siguiente sintaxis:
imageline($image, $x1, $y1, $x2, $y2, $color);
  • image: Un recurso image, es devuelto por una de las funciones de creación de imágenes, como imagecreatetruecolor().
  • x1: Coordenada x del primer punto.
  • y1: Coordenada y del primer punto.
  • x2: Coordenada x del segundo punto.
  • y2: Coordenada y del segundo punto.
  • color: El color de la línea. Un identificador de color creado con imagecolorallocate().
<?php

header("Content-Type: image/png");
$imagen = imagecreatetruecolor(400, 400);
$color = imagecolorallocate($imagen, 255, 255, 0);

# imageline($image, $x1, $y1, $x2, $y2, $color);
imageline($imagen, 12, 33, 300, 200, $color);

# Mostrar la imagen en formato PNG
imagepng($imagen);

# Liberar memoria
imagedestroy($imagen);

?>


IMAGERECTANGLE

Esta función permite la creación de rectágulos con la siguiente sintaxis:
imagerectangle ($image, $x1, $y1, $x2, $y2, $color);
  • image: Un recurso image, es devuelto por una de las funciones de creación de imágenes, como imagecreatetruecolor().
  • x1: Coordenada x de partida.
  • y1: Coordenada y de partida.
  • x2: Coordenada x de llegada.
  • y2: Coordenada y de llegada.
  • color: El color de la línea. Un identificador de color creado con imagecolorallocate().
<?php

header("Content-Type: image/png");
$imagen = imagecreatetruecolor(400, 400);
$color = imagecolorallocate($imagen, 255, 255, 0);

# imagerectangle ($image, $x1, $y1, $x2, $y2, $color);
imagerectangle ($imagen, 12, 33, 300, 200, $color);

# Mostrar la imagen en formato PNG
imagepng($imagen);

# Liberar memoria
imagedestroy($imagen);

?>


IMAGEREARC

Esta función permite la creación de arcos y circunferencias con la siguiente sintaxis:
imagearc($image, $cx, $cy, $ancho, $largo, $inicio, $fin, $color);
  • image: Un recurso image, es devuelto por una de las funciones de creación de imágenes, como imagecreatetruecolor().
  • cx: Coordenada x del centro.
  • cy: Coordenada y del centro.
  • largo: largo del arco.
  • ancho: ancho del arco.
  • inicio: ángulo de inicio en grados sexagésimales.
  • fin: ángulo de fin en grados sexagésimales.
  • color: El color de la línea. Un identificador de color creado con imagecolorallocate()
<?php

header("Content-Type: image/png");
$imagen = imagecreatetruecolor(400, 400);
$color = imagecolorallocate($imagen, 255, 255, 0);

# imagearc($image, $cx, $cy, $an, $la, $ini, $fin, $col);
imagearc ($imagen, 200, 200, 100, 100,0, 360, $color);

# Mostrar la imagen en formato PNG
imagepng($imagen);

# Liberar memoria
imagedestroy($imagen);

?>




Métodos GET y POST con PHP

Para enviar información a través de la web tenemos dos métodos que son el protocolo HTTP que emplea el método POST y mediante la URL que emplea el método GET.


Método GET

Es mucho más veloz, pero tiene ciertas limitaciones como la cantidad de datos a enviar, no se permite enviar archivos y se visualiza el valor enviado por el URL, lo que lo puede hacer aparentemente frágil para sistemas de autentificación, pero si se le añade encriptamiento resulta en un método seguro y veloz.

Supongamos el siguiente formulario en una página llamada "formulario.html"
<!DOCTYPE html>
<html>
    <head>
        <title>Formulario GET</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form action="receptorget.php" method="GET">
            <label>Nombre</label><br/>
            <input type="text" name="txtNombre"/><br/><br/>
            <label>Clave</label><br/>
            <input type="password" name="txtClave"/>
            <br/><br/>
            <select name="txtIdioma">
                <option value="esp">Español</option>
                <option value="ing">Inglés</option>
                <option value="fra">Francés</option>
            </select><br/><br/><br/>
            <button type="submit">Enviar por GET</button>
        </form>  
    </body>
</html>

Se aprecia que en el formulario aparecen dos atributos con sus respectivos valores que son:
  • action: indica a que página viajarán los datos
  • method: indica la forma de enviar los datos, en este caso GET

La salida visual sería:












En una página llamada "receptorget.php" vamos a recibir estos valores enviados por GET, el URL que aparecerá en el navegador tendrá la siguiente forma:

http://localhost/test/receptorget.php?txtNombre=Paul&txtClave=12345&txtIdioma=ing

El código de "receptorget.php" sería:
<?php

$nombre = $_GET["txtNombre"];
$clave = $_GET["txtClave"];
$idioma = $_GET["txtIdioma"];

echo "Nombre: $nombre <br/>";

echo "Longitud de la clave: " . strlen($clave) . "<br/>";

switch ($idioma) {
    case "esp":
        echo "Habla español";
        break;
    case "ing":
        echo "Habla inglés";
        break;
    case "fra":
        echo "Habla francés";
        break;
    case "":
        echo "No ingresó idioma";
        break;
    default:
        echo "ERROR";
        break;
} ?>

El resultado visual sería el siguiente:
Nombre: Paul
Longitud de la clave: 5
Habla inglés 

Método POST

Es menos veloz que el método GET, pero permite enviar una gran la cantidad de datos, incluidos archivos como fotos y no se visualiza los valores enviados en el URL, lo que lo convierte en el método favorito para inicio de sesión.

Supongamos el siguiente formulario en una página llamada "formulario.html"
<!DOCTYPE html>
<html>
    <head>
        <title>Formulario GET</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form action="receptorget.php" method="POST">
            <label>Nombre</label><br/>
            <input type="text" name="txtNombre"/><br/><br/>
            <label>Clave</label><br/>
            <input type="password" name="txtClave"/>
            <br/><br/>
            <select name="txtIdioma">
                <option value="esp">Español</option>
                <option value="ing">Inglés</option>
                <option value="fra">Francés</option>
            </select><br/><br/><br/>
            <button type="submit">Enviar por POST</button>
        </form>  
    </body>
</html>

Se aprecia que en el formulario aparecen dos atributos con sus respectivos valores que son:
  • action: indica a que página viajarán los datos
  • method: indica la forma de enviar los datos, en este caso POST

La salida visual sería:












En una página llamada "receptorpost.php" vamos a recibir estos valores enviados por POST, el URL que aparecerá en el navegador no tiene ninguna modificación

El código de "receptorget.php" sería:
<?php

$nombre = $_POST["txtNombre"];
$clave = $_POST["txtClave"];
$idioma = $_POST["txtIdioma"];

echo "Nombre: $nombre <br/>";

echo "Longitud de la clave: " . strlen($clave) . "<br/>";

switch ($idioma) {
    case "esp":
        echo "Habla español";
        break;
    case "ing":
        echo "Habla inglés";
        break;
    case "fra":
        echo "Habla francés";
        break;
    case "":
        echo "No ingresó idioma";
        break;
    default:
        echo "ERROR";
        break;
} ?>

El resultado visual sería el siguiente:
Nombre: Paul
Longitud de la clave: 5
Habla inglés 



El método $_Request["name"]

PHP tiene como método de entrada a GET y POST, pero cuando se desconoce el medio por el que llegarán los datos se puede recurrir al método $

<?php
   $nombre = $_REQUEST["txtNombre"];
   $clave = $_REQUEST["txtClave"];
   $idioma = $_REQUEST["txtIdioma"];
?>

Modificaciones de seguridad

Por cuestiones de seguridad y adaptándonos a los nuevos cambios se reemplaza los $_GET y $POST por:
<?php
$dia =  filter_input(INPUT_GET, 'txtIdioma', FILTER_SANITIZE_STRING);
$clave = filter_input(INPUT_POST, 'txtIdioma', FILTER_SANITIZE_STRING); 
?>


jueves, 11 de junio de 2020

Sesiones en PHP

El manual PHP indica sobre el soporte de las sesiones en PHP: "El soporte para sesiones en PHP consiste en una manera de preservar ciertos datos a través de accesos posteriores, lo que permite crear aplicaciones más personalizadas y mejorar el atractivo de un sitio web."


Crear sesiones

Para mantener seguridad al inicio de sesión, por ejemplo. Se opta por el uso de sesiones, ya que estos valores son almacenados en el servidor y no la computadora del usuario.

Para crear una sesión:
<?php
   
   # Iniciar sesión
   session_start();

   # Declarar los identificadores de sesión y sus valores
   $_SESSION["sesion"]="hola";
   $_SESSION["valor"]=12;

?>

$_SESSION (y todas las variables registradas) son serializadas internamente por PHP.

Operaciones con sesiones
<?php

   # Iniciar sesión
   session_start();

   # Crear sesión
   $_SESSION["valor"]=12;

   # Ver el valor de una sesión
   echo $_SESSION["valor"];

   # Actualizar el valor de una sesión
   $_SESSION["valor"]=100;

   # Cerrar sesión
   unset ( $_SESSION["valor"] ); //Liberar memoria
   session_destroy(); //Cerra la sesión propiamente dicha

?>

Usos de las sesiones

"PHP permite el uso de sesiones, valores que podemos usar para autentificar a un usuario, debe ser una medida adicional al encriptado en la base de datos para iniciar sesión"


SESIÓN PARA INICIO DE SESIÓN

<?php

   /* Colocar dentro del método de autentificación de usuario */

   if (validar()=true){
      # Creamos una sesión
      session_star(); 
      # Creamos una clave
      $_SESSION[ "acceso" ]="E14007a"; 
      # Enviamos a la página de inicio
      header ("location: inicio.php"); 
   } else {
      # Creamos una sesión para evitar conflicto al cerrar la sesión
      session_star();
      # Destruimos la sesión
      session_destroy(); 
      # Lo retornamos a la página de login
      header ("location: login.php");
   }

?>


VALIDAR EL INICIO DE SESIÓN

<?php

   # Iniciamos sesión
   session_start();

   # si la sesion es diferente a la iniciada
   if($_SESSION[ "acceso" ] != "E14007a";){ 
      # Destruimos la sesión
      session_destroy();
      # Lo retornamos a la página de login
      header ("location: login.php");
   }
?>

<!-- CÓDIGO HTML -->

Cookies en PHP

Las cookies pueden ser borradas, aceptadas, ignoradas o bloqueadas según se desee, para esto se debe configurar convenientemente el navegador web.

Del punto de vista lingüístico, el término Cookie es un anglicismo para las "galletas informáticas", estas pueden ser borradas, aceptadas, ignoradas o bloqueadas por el cliente mediante la configuración del navegador web.

Tienen diversas aplicaciones como:
  • Como un contador de visitas al sitio web.
  • Un contenedor de información que se almacena en el computador cliente y puede ser consultado por el servidor. Por ejemplo, un carrito de compras virtual.
  • Hacer seguimiento al cliente. Por ejemplo, gustos de navegación, spyware, etc.
  • Uso con intenciones malignas. Por ejemplo, las Zombie cookies.


Crear COOKIES

Para crear una cookie básica se necesita dos parámetros: el nombre de la cookie y el valor asignado. Se debe crear antes de cargar el documento HTML.
<?php
   setcookie("texto", "Bienvenido a PHP");
   setcookie("contador", 12);
   setcookie("acumulado", 33.5);
?>

Del ejemplo anterior hemos creado 3 cookies que almacenan un valor tipo cadena, tipo entero y tipo decimal. Estos se almacenan en la computadora del usuario de modo que no consumen recursos del servidor.

Llamar COOKIES

Todas las cookies se almacenan en $_COOKIE que tiene forma de array, de forma que se les llama mediante su identificador y ese valor se puede almacenar en una variable o mostrar.
<?php

   //Creamos el cookie en un archivo
   setcookie("contador", 12);

?>
<?php
   //Llamamos al cookie desde otro archivo
   $dato = $_COOKIE["contador"];

   echo $dato; //Mostrara en pantalla 12
?>


Parámetros en una cookie

Los parámetros que podemos pasar son:
  • Clave: el nombre de la cookie.
  • Valor: el valor de la cookie.
  • Duración: el tiempo que la cookie está activa.
  • Ruta: el lugar donde se almacena la cookie.
  • Dominio: el servidor donde se almacena la cookie.
  • Protocolo de seguridad: la cookie se puede transmitir por HTTPS.
  • Uso solo de HTTP: la cookie solo es accesible por http y no por otros como javaScript por ejemplo

Cookie con tiempo y sin tiempo

Se puede indicar la duración de una Cookie, si no lo hacemos esta se destruye al cerrar el navegador.

<?php
   /*Sin tiempo*/
   setcookie("nombre","argos") ;
   /* Duración: hasta que se cierre el navegador*/

   /*Con tiempo*/
   setcookie("apodo","perrosaurio", time() + 30*24*60*60) ; 
   /* Duración: 1 mes
      Con Time() iniciamos en cero, y le agregamos un mes en segundos, 
      no afecta si el usuario cierra el navegador
   */
?>


Cookie con ruta

Se puede indicar una ubicación para almacenar las Cookies.
<?php

   #Con ruta simple
   setcookie("apodo","perrosaurio", time() + 30*24*60*60, "/"); 
   //Se guarda en el directorio raíz

   #Con ruta específica
   setcookie("apodo","perrosaurio", time() + 30*24*60*60, "/cookie"); 
   // Se guarda en la carpeta cookie dentro del directorio raíz

?>

Cookie con dominio

Se puede indicar una ruta distinta a la del computador del cliente para almacenar la información:
<?php

   #Con dominio
   setcookie("nombre","argos", time() + 1000, "/c", "www.argosperro.com") ;

   /*
    * Duración: 1000 segundos
    * Carpeta: "c" dentro del directorio del dominio
    * Dominio donde se almacena: www.argosperro.com
   */

?>

Cookie con protocolos HTTPS y HTTP

Se puede implementar protocolos seguros para las Cookies mediante el siguiente formato.
<?php

   #Si queremos usar un protocolo seguro, hacemos:

   setcookie("galleta", "Hola", time()+1000, "/", "www.gatofeliz.com", true, true);

   /*
    * El primer valor en "true" activa el protocolo seguro
    * El segundo "true" evita que se usen protocolos diferentes al HTTP
    * Es necesario establecer un dominio al cual mandar los valores
   */

?>



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" ;
}
?>

sábado, 22 de diciembre de 2018

Fundamentos de PHP

Variables


Las variables en PHP, a diferencia de Java no están limitadas a un tipo único de datos, de forma que esta puede almacenar un entero o una cadena en el mismo archivo.

Para declarar una variable se debe anteponer el símbolo $ al nombre de la variable, es nombre puede contener caracteres alfanuméricos y guión bajo, pero no deben comenzar con un número.

Ejemplo:

<?php
$variable1;
$variable_entero = 12;
$variable_decimal = 20.56;
$variable_texto = "Bienvenido a PHP";
$variable_byte = true; 
?>

Sintaxis


Para iniciar código PHP se debe iniciar con la etiqueta <?php y terminar con la etiqueta ?>, este código puede ir junto con código HTML, que es el que le da toa esa flexibilidad y potencialidad en el desarrollo de aplicaciones web.

Ejemplo:
<?php
/* Aquí va el código */
?>

Nota: cuando el código el PHP puro, los IDE y el compilador no exigen cerrar las etiquetas.

Para comentar código se puede hacer de 3 formas:

Ejemplo:
<?php
/*
Comentario de bloque
*/

//Comentario de línea con  //

#Comentario de línea con  #
?>

Para imprimir texto o una variable en pantalla se usa la expresión echo.

Ejemplo
<?php
echo "Texto en pantalla";
?>

Nota: para algunos casos dentro del código HTML es necesario escribir el valor de una variable o cadena de texto y toda la expresión anterior se puede reemplazar por:

<?= "Texto en pantalla" ?>

El signo igual se interpreta como: php echo, pero debe ser usado solo para imprimir un valor a la vez.

Para conocer el valor de una variable se puede usar la función var_dump

Ejemplo:
<?php

$variable = "Bienvenidos al nuevo mundo";
var_dump($variable);

?>


Estructuras de control


En PHP se tiene una serie de estructuras de control, las principales son:

Condicional IF-ELSE

La condición va entre paréntesis, luego entre llaves las sentencias que se ejecutarán de ser verdadera la expresión, el ELSE es opcional y se puede declarar las sentencias que se ejecutaran si no se cumple esta condición:
<?php

$num1 = 5;
$num2 = 11;
$num3 = 8;

$mayor = 0;

#usando if

if ($num1 > $num2) {
    $mayor = $num1;
} else {
    $mayor = $num2;
}

if ($mayor < $num3) {
    $mayor = $num3;
}

echo "El número mayor de $num1, $num2 y $num3 es: $mayor";
?>

También podemos tener múltiples comparaciones mediante ELSE IF
<?php
$nota = 17;

#usando if
if ($nota >= 12 && $nota <=20) {
    echo "Aprobado";
} else if ($nota <12 nota="">=0) {
    echo "Desaprobado";
} else {
    echo "Nota inválida";
}
?>

Las comparaciones IF - ELSE pueden ser reemplazadas por un operador ternario

Ejemplo:
<?php
$valor = true;
#usando if
if ($valor) {
    echo "Verdadero";
} else {
    echo "Falso";
}

#Usando ternario
$valor ? "Verdadero" : "Falso";

#Evaluando si una variable posee contenido
$val = ""; //Sin contenido
$resultado = ($val) ?: 'Vacío'; //Asigna 'Vacío' a $resultado

$val = "Hola"; //Con contenido
$resultado = ($val) ?: 'Vacío'; //Asigna 'Hola' a $resultado
?>


Condicional iterativo SWITCH y de transición BREAK

Es una serie de IF-ELSE IF-ELSE IF- ... - ELSE

<?php
$mes = 6;

switch ($mes) {
    case 1:
        echo 'Enero';
        break; 
        //BREAK evita que se sigan realizando comparaciones
    case 2:
        echo 'Febrero';
        break;
    case 3:
        echo 'Marzo';
        break;
    case 4:
        echo 'Abril';
        break;
    case 5:
        echo 'Mayo';
        break;
    case 6:
        echo 'Junio';
        break;
    case 7:
        echo 'Julio';
        break;
    case 8:
        echo 'Agosto';
        break;
    case 9:
        echo 'Septiembre';
        break;
    case 10:
        echo 'Octubre';
        break;
    case 11:
        echo 'Noviembre';
        break;
    case 12:
        echo 'Diciembre';
        break;
    default:
        break;
}
?>

Repetitiva FOR, WHILE, FOREACH

Para su uso, se puede utilizar un arreglo de datos (array), en este caso es más recomendado el uso del FOREACH.

Cuando se conoce el número de iteraciones que se debe hacer, es recomendado el uso del FOR, ya que permite avanzar la iteración de 1 en 1 o en diferente forma, mediante el uso de un operador incremental.
<?php
$persona[]="jhon";
$persona[]="paul";
$persona[]="argos";

echo $persona[1];
var_dump($persona);

#FOR
for ($u = 0; $u < count($persona); $u++) {
    echo $persona[$u]."<br>";
}
#FOREACH

foreach ($persona as $indice => $dato) {
    echo $indice." ::: ".$dato."<br>";
}
?>


Cuando se desconoce el número de iteraciones que se deben realizar se recomienda el uso del WHILE.
<?php
$nota = 0;
$intento = 1;

#WHILE
while($nota < 12) {
    echo "Aún desaprobado - Intento: " . $intento;
    ++$intento;
    $nota++; 
}

echo "Aprobado en el intento: " . $intento;
?>


Funciones y procedimientos


La sintaxis de ambos es muy similar, su diferencia radica en que los procedimientos no devuelven ningún valor, mientras las funciones tienen un valor de retorno.

Ejemplos:
<?php
#Función
function promediar($a = 0, $b = 0) {
    return ($a + $b) / 2;
}

#Procedimiento
function saludo($a = '') {
    echo 'Hello ' . $a;
}
?>

Entrada y salida


PHP tiene como método de entrada a GET y POST, se recomienda el uso de POST siempre y cuando sea posible y los datos no sean muy sensibles, para búsquedas públicas o que no requieran mucha seguridad, el método GET es el ideal, ya que muestra el dato en la barra de direcciones.
Ejemplo
<?php
$dia = $_GET['txtdia'];
$clave = $_POST['clave'];
?>

Por cuestiones de seguridad y adaptándonos a los nuevos cambios se reemplaza lo anterior por:
<?php
$dia =  filter_input(INPUT_GET, 'txtdia', FILTER_SANITIZE_STRING);
$clave = filter_input(INPUT_POST, 'clave', FILTER_SANITIZE_STRING); 
?>