Diferencia entre revisiones de «Usuario:ManuelRomero/NewPHP/B2T8/BasesDatos/practica»

De WikiEducator
Saltar a: navegación, buscar
(Requisito 1 Visualizar la base de datos)
Línea 77: Línea 77:
 
*Puedes usarlo de ejemplo o construirte uno propio '''''index.php'''''
 
*Puedes usarlo de ejemplo o construirte uno propio '''''index.php'''''
 
{{Plegable|hide|Código de index.php|
 
{{Plegable|hide|Código de index.php|
<source lang=html5>
+
 
 
<!DOCTYPE html>
 
<!DOCTYPE html>
 
 
<?php
 
<?php
 
//Función para auto carga de clases siguiendo las buenas prácticas de programación
 
//Función para auto carga de clases siguiendo las buenas prácticas de programación
 
spl_autoload_register(function ($clase) {
 
spl_autoload_register(function ($clase) {
    require_once "$clase.php";
+
  require_once "$clase.php";
 
}
 
}
 
);
 
);
 
+
session_start();
  
 
//Si paso parámetros de conexión los leo
 
//Si paso parámetros de conexión los leo
 +
$datosConexión = [];
 
if (isset($_POST['conectar'])) {
 
if (isset($_POST['conectar'])) {
    $localhost = filter_input(INPUT_POST, 'localhost');
 
    $user = filter_input(INPUT_POST, 'usuario');
 
    $pass = filter_input(INPUT_POST, 'pass');
 
    $db = new BD($localhost, $user, $pass);
 
} else
 
    $db = new BD();
 
  
//Consulto las bases de datos de mi servidor de bases de datos
+
  //Guardo los datos de conexión en variable de sesión
$basesDatos = $db->consultar("Show databases");
+
  $_SESSION['conexion']['host'] = filter_input(INPUT_POST, 'host');
 +
  $_SESSION['conexion']['user'] = filter_input(INPUT_POST, 'usuario');
 +
  $_SESSION['conexion']['pass'] = filter_input(INPUT_POST, 'pass');
 +
}
 +
 
 +
if (isset($_SESSION['conexion'])) {
 +
//Si ya he establecido previamente conexión, recojo los datos de sesión
 +
//Si no contendrán null y la conexión fallará y me informará de ello
 +
  $conexion = $_SESSION['conexion'];
 +
} else {
 +
  $_SESSION['conexion']['host'] = 'localhost';
 +
  $_SESSION['conexion']['user'] = 'root';
 +
  $_SESSION['conexion']['pass'] = 'root';
 +
}
 +
 
 +
//creo un objeto de conexión con la base de datos
 +
$db = new BD($conexion);
 +
//En caso de error lo visualizo.
 +
 
 +
 
 +
echo $db->get_error_message();
 
?>
 
?>
  
Línea 110: Línea 124:
 
     </head>
 
     </head>
 
     <body>
 
     <body>
 +
  
 
         <fieldset id="sup"style="width:70%">
 
         <fieldset id="sup"style="width:70%">
Línea 125: Línea 140:
 
         </fieldset>
 
         </fieldset>
  
         <fieldset style="width:70%">
+
         <?php
            <legend>Gestion de las Bases de Datos del host  
+
        if ($db->conectado()):
                  <span class="resaltar">
+
          //Este método retorna un array indexado con los nombres de las bases de datos
                    <?php echo $db->getHost(); ?>
+
          $basesDatos = $db->selecionar_bases_datos();
                  </span>
+
          ?>
            </legend>
+
          <fieldset style="width:70%">
            <form action="tablas.php" method="post">
+
              <legend>Gestion de las Bases de Datos del host <span class="resaltar"><?php echo $db->getHost(); ?></span></legend>
                <?php
+
              <form action="tablas.php" method="post">
                //Observar bien como realio la extracción
+
                  <?php
                //Lo  extraigo como un array indexado para independizarme del nombre del campo
+
                  foreach ($basesDatos as $basedato) {
                while ($basedato = $basesDatos->fetch_array()) {
+
                     echo "<input type=radio value=$basedato name=basedatos>";
                     echo "<input type=radio value=$basedato[0] name=basedatos>";
+
                     echo "<label for=basedatos>$basedato</label><br />";
                     echo "<label for=basedatos>$basedato[0]</label><br />";
+
                  }
                }
+
                  //Muy importante cerrar la conexión de forma explícita
 
+
                  $db->cerrarDB();
                //Muy importante cerrar la conexión de forma explícita
+
                  ?>
                $db->cerrarDB();
+
                  <input type="submit" value="Gestionar">
                ?>
+
              </form>
                <input type="submit" value="Gestionar">
+
          </fieldset>
            </form>
+
        <?php endif ?>
        </fieldset>
+
 
+
 
     </body>
 
     </body>
 
</html>
 
</html>
 
 
</source>
 
</source>
 
}}
 
}}
Línea 167: Línea 179:
 
