PHP EXERCICIOS SESSION
Sumario
Exercicio 1
- Crea unha páxina de nome UD4_session_Ex1_preferencias.??? na que se amose unha páxina no que o usuario ten que escoller a cor de fondo e a cor dos textos (cunha lista) que van ter as páxinas do seu sitio web.
- Unha vez escollidos, ao premer nun botón co texto 'Gardar' pasará á seguinte páxina de nome UD4_session_Ex1_pref_paxina1.??? no que se gardarán en variables de sesión as opcións escollidas e amosará un texto calquera no que se visualizará coa cor de fondo e de texto escollido. Dita páxina terá a maiores un enlace á páxina UD4_session_Ex1_pref_paxina2.???. A esta páxina podemos volver dende a seguinte páxina (UD4_session_Ex1_pref_paxina2.???) coas variables de sesión borradas. Nese caso os valores por defecto deben ser de cor verde para o texto e cor marrón para o fondo.
- A páxina UD4_session_Ex1_pref_paxina2.??? terá un enlace para volver á páxina inicial (UD4_session_Ex1_preferencias.???) outro enlace para volver á páxina anterior (UD4_session_Ex1_pref_paxina1.???) e outro enlace para borrar as preferencias e o id de sesión na mesma páxina, pasando o control á páxina inicial.
Solución Exercicio 1
Páxina: UD4_session_Ex1_preferencias.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <title>Exercicio de variables Session</title> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 7 8 </head> 9 <body> 10 <form action="UD4_session_Ex1_pref_paxina1.php" method='post'> 11 <div> 12 Cor de fondo:<select name='lstCorFondo'> 13 <option value='#ff0000'>Vermello</option> 14 <option value='#00ff00'>Verde</option> 15 <option value='#0000ff'>Azul</option> 16 </select> 17 </div> 18 <div> 19 Cor de texto:<select name='lstCorTexto'> 20 <option value='#ff0000'>Vermello</option> 21 <option value='#00ff00'>Verde</option> 22 <option value='#0000ff'>Azul</option> 23 </select> 24 </div> 25 26 <input type='submit' value='GARDAR' /> 27 28 </form> 29 </body> 30 </html>
Páxina: UD4_session_Ex1_pref_paxina1.php
1 <?php 2 session_start(); // IMPORTANTE 3 4 if(!empty($_POST)){ // Miramos se temos datos que veñan dun formulario 5 if (!empty($_POST['lstCorTexto'])){ 6 $_SESSION['cor_texto']=$_POST['lstCorTexto']; 7 } 8 9 if (!empty($_POST['lstCorFondo'])){ 10 $_SESSION['cor_fondo']=$_POST['lstCorFondo']; 11 } 12 } 13 else{ 14 if (empty($_SESSION['cor_texto'])){ 15 $_SESSION['cor_texto']='green'; 16 } 17 if (empty($_SESSION['cor_fondo'])){ 18 $_SESSION['cor_fondo']='brown'; 19 } 20 } 21 ?> 22 23 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 24 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 25 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 26 <head> 27 <title>Exercicio de variables Session</title> 28 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 29 <style type="text/css"> 30 .estilo{ 31 background-color: <?php echo $_SESSION['cor_fondo'];?>; 32 color: <?php echo $_SESSION['cor_texto'];?>; 33 } 34 </style> 35 </head> 36 <body> 37 <div class='estilo'>Este é un texto calquera sobre o que se vai a aplicar o estilo escollido na pantalla de preferencias....</div> 38 39 <a href='UD4_session_Ex1_pref_paxina2.php' >Enlace á páxina 2</a> 40 </body> 41 </html>
Páxina: UD4_session_Ex1_pref_paxina2.php
1 <?php 2 session_start(); // IMPORTANTE 3 4 if(!empty($_GET['borrarPreferencias'])){ // Miramos se vimos de premer o enlace de borrar preferencias desta páxina 5 if ($_GET['borrarPreferencias']==1){ // Comprobamos que valga 1 (poderíamos poñer esta condición cun && na liña anterior. 6 session_unset(); 7 session_destroy(); 8 setcookie(session_name(),'',0,'/'); 9 } 10 } 11 ?> 12 13 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 14 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 15 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 16 <head> 17 <title>Exercicio de variables Session</title> 18 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 19 <style type="text/css"> 20 .estilo{ 21 background-color: <?php echo $_SESSION['cor_fondo'];?>; <!-- Isto dará un warning se temos o display_errors a on xa que se vimos de borrar as variables de session non terá valor --> 22 color: <?php echo $_SESSION['cor_texto'];?>; <!-- Teríamos que comprobar se ten valor (usar o operador ternario) antes de utilizalo 23 } 24 </style> 25 </head> 26 <body> 27 <div class='estilo'>Este é un texto calquera sobre o que se vai a aplicar o estilo escollido na pantalla de preferencias....</div> 28 29 <a href='UD4_session_Ex1_preferencias.html' >Enlace á páxina inicial</a> 30 <a href='UD4_session_Ex1_pref_paxina1.php' >Enlace á páxina 1</a> 31 <a href="<?php echo $_SERVER['PHP_SELF']; ?>?borrarPreferencias=1" >Borrar preferencias</a> 32 </body> 33 </html>
Exercicio 2
- Crea unha páxina de nome UD4_session_Ex2_contador.??? que leve a conta de cantas veces foi visitada a páxina por cada usuario, facendo uso dunha variable de sesión.
- Se a variable de sesión non existe deberá ser inicializada a 5 e posteriormente, por cada visita deberá ser incrementado o seu valor. Amosar o número de visitas.
Na mesma páxina amosa un enlace que ao premerse, borre a variable de sesión.
Solución Exercicio 2
1 <?php 2 session_start(); 3 4 define (VAR_SESSION_NUM_ACCESOS,'numAccesos'); // Isto non é necesario. Simplemente amosamos unha forma de referenciar o nome dunha variable utilizando unha constante. Desta forma non nos podemos equivocar ao teclear o nome da variable á que queremos acceder no array global $_SESSION. 5 6 if (isset($_GET['borrar']) && $_GET['borrar']==1){ // Dentro desta páxina temos en enlace que manda na URL un parámetro da forma ?borrar=1 para eliminar a variable de sesión. 7 unset($_SESSION[VAR_SESSION_NUM_ACCESOS]); // => Desta forma o sessionID se mantén o mesmo 8 session_destroy(); 9 session_start(); // Iniciamos unha nova sesión => Novo sessionID 10 } 11 12 if (!isset($_SESSION[VAR_SESSION_NUM_ACCESOS])){ 13 $_SESSION[VAR_SESSION_NUM_ACCESOS]= 5; 14 } 15 else { 16 $_SESSION[VAR_SESSION_NUM_ACCESOS]++; 17 } 18 19 ?> 20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 21 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 22 23 <html> 24 <head> 25 <meta charset="UTF-8"> 26 <title></title> 27 </head> 28 <body> 29 <?php 30 printf("<h1>Número de veces visitas: %s</h1>",$_SESSION[VAR_SESSION_NUM_ACCESOS]); 31 printf("<h2>O valor do ID de sesión é: %s</h2>", session_id()); 32 33 ?> 34 <h2>Pulsa <a href='UD4_session_Ex2_contador.php?borrar=1'> para borrar o contador...</a></h2>. 35 <h2>Pulsa <a href='UD4_session_Ex2_contador.php'> para incrementar o contador...</a></h2>. 36 37 38 </body> 39 </html>
Exercicio 3
- Fai unha variación do exercicio anterior e garda as veces (a hora) na que un usuario visitou a páxina. O nome da páxina será UD4_session_Ex3_visitas.???. A hora gardarase nun array dentro dunha variable session e será amosado en forma de lista.
- Nota: para visualizar a hora podes facer uso da función date.
Solución Exercicio 3
1 <?php 2 session_start(); 3 4 define (VAR_SESSION_TEMPO_ACCESOS,'tempoAccesos'); 5 if (isset($_GET['borrar']) && $_GET['borrar']==1){ 6 unset($_SESSION[VAR_SESSION_NUM_ACCESOS]); // => Desta forma o sessionID se mantén o mesmo 7 session_destroy(); 8 session_start(); // Iniciamos unha nova sesión xa que queremos gardar o valor por defecto das visitas 9 10 } 11 12 if (!isset($_SESSION[VAR_SESSION_TEMPO_ACCESOS])){ 13 $_SESSION[VAR_SESSION_TEMPO_ACCESOS]= array(); 14 } 15 else { 16 $_SESSION[VAR_SESSION_TEMPO_ACCESOS][]= date('l jS \de F Y h:i:s A'); 17 } 18 19 ?> 20 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 21 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 22 23 <html> 24 <head> 25 <meta charset="UTF-8"> 26 <title></title> 27 </head> 28 <body> 29 <?php 30 printf("<h1>Número de veces visitas: </h1>"); 31 foreach($_SESSION[VAR_SESSION_TEMPO_ACCESOS] as $valor){ 32 printf("<h3 style='margin-left:10px'>%s</h3>",$valor); 33 } 34 printf("<h2>O valor do ID de sesión é: %s</h2>", session_id()); 35 36 ?> 37 <h2>Pulsa <a href='UD4_session_Ex3_visitas.php?borrar=1'> para borrar o histórico de visitas...</a></h2>. 38 <h2>Pulsa <a href='UD4_session_Ex3_visitas.php'> para unha nova visita...</a></h2>. 39 40 41 </body> 42 </html>
Exercicio 4
•Crea un arquivo 'include' de nome Carrito_Compra.???.???. ◾A funcionalidade de dito arquivo será a seguinte: ◾Gardar nunha variable de sesión un array no que se garde o nome do produto, prezo e cantidade escollido polo usuario. ◾Terá unha función de nome calcularTotal, que devolva o total do pedido en base ao gardado na variable anterior. ◾Terá unha función de nome baleirarCarrito que baleire o carrito. ◾Terá unha función de nome amosarCarrito que amose, en formato HTML unha táboa flotando á dereita, na que se visualizará unha liña por cada produto engadido ao carrito e unha liña final co total do pedido. Tamén visualizará unha imaxe para baleirar o carrito. En caso de premer nela chamarase á función baleirarCarrito.
◾Terá unha función de nome engadirProduto. Terá de parámetros o nome do produto, cantidade e prezo individual. Engadirá o produto ao array que se atopa na variable de sesión.
•Crea un arquivo include de nome Produtos.???.??? no que estean definidos nun array o listado de produtos que vai poder mercar o usuario. Dito array gardará o nome do produto e o seu prezo unitario.
•Crea unha páxina de nome ListadoProductos,???.
◾Dita páxina terá: ◾Visualizará en todo momento o contido do carrito chamando á función amosarCarrito. ◾Visualizará dentro dun formulario os produtos definidos no arquivo de 'include' Produtos.???.???. O usuario poderá escribir o número de unidades por cada un dos produtos (visualizar os produtos segundo o visto neste punto da wiki). Ao lado de cada produto haberá un imaxe dun carrito e ao premer nela engadirase dito produto ao carrito chamando á función engadirProduto. ◾Terá un enlace á páxina FinalizarCompra.??? na que se amosará o carrito completo. •Crea unha páxina de nome FinalizarCompra.??? que amose o contido do carrito e finalice a sesión do usuario.
Solución Exercicio 4
- Partimos da base que temos os produtos nun array e polo tanto o que temos que descubrir é o índice do array e a cantidade do produto asociado á imaxe do carrito.
- O problema que ides ter é como enviar a través dunha imaxe (o carrito) o índice do array (tamén poderiades facelo cun array asociativo no que a clave fose o código do produto, neste caso teríamos que enviar o código do produto e a cantidade escollida).
- Teríamos varias aproximacións:
- Poderíamos facer un formulario individual por cada produto de tal forma que ao premer sobre o carrito xa enviamos os datos do produto (poderíamos ter o índice do array nun campo oculto).
- Poderíamos utilizar un único formulario e usar JavaScript para que cando prememos sobre a imaxe, cambie o valor dun campo oculto polo valor do índice do array que se corresponde ao produto. Tamén poderíamos cambiar o action e enviar en forma de parámetro dito índice.
- Poderíamos utilizar un único formulario e asociar a cada produto un botón cun value igual ao índice do array e dentro do botón unha imaxe do carrito. Cando prememos a imaxe estaremos premendo o botón e polo tanto poderemos recuperar o seu value. O nome do botón será único (non será un 'array' coma os produtos) xa que soamente queremos recuperar o valor do produto seleccionado. A continuación se amosa un exemplo da implementación desta solución:
Páxina: UD4_session_Ex4_carrito_1.php
1 <?php 2 3 $prod1=array("DISCO DURO 1 TB",123.5); 4 $prod2=array("MONITOR 23' HP",223.5); 5 $prod3=array("CPU I5 2GHZ",53); 6 $produtos = array($prod1,$prod2,$prod3); // Un exemplo de produtos gardados nun array 7 8 9 if (isset($_POST['carrito'])){ 10 11 // Habería que comprobar con filter_var que $_POST['cantidade'] e $_POST['carrito'] sexa un número 12 // Coidado con poñer isset xa que o índice 0 o interpretaría como baleiro. 13 14 echo "Traemos algo"; // Amosamos os datos a modo de exemplo. Non debemos facelo aquí xa que estamos fora de body. Aquí iría o código que engade o produto a o array de produtos escollidos e que gardaríamos nunha variable de sesión. 15 echo "<br />"; 16 echo "Referencia no array:" . $_POST['carrito']; 17 echo "<br />"; 18 echo "PRODUTO:" . $produtos[$_POST['carrito']][0] . " e cantidade escollida:" . $_POST['cantidade'][$_POST['carrito']]; 19 20 } 21 ?> 22 23 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 24 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 25 <html> 26 <head> 27 <meta charset="UTF-8"> 28 <title></title> 29 </head> 30 31 <body> 32 <form action="UD4_session_Ex4_carrito_1.php" method="post"> 33 34 <?php 35 36 foreach ($produtos as $key=>$p) { 37 38 printf("<div>%s => %s <input type='text' size='2' maxlength='2' name='cantidade[]' /><button type='submit' name='carrito' value='%d'><input type='image' src='carrito.jpg' style='width:20px;height:20px' /></button></div>",$p[0], number_format($p[1],2),$key); 39 40 } 41 42 ?> 43 44 </form> 45 </body> 46 </html>
-- Ángel D. Fernández González -- (2017).