phpMyAdmin - Ejercicios (2) - Soluciones

En esta lección se proponen soluciones detalladas de los ejercicios (2) de phpMyAdmin. Se recomienda intentar realizarlos primero sin recurrir a estas soluciones.

phpMyAdmin (2) 1 - Crear un usuario iaw_agenda_1 con una base de datos única

  1. Cree un nuevo usuario de MySQL
    • En la página principal, haga clic en el enlace Cuentas de usuarios:

      phpMyAdmin. Usuarios

    • Para crear un nuevo usuario, haga clic en el enlace Agregar cuenta de usuario:

      phpMyAdmin. Usuarios

    • En la pantalla Agregar cuenta de usuario, agregue un nuevo usuario con la siguiente configuración y haga clic en el botón Continuar:
      • nombre de usuario: iaw_agenda_1
      • nombre de host: localhost
      • contraseña: iaw_agenda_1
      • base de datos para la cuenta de usuario: Crear base de datos con el mismo nombre (iaw_agenda_1)
      • sin privilegios globales
      • sin límite de recursos

      phpMyAdmin. Usuarios

    • Se mostrará el mensaje de creación de usuario y en la lista de bases de datos lateral se mostrará la base de datos iaw_agenda_1.

      phpMyAdmin. Usuarios

  2. Al entrar como usuario iaw_agenda_1, en el lateral izquierdo se puede ver la base de datos iaw_agenda_1.

    phpMyAdmin. Usuarios

  3. Haga clic en la opción Bases de datos y compruebe que no tiene privilegios para crear más bases de datos

    phpMyAdmin. Usuarios

phpMyAdmin (2) 2 - Instalar una aplicación como usuario iaw_agenda_1

phpMyAdmin (2) 3 - Crear un usuario iaw_agenda_2 que pueda administrar varias bases de datos

  1. Cree un nuevo usuario de MySQL
    • En la página principal, haga clic en el enlace Cuenta de usuarios:

      phpMyAdmin. Usuarios

    • Para crear un nuevo usuario, haga clic en el enlace Agregar cuenta de usuario:

      phpMyAdmin. Usuarios

    • En la pantalla Agregar cuenta de usuario, agregue un nuevo usuario con la siguiente configuración y haga clic en el botón Continuar:
      • nombre de usuario: iaw_agenda_2
      • nombre de host: localhost
      • contraseña: iaw_agenda_2
      • base de datos para la cuenta de usuario: Otorgar todos los privilegios al nombre que contiene comodín (username\_%)
      • sin privilegios globales
      • sin límite de recursos

      phpMyAdmin. Usuarios

    • Se mostrará el mensaje de creación de usuario, pero en la lista de bases de datos lateral no se mostrará ninguna base de datos cuyo nombre empiece por iaw_agenda_2_.

      phpMyAdmin. Usuarios

  2. Una vez creado el usuario, salga de phpMyAdmin y entre como usuario iaw_agenda_2. Compruebe que no se ha creado ninguna base de datos cuyo nombre empiece por iaw_agenda_2_.

    phpMyAdmin. Usuarios

  3. Haga clic en la opción Bases de datos y compruebe que tiene privilegios para crear más bases de datos, pero su nombre debe comenzar por iaw_agenda_2_.

    phpMyAdmin. Usuarios

phpMyAdmin (2) 4 - Instalar dos aplicaciones como usuario iaw_agenda_2

phpMyAdmin (2) 5 - Crear un usuario iaw_agenda_3 con una base de datos única

Este ejercicio se resuelve como el ejercicio phpMyadmin (2) 1.

phpMyAdmin (2) 6 - Instalar dos aplicaciones como usuario iaw_agenda_3

El "truco" para que un usuario con una única base de datos pueda instalar dos aplicaciones es que las aplicaciones trabajen con tablas distintas.