//Auto carga de clases
 
//Auto carga de clases
 
spl_autoload_register(function ($clase) {
 
spl_autoload_register(function ($clase) {
    require_once "$clase.php";
+
  require_once "$clase.php";
 
}
 
}
 
);
 
);
 +
 +
session_start();
 +
 +
$conexion = $_SESSION['conexion'];
  
 
$basedatos = filter_input(INPUT_POST, 'basedatos');
 
$basedatos = filter_input(INPUT_POST, 'basedatos');
  
 
//Esta opción es por si volvemos de la página gestionarTabla.php
 
//Esta opción es por si volvemos de la página gestionarTabla.php
if (!isset($basedatos)) {
+
if (!isset($basedatos))
    $basedatos = filter_input(INPUT_GET, 'basedatos');
+
  $basedatos = $_SESSION['bd'];
}
+
else
 
+
  $_SESSION['bd'] = $basedatos;
  
 
//Conectamos a la base de datos
 
//Conectamos a la base de datos
$db = new BD();
+
$db = new BD($conexion);
$db->usar_BD("$basedatos");
+
$db->usar_BD("$basedatos", $datosConexion);
 +
$db->get_error_message();
  
  
 
//consultamos las tablas de esa base de datos
 
//consultamos las tablas de esa base de datos
$tablas = $db->consultar("Show tables from $basedatos");
+
//Este método nos retorna un array con todas las tablas de una base de datos concreta
 +
$tablas = $db->seleccionar("Show tables from $basedatos");
 
?>
 
?>
  
Línea 199: Línea 217:
 
         <fieldset id="sup"style="width:25%">
 
         <fieldset id="sup"style="width:25%">
 
             <legend>Listado bases de datos</legend>
 
             <legend>Listado bases de datos</legend>
             <input type="submit" value="Volver">
+
             <form action="index.php" method='POST'>
 +
                <input type="submit" value="Volver" name="volver">
 +
            </form>
 
         </fieldset>
 
         </fieldset>
  
 
         <fieldset style="width:70%">
 
         <fieldset style="width:70%">
             <legend>Gestion de las Bases de Datos  
+
             <legend>Gestion de las Bases de Datos <span class="resaltar"><?php echo $db->get_database(); ?></span></legend>
              <span class="resaltar">
+
                    <?php echo $db->get_database(); ?>
+
              </span>
+
            </legend>
+
 
                 <?php
 
                 <?php
 
                 echo "<form action='gestionarTabla.php' method='post'>";
 
                 echo "<form action='gestionarTabla.php' method='post'>";
                 while ($tabla = $tablas->fetch_array())
+
                 foreach ($tablas as $tabla)
                    echo "<input type=submit value=$tabla[0] name=tabla>";
+
                  echo "<input type=submit value=$tabla[0] name=tabla>";
 
