Diferencia entre revisiones de «PHP UD3 EXERCICIOS PROPOSTOS»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 519: Línea 519:
 
<br/>
 
<br/>
  
−
'''Arquivo '''animais/consultar_animais.php''': Fixarse que está dentro dun cartafol creado previamente de nome animais.
+
'''Arquivo: animais/consultar_animais.php''': Fixarse que está dentro dun cartafol creado previamente de nome animais.
 
::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 
::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 
<?php
 
<?php

Revisión del 19:17 22 oct 2023

Introducción

  • Notas:
  • A base de datos que imos empregar para facer os exercicios propostos a emprego para explicar outro módulo (Bases de datos) polo que non segue as regras de nomenclatura que indiqué anteriormente. Podedes deixala así ou modificar o script para adaptalo a ditas regras.
  • Vou propoñer varios exercicios. O normal sería ter unha estrutura lóxica de cartafoles, onde gardaríamos as páxinas php que conforman o noso sitio web, e tamén unha cabeceira cun menú onde poderíamos navegar ata as diferentes páxinas (lembrade o emprego de include).
  • De cada exercicio podedes facer varias versións, facendo que as operacións contra a base de datos se fagan con ordes SQL ou con chamadas a procedementos creados previamente no xestor de Mysql.
  • Os exercicios terán código javascript, para confirmar o borrado das filas.
  • Estes exercicios están pensados para aprender PHP.
O deseño das páxinas para amosar cun deseño adecuado os formularios non se ten en conta. Iso quedaría para outro curso de CSS, HTML, Javascript / BootStrap / Outro framework cliente.




  • Todos os exercicios propostos están baseados nunha base de datos de nome CIRCO probado sobre un xestor MYSQL versión 5.7 ou superior:
Mod BD Prog Modelo Circo.jpg





  • PASOS A SEGUIR E CONSIDERACIÓNS:
  • Crear a base de datos anterior (CIRCO) executando o script no xestor MYSQL
  • Crear un usuario/password con permisos de acceso a dita base de datos (sempre dádelle os mínimos permisos posibles, neste caso, serán os de SELECT/UPDATE/DELETE/INSERT/EXECUTE de toda a base de datos)
  • Crear nun arquivo separado do sitio web de nome bd_pistas.inc.php todos os datos necesarios para conectarse á base de datos e onde van estar definidas as constantes coas ordes SQL, tal como vimos nun punto anterior desta sección.
  • Na maior parte das bases de datos, as claves primarias son id´s autonuméricos que non se amosan ao usuario e quedan en campos ocultos. Á hora de actualizar os datos dunha táboa o id se emprega para buscar o dato a actualizar e nunca o pode cambiar o usuario no formulario. Nesta base de datos, as claves primarias son datos que se amosan ao usuario e os vai poder cambiar. Polo tanto nos formularios de modificación imos ter que enviar a clave primaria orixinal (sen cambiar) e a clave primaria modificada xa que imos ter que buscar a fila pola clave primaria sen modificar e cambiar o seu valor.
  • Relacionado có anterior, podería darse o caso de que ao modificar un dato, a clave primaria estivera repetida. Nas solucións non contemplo este caso. A solución é doada: Ou facer unha consulta previa para verificar que a nova clave primaria non existe ou capturar a excepción 'duplicate key' e amosar unha mensaxe ao usuario.
  • Lembrar que en todos os exercicios aparecen as ordes para amosar os erros que se poidan dar. Nunha aplicación final esas ordes hai que quitalas. E tamén se visualizan os erros que se producen cando hai unha excepción (sección catch). Isto tería que modificarse xa que ao usuario non se lle deben amosar información sobre os erros que se poidan dar.
  • Lembrar dar permiso 644 (rw,r,r) aos arquivos php e cambiar o propietario a www-data:www-data. Nos cartafoles permisos 755 cando rematedes.
  • Ao principio ides faiar en moitas cousas. Lembrade ter posto o display_errors como vimos nas seccións anteriores. Tamén axuda moito facer un echo da sentenza a enviar á base de datos antes de enviala para ver que estea todo ben (espazos en branco, comillas,...).



Para todos os exercicios

Arquivo bd_pistas.inc.php: Dito arquivo se atopa nun cartafol confBD fora da estrutura do sitio web.

1 <?php
2 
3 define ('SERVIDOR','localhost');
4 define ('USUARIO','user_php');
5 define ('PASSWORD','user_php');
6 define ('BD','CIRCO');



Exercicio 1

  • Partindo da táboa PISTAS, crea unha páxina web que permita dar de alta, baixa, modificar e listar os datos de dita táboa.
No listado amosa unha táboa cós datos e na parte dereita un enlace para modificar unha pista e un botón para borrala. Se sabes, fai que o botón teña a apariencia dun enlace empregando css. Se sabes javascript, fai que o botón pida conformación de borrado.
Crea un cartafol pistas onde van estar todas as páxinas relacioanadas con pistas.
Como as operacións de alta e modificar van amosar os mesmos campos, fai que os campos estean gardados nun arquivo separado de nome 'campos_pistas.php'. Deberán amosar o dato en caso de que carguemos o formulario ao editar unha pista ou amosar os campos en branco no caso de que viñamos de dar de alta unha nova pista. Isto o podes facer empregando variables que veñan cos datos en caso de editar e se ditas variables non están definidas é que vimos do formulario de alta.
Fai que o action do formulario de alta pista, apunte a unha páxina de nome procesar_alta_pista.php que é onde terás o código para dar de alta unha pista. Ao dala de alta terás que redirexionar á páxinas de listado de pistas.
Fai que o action do formulario de modificar pista, apunte a unha páxina de nome procesar_modificar_pista.php que é onde terás o código para modificar unha pista. Ao modificala terás que redirexionar á páxinas de listado de pistas.
Polo tanto as páxinas a facer son: consultar_pistas.php, alta_pista.php, procesar_alta_pista.php, editar_pista.php, procesar_editar_pista.php, procesar_borrar_pista.php





  • Como facer o exercicio ?
O procedemento sempre é o mesmo:
  • Definimos nun arquivo externo ao sitio web (se non está feito de antes) os datos necesarios para conectarnos cós permisos mínimos necesarios á base de datos.
Nese arquivo definimos en forma de constantes e con parámetros %? os ordes SQL que despois serán sustituidos polos valores empregando sprintf.
  • Empezaremos coa páxina de consultar_nometaboa no que debe aparecer en forma de lista (normalmente táboa) os datos da táboa xestionar.
Dita páxina necesará unha constante definida no arquivo anterior para obter a lista de datos da táboa ordenados.
Visualmente permitirá crear un novo dato, modificar un dato existente ou dar de baixa dito dato.
  • Creamos a páxina de campos_nometaboa. Estarán os elementos do formulario (non o formulario) que se empregará na páxina de alta e de modificar. Como se carga en ambos casos, cando vimos de modificar, teremos acceso á variables que teñen os datos da fila seleccionada. Se vimos de alta, non teremos definidos dichas variables. Polo tanto no value dos elementos do formulario teremos que preguntar se temos ou non definido a variable para darlle un valor por defecto ou o valor da base de datos.
  • Creamos a páxina alta_nometaboa. Terá o formulario e un botón de alta e fará o include da páxina de campos. Chamará a unha páxina procesar_alta_nomtaboa.
  • Creamos a páxina procesar_alta_taboa: Collerá os datos do formulario e fará uso dunha constante definada no arquivo de configuración para facer o INSERT.
  • Creamos a páxina editar_nometaboa. Terá o formulario e un botón de modificar e fará o include da páxina de campos. Virá coa clave primaria do dato a buscar (dende a páxina de consultar), buscaremos os datos da fila e os gardaremos en variables que serán empregadas polo páxina de campos. Se o usuario pode modificar a clave primaria no formulario, gardaremos nun campo oculto o dato orixinal. Chamará a unha páxina procesar_editar_nomtaboa.
  • Creamos a páxina procesar_editar_taboa: Collerá os datos do formulario e fará uso dunha constante definada no arquivo de configuración para facer o UPDATE.
  • Creamos a páxina procesar_borrar_taboa: Collerá o dato do elemento a borrar que será enviado por $_GET ou $_POST dende a páxina de consultar e fará uso dunha constante definada no arquivo de configuración para facer o DELETE.



Solución Exercicio 1

Arquivo bd_pistas.inc.php: Engadir o seguinte contido ao existente.

<?php
..............

define('CONSULTAR_PISTAS', 'SELECT nombre,aforo FROM PISTAS ORDER BY nombre');
define('ACTUALIZAR_PISTAS', "UPDATE PISTAS SET nombre='%s',aforo = %d WHERE nombre = '%s'");
define('INSERTAR_PISTAS', "INSERT INTO PISTAS (nombre, aforo) VALUES ('%s', %d)");
define('BORRAR_PISTAS', "DELETE FROM PISTAS WHERE nombre='%s'"); 
define('CONSULTAR_PISTAS_POR_NOME', "SELECT nombre,aforo FROM PISTAS WHERE nombre = '%s'");




Arquivo pistas/consultar_pistas.php: Fixarse que está dentro dun cartafol creado previamente de nome pistas.

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 
 9 try {
10     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD,BD);   
11     $conex->set_charset('utf8mb4');
12 
13 ?>
14 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
15     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
16 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
17     <head>
18         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
19         <title>Xestión de pistas</title>
20     </head>
21     <body>
22         <form action="alta_pista.php" method="post">
23             <button type="submit">Nova Pista</button>
24         </form>
25         <table border="1">
26             <tr>
27             <th>Nombre</th>
28             <th>Aforo</th>
29             <th>Accións</th>
30             </tr>
31         <?php
32             $resultado = $conex->query(CONSULTAR_PISTAS);
33 
34             while($fila = $resultado->fetch_assoc()) {
35                 $nombre = htmlentities($fila['nombre']);
36                 $aforo = htmlentities($fila['aforo']);
37                 echo "<tr>";
38                 echo "<td>$nombre</td>";
39                 echo "<td>$aforo</td>";
40                 printf("<td><a href='editar_pista.php?nombre=%s'>Editar</a>",$nombre);
41                 printf("<form action='procesar_borrar_pista.php' method='post'>");
42                 printf("<input type='hidden' name='nombre' value='%s' />",htmlentities($fila['nombre']));
43                 echo '<input onclick="return confirm(\'Estás seguro de que queres borrar esta pista?\');" type="submit" value="Borrar" name="btnBorrarPista" style="background:none;border:none;padding:0;maring:0;color: blue; text-decoration:underline; cursor:pointer; font-size:inherit" />';
44                 echo '</form>';
45                 echo "</tr>";
46             }
47 
48             $resultado->free();
49         ?>    
50         </table>
51 
52 
53         
54     </body>    
55 </html>
56 <?php
57 }   // Pecha o try da parte superior da páxina
58 catch (mysqli_sql_exception $e) {
59     die("Erro mysql: " . $e->getMessage());
60 }
61 catch (Expcetion $e) {
62     die("Erro xeral: " . $e->getMessage());
63 }
64 finally{
65   if(!empty($conex)){
66       $conex->close();
67   }
68 }
69 ?>




Arquivo pistas/campos_pista.php:

1 <label for="nombre">Nome:</label>
2 <input type="text" maxlength="50" id="nombre" name="nombre" required value="<?php echo isset($nombre) ? htmlentities($nombre) : ''; ?>"><br>
3 <label for="aforo">Aforo:</label>
4 <input type="number" min="20" max="500" id="aforo" name="aforo" required value="<?php echo isset($aforo) ? htmlentities($aforo) : ''; ?>">




Arquivo pistas/alta_pista.php

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4   <title>Alta Pista</title>
 5 </head>
 6 <body>
 7   <h3>Alta pista</h3>
 8   <form method="POST" action="procesar_alta_pista.php">
 9     <?php include 'campos_pista.php'; ?>
10     <div>
11         <input type="submit" value="Dar de Alta" name="btnAltaPista">
12     </div>
13   </form>
14 </body>
15 </html>




Arquivo pistas/procesar_alta_pista.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 if (isset($_POST['btnAltaPista'])) {
 9   try {
10     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
11     $conex->set_charset('utf8mb4');
12 
13     // Lóxica para dar de alta unha nova pista
14     $nombre = $conex->real_escape_string($_POST['nombre']);
15     $aforo = $conex->real_escape_string($_POST['aforo']);
16     $consulta = sprintf(INSERTAR_PISTAS,$nombre, $aforo);
17     $conex->query($consulta);
18 
19   } catch (mysqli_sql_exception $e) {
20     die("Erro: " . $e->getMessage());
21   }
22   catch (Expcetion $e) {
23     die("Erro xeral: " . $e->getMessage());
24   }
25   finally{
26     if(!empty($conex)){
27       $conex->close();
28     }  
29   }
30   
31 }
32 header("Location: consultar_pistas.php");




Arquivo pistas/editar_pista.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
 9 $conex->set_charset('utf8mb4');
10 $erros = '';
11 
12 ?>
13 
14 <?php 
15     $consulta = sprintf(CONSULTAR_PISTAS_POR_NOME,$conex->real_escape_string($_GET['nombre']));
16     $result=$conex->query($consulta);  // Ven na URL da paxina consultar_pistas.php
17     if ($result && $result->num_rows>0){
18         $row = mysqli_fetch_assoc($result); // Os datos serán empregados polos inputs do formulario
19         $nombre = htmlentities($row['nombre']);
20         $aforo = htmlentities($row['aforo']);
21 
22         $result->free();
23     }
24     else {
25         $erros = "Non se atopan os datos da pista!!!!";
26     }
27 
28 
29 ?>
30 <!DOCTYPE html>
31 <html>
32 <head>
33   <title>Modificar Pista</title>
34 </head>
35 <body>  
36   <h3>Modificar pista</h3>
37 
38   <form method="POST" action="procesar_editar_pista.php">
39     <?php include 'campos_pista.php'; ?>
40     <div>
41         <input type="hidden" name="nome_orixinal" value="<?php echo $nombre; ?>">
42         <input type="submit" value="Modificar" name="btnModificarPista">
43     </div>
44   </form>
45   <?php 
46     if(!empty($erros)){
47         printf("<h3>$erros</h3>");
48     }
49   ?>
50 </body>
51 </html>




Arquivo pistas/procesar_editar_pista.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
 9 $conex->set_charset('utf8mb4');
10 
11 if (isset($_POST['btnModificarPista'])) {
12   try {
13 
14     // Lóxica para dar de alta unha nova pista
15     $nome_novo = $conex->real_escape_string($_POST['nombre']);
16     $nome_orixinal = $conex->real_escape_string($_POST['nome_orixinal']); // Ven nun campo oculto do form
17     $aforo = $conex->real_escape_string($_POST['aforo']);
18     $consulta = sprintf(ACTUALIZAR_PISTAS,$nome_novo, $aforo,$nome_orixinal);
19     $conex->query($consulta);
20 
21   } catch (mysqli_sql_exception $e) {
22     die("Erro: " . $e->getMessage());
23   }
24   catch (Expcetion $e) {
25     die("Erro xeral: " . $e->getMessage());
26   }
27   finally{
28     if(!empty($conex)){
29       $conex->close();
30     }  
31   }
32 }
33 header("Location: consultar_pistas.php");
34 
35 ?>



Arquivo pistas/procesar_borrar_pista.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 if (isset($_POST['btnBorrarPista'])) {
 9   try {
10     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
11     $conex->set_charset('utf8mb4');
12 
13     // Lóxica para dar de alta unha nova pista
14     $nombre = $conex->real_escape_string($_POST['nombre']);
15     $consulta = sprintf(BORRAR_PISTAS,$nombre);
16     $conex->query($consulta);
17 
18   } catch (mysqli_sql_exception $e) {
19     die("Erro: " . $e->getMessage());
20   }
21   catch (Expcetion $e) {
22     die("Erro xeral: " . $e->getMessage());
23   }
24   finally{
25     if(!empty($conex)){
26       $conex->close();
27     }  
28   }
29   
30 }
31 header("Location: consultar_pistas.php");




Exercicio 2

  • NOTA IMPORTANTE: Este exercicio vai consistir no mantemento da táboa ANIMALES. Dita táboa ten unha serie de particularidades que non tiña a táboa PISTAS.
  • Ten relacións 1:N con PISTAS e ATRACCIONES.
  • Ten campos que poden ter valores NULOS (anhos, peso, estatura, nombre_atraccion, nombre_pista)
  • Nesta BD é empregada no módulo de BD para aprender SQL. Por iso os campos claves son datos para o usuario. Nunha base de datos 'normalmente' as clave primarias son numéricas auto-incrementales.


  • O anterior vai levar consigo as seguintes modificacións con respecto ao exercicio anterior (posibles solucións):
  • Na operación de INSERT, na cadea que está definida en forma de constante: define('INSERTAR_ANIMAL', "INSERT INTO ANIMALES (nombre, tipo, anhos, peso, estatura, nombre_atraccion, nombre_pista) VALUES ('%s','%s',%s,%s,%s,'%s','%s')");
Como vedes todos os parámetros son %s (tamén os numéricos). Iso é así porque se queremos enviar un valor null e poñemos %d, o vai cambiar polo valor cero.
Cando enviamos un valor null ao parámetro nombre_pista (por exemplo) vai formar a cadea: "INSERT INTO ANIMALES (....., nombre_pista) VALUES (........., 'null') e o que vai enviar á base de datos vai ser a cadea 'null' non o valor null. Vai ser por iso que antes de executar a sentenza, imos sustituir o valor "'null'" por "null".


  • No formulario de alta e modificar, imos empregar un SELECT para cargar todas as pistas e todas as atraccións dispoñibles e que o usuario sexa o que escolla o valor a gardar. No caso da modificación, o valor do campo nombre_pista / nombre_atraccion do animal seleccionado, terá que empregarse para que o select marque como seleccionado dicho valor do conxunto dispoñible.
É dicir, teremos un bucle no que iremos xerando as etiquetas <option> de html por cada pista/atraccion, e cando o nome sexa igual ao da pista/atracción do animal, teremos que xerar a etiqueta 'seltected'.
Como imos ter que comparar o valor de cada pista/atracción có valor que ven da base de datos para esa animal, non podemos empregar htmlentities xa que cambiaría os acentos por &letracute;
Tamén algún dos campos que veñen da base de datos poden ser NULOS, polo que no podemos empregar htmlentities sobre dito valor. Teremos que comprobalo antes.


  • Agora nos formularios de alta/modificar imos ter que acceder á base de datos para buscar todas as pistas e todas as atraccións que imos cargar nos select de dito formulario.




  • Partindo da táboa ANIMALES, crea unha páxina web que permita dar de alta, baixa, modificar e listar os datos de dita táboa.
No listado amosa unha táboa cós datos e na parte dereita un enlace para modificar un animal e un botón para borralo. Se sabes, fai que o botón teña a apariencia dun enlace empregando css. Se sabes javascript, fai que o botón pida conformación de borrado.
Crea un cartafol animais onde van estar todas as páxinas relacioanadas con animais.
Como as operacións de alta e modificar van amosar os mesmos campos, fai que os campos estean gardados nun arquivo separado de nome 'campos_animais.php'. Deberán amosar o dato en caso de que carguemos o formulario ao editar un animal ou amosar os campos en branco no caso de que viñamos de dar de alta un novo animal. Isto o podes facer empregando variables que veñan cos datos en caso de editar e se ditas variables non están definidas é que vimos do formulario de alta.
Fai que o action do formulario de alta animal, apunte a unha páxina de nome procesar_alta_animal.php que é onde terás o código para dar de alta un novo animal. Ao dala de alta terás que redirexionar á páxinas de listado de animais.
Fai que o action do formulario de modificar animal, apunte a unha páxina de nome procesar_modificar_animal.php que é onde terás o código para modificar un animal. Ao modificalo terás que redirexionar á páxinas de listado de animais.
Polo tanto as páxinas a facer son: consultar_animais.php, alta_animal.php, procesar_alta_animal.php, editar_animal.php, procesar_editar_animal.php, procesar_borrar_animal.php





  • Como facer o exercicio ?
O procedemento sempre é o mesmo:
  • Definimos nun arquivo externo ao sitio web (se non está feito de antes) os datos necesarios para conectarnos cós permisos mínimos necesarios á base de datos.
Nese arquivo definimos en forma de constantes e con parámetros %? os ordes SQL que despois serán sustituidos polos valores empregando sprintf.
  • Empezaremos coa páxina de consultar_nometaboa no que debe aparecer en forma de lista (normalmente táboa) os datos da táboa xestionar.
Dita páxina necesará unha constante definida no arquivo anterior para obter a lista de datos da táboa ordenados.
Visualmente permitirá crear un novo dato, modificar un dato existente ou dar de baixa dito dato.
  • Creamos a páxina de campos_nometaboa. Estarán os elementos do formulario (non o formulario) que se empregará na páxina de alta e de modificar. Como se carga en ambos casos, cando vimos de modificar, teremos acceso á variables que teñen os datos da fila seleccionada. Se vimos de alta, non teremos definidos dichas variables. Polo tanto no value dos elementos do formulario teremos que preguntar se temos ou non definido a variable para darlle un valor por defecto ou o valor da base de datos.
  • Creamos a páxina alta_nometaboa. Terá o formulario e un botón de alta e fará o include da páxina de campos. Chamará a unha páxina procesar_alta_nomtaboa.
  • Creamos a páxina procesar_alta_taboa: Collerá os datos do formulario e fará uso dunha constante definada no arquivo de configuración para facer o INSERT.
  • Creamos a páxina editar_nometaboa. Terá o formulario e un botón de modificar e fará o include da páxina de campos. Virá coa clave primaria do dato a buscar (dende a páxina de consultar), buscaremos os datos da fila e os gardaremos en variables que serán empregadas polo páxina de campos. Se o usuario pode modificar a clave primaria no formulario, gardaremos nun campo oculto o dato orixinal. Chamará a unha páxina procesar_editar_nomtaboa.
  • Creamos a páxina procesar_editar_taboa: Collerá os datos do formulario e fará uso dunha constante definada no arquivo de configuración para facer o UPDATE.
  • Creamos a páxina procesar_borrar_taboa: Collerá o dato do elemento a borrar que será enviado por $_GET ou $_POST dende a páxina de consultar e fará uso dunha constante definada no arquivo de configuración para facer o DELETE.



Solución Exercicio 2

Arquivo bd_pistas.inc.php: Engadir o seguinte contido ao existente.

<?php
..............

define('CONSULTAR_ATRACCIONES','SELECT nombre, fecha_inicio, ganancias FROM ATRACCIONES');


define('CONSULTAR_ANIMALES','SELECT ANIMALES.nombre,tipo, anhos, peso, estatura, nombre_atraccion, fecha_inicio, nombre_pista, aforo ' . 
                             'FROM ANIMALES LEFT OUTER JOIN ATRACCIONES ON (ANIMALES.nombre_atraccion = ATRACCIONES.nombre) ' .
                             'LEFT OUTER JOIN PISTAS ON (PISTAS.nombre = ANIMALES.nombre_pista) ' .
                             'ORDER BY nombre');
define('INSERTAR_ANIMAL', 'INSERT INTO ANIMALES (nombre, tipo, anhos, peso, estatura, nombre_atraccion, nombre_pista) ' . 
                          "VALUES ('%s','%s',%s,%s,%s,'%s','%s')");
define('CONSULTAR_ANIMAL_POR_NOME','SELECT ANIMALES.nombre,tipo, anhos, peso, estatura, nombre_atraccion, nombre_pista ' . 
                                     "FROM ANIMALES WHERE nombre = '%s'");
define('ACTUALIZAR_ANIMAL', "UPDATE ANIMALES SET " .
                            "nombre='%s', tipo='%s', anhos=%s, peso=%s, estatura=%s, nombre_atraccion='%s', nombre_pista='%s' " . 
                            "WHERE nombre='%s'");
define('BORRAR_ANIMAL', "DELETE FROM ANIMALES WHERE nombre='%s'");




Arquivo: animais/consultar_animais.php: Fixarse que está dentro dun cartafol creado previamente de nome animais.

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 
 9 try {
10     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD,BD);   
11     $conex->set_charset('utf8mb4');
12 
13 ?>
14 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
15     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
16 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
17     <head>
18         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
19         <title>Xestión de animais</title>
20     </head>
21     <body>
22         <form action="alta_animal.php" method="post">
23             <button type="submit">Novo Animal</button>
24         </form>
25         <table border="1">
26             <tr>
27                 <th>Nome</th>
28                 <th>Tipo</th>
29                 <th>Anos</th>
30                 <th>Peso</th>
31                 <th>Estatura</th>
32                 <th>Nome Atracción</th>
33                 <th>Fecha Inicio</th>
34                 <th>Nome Pista</th>
35                 <th>Aforo</th>
36             </tr>
37         <?php
38             /**
39              * htmlEntities non se pode empregar sobre un valor null e como temos campos que poden vir con null fago esta función
40              * Como imos empregala en varios sitio, podería estar definida un arquivo de utilidades.inc-php 
41              */
42             function comprobarNull($valor){
43                 $dato =  $valor==null ? '' : $valor;
44                 return htmlentities($dato);
45             }
46 
47             $resultado = $conex->query(CONSULTAR_ANIMALES);
48 
49             while($fila = $resultado->fetch_assoc()) {
50                 $nombre = comprobarNull($fila['nombre']);
51                 $tipo = comprobarNull($fila['tipo']);
52                 $anhos = comprobarNull($fila['anhos']);
53                 $peso = comprobarNull($fila['peso']);
54                 $estatura = comprobarNull($fila['estatura']);
55                 $nombre_atraccion = comprobarNull($fila['nombre_atraccion']);
56                 $fecha_inicio = (new DateTime(comprobarNull($fila['fecha_inicio'])))->format('d-m-Y');
57                 $nombre_pista = comprobarNull($fila['nombre_pista']);
58                 $aforo = comprobarNull($fila['aforo']);
59                 echo "<tr>";
60                 echo "<td>$nombre</td>";
61                 echo "<td>$tipo</td>";
62                 echo "<td>$anhos</td>";
63                 echo "<td>$peso</td>";
64                 echo "<td>$estatura</td>";
65                 echo "<td>$nombre_atraccion</td>";
66                 echo "<td>$fecha_inicio</td>";
67                 echo "<td>$nombre_pista</td>";
68                 echo "<td>$aforo</td>";
69                 printf("<td><a href='editar_animal.php?nombre=%s'>Editar</a>",$nombre);
70                 printf("<form action='procesar_borrar_animal.php' method='post'>");
71                 printf("<input type='hidden' name='nombre' value='%s' />",htmlentities($fila['nombre']));
72                 echo '<input onclick="return confirm(\'Estás seguro de que queres borrar este animal?\');" type="submit" value="Borrar" name="btnBorrarAnimal" style="background:none;border:none;padding:0;maring:0;color: blue; text-decoration:underline; cursor:pointer; font-size:inherit" />';
73                 echo '</form>';
74                 echo "</tr>";
75             }
76 
77             $resultado->free();
78         ?>    
79         </table>
80 
81 
82         
83     </body>    
84 </html>
85 <?php
86 }   // Pecha o try da parte superior da páxina
87 catch (mysqli_sql_exception $e) {
88     die("Erro mysql: " . $e->getMessage());
89 }
90 catch (Expcetion $e) {
91     die("Erro xeral: " . $e->getMessage());
92 }
93 finally{
94   if(!empty($conex)){
95       $conex->close();
96   }
97 }
98 ?>




Arquivo animais/campos_animais.php: Notas:

  • Este arquivo vai necesitar ir á base de datos para obter a lista de atraccións e a lista de pistas para cargar nos select.
  • Fixarse que a lista de pistas está obtida empregando fetch_object() en vez de fetch_assoc(), simplemente como exemplo de como podemos empregar unha forma ou outra.
Á hora de recoller os datos, se estamos empregando a opción de obxectos sería da forma: obxecto->propiedade
 1 <?php
 2     // Cargamos os datos que necesita o formulario que son a lista de atracciones e a lista de pistas
 3 
 4 // Como a estes datos podes chegar ao dar de alta ou ao modificar un animal, se ves de modificar un animal, terías que vir o nombre_pista e nombre_atraccion  e tipo
 5 //   de dito animal e facer que o select seleccionara dita opción.
 6 //   Pero se ves de alta, o select non ten que ter nada seleccionado.
 7 $nombre_atraccion = isset($nombre_atraccion) ? $nombre_atraccion : '';  // no pongo htmlentities ya que no lo vou a mostrar. Sólo lo empleo para saber cual se debe selecconar en la select. Si lo pongo no va a encontrar el valor a seleccionar si el nombre tiene tildes por ejemplo
 8 $nombre_pista = isset($nombre_pista) ? $nombre_pista : ''; // no pongo htmlentities ya que no lo vou a mostrar. Sólo lo empleo para saber cual se debe selecconar en la select. Si lo pongo no va a encontrar el valor a seleccionar si el nombre tiene tildes por ejemplo
 9 $tipo = isset($tipo) ? htmlentities($tipo) : '';
10 
11 try {
12     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
13     $conex->set_charset('utf8mb4');
14 
15     // BUSCAMOS A LISTA DE ATRACCIONS
16     $resultado = $conex->query(CONSULTAR_ATRACCIONES);
17     $atracciones = [];
18     while($fila = $resultado->fetch_assoc()) {   // Poderíamos empregar fecth_object
19         $atracciones[] = $fila;
20     }
21     $resultado->free();
22 
23     // BUSCAMOS A LISTA DE PISTAS
24     $resultado = $conex->query(CONSULTAR_PISTAS);
25     $pistas = [];
26     while($fila = $resultado->fetch_object()) {     // Por poñer un exemplo empregado esta forma 
27         $pistas[] = $fila;
28     }
29     $resultado->free();
30 
31   } catch (mysqli_sql_exception $e) {
32     die("Erro: " . $e->getMessage());
33   }
34   catch (Expcetion $e) {
35     die("Erro xeral: " . $e->getMessage());
36   }
37   finally{
38     if(!empty($conex)){
39       $conex->close();
40     }  
41   }
42 
43 ?>
44     
45     <label for="nombre">Nome:</label>
46     <input type="text" id="nombre" name="nombre" value="<?php echo isset($nombre) ? htmlentities($nombre) : ''; ?>" required>
47     <br>
48 
49     <label for="tipo">Tipo:</label>
50     <select id="tipo" name="tipo" required>
51         <option value="León" <?php if ($tipo === "León") echo "selected"; ?>>León</option>
52         <option value="Cocodrilo" <?php if ($tipo === "Cocodrilo") echo "selected"; ?>>Cocodrilo</option>
53         <option value="Jirafa" <?php if ($tipo === "Jirafa") echo "selected"; ?>>Jirafa</option>
54         <option value="Mono" <?php if ($tipo === "Mono") echo "selected"; ?>>Mono</option>
55     </select>
56     <br>
57 
58     <label for="anhos">Anos:</label>
59     <input type="number" id="anhos" name="anhos" min="1" max="50" value="<?php echo isset($anhos) ? htmlentities($anhos) : ''; ?>">
60     <br>
61 
62     <label for="peso">Peso:</label>
63     <input type="number" id="peso" name="peso" min="0.1" step='any' max="500" value="<?php echo isset($peso) ? htmlentities($peso) : ''; ?>">
64     <br>
65 
66     <label for="estatura">Estatura:</label>
67     <input type="number" id="estatura" name="estatura" min="0.1"  step='any' max="20" value="<?php echo isset($estatura) ? htmlentities($estatura) : ''; ?>">
68     <br>
69 
70     <label for="nombre_atraccion">Nome Atracción:</label>
71     <select id="nombre_atraccion" name="nombre_atraccion">
72         <option value=''>Sen asignar</option>
73         <?php 
74             foreach($atracciones as $atraccion_bd){
75                 $selected = '';
76                 if($atraccion_bd['nombre']==$nombre_atraccion){  // nombre_atraccion está definido arriba
77                     $selected = 'selected';
78                 }
79                 printf("<option value='%s' %s>%s</option>",$atraccion_bd['nombre'],$selected,$atraccion_bd['nombre']);  // Fixarse que no value ten que ir a clave primaria de táboa
80             }
81         ?>
82     </select>
83     <br>
84 
85     <label for="nombre_pista">Nome Pista:</label>
86     <select id="nombre_pista" name="nombre_pista">
87         <option value=''>Sen asignar</option>
88         <?php 
89             foreach($pistas as $pista_bd){
90                 $selected = '';
91                 if($pista_bd->nombre==$nombre_pista){  // nombre_atraccion está definido arriba
92                     $selected = 'selected';
93                 }
94                 printf("<option value='%s' %s>%s</option>",$pista_bd->nombre,$selected,$pista_bd->nombre);   // Fixarse que no value ten que ir a clave primaria de táboa
95             }
96         ?>
97     </select>




Arquivo animais/alta_animal.php

 1 <?php 
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 // Aunque esta página no hace uso de las constantes, al cargar los campos de animal, esa sí que hace uso de ellas.
 8 //  Podríamos ponerlo en la página de campos_animal.php, pero necesitaríamos poner require_once ya que la página de editar_animal.php también tiene el include
 9 require('/var/www/confBD/bd_pistas.inc.php');  
10 ?>
11 
12 
13 <!DOCTYPE html>
14 <html>
15 <head>
16   <title>Alta Animal</title>
17 </head>
18 <body>
19   <h3>ALTA ANIMAL</h3>
20   <form method="POST" action="procesar_alta_animal.php">
21     <?php include 'campos_animal.php'; ?>
22     <div>
23         <input type="submit" value="Dar de Alta" name="btnAltaAnimal">
24     </div>
25   </form>
26 </body>
27 </html>




Arquivo animais/procesar_alta_animal.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 if (isset($_POST['btnAltaAnimal'])) {
 9   try {
10     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
11     $conex->set_charset('utf8mb4');
12 
13     // Lóxica para dar de alta un novo animal
14     $nombre = $conex->real_escape_string($_POST['nombre']);
15     $tipo = $conex->real_escape_string($_POST['tipo']);
16     $anhos = $conex->real_escape_string($_POST['anhos']);
17     $peso = $conex->real_escape_string($_POST['peso']);
18     $estatura = $conex->real_escape_string($_POST['estatura']);
19     $nombre_atraccion = $conex->real_escape_string($_POST['nombre_atraccion']);
20     $nombre_pista = $conex->real_escape_string($_POST['nombre_pista']);
21 
22 
23     // Comprobamos os campos que poden ser nulos
24     if (empty($anhos)) $anhos = 'null';
25     if (empty($peso)) $peso = 'null';
26     if (empty($estatura)) $estatura = 'null';
27     if (empty($nombre_atraccion)) $nombre_atraccion = 'null';
28     if (empty($nombre_pista)) $nombre_pista = 'null';
29 
30     $consulta = sprintf(INSERTAR_ANIMAL,$nombre,$tipo,$anhos,$peso,$estatura,$nombre_atraccion,$nombre_pista);
31     $consulta = str_replace("'null'","null",$consulta); // En caso de ter valores null estarán desta forma: "'null'" ao ter INSERTAR_ANIMAL o código campo='%s'
32 
33     $conex->query($consulta);
34 
35   } catch (mysqli_sql_exception $e) {
36     die("Erro: " . $e->getMessage());
37   }
38   catch (Expcetion $e) {
39     die("Erro xeral: " . $e->getMessage());
40   }
41   finally{
42     if(!empty($conex)){
43       $conex->close();
44     }  
45   }
46   
47 }
48 header("Location: consultar_animais.php");




Arquivo animais/editar_animal.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
 9 $conex->set_charset('utf8mb4');
10 $erros = '';
11 
12 ?>
13 
14 <?php 
15     /**
16      * htmlEntities non se pode empregar sobre un valor null e como temos campos que poden vir con null fago esta función
17      * Como imos empregala en varios sitio, podería estar definida un arquivo de utilidades.inc-php 
18      */
19     function comprobarNull($valor){
20       $dato =  $valor==null ? '' : $valor;
21       return htmlentities($dato);
22     }
23 
24     $consulta = sprintf(CONSULTAR_ANIMAL_POR_NOME,$conex->real_escape_string($_GET['nombre']));
25     $result=$conex->query($consulta);  // Ven na URL da paxina listar_pistas.php
26     if ($result && $result->num_rows>0){
27         $row = mysqli_fetch_assoc($result); // Os datos serán empregados polos inputs do formulario
28         $nombre = comprobarNull($row['nombre']);
29         $tipo = comprobarNull($row['tipo']);
30         $anhos = comprobarNull($row['anhos']);
31         $peso = comprobarNull($row['peso']);
32         $estatura = comprobarNull($row['estatura']);
33         $nombre_atraccion = $row['nombre_atraccion']; // Non aplico htmlentities xa que non vou amosar o dato. Vou comparalo coa lista de atraccións para poñelo como seleccionado.  Se a aplicara, os acentos sería sustituídos por &acute; por exemplo e non coincidiría
34         $nombre_pista = $row['nombre_pista'];  // Non aplico htmlentities xa que non vou amosar o dato. Vou comparalo coa lista de pistas para poñelo como seleccionado. Se a aplicara, os acentos sería sustituídos por &acute; por exemplo e non coincidiría
35 
36         $result->free();
37     }
38     else {
39         $erros = "Non se atopan os datos do animal!!!!";
40     }
41 
42 
43 ?>
44 <!DOCTYPE html>
45 <html>
46 <head>
47   <title>Modificar Animal</title>
48 </head>
49 <body>  
50     <h3>EDITAR ANIMAL</h3>
51 
52   <form method="POST" action="procesar_editar_animal.php">
53     <?php include 'campos_animal.php'; ?>
54     <div>
55         <input type="hidden" name="nome_orixinal" value="<?php echo $nombre; ?>">
56         <input type="submit" value="Modificar" name="btnModificarAnimal">
57     </div>
58   </form>
59   <?php 
60     if(!empty($erros)){
61         printf("<h3>$erros</h3>");
62     }
63   ?>
64 </body>
65 </html>




Arquivo animais/procesar_editar_animal.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
 9 $conex->set_charset('utf8mb4');
10 
11 if (isset($_POST['btnModificarAnimal'])) {
12   try {
13 
14     // Lóxica para dar de alta un novo animal
15     $nombre = $conex->real_escape_string($_POST['nombre']);
16     $tipo = $conex->real_escape_string($_POST['tipo']);
17     $anhos = $conex->real_escape_string($_POST['anhos']);
18     $peso = $conex->real_escape_string($_POST['peso']);
19     $estatura = $conex->real_escape_string($_POST['estatura']);
20     $nombre_atraccion = $conex->real_escape_string($_POST['nombre_atraccion']);
21     $nombre_pista = $conex->real_escape_string($_POST['nombre_pista']);
22 
23     $nome_orixinal = $conex->real_escape_string($_POST['nome_orixinal']); // nome_orixinal ven nun campo oculta dende a páxina de editar_animal.php
24 
25     // Comprobamos os campos que poden ser nulos
26     if (empty($anhos)) $anhos = 'null';
27     if (empty($peso)) $peso = 'null';
28     if (empty($estatura)) $estatura = 'null';
29     if (empty($nombre_atraccion)) $nombre_atraccion = 'null';
30     if (empty($nombre_pista)) $nombre_pista = 'null';
31 
32     $consulta = sprintf(ACTUALIZAR_ANIMAL,$nombre,$tipo,$anhos,$peso,$estatura,$nombre_atraccion,$nombre_pista,$nome_orixinal);  
33     $consulta = str_replace("'null'","null",$consulta); // En caso de ter valores null estarán desta forma: "'null'" ao ter INSERTAR_ANIMAL o código campo='%s'
34     
35     $conex->query($consulta);
36 
37 
38   } catch (mysqli_sql_exception $e) {
39     die("Erro: " . $e->getMessage());
40   }
41   catch (Expcetion $e) {
42     die("Erro xeral: " . $e->getMessage());
43   }
44   finally{
45     if(!empty($conex)){
46       $conex->close();
47     }  
48   }
49 }
50 header("Location: consultar_animais.php");
51 
52 ?>




Arquivo animais/procesar_borrar_animal.php

 1 <?php
 2 /* Lembrar quitar isto ao probar o scripts sen erros */
 3 ini_set('display_errors', 1);
 4 ini_set('display_startup_errors', 1);
 5 error_reporting(E_ALL);
 6 
 7 require ('/var/www/confBD/bd_pistas.inc.php');
 8 if (isset($_POST['btnBorrarAnimal'])) {
 9   try {
10     $conex = new mysqli(SERVIDOR, USUARIO, PASSWORD, BD);
11     $conex->set_charset('utf8mb4');
12 
13     // Lóxica para dar de alta unha nova pista
14     $nombre = $conex->real_escape_string($_POST['nombre']);
15     $consulta = sprintf(BORRAR_ANIMAL,$nombre);
16     $conex->query($consulta);
17 
18   } catch (mysqli_sql_exception $e) {
19     die("Erro: " . $e->getMessage());
20   }
21   catch (Expcetion $e) {
22     die("Erro xeral: " . $e->getMessage());
23   }
24   finally{
25     if(!empty($conex)){
26       $conex->close();
27     }  
28   }
29   
30 }
31 header("Location: consultar_animais.php");







-- Ángel D. Fernández González -- (2023).