phpMyAdmin (2) 7 - Mejora de las aplicaciones del usuario iaw_agenda_3

  1. El problema de las aplicaciones del ejercicio 6 es que las dos aplicaciones borran la base de datos antes de crear su tabla, por lo que al hacer Borrar todo en una aplicación se destruye también la tabla de la otra.

    Para resolver este problema basta con eliminar el borrado y creación de la base de datos de la función borrarTodo():

    /* biblioteca-mysql.php aplicación agenda-3a y agenda-3b */
    
    function borraTodo()
    {
        global $pdo, $cfg;
    
        $consulta = "DROP TABLE IF EXISTS $cfg[dbPersonasTabla]";
    
        if (!$pdo->query($consulta)) {
            print "    <p class=\"aviso\">Error al borrar la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } else {
            print "    <p>Tabla borrada correctamente (si existía).</p>\n";
        }
        print "\n";
    
        $consulta = "CREATE TABLE $cfg[dbPersonasTabla]  (
                     id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
                     nombre VARCHAR($cfg[dbPersonasTamNombre]),
                     apellidos VARCHAR($cfg[dbPersonasTamApellidos]),
                     telefono VARCHAR($cfg[dbPersonasTamTelefono]),
                     correo VARCHAR($cfg[dbPersonasTamCorreo]),
                     PRIMARY KEY(id)
                     )";
    
        if (!$pdo->query($consulta)) {
            print "    <p class=\"aviso\">Error al crear la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } else {
            print "    <p>Tabla creada correctamente.</p>\n";
        }
    }
    
  2. Ejecute las aplicaciones en el navegador y compruebe que funcionan creando varios registros. Compruebe especialmente que al borrar todo desde una aplicación no se borran los registros de la otra.
  3. Compruebe los contenidos de las tablas en phpMyAdmin como usuario iaw_agenda_3.
  4. Las aplicaciones tal y como las hemos modificado funcionan siempre que exista la base de datos. Puesto que el usuario iaw_agenda_3 se ha creado en el ejercicio 5 como usuario del tipo "base de datos con el mismo nombre", phpMyAdmin ha creado la base de datos iaw_agenda_3 junto con el usuario. El problema lo tendríamos si el usuario iaw_agenda_3 hubiera sido del tipo "comodín {username\_%)", para los que phpMyAdmin no crea bases de datos.
  5. Para resolver este caso, deberíamos mejorar la función borrarTodo() incluyendo una consulta inicial "CREATE DATABASE IF NOT EXISTS", que creara la base de datos si no existe.
  6. /* biblioteca-mysql.php aplicación agenda-3a y agenda-3b */
    
    function borraTodo()
    {
        global $pdo, $cfg;
    
        $consulta = "CREATE DATABASE IF NOT EXISTS $cfg[mysqlDatabase]
                     CHARACTER SET utf8mb4
                     COLLATE utf8mb4_unicode_ci";
    
        if (!$pdo->query($consulta)) {
            print "    <p class=\"aviso\">Error al crear la base de datos. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } else {
            print "    <p>Base de datos creada correctamente (si no existía).</p>\n";
        }
    
        $consulta = "DROP TABLE IF EXISTS $cfg[dbPersonasTabla]";
    
        if (!$pdo->query($consulta)) {
            print "    <p class=\"aviso\">Error al borrar la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } else {
            print "    <p>Tabla borrada correctamente (si existía).</p>\n";
        }
        print "\n";
    
        $consulta = "CREATE TABLE $cfg[dbPersonasTabla]  (
                     id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
                     nombre VARCHAR($cfg[dbPersonasTamNombre]),
                     apellidos VARCHAR($cfg[dbPersonasTamApellidos]),
                     telefono VARCHAR($cfg[dbPersonasTamTelefono]),
                     correo VARCHAR($cfg[dbPersonasTamCorreo]),
                     PRIMARY KEY(id)
                     )";
    
        if (!$pdo->query($consulta)) {
            print "    <p class=\"aviso\">Error al crear la tabla. SQLSTATE[{$pdo->errorCode()}]: {$pdo->errorInfo()[2]}</p>\n";
        } else {
            print "    <p>Tabla creada correctamente.</p>\n";
        }
    }