+
                 $_SESSION['bd'] = $basedatos;
                 /*Importante necesitaré
+
                  el nombre de la base de datos para el siguiente script
+
                  Cuando quiera visualizar el contendio de una tabla,
+
                  me tendré que conectar con la base de datos
+
                */
+
                echo "<input type=hidden value=$basedatos name=basedatos>";
+
 
+
 
                 //Muy importante
 
                 //Muy importante
 
                 $db->cerrarDB();
 
                 $db->cerrarDB();
Línea 228: Línea 237:
 
</body>
 
</body>
 
</html>
 
</html>
 
 
</source>
 
</source>
 
}}
 
}}
Línea 249: Línea 257:
  
 
=====Visualizar los datos=====
 
=====Visualizar los datos=====
Esta es la parte principal del requisito 3. Recibimos la tabla seleccionada por POST (Submit que nos trae a este script), necestamos también la base de datos que nos puede venir en un '''input''' de tipo '''hidden'''
+
Esta es la parte principal del requisito 3. Recibimos la tabla seleccionada por POST (Submit que nos trae a este script), necestamos también la base de datos que nos puede venir en un '''input''' de tipo '''hidden'''.
<source lang=php>
+
//En este script siempre necesitaremos la base de datos
+
// y nombre de tabla
+
$basedatos = filter_input(INPUT_POST, "basedatos");
+
$tabla = filter_input(INPUT_POST, "tabla");
+
</source>
+
*Ahora simplemente tendremos que leer la base de datos y cargar los registros como muestra el código
+
{{Plegable|hide|código|
+
<source lang=php>
+
<?php
+
  //Ahora habrá que ver cuantos campos tiene y crear un input para cada campo
+
  //Todos deshabilitados hasta saber qué operacion queremos hacer
+
  $db = new BD();
+
  $db->usar_BD($basedatos);
+
  $sentencia = "select * from $tabla";
+
  $contenido = $db->consultar($sentencia);
+
  $campos = $contenido->fetch_fields();
+
?>
+
<table id="tabla" class="display" border="1">
+
    <thead>
+
        <tr>
+
            <?php
+
              //Aquí ponemos la cabecera
+
              foreach ($campos as $campo)
+
                      echo "<th>$campo->name</th>";
+
            ?>
+
            <th colspan="2">Acciones</th>
+
        </tr>
+
    </thead>
+
    <tbody>
+
        <?php
+
          while ($fila = $contenido->fetch_row()){
+
                echo "<tr>";
+
                echo "\n <form action='gestionarTablas.php'  method='post'>\n";
+
                $i = 0;
+
                echo "\n <input type =hidden value =$tabla  name = 'tabla'> \n";
+
                echo "\n <input type =hidden value = $basedatos  name ='basedatos' > \n";
+
                foreach ($fila as $valor) {
+
                        echo "<td>$valor</td>";
+
                        echo "\n<input type =hidden name = campos[".$campos[$i]->name ."] value =$valor >\n";
+
                        $i++;
+
                }//End foreach
+
                echo "</form></tr>"
+
            }
+
            $db->cerrarDB();
+
            ?>
+
    </tbody>
+
</table>
+
</source>
+
}}
+
  
 
=====Borrar =====
 
=====Borrar =====
Línea 311: Línea 269:
 
*Lo que haremos es en función de qué acción nos haya traído a esta página, realizar unas acciones u otras que analizaremos en un '''switch case'''.
 
*Lo que haremos es en función de qué acción nos haya traído a esta página, realizar unas acciones u otras que analizaremos en un '''switch case'''.
 
*Todos los submit tendrán el atributo '''''name''''' a '''''gestionar'''''
 
*Todos los submit tendrán el atributo '''''name''''' a '''''gestionar'''''
<source lang=php>
 
