(2022-2023)
Integración
Lenguajes de Script con Sistemas Gestores de Bases de Datos.
Conexión
A bases de datos haciendo uso de funciones de PHP
Creación de
Bases de datos y tablas.
# UT06
# UT06
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
<h3>CONFIGURACIÓN DE PHP</h3>
<p>
<?php
/* MUESTRA INFORME DE LA CONFIGURACIÓN DE PHP */
echo phpinfo();
?>
</p>
# UT06
# UT06
Nos permite acceder a la funcionalidad de MySQL desde PHP
# UT06
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
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)
<?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
<?php
//$conexion es un objeto de la clase mysqli
$conexion = new mysqli($host, $user, $pwd, $db);
?>
# UT06
Tratamiento de la Información.
Codificación de consultas
Modificación de datos (insertar, actualizar, eliminar)
Verificación
de la información, uso de integridad referencial, motores MyISAM e innodb.
Gestión
de errores try{...}catch{...}
# UT06
# UT06
Una vez conectados a la BD, resulta una tarea sencilla manipular datos gracias a las funciones específicas de PHP para manejar BD
# UT06
//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
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
//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
//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
//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
<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
//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
//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;
}Tratamiento de la Información.
Codificación de consultas
Modificación de datos (insertar, actualizar, eliminar)
Verificación
de la información, uso de integridad referencial, motores MyISAM e innodb.
Gestión
de errores try{...}catch{...}
# UT06
Documentación de aplicaciones web
¿Qué conviene documentar en una aplicación?
PhpDocumentor
Generar documentación para proyectos en PHP
Repaso manipulación de datos con Lenguajes de Script
Repaso de la sintaxis.
# UT06
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
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
# 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
@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;
}
?>Proceso de Instalación de phpDocumentor