Tema 3.
4
PHP y Bases de datos
1
Repaso de BBDD: MySQL
Tema 3.4: Código en el servidor - PHP y MySQL 2
Persistencia de datos
• La información se guarda para volver a utilizarla
• Ficheros
• Almacenamiento básico
• Acceso secuencial o aleatorio
• Bases de datos
• Información estructurada
• Relaciones
• Búsquedas
• Acceso concurrente
• Control de acceso a la información
• Integridad
Tema 3.4: Código en el servidor - PHP y MySQL 3
MySQL
• Sistema de Gestión de Base de Datos Relacional
• La información se guarda en tablas
• Una tabla es una colección de datos relacionados
• Una tabla consta de columnas (campos) y filas (registros)
• Las tablas se enlazan por relaciones entre columnas
• Implementa casi todo el estándar SQL (Structured Query Language)
• Código abierto
• Actualmente de Oracle, que adquirió Sun, a la que pertenecía MySQL AB
• Escalable
• Aplicaciones pequeñas y grandes (millones de registros)
• Transacciones, Multiusuario
• Eficiente: Multihilo, varias técnicas de hash, b-tree, etc.
http//localhost/phpmyadmin/
Tema 3.4: Código en el servidor - PHP y MySQL 4
MySQL
Clientes Pedidos
Productos
nif* numero *
id *
nombre fecha
nombre
direccion cliente
precio
email producto
descripcion
telefono cantidad
Tema 3.4: Código en el servidor - PHP y MySQL 5
Creación de tablas
• La base de datos consta de tablas
• Cada una con una serie de columnas (campos)
• Cada campo tendrá asociado un tipo:
• Enteros: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
• Números reales: DECIMAL, DOUBLE, FLOAT, REAL
• Booleanos: BOOLEAN
• Fecha: DATE, TIME, YEAR
• Strings: VARCHAR (hasta 256 caracteres), TEXT
• Como Storage Engine conviene usar InnoDB para poder gestionar relaciones
entre tablas
• Como Collation conviene usar utf8_general_ci
https://disenowebakus.net/crear-una-base-de-datos-phpmyad
min-mysql-php.php
Tema 3.4: Código en el servidor - PHP y MySQL 6
SQL-Select
• Recupera elementos de una tabla o conjunto de tablas (con JOIN)
• SELECT campos FROM tabla WHERE campo = valor
• Si se quieren todos los campos, usar *
• Si se omite la cláusula WHERE se tienen todos los campos de la tabla
• Para la condición WHERE se pueden usar varios operadores:
• = <> != < <= > >=
• AND OR NOT
• Se pueden recuperar campos de varias tablas
• SELECT tabla1.campo1 tabla2.campo2 FROM tabla1, tabla2
WHERE campo3=valor3 AND tabla1.campo1 = tabla2.campo2
• También se pueden usar patrones para las condiciones
• % indica cualquier subcadena
• SELECT campos FROM tablas WHERE campo3 LIKE patron
• Ejemplo: SELECT nombre FROM clientes WHERE nombre LIKE Juan%
• Ordenar: ORDER BY
• Para no tener registros duplicados: DISTINCT
• SELECT DISTINCT campos FROM tablas WHERE ...
Tema 3.4: Código en el servidor - PHP y MySQL 7
SQL
• INSERT
• Inserta nuevos elementos en una tabla
• Crea un nuevo cliente
• INSERT INTO clientes (nif, nombre, direccion, email, telefono) VALUES ("M3885337J", "Empresa
Uno", "Calle Uno, Madrid", "jefe@empresauno.com", "91 2347898")
• UPDATE
• Actualiza campos de una tabla
• Modifica el importe del producto "Producto1"
• UPDATE productos SET precio = 399.99 WHERE nombre="Producto1“
• DELETE
• Elimina registros de una tabla
• Elimina pedidos con más de 30 días de antigüedad
• DELETE FROM pedidos WHERE fecha < CURDATE()-30
Tema 3.4: Código en el servidor - PHP y MySQL 8
phpMyAdmin
Tema 3.4: Código en el servidor - PHP y MySQL 9
phpMyAdmin
• Herramienta que ofrece una interfaz gráfica para la
administración del servidor MySQL
• Configuración del servidor y las bases de datos
• Gestionar (crear, modificar, borrar) las bases de datos, tablas, campos,
relaciones, índices, etc.
• Consultas con SQL, y mediante ejemplos (query by example)
• Definir usuarios y asignar permisos
• Realizar copias de seguridad
• Crear gráficos (PDF) del esquema de la base de datos
• Exportar a muchos formatos (documentos de texto, hojas de cálculo)
• En XAMPP se puede invocar en http://localhost/phpmyadmin/
Tema 3.4: Código en el servidor - PHP y MySQL 10
phpMyAdmin – Página inicial
Tema 3.4: Código en el servidor - PHP y MySQL 11
Usuarios de MySQL
• Conviene crear un nuevo usuario para cada sitio web
• Cada sitio web tendrá sus propias bases de datos
• El usuario root sólo se debe usar para administración
• Entrar en phpMyAdmin como usuario root
• A continuación crear un nuevo usuario
• Pestaña Users-> Add user
• En la ventana que aparece indicar los datos correspondientes
• Salir de la sesión como root
• Entrar con el nuevo usuario
• Se puede trabajar con la nueva base de datos
Tema 3.4: Código en el servidor - PHP y MySQL 12
Manejo de la base de datos con phpMyAdmin
• Al seleccionar la base de datos creada aparecen las operaciones que
se pueden realizar con ella
• Se pueden añadir permisos (pestaña Privileges) para que otros usuarios
puedan usar la base de datos
• En Structure se pueden crear las tablas que definen el esquema de la
base de datos
Tema 3.4: Código en el servidor - PHP y MySQL 13
Ejemplo práctico: Una tienda
Tema 3.4: Código en el servidor - PHP y MySQL 14
Ejemplo sencillo de base de datos: Tienda
Clientes Pedidos
Productos
nif* numero *
id *
nombre fecha
nombre
direccion cliente
precio
email producto
descripcion
telefono cantidad
*Clave
*Clave primaria
primaria (los
(los objetos
objetos en
en esta
esta columna
columna son
son únicos
únicos yy no
no nulos).
nulos). Por
Por defecto
defecto será
será indexada.
indexada.
**Se
**Se pueden
pueden definir
definir también
también índices
índices para
para mejorar
mejorar la
la eficiencia
eficiencia de
de las
las búsquedas
búsquedas
***Las
***Las claves
claves foráneas
foráneas (foreign
(foreign keys)
keys) identifican
identifican una
una columna
columna (o (o grupo
grupo de
de columnas)
columnas) enen una
una tabla
tabla que
que se
se
refiere
refiere aa otra
otra columna
columna (o(o grupo
grupo dede columnas)
columnas) en en otra
otra tabla,
tabla, generalmente
generalmente la la clave
clave primaria
primaria en
en la
la tabla
tabla
referenciada.
referenciada.
Contribuyen
Contribuyen aa gestionar
gestionar la
la integridad
integridad de
de la
la base
base de
de datos:
datos: no
no se
se puede
puede crear
crear un
un pedido
pedido de
de un
un cliente
cliente oo un
un
producto que no existan.
producto que no existan.
Las
Las claves
claves foráneas
foráneas deberían
deberían indexarse
indexarse porque
porque sese usarán
usarán para
para seleccionar
seleccionar registros
registros con
con frecuencia.
frecuencia.
Tema 3.4: Código en el servidor - PHP y MySQL 15
Creación de BD
• Como root: Create database en la pestaña
Database
• Indicar un nombre para la base de datos
• La opción "collation" indica el conjunto de reglas
de comparación y ordenación del texto en la base
de datos, que dependerá del idioma
utf8_general_ci: vale para muchos idiomas y no
es sensible a mayúsculas y minúsculas
Tema 3.4: Código en el servidor - PHP y MySQL 16
Creación de tablas
• La primera tabla es la de clientes, con cinco campos
• nif: servirá como primary key (el nif es único)
• nombre: de empresa o de persona (sería nombre + apellidos)
• Se puede indexar para hacer búsquedas por este campo
• direccion
• email
• telefono: como string para permitir uso de caracteres no
numéricos
Tema 3.4: Código en el servidor - PHP y MySQL 17
Creación de tablas
• Crear dos tablas más:
• Productos y pedidos
• pedidos autoindex
Tema 3.4: Código en el servidor - PHP y MySQL 18
Creación de tablas
• Cada tabla tiene una serie de columnas (campos)
• Cada campo tendrá asociado un tipo:
Enteros: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
Números reales: DECIMAL, DOUBLE, FLOAT, REAL
Booleanos: BOOLEAN
Fecha: DATE, TIME, YEAR
Strings: VARCHAR (hasta 256 caracteres), TEXT
• Como Storage Engine conviene usar InnoDB para poder gestionar relaciones
entre tablas
• Como Collation conviene usar utf8_general_ci
Tema 3.4: Código en el servidor - PHP y MySQL 19
Definir relaciones entre tablas
• Usar la pestaña Designer para ver gráficamente las tablas
• Para añadir una relación seleccionar el botón Create relation
• Seleccionar la primary key de la tabla clientes: nif
• Seleccionar la foreign key en la tabla pedidos: cliente
• Aparece una ventana para seleccionar qué hacer para preservar la integridad de las
referencias, con las siguientes operaciones:
• DELETE: seleccionar RESTRICT
• UPDATE: seleccionar CASCADE
• La restricción más adecuada en la mayoría de los casos es evitar realizar borrados en
cascada y actualizar en cascada
• La relación queda establecida y aparece en el gráfico
• Para salvar el diagrama, usar el botón Save
Tema 3.4: Código en el servidor - PHP y MySQL 20
Introducir datos en tablas
• Seleccionar la tabla
Seleccionar la pestaña Insert
Introducir datos para los campos correspondientes en Value
• También se pueden introducir a través de un formulario
• En la pestaña Browse se pueden ver los registros y modificar campos
Tema 3.4: Código en el servidor - PHP y MySQL 21
Backup de la base de datos
• Export
• Conveniente de forma regular
• Especialmente si se hacen muchos cambios
• Opciones (seleccionar Custom en Export Method)
• Qué se guarda
• El servidor completo
• Una base de datos entera
• Una tabla
• Estructura o datos, o ambos
• Compresión: ninguna, zipped, gzipped, bzipped
• Formato
• SQL, CSV, Word, Latex, Excel, OpenDoc, PDF, XML, JSON, etc.
• El proceso inverso es posible con Import
Tema 3.4: Código en el servidor - PHP y MySQL 22
Backup de la base de datos
• Export
• Conveniente de forma regular
• Especialmente si se hacen muchos cambios
• Opciones (seleccionar Custom en Export Method)
• Qué se guarda
• El servidor completo
• Una base de datos entera
• Una tabla
• Estructura o datos, o ambos
• Compresión: ninguna, zipped, gzipped, bzipped
• Formato
• SQL, CSV, Word, Latex, Excel, OpenDoc, PDF, XML, JSON, etc.
• El proceso inverso es posible con Import
Tema 3.4: Código en el servidor - PHP y MySQL 23
Ejercicios con phpMyAdmin
• Pruebas en casa con phpMyAdmin
• Crear la base de datos tienda con las tablas clientes, productos y pedidos tal
como se han definido previamente
• Insertar elementos en las tres tablas, primero en clientes y productos y luego
en pedidos
• Comprueba qué ocurre si se intenta introducir un pedido para un cliente que no existe
• Intenta eliminar un cliente que tiene algún pedido
• Observa el efecto de haber definido la política DELETE: RESTRICT cuando se estableció la
FOREIGN KEY
• Intenta cambiar el id de un producto que tiene algún pedido
• Observa el efecto de haber definido la política UPDATE: CASCADE cuando se estableció la
FOREIGN KEY
Tema 3.4: Código en el servidor - PHP y MySQL 24
PHP y MySQL
Ejemplo: Ej34bd/bbdd.php
Tema 3.4: Código en el servidor - PHP y MySQL 25
Uso de una base de datos MySQL desde PHP
• Se recomienda utilizar la extensión MySQLi (Mysql improved) en vez de la
tradicional Mysql
• Permite utilizar las mejoras de las últimas versiones del servidor MySQL
• Interfaz orientada a objetos
• Alternativa: PHP Data Objects (PDO)
• Interfaz ligera para acceso a bases de datos, con soporte para MySQL y otros sistemas
de gestión de bases de datos
• Un driver específico para cada SGBD
• Proporciona una capa de abstracción para el acceso a datos
• Independiente del tipo de SGBD
• Orientado a objetos
Tema 3.4: Código en el servidor - PHP y MySQL 26
Uso de una base de datos MySQL desde PHP
• Normalmente comprende los siguientes pasos:
• Conexión con el servidor de bases de datos y selección de una base de datos
• Se obtiene un objeto para operar con la base de datos
• Uso de la base de datos
• Envío de operación SQL a la base de datos
• Recepción y tratamiento de los resultados
• Liberar memoria de resultados
• Desconexión
Tema 3.4: Código en el servidor - PHP y MySQL 27
Conexión con la base de datos
• Para utilizar una base de datos hay que indicar el servidor y la base de datos
que se quiere utilizar, con un usuario
• Devuelve un objeto sobre el que operar con la base de datos
• Si hubiera un error se comprueba con el método mysqli_connect_errno()
$mysqli = new mysqli($hostname, $usuario, $password, $basededatos);
if ( mysqli_connect_errno() ) {
echo "Error de conexión a la BD: ".mysqli_connect_error();
exit();
}
• Cuando se deja de utilizar la base de datos conviene cerrar la conexión al
servidor para liberar recursos ordenadamente
$mysqli->close();
Tema 3.4: Código en el servidor - PHP y MySQL 28
Operaciones SQL en una base de datos MySQL
• Las queries SQL se pasan con el método query
$mysqli->query("SQL query");
• Devuelve un objeto que permite tratar los resultados
• Devuelve FALSE si hay algún error
• Si se ponen variables PHP en la query, se ponen entre comillas
simples para que la función mysql_query las reemplace por su valor
$empresa="Empresa%";
$query="SELECT * FROM clientes WHERE nombre LIKE '$empresa'";
$resultado=$mysqli->query($query)
or die ($mysqli->error. " en la línea ".(__LINE__-1));
$numregistros=$resultado->num_rows;
echo "<p>El número de clientes con nombre Empresa* es:
",$numregistros,".</p>";
Tema 3.4: Código en el servidor - PHP y MySQL 29
El condicional WHERE
• LIKE
SELECT * FROM canales WHERE nombre LIKE '%TV%’
• BETWEEN
SELECT * FROM empleados WHERE edad BETWEEN 40 and 50
• ORDER BY
SELECT * FROM empleados ORDER BY edad DESC
• LIMIT
SELECT * FROM empleados ORDER BY apellido LIMIT 0,3
SELECT * FROM empleados ORDER BY apellido LIMIT 3,3
• DISTINCT
SELECT DISTINCT campos FROM tablas WHERE ...
Tema 3.4: Código en el servidor - PHP y MySQL 30
Funciones estadísticas
COUNT La cantidad de registros seleccionados por una consulta
MIN El valor mínimo almacenado en ese campo
MAX El valor máximo almacenado en ese campo
SUM La sumatoria de ese campo
AVG El promedio de ese campo
Tema 3.4: Código en el servidor - PHP y MySQL 31
Operaciones SQL en una base de datos MySQL
• Varios atributos y métodos de la clase mysqli_result facilitan el
tratamiento de los registros obtenidos
• $num_rows: Número de registros (filas)
• $numfilas=$resultado->num_rows;
• fetch_all([modo]): Devuelve todas las filas en un array asociativo, numérico, o
en ambos
• $registro=$resultado->fetch_all([modo])
• Modo: argumento opcional para indicar cómo se accede a los registros
• Usando el nombre del campo como índice: MYSQL_ASSOC
• Usando la posición como índice: MYSQL_NUM
• Usando tanto el nombre de campo como la posición: MYSQL_BOTH
• fetch_array([modo]): Lo mismo pero los devuelve de uno en uno (en cada
llamada)
• fetch_assoc(): Lo mismo que el anterior pero como array asociativo
• fetch_object(): Devuelve la fila actual de un conjunto de resultados como un
objeto
• free(): Libera la memoria asociada al resultado
• $resultado->free();
Tema 3.4: Código en el servidor - PHP y MySQL 32
Operaciones SQL en una base de datos MySQL
• Ejemplo: listado de la tabla clientes Contiene los registros que cumplen la
condición del SELECT
$query="SELECT * FROM clientes";
$resultado=$mysqli->query($query)
or die ($mysqli->error. " en la línea ".(__LINE__-1));
$numregistros=$resultado->num_rows;
echo "<p>El número de clientes es:",$numregistros,".</p>";
echo "<table border=2><tr><th>NIF</th> <th>Nombre</th> <th>Dirección</th>
<th>Email</th> <th>Teléfono</th></tr>";
while ($registro = $resultado->fetch_assoc()) {
echo "<tr>";
foreach ($registro as $campo)
echo "<td>",$campo, "</td>";
Contiene varios campos
echo "</tr>";
}
echo "</table>";
$resultado->free();
Tema 3.4: Código en el servidor - PHP y MySQL 33
Tratamiento de campos de un registro
while ($registro = $resultado->fetch_assoc()) {
echo "<tr>";
foreach ($registro as $campo)
echo "<td>",$campo, "</td>";
echo "</tr>";
}
Ambas estructuras proporcionan el mismo resultado
while ($registro = $resultado->fetch_assoc()) {
echo "<tr> $registro[“ “]<td> $registro[“ “] "</td>";
echo "</tr>";
}
Tema 3.3: Código en el servidor - Objetos en PHP 34
SQL SELECT
Recupera elementos de una tabla o conjunto de tablas (con JOIN)
SELECT campos FROM tabla WHERE campo = valor
Si se quieren todos los campos, usar *
Si se omite la cláusula WHERE se tienen todos los campos de la
tabla
Para la condición WHERE se pueden usar varios operadores:
= <> != < <= > >= AND OR NOT
Tema 3.3: Código en el servidor - Objetos en PHP 35
SQL SELECT
Se pueden recuperar campos de varias tablas
SELECT tabla1.campo1 tabla2.campo2 FROM tabla1, tabla2
WHERE campo3=valor3 AND tabla1.campo1 = tabla2.campo2
Tema 3.3: Código en el servidor - Objetos en PHP 36
SQL INSERT
Inserta nuevos elementos en una tabla
INSERT INTO clientes (nif, nombre, direccion, email)
VALUES ("M3885337J", "Empresa Uno", "Calle Uno, Madrid“, jefe@empresauno.com)
Si recibimos los datos de un formulario:
//Validamos que hayan llegado estas variables, y que no esten vacias:
if (isset($_POST["nif"], isset($_POST["nombre"], $_POST["email"], $_POST[“direccion"]) and
$_POST["nif"] !="" and $_POST["nombre"] !="" and $_POST["email"]!="" and $_POST[“direccion"]!="" ){
//traspasamos a variables locales:
$nif = $_POST["nif"];
$nombre = $_POST["nombre"];
$email = $_POST["email"];
$direccion = $_POST[“direccion"];
INSERT INTO clientes (nif,nombre,direccion, email) VALUES (‘$nif','$nombre','$dirección','$email');
Tema 3.3: Código en el servidor - Objetos en PHP 37
SQL DELETE
Ejemplo: Elimina pedidos con más de 30 días de antigüedad
DELETE FROM pedidos WHERE fecha < CURDATE()‐10
CUIDADO: Al no poseer una condición WHERE, eliminará todos los
registros de la tabla
DELETE FROM tabla
Si recibimos el código a borrar desde un formulario:
DELETE FROM tabla WHERE id='$_GET["codigo"]’
Hay un problema, ¿sabes cuál es?
Tema 3.3: Código en el servidor - Objetos en PHP 38
Problema con comillas dobles anidadas
Surge al asignar esta sql a la variable $query
DELETE FROM tabla WHERE id='$_GET["codigo"]’
Dos soluciones:
1) Envolver entre llaves el valor que se envía a MySql:
$query="DELETE FROM empleados WHERE id='{$_GET["codigo"]} '”;
2) Traspaso a una variable local
$codigo = $_GET["codigo"];
$query = "DELETE FROM empleados WHERE id='$código'”;
Tema 3.3: Código en el servidor - Objetos en PHP 39
SQL UPDATE
Ejemplo: Modifica el importe del producto "Producto1"
UPDATE productos SET precio = 399.99 WHERE nombre="Producto1“
CUIDADO: Al no poseer una condición WHERE, modificará todos los registros de la tabla
UPDATE tabla SET campo='valor'
Ejemplo: Datos pasados de un formulario y pasado a variables
UPDATE empleados SET nombre='$nombre', apellido='$apellido', edad='$edad',
especialidad='$especialidad' WHERE id='$codigo';
Tema 3.3: Código en el servidor - Objetos en PHP 40
Ejemplo de Inyección de código
Si en password introducimos este valor:
Condición verdadera
‘OR “=“
la instrucción SQL quedaría así:
SELECT" * FROM usuarios WHERE usuario= 'cualquiera' AND clave=' ' OR “=“;
La primera comilla cerraría la comilla abierta de la clave e incluiría una condición verdadera
como podría ser “e”=“e” o 123=123
Sabiendo la clave secreta se podría entrar sin conocer la contraseña
Tema 3.3: Código en el servidor - Objetos en PHP 41
Como evitar la Inyección de código
$usuario = mysql_real_escape_string ($_POST["usuario"]);
$password = mysql_real_escape_string ($_POST["clave"]);
Si hacemos echo de password, las comillas son desactivadas incluyendo una “\”
delante:
\' OR' \'\'=\'
Tema 3.3: Código en el servidor - Objetos en PHP 42
Páginas de ejemplo de accesos a bases de datos
https://disenowebakus.net/altas-bajas-y-modificaciones-en-bases-de-
datos-mysql-phpmyadmin-php.php
https://disenowebakus.net/llevando-datos-de-la-base-mysql-a-las-pagi
nas-php.php
https://parzibyte.me/blog/2018/02/12/mysql-php-pdo-crud/
https://www.tutorialrepublic.com/php-tutorial/php-mysql-crud-applica
tion.php
Tema 3.4: Código en el servidor - PHP y MySQL 43
Consejos generales
Tema 3.4: Código en el servidor - PHP y MySQL 44
Objetos vs. clásico
• Muy cómodo usar objetos para las entidades del dominio
• Una clase para los elementos de cada tabla; asumamos una tabla 'anuncios'
• Objeto 'anuncio'. Métodos para
• crear un nuevo anuncio (= constructor)
• insertar (devuelve ID asignado) ó sobreescribir un anuncio en la BD
• borrar un anuncio de la BD por ID
• leer un anuncio de la BD por ID
• leer de la BD todos los anuncios de un tipo dado
• "Data Access Object", DAO: patrón de diseño especializado en persistir los
datos
• Código de vistas muy legible; posibilidad de pasar de/a JSON fácilmente
Tema 3.3: Código en el servidor - Objetos en PHP 45
Backup de la base de datos
• Consejos importante para el proyecto
• Crear una buena base de datos con datos de prueba detallados
• Tener siempre a mano un backup de la misma
• Es muy común estropear el contenido de la BDD durante el desarrollo.
• Cada vez que se añade nueva funcionalidad, hacemos una nueva versión de
los datos de prueba
• Y su backup, claro.
Tema 3.4: Código en el servidor - PHP y MySQL 46
Escapar argumentos
$login = $mysqli->real_escape_string($_POST['txtlogin']);
$pass = $mysqli->real_escape_string($_POST['txtpass']);
$resultado = $mysqli->query("SELECT * FROM tbusuario where
login='$login' and pass='$pass' and activo!=0");
$valida=$resultado->num_rows;
if($valida != 0){
$datosUsu = $resultado->fetch_row();
$_SESSION['nombreusu'] = $datosUsu[3];
$_SESSION['perfil'] = $datosUsu[4];
echo "<META HTTP-EQUIV='Refresh’
CONTENT='0; URL=listar.php'>";
}
else . . .
Tema 3.4: Código en el servidor - PHP y MySQL 47
BD: peligros y opciones
• Opciones
• Usa PDO con prepared statements
• Usa PEAR MDB2 (algo obsoleto) con prepared statements
• Usa mysqli_*
y no te olvides, nunca, nunca, de escapar argumentos con
mysqli_real_escape_string()
$nombre = $mysqli->real_escape_string($nombre);
$firstname = mysqli_real_escape_string($con, $_POST['firstname']);
Tema 3.4: Código en el servidor - PHP y MySQL 48
Cifrado de password
<?php
// Al elegir BCRYPT la salida del algoritmo siempre serán 60 caracteres
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT)."\n";
// Genera $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
?>
// inserta un nuevo usuario en la BD
function add_user($db, $login_, $pass_, $role) {
$hashed = password_hash($pass);
inserta ($login_, $hashed, $role) en BD
}
// verifica que una contraseña es correcta
function auth_check_login($db, $login_, $pass_) {
consulta ($hashed) en BD, buscando por $login_
return password_verify($pass_, $hashed);
}
Tema 3.4: Código en el servidor - PHP y MySQL 49
Ejemplo
• Ejemplo en el SA de Usuario: insertar usuario y validar login...
public function insertarUsuario(tUsuario $usuario..)
. . .
if(empty($errores)) {
// encriptamos la contraseña del usuario
$usuario->setPassword(password_hash($usuario->getPassword(),
PASSWORD_DEFAULT));
// insertamos el usuario.
$idUsuario = $this->daoUsuario->insert($usuario);
. . .
}
Tema 3.4: Código en el servidor - PHP y MySQL 50
Ejemplo
public function validaLogin($username, $password)
. . .
$errores = array();
$usuario;
if(empty($username)) {
$errores[] = "El nombre de usuario no puede estar vacio";
}
if(empty($password)) {
$errores[] = "La contraseña no puede estar vacia";
}
If (mb_strlen($password) < 4) {
. . .
if(empty($errores)) {
$usuario = $this->buscarUsuarioPorNombre($username);
if($usuario) {
if(password_verify($password, $usuario->getPassword()))
{
$_SESSION['sesion'] = true;
$_SESSION['userID'] = $usuario->getId();
$_SESSION['esAdmin']=($usuario->getNivel_Acceso() == 9) ? true :false;
Tema 3.4: Código en el servidor - PHP y MySQL 51
PEAR: Para no redescubrir la rueda
• PHP Extension and Application Repository
• Extensiones a PHP (módulos) para automatizar tareas frecuentes
• Configurable vía dir-xampp/php/pear.bat (desde consola)
• Extensiones interesantes
• DB: Manejo de conexiones a bases de datos, MySQL inclusive
• Permite cambiar el motor de BD sin tocar código (abstracción)
• Sustitución de parámetros inteligente, evitando "inyección SQL"
• Extensiones recomendadas
• Auth: Manejo de autenticación
• Mail: Envío de correos
• HTML_QuickForm2: generación / validación de formularios
• Text_CAPTCHA: generación / validación de CAPTCHAS
Tema 3.4: Código en el servidor - PHP y MySQL 52
Licencia de uso
• Licencia Creative Commons
• Este documento tiene establecidas las siguientes
condiciones:
Reconocimiento (Attribution):
En cualquier explotació n de la obra autorizada por la licencia
hará falta reconocer la autoría.
No comercial (Non commercial):
La explotació n de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotació n autorizada incluye la creació n de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.
• Material elaborado por Juan Pavón Mestras, con modificaciones
de Pablo Moreno Ger, Manuel Freire Morán, Raquel Hervás
Ballesteros y Santiago Domínguez Salamanca
53