switch ($_POST['gestionar']) {
 
      //Para pasar un array entre páginas es mejor serializarlo
 
      //Por ello en todos los casos serializaremos
 
  case Add:
 
            break;
 
  case Edit:
 
            break;
 
  case Del:
 
            //Quiero borrar el registro soleccionado y quedarme aquí
 
            borrar($tabla, $basedatos);
 
            break;
 
  case Close:
 
            break;
 
    }
 
</source>
 
 
*En este caso vamos a implementar la acción borrar que escribiremos en una función llamada '''''borrar'''''.
 
*En este caso vamos a implementar la acción borrar que escribiremos en una función llamada '''''borrar'''''.
 
*Como podemos observar pasamos el nombre de la tabla
 
*Como podemos observar pasamos el nombre de la tabla
Línea 358: Línea 300:
 
[Arhivo:]
 
[Arhivo:]
  
<div id=parrafo>
+
</div>
 
+
{{Plegable|hide|Codigo del método getinoarTabla.php
===Actividad 2 : Gestión de una tienda===
+
*Vamos a realizar una tienda usando la extensión '''''pdo'''''
+
*Para la gestión de la misma, usaremos la base de datos que actualmente tenemos  cargada en la base de datos.
+
*Esta práctica la realizaremos en diferentes etapas, que irán siendo utilizadas de manera creciente
+
====Gestión de productos====
+
Partiendo de la base de datos ''''dwes'''' usada en la explicación de este tema ,se pide que realicéis una aplicación que permita gestionar los registros de la tabla productos. La aplicación se dividirá en tres páginas web:
+
;listado.php
+
Mostrara un cuadro desplegable que permita seleccionar un registro de la tabla
+
familias, junto a un botón "Mostrar". Al pulsar el botón, se mostrará un listado de los productos
+
de la familia seleccionada.<br />
+
Para cada producto se mostrará su nombre corto y su PVP, junto a un botón con el texto Editar
+
(se puede usar como opción crear un formulario distinto por cada producto). Cuando se pulse
+
ese botón, se enviará el formulario a la página editar.php.<br />
+
[[Archivo:listadoProductos.png]]
+
;Editar.php
+
Debe mostrar los datos del producto seleccionado en la página anterior '''(nombre corto, nombre, descripción y PVP)''' dentro de un formulario que permita cambiarlos.<br />
+
Ademas habrá dos botones: '''''Actualizar''''' y '''''Cancelar'''''. Este  formulario me enviará a la página '''''actualizar.php'''''.<br />
+
[[Archivo:edicionProducto.png]]
+
;actulizar.php.
+
Esta página simplemente redirige a la página '''''listado.php''''', pero si en el formulario anterior se ha pulsado "Actualizar" (y no "Cancelar"), antes de redirigir debe ejecutar una consulta para cambiar los datos del producto.
+
Para redirigir se puede utilizar un formulario con un botón "Continuar" o la etiqueta "<meta http-equiv='refresh'
+
content='1'; url=...> dentro del encabezado, o bien la función header que ya conocemos un tiempo de espera de unos segundos.<br />
+
Como vemos esta página no tiene pantalla, solo tiene acción.
+
 
+
*Para acceder a la base de datos se debe usar PDO. También se deben utilizar excepciones para el control de errores.
+
Además, se recomienda utilizar como base esta página y hoja de estilo.
+
{{Plegable|hide|Click para ver plantilla|
+
 
<source lang=php>
 
<source lang=php>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+
<!doctype html>
 
<html>
 
<html>
<head>
+
    <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Plantilla para Ejercicios Tema 3</title>
+
        <title>Ejemplo de estilos CSS en un archivo externo</title>
  <link href="dwes.css" rel="stylesheet" type="text/css">
+
        <link rel="stylesheet" type="text/css" href="estilo.css" media="screen" />
</head>
+
        <meta charset="ISO-8859-1"
 +
              <title></title>
 +
    </head>
 +
    <?php
 +
    /*
 +
    * To change this license header, choose License Headers in Project Properties.
 +
    * To change this template file, choose Tools | Templates
 +
    * and open the template in the editor.
 +
    */
  
<body>
+
    /**
 +
    * Leemos base de datos y tabla que estamos gestionando
 +
    *
 +
    * Leemos por post o por get
 +
    */
 +
    spl_autoload_register(function ($clase) {
 +
      require_once "$clase.php";
 +
    });
  
<div id="encabezado">
+
    session_start();
<h1>Ejercicio: </h1>
+
<form id="form_seleccion" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
+
</form>
+
</div>
+
  
<div id="contenido">
 
<h2>Contenido</h2>
 
</div>
 
  
<div id="pie">
+
//En este script siempre necesitaremos la base de datos y nombre de tabla
</div>
+
    $basedatos = $_SESSION['bd'];
</body>
+
    $conexion = $_SESSION['conexion'];
 +
 
 +
    $tabla = filter_input(INPUT_POST, "tabla");
 +
//Leemos el nombre de la tabla
 +
    if (!isset($tabla))
 +
      $tabla = filter_input(INPUT_GET, "tabla");
 +
 
 +
    $accion = filter_input(INPUT_POST, "gestionar");
 +
    /* Solo si vengo del script editar.php y al actulizar se ha producido un error, lo recupero aquí y lo visualizo
 +
    */
 +
 
 +
    $error = $_GET['error'];
 +
    echo $error;
 +
 
 +
    if (isset($_POST['gestionar'])) {
 +
      switch ($_POST['gestionar']) {
 +
        case 'Add':
 +
          header("Location:insertar.php?tabla=$tabla");
 +
          break;
 +
        case 'Edit':
 +
          $campos = $_POST['campos'];
 +
          $valores = serialize($campos);
 +
          header("Location:editar.php?tabla=$tabla&campos=$valores");
 +
          exit();
 +
          break;
 +
        case 'Del':
 +
          //Quiero borrar el registro soleccionado y quedarme aquí
 +
          borrar($tabla, $basedatos, $conexion);
 +
          break;
 +
        case 'Close':
 +
          //Necesitamos pasar la base de datos
 +
          header("Location:tablas.php?&tabla=$tabla");
 +
          break;
 +
      }
 +
    }
 +
 
 +
//Ahora habrá que ver cuantos campos tiene y crear un input para cada campo
 +
//Todos deshabilitados hasta saber qué operacion queremos hacer
 +
 
 +
    $db = new BD($conexion);
 +
    echo $db->get_error_message();
 +
    $db->usar_BD($basedatos);
 +
    $sentencia = "select * from $tabla";
 +
    $contenido = $db->seleccionar($sentencia);
 +
    echo $db->get_error_message();
 +
    ?>
 +
    <body>
 +
        <fieldset style="width:70%">
 +
            <legend>Admnistración de la tabla  <?php echo $tabla; ?></legend>
 +
            <?php
 +
            $campos = $db->campos($tabla);
 +
            $campos[] = "Acciones";
 +
            ?>
 +
            <table id="tabla" class="display" border="1">
 +
                <thead>
 +
                    <tr>
 +
                        <?php
 +
                        //Aquí ponemos la cabecera
 +
                        foreach ($campos as $campo)
 +
                          echo "<th>$campo</th>";
 +
                        ?>
 +
                        <th colspan="2">Acciones</th>
 +
                    </tr>
 +
                </thead>
 +
                <tbody>
 +
                    <?php
 +
                    foreach ($contenido as $fila):
 +
                      echo "<tr>";
 +
                      echo "\n <form action='gestionarTabla.php'  method='post'>\n";
 +
                      $i = 0;
 +
                      echo "\n <input type =hidden value =$tabla  name = 'tabla'> \n";
 +
                      foreach ($fila as $valor) {
 +
                        echo "<td>$valor</td>";
 +
                        echo "\n<input type =hidden name = campos[" . $campos[$i] . "] value ='$valor' >\n";
 +
                        $i++;
 +
                      }
 +
                      ?>
 +
                  <td><input id=tabla type="submit" value="Edit" name="gestionar"></td>
 +
                  <td><input id=tabla type="submit" value="Del" name="gestionar"></td>
 +
                  </form>
 +
                  </tr>
 +
                  <?php
 +
                endforeach;
 +
                $db->cerrarDB();
 +
                ?>
 +
                </tbody>
 +
            </table>
 +
            <form action='gestionarTabla.php' method='post'>
 +
                <input type="submit" value="Add" name="gestionar">
 +
                <input type="submit" value="Close" name="gestionar">
 +
                <input type="hidden" value='<?php echo $tabla; ?>' name="tabla">
 +
            </form>
 +
        </fieldset>
 +
    </body>
 
</html>
 
</html>
 +
 +
<?php
 +
 +
/**
 +
* función usada para borrar
 +
* Aquí puedo leer el input registros que contendrá todos los campos
 +
*/
 +
function borrar($tabla, $database, $datosConexion) {
 +
  //He de leer todos los campos de esa fila que quiero borrar (nombre de campo y valor)
 +
  $registro = $_POST['campos'];
 +
  $sentencia = "delete from $tabla where ";
 +
  $condicion = "";
 +
  foreach ($registro as $campo => $valor) {
 +
    $condicion .=" ($campo = '$valor') and ";
 +
  }
 +
  $condicion = substr($condicion, 0, strlen($condicion) - 4);
 +
  $sentencia = "delete from $tabla where $condicion";
 +
  $db = new BD($datosConexion);
 +
  $db->usar_BD("$database");
 +
  $db->borrar($sentencia);
 +
 +
  echo $db->get_error_message();
 +
  $db->cerrarDB();
 +
}
 +
?>
 
</source>
 
</source>
 
}}
 
}}
{{Plegable|hide|Hoja de estilo|
+
===Insertar===
<source lang=php>
+
*Tomaremos a partir del diccionario de datos los campos de la tabla y construiremos un formulario
h1 {margin-bottom:0;}
+
*En esta caso no vamos a tener en cuenta campo de tipo autogenerados, ni restricciones de clave primaria/foránea, por lo que puede que alguna inserción no funcione.
#encabezado {background-color:#ddf0a4;}
+
{{Pleable|hide|Código de insertar.php
#contenido {background-color:#EEEEEE;height:600px;}
+
<source lang=php><?php
#pie {background-color:#ddf0a4;color:#ff0000;height:30px;}
+
//Leo datos para editar
</source>
+
}}
+
  
 +
spl_autoload_register(function($class) {
 +
  require "$class.php";
 +
});
 +
session_start();
  
 +
$basedatos = $_SESSION['bd'];
 +
$conexion = $_SESSION['conexion'];
  
 +
$tabla = $_GET['tabla'];
 +
if (isset($_POST['tabla']))
 +
  $tabla = $_POST['tabla'];
  
  
 +
//Conectamos a la base de datos
  
 +
$db = new BD($conexion);
  
 +
$db->usar_BD("$basedatos");
  
</div>
+
if ($_POST['submit'] == "Guardar") {
 +
  //Lo  tomaré todo como varchar o string
 +
  foreach ($_POST as $name => $input) {
 +
    echo "$input<br />";
 +
    if (($name != "submit") && ($name != "tabla"))
 +
      $valores.= "'$input',";
 +
  }
 +
  $valores = substr($valores, 0, strlen($valores) - 1);
 +
  $sentencia = "insert into $tabla values($valores)";
 +
  $db->insertar($sentencia);
 +
  $error = $db->get_error_message();
 +
  echo $error;
 +
  if ($error)
 +
    echo $error;
 +
  else {
 +
    header("Location:gestionarTabla.php?tabla=$tabla");
 +
    exit();
 +
  }
 +
}
 +
 
 +
if ($_POST['submit'] == "Cancelar") {
 +
  header("Location:gestionarTabla.php?tabla=$tabla");
 +
  exit();
 +
}
 +
 
 +
//consultamos las tablas de esa base de datos
 +
$campos = $db->seleccionar("describe $tabla");
 +
var_dump($tabla);
 +
?>
 +
<html>
 +
    <head>
 +
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 +
        <title>Ejemplo de estilos CSS en un archivo externo</title>
 +
        <link rel="stylesheet" type="text/css" href="estilo.css" media="screen" />
 +
        <meta charset="UTF-8">
 +
        <title></title>
 +
    </head>
 +
    <body>
 +
        <fieldset>
 +
            <legend>Insertar nuevo registro en la tabla <?php echo $tabla ?></legend>
 +
            <form action="insertar.php" method="post">
 +
                <?php
 +
                crea_formulario();
 +
                ?>
 +
                <input type="submit" value="Guardar" name = submit>
 +
                <input type="submit" value="Cancelar" name = submit>
 +
                <input type="hidden" value='<?php echo $tabla; ?>' name="tabla">
 +
            </form>
 +
        </fieldset>
 +
 
 +
    </body>
 +
</html>
 +
<?php
 +
 
 +
function crea_formulario() {
 +
  global $campos;
 +
  foreach ($campos as $campo) {
 +
    echo "<label for=$campo[0]>$campo[0]</label>";
 +
    echo "<input type=text value='' name='$campo[0]' /><br />\n";
 +
  }
 +
}
 +
?>
 +
</source>
 +
 
 +
}}

