Diferencia entre revisiones de «PHP UD3 EXERCICIOS PROPOSTOS»
Ir a la navegación
Ir a la búsqueda
| Línea 58: | Línea 58: | ||
: 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 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. | : 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: | + | : 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 |
| Línea 93: | Línea 93: | ||
<br/> | <br/> | ||
| − | '''Arquivo '''pistas/ | + | '''Arquivo '''pistas/consultar_pistas.php''': Fixarse que está dentro dun cartafol creado previamente de nome pistas. |
::<syntaxhighlight lang="php" line enclose="div" highlight="" > | ::<syntaxhighlight lang="php" line enclose="div" highlight="" > | ||
<?php | <?php | ||
| Línea 237: | Línea 237: | ||
} | } | ||
| − | header("Location: | + | header("Location: consultar_pistas.php"); |
| Línea 263: | Línea 263: | ||
<?php | <?php | ||
$consulta = sprintf(CONSULTAR_PISTAS_POR_NOME,$conex->real_escape_string($_GET['nombre'])); | $consulta = sprintf(CONSULTAR_PISTAS_POR_NOME,$conex->real_escape_string($_GET['nombre'])); | ||
| − | $result=$conex->query($consulta); // Ven na URL da paxina | + | $result=$conex->query($consulta); // Ven na URL da paxina consultar_pistas.php |
if ($result && $result->num_rows>0){ | if ($result && $result->num_rows>0){ | ||
$row = mysqli_fetch_assoc($result); // Os datos serán empregados polos inputs do formulario | $row = mysqli_fetch_assoc($result); // Os datos serán empregados polos inputs do formulario | ||
| Línea 340: | Línea 340: | ||
} | } | ||
} | } | ||
| − | header("Location: | + | header("Location: consultar_pistas.php"); |
?> | ?> | ||
| Línea 381: | Línea 381: | ||
} | } | ||
| − | header("Location: | + | header("Location: consultar_pistas.php"); |
Revisión del 13:50 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.
- 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:
- Fichero .sql: Archivo:CIRCO.zip
- 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.
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
- Xestión da táboa PISTAS
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' onsubmit='return confirm(\'Estás seguro de que queres borrar esta pista?\');'>"); 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 Nome: <input type="text" maxlength="50" name="nombre" required value="<?php echo isset($nombre) ? htmlentities($nombre) : ''; ?>"><br> 2 Aforo: <input type="number" min="20" max="500" 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");
-- Ángel D. Fernández González -- (2023).