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