Revisión de 23:51 29 mar 2017

Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg




Actividad 1 Gestor BD con CRUD básico



Icon activity.jpg
Realizar un gestor básido con acciones CRUD

Vamos a realizar una pequeña aplicación que me permita gestionar a nivel básico la bd. Concretamente me permitirá

  1. Visualizar las bases de datos
  2. Al seleccionar una de ellas, visualizar sus tablas
  3. Al seleccionar una de ellas, ver su contenido y realizar aciones de insertar, borrar o modificar cada fila
  • A continuación las especificaciones concretas





Icon activity.jpg
Requisitos no funcionales
  • Las acciones sobre la base de datos se realizarán en una clase llamada BD.php




Icon inter.gif
GRUD funcionando
  • Puedes ver la idea del objetivo de esta práctica en esta ubicación
  • Dependiendo de la base de datos o tabla pueden fallar algunas acciones por integridad establecida
  • Por defecto se puede conectar a un servidor bd dokerizado (ip 172.17.0.2 y root-root como credenciales), pero se puede probar con otro host que tengo un gestor de bases de datos.
  • Los datos de la conexión a la base de datos dockerizada aparecen en el mensaje superior inicial.
http://manuel.infenlaces.com/dwes/BD/


Requisito 1 Visualizar la base de datos

  • Se trata de realizar una práctica para administrar una base de datos cualquiera
  • Se ha de implementar las acciones de la base de datos en una clase llamada BD.php (base de datos)
  • Para incluir las diferentes clases usaremos la función autoload de php
  • Observar que es una función que se invoca de forma implícita cuando instancimos un objeto de una clase
  • La función tiene un parámetro, el cual es una función anónima (sin nombre) con un parámetro que es el nombre de la clase
  • Es en el cuerpo de esta función (parámetro de spl_autoload_register), donde realizamos el require del fichero con la clase correspondiente
