UT06. Acceso a bases de datos desde lenguajes de script de servidor
(2022-2023)
IMPLANTACIÓN DE APLICIONES WEB
Sesión 1. ¿Qué vamos a ver hoy?
Integración
Lenguajes de Script con Sistemas Gestores de Bases de Datos.
1.
2.
Conexión
A bases de datos haciendo uso de funciones de PHP
3.
Creación de
Bases de datos y tablas.
# UT06
# UT06
Integración de PHP con SGBD
Con la creación de nuestra pila LAMP visto en UT anteriores ya tenemos realizada la integración con el SGBD MySQL o MaríaDB
Pero PHP puede trabajar
con otros sistemas
Comprobación fichero php.ini
<h3>CONFIGURACIÓN DE PHP</h3>
<p>
<?php
/* MUESTRA INFORME DE LA CONFIGURACIÓN DE PHP */
echo phpinfo();
?>
</p>
# UT06
# UT06
mysqli
Nos permite acceder a la funcionalidad de MySQL desde PHP


# UT06
Conexión a Bases de Datos
PHP dispone de una serie de funciones que facilitan la realización de consultas entre las webs y las BBDD's más usuales
En primer lugar siempre estableceremos la conexión entre nuestra app y la BBDD
mysqli_connect
Requiere una serie de parámetros
host
username
password
dbname
port
socket
# UT06
Conexión a Bases de Datos
Dicha conexión se almacena en una variable y la podemos realizar de 2 formas:
OPCION 1. Usando la llamada a una función
(programación estructurada)
OPCION 2. Llamando al constructor de la clase para crear el objeto
(POO)
OPCION 1. Llamada a función
<?php
//Abrir conexión con base de datos - Uso de parámetros para llamar a la función
$conexion = mysqli_connect($host, $user, $pwd, $db);
?>
# UT06
OPCION 2. Instanciando un objeto
<?php
//$conexion es un objeto de la clase mysqli
$conexion = new mysqli($host, $user, $pwd, $db);
?>
# UT06
Sesión 2. ¿Qué vamos a ver hoy?
Tratamiento de la Información.
Codificación de consultas
Modificación de datos (insertar, actualizar, eliminar)
1.
2.
Verificación
de la información, uso de integridad referencial, motores MyISAM e innodb.
3.
Gestión
de errores try{...}catch{...}
# UT06
# UT06
Tratamiento de la información
Una vez conectados a la BD, resulta una tarea sencilla manipular datos gracias a las funciones específicas de PHP para manejar BD
# UT06
Insertar registros en la base de datos
//Parámetros de conexión a nuestra base de datos
include_once("config.php");
// Crear la conexión
$conexion = new mysqli($DB_HOST, $DB_USER, $DB_PASSWORD, $DB_BASE);
//Si no se ha podido llevar a cabo la conexión abortamos el programa
if ($conexion->connect_error) {
die("Connection failed: " . $conexion->connect_error);
}
//Acciones a realizar una vez establecida la conexión
//En este caso vamos a añadir un nuevo registro en la tabla fabricante
$consulta = $conexion->prepare("INSERT INTO fabricante (nombre) VALUES (?)");
//Establecemos el valor de la variable $nombre
$nombre = "Fabricante de prueba";
//Enlazamos el parámetro indicando el tipo de dato que va a esperar la consulta
//Este ejemplo espera un string que indicamos mediante 's'
$consulta->bind_param("s", $nombre);
//Cerramos la consulta
$consulta->close();
//Cerramos la conexion
$conexion->close();# UT06
Insertar registros - Recomendado
include_once("./conexion.php");
function insertarFabricante($conexion, $nombre){
//Preparamos la sentencia a ejecutar parametrizando los valores
$sentencia = $conexion->prepare("INSERT INTO fabricante (nombre) VALUES (?);");
//Vinculación de los parámetros
$sentencia->bind_param('s', $nombre);
//Comprobamos que se puede llevar a cabo la ejecución
if($sentencia->execute()){
//Cerramos la sentencia
$sentencia->close();
//cerramos la conexion
$conexion->close();
//Redirigimos al sitio que deseemos
header('Location:http://proyecto.site/ut06/sesion2/insertok.php');
}else{
//Redirigimos a la página de error
header('Location:http://proyecto.site/ut06/sesion2/insertko.php');
}
}# UT06
Obtener registros de la BBDD
//Realizamos la conexión con nuestra BBDD como siempre
include_once("./conexion.php");
//Definición de la función
function obtenerProductos($conexion){
//Ejecutamos la sentencia SELECT deseada
$productos = mysqli_query($conexion, "SELECT * FROM producto ORDER BY nombre;");
//Cerramos la conexión
$conexion->close();
//retornamos los resultados
return $productos;
}
# UT06
Obtener registros - Recorrido resultado
//Llamamos a la función para obtener los resultados
$resultado = obtenerProductos($conexion);
//Comprobamos que se ha traido resultados para mostrar
if (isset($resultado)){
//Definimos la estructura de la tabla
echo "<table class='table table-light table-striped table-hover'>
<thead><tr><th>ID</th><th>Nombre</th><th>Precio</th></tr></thead><tbody>";
//Recorremos el resultado con fetch_assoc() que me dará un array asociativo, también
//se puede usar fetc_array() con un resultado similar.
while($producto = $resultado->fetch_assoc()){
//Añadimos una fila a la tabla por cada producto
echo "<tr><td>" .$producto["txtCodigo"]. "</td><td>". $producto["nombre"].
"</td><td>". number_format($producto["precio"],2,",",".") ." €" ."</td></tr>";
}
//Cerramos la estructura de tabla
echo "</tbody></table>";
}else{
echo "La consulta no ha generado resultados";
}# UT06
Actualizar registros de la BBDD
//Realizamos la conexión con nuestra BBDD como siempre
include_once("./conexion.php");
/** Consultamos la información del código de producto recibido */
function obtenerDatosProducto($conexion, $codigo){
//preparamos la consulta
$sql = "SELECT * FROM producto WHERE codigo=" .$codigo. ";";
//Ejecutamos la sentencia SELECT
$producto = $conexion->query($sql);
//Cerramos la conexión
//$conexion->close();
//Devolvemos el resultado
return $producto;
}
function updateProducto($conexion, $codigo, $producto){
//Aquí vamos a usar también la consulta parametrizada
//Creamos nuestra sentencia
$sentencia = $conexion->prepare('UPDATE producto SET nombre = ?, precio = ? WHERE codigo = ?');
//Vinculamos los parámetros
$sentencia->bind_param('sdi', $producto['txtNombre'], $producto['txtPrecio'], $codigo);
//Comprobamos que se puede llevar a cabo la ejecución
if($sentencia->execute()){
//Cerramos la sentencia
$sentencia->close();
//cerramos la conexion
$conexion->close();
//Redirigimos al sitio que deseemos
header('Location:http://proyecto.site/ut06/sesion2/updateok.php');
}else{
//Redirigimos a la página de error
header('Location:http://proyecto.site/ut06/sesion2/updateko.php');
}
}
//Si tenemos un código nos traemos la info de la BBDD
if(isset($_GET['codigo'])){
$resultado = obtenerDatosProducto($conexion, $_GET['codigo']);
$producto = $resultado->fetch_assoc();
}
# UT06
Actualizar registros de la BBDD
<form action="updateproducto.php" method="post">
<div class="form-floating mb-3">
<input type="number" class="form-control" id="txtCodigo" name="txtCodigo"
value="<?php echo $producto['codigo'] ?>">
<label for="txtCodigo">Código del producto</label>
</div>
<div class="form-floating mb-3">
<input type="text" class="form-control" id="txtNombre" name="txtNombre"
value="<?php echo $producto['nombre'] ?>" required>
<label for="txtNombre">Nombre del producto</label>
</div>
<div class="form-floating mb-3">
<input type="number" class="form-control" id="txtPrecio" name="txtPrecio" step="0.01"
value="<?php echo $producto['precio'] ?>" required>
<label for="txtPrecio">Precio del producto</label>
</div>
<button type="submit" class="btn btn-warning">Actualizar producto</button>
</form>
<br><br><br>
<?php
//Comprobamos que se hayan modificado los datos del formulario
if(isset($_POST['txtNombre']) && isset($_POST['txtPrecio'])){
//Llamamos a la función para actualizar la información
updateProducto($conexion, $_POST['txtCodigo'], $_POST);
}
# UT06
Eliminar registros de la BBDD
//Realizamos la conexión con nuestra BBDD como siempre
include_once("./conexion.php");
function deleteProducto($conexion, $codigo){
$sentencia = $conexion->prepare("DELETE FROM producto WHERE codigo = ?");
$sentencia->bind_param('i', $codigo);
if($sentencia->execute()){
$mensaje = "Se ha borrado correctamente el registro";
}else{
$mensaje = "Ha habido un error contacte con el administrador del sitio";
}
$sentencia->close();
$conexion->close();
return $mensaje;
}# UT06
Gestión de Errores
//Realizamos la conexión con nuestra BBDD como siempre
include_once("./conexion.php");
function deleteProducto($conexion, $codigo){
$sentencia = $conexion->prepare("DELETE FROM producto WHERE codigo = ?");
$sentencia->bind_param('i', $codigo);
try {
$sentencia->execute();
$mensaje = "Se ha borrado correctamente el registro";
} catch (Exception $e) {
echo 'Excepción capturada: ', $e->getMessage(), "\n";
}finally {
$mensaje = "Ha habido un error contacte con el administrador del sitio";
}
$sentencia->close();
$conexion->close();
return $mensaje;
}Sesión 3. ¿Qué vamos a ver hoy?
Tratamiento de la Información.
Codificación de consultas
Modificación de datos (insertar, actualizar, eliminar)
1.
2.
Verificación
de la información, uso de integridad referencial, motores MyISAM e innodb.
3.
Gestión
de errores try{...}catch{...}
# UT06
Documentación de aplicaciones web
¿Qué conviene documentar en una aplicación?
1.
2.
PhpDocumentor
Generar documentación para proyectos en PHP
3.
Repaso manipulación de datos con Lenguajes de Script
Repaso de la sintaxis.
# UT06
Documentación de Aplicaciones Web
Se debe documentar 3 aspectos fundamentales
Interfaz
Implementación
Toma de decisiones
¿Qué hace? (funciones, métodos, parámetros)
Explicación paso a paso, uso de variables, algoritmos, etc
Por qué se ha implementado así y no de otra manera
La información de la interfaz conviene pasarla a un documento independiente del código fuente (manual de uso)
HERRAMIENTAS
Existen algunas herramientas que permiten generar documentación de forma automática a partir del código fuente.
PhpDocumentor
JavaDoc
Extensiones de IDE (VS Code)
# UT06
PhpDocumentor
permite generar automáticamente una buena documentación de nuestro código haciendo uso de comentarios y etiquetas especiales
Desde línea de comandos
Interfaz Web (incluida)
Desde código (scripts propios)
# UT06
En cualquier caso siempre habrá que especificar estos parámetros
- Directorio del proyecto (raíz)
- los @package (opcional)
- Directorio de generación de la documentación
- Pública (sólo interfaz) o interna (@internal)
- Formato de salida de la Documentación (html, PDF, XML)
# UT06
La documentación se distribuye en "DocBlocks" que van antes del elemento a documentar
<?php
/**
* suma
*
* @param mixed $a
* @param mixed $b
* @return void
*/
function suma($a, $b){
return $a + $b;
}
?># UT06
Elementos que pueden ser documentados
- define / function / class / class vars
- include / require / include_once / require_once
- global variables
@access : Para generar documentación solo de la interfaz y no de la implementación
@author: Autor de ese fragmento de código
@copyright: Información sobre derechos
@ignore: No se documenta por phpDocumentor
@deprecated: Para indicar que no se use, no disponible en futuras versiones
# UT06
Un ejemplo sobre marcas internas en DockBlock podría ser:
<?php
/**
* suma
* @author Manu
* @copyright Creative Commons 4.0
* @param mixed $a
* @param mixed $b
* @return void
*/
function suma($a, $b){
return $a + $b;
}
?>Instalación
Proceso de Instalación de phpDocumentor

¡¡¡Repasemos un poco!!!
IAW-UT06-Acceso a bases de datos desde lenguajes de script de servidor
By Manuel Jesús Rodríguez Arabi
IAW-UT06-Acceso a bases de datos desde lenguajes de script de servidor
- 209