Icon present.gif
Tip: Para poder usar el autoload y siguiendo las buenas prácticas de programación, debemos guardar las clases en ficheros con el mismo nombre


spl_autoload_register(function ($clase) {
    require_once "$clase.php";}
);
  • Lo primero que debe de aparecer es un formulario con la lista de todas las tablas
  • Cada tabla será mostrada con un botón de tipo submit
AppGBD CRUD caso1B.png

  • Un posible ejemplo de cómo quedaría
AppGBD CRUD pantalla1.png

  • Para el css podemos usar simplemente este código o podéis cambiarlo un poco
  • A continuación un posible index, usa una clase BD con los métodos de la base de datos
  • Puedes usarlo de ejemplo o construirte uno propio index.php

Requisito 2 Visualizar la base de datos

Una vez seleccionada una base de datos, veremos todas las tablas que tiene la base de datos.
Una idea es visualizarlas en botones de tipo submit con el nombre de la tabla.
Todo esto lo implemetaremos en un fichero llamado tablas.php.
En esta página daremos la opción de volver a la página anterior para poder seleccionar otra base de datos diferente o conectarnos a otro servidor El caso de uso se muestra muy sencillo
:

AppGBD CRUD caso2.png

  • Un posible ejemplo de cómo quedaría
AppGBD CRUD pantalla2.png

Requisito 3 Visualizar la base de datos

  • Este requisito lo implementamos en el fichero gestionarTabla.php
  • Ahora se trata de visualizar el contenido de la base de datos.
  • Tendremos que obtener los nombres de los campos.
  • Crear una tabla en html donde la primera fila serán los nombres de los campos, y luego cada registro en una fila.
  • Cada registro lo podremos editar (para cambiar) o borrar, esto lo gestionaremos con un botón en cada fila *En la tabla tendremos la acción de Insertar para crear un nuevo registro o cancelar para volver a la página anterior (tablas.php), y tener la posibilidad de visualizar otra tabla.
  • Veamos un diagrama de caso de uso con todas las posibles acciones.
AppGBD CRUD caso3.png


  • Este caso de uso es mas amplio que los anteriores, por ello vamos a ir resolviendo cada apartado
  1. R3.1 Visualizar los datos
  2. R3.2 Editar para modificar
  3. R3.3 Borrar
  4. R3.4 Insetar un nuevo registro
  5. R3.4 Volver a ver las tablas
Visualizar los datos

Esta es la parte principal del requisito 3. Recibimos la tabla seleccionada por POST (Submit que nos trae a este script), necestamos también la base de datos que nos puede venir en un input de tipo hidden.

Borrar
  • Para cubrir este objetivo lo que haremos es añadir en cada fila un botón de borrar y otro de editar
  • Al principio del script analizaremos qué botón he presionada, tendiendo las siguientes posibilidades
  1. Borrar
  2. Editar
  3. Insertar
  4. Cancelar
  5. Venimos de la página tablas.php
  • Lo que haremos es en función de qué acción nos haya traído a esta página, realizar unas acciones u otras que analizaremos en un switch case.
  • Todos los submit tendrán el atributo name a gestionar
  • En este caso vamos a implementar la acción borrar que escribiremos en una función llamada borrar.
  • Como podemos observar pasamos el nombre de la tabla
/**
 * función usada para borrar
 * Aquí puedo leer el input registros que contendrá todos los campos
 */
function borrar($tabla, $database) {
    //He de leer todos los campos de esa fila que quiero borrar (nombre de campo y valor)
    $registro = $_POST['campos'];
    $sentencia = "delete from $tabla where ";
    $condicion="";
    foreach ($registro as $campo => $valor) {
        $condicion .=" ($campo = '$valor') and ";
    }
 
    //quitamos el último and, para que la sentencia quede correcta
    $condicion = substr($condicion, 0, strlen($condicion) - 4);
 
    $sentencia = "delete from $tabla where $condicion";
    $db = new BD();
    $db->usar_BD("$database");
    $db->borrar($sentencia);
    $db->cerrarDB();
}

La acción borrar se verá por que el registro no aparecerá ya [Archivo:] Después de darle a borrar [Arhivo:]

Insertar

  • Tomaremos a partir del diccionario de datos los campos de la tabla y construiremos un formulario
  • En esta caso no vamos a tener en cuenta campo de tipo autogenerados, ni restricciones de clave primaria/foránea, por lo que puede que alguna inserción no funcione.

Plantilla:Pleable