Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red IES Valle del Cidacos – Calahorra Implantación de Aplicaciones Web – Programación con PHP © Enrique Rivas Marco Usted es libre de: Compartir — copiar y redistribuir el material en cualquier medio o formato Adaptar — remezclar, transformar y crear a partir del material El licenciador no puede revocar estas libertades mientras cumpla con los términos de la licencia. Bajo las condiciones siguientes: Reconocimiento — Debe reconocer adecuadamente la autoría, proporcionar un enlace a la licencia e indicar si se han realizado cambios. Puede hacerlo de cualquier manera razonable, pero no de una manera que sugiera que tiene el apoyo del licenciador o lo recibe por el uso que hace. NoComercial — No puede utilizar el material para una finalidad comercial. CompartirIgual— Si remezcla, transforma o crea a partir del material, deberá difundir sus contribuciones bajo la misma licencia que el original. No hay restricciones adicionales — No puede aplicar términos legales o medidas tecnológicas que legalmente restrinjan realizar aquello que la licencia permite. 1 Apuntes de PHP 1. ¿Qué es PHP? ................................................................................................................... 4 2. Requisitos:......................................................................................................................... 4 3. Otras utilidades ................................................................................................................. 4 4. Preparar el servidor. ........................................................................................................ 5 5. Sintaxis de PHP Básico ...............................................................................................................9 6. Comentarios: ..................................................................................................................... 9 7. Incluir ficheros ................................................................................................................ 10 8. Mayúsculas y minúsculas:............................................................................................ 11 9. Variables .......................................................................................................................... 11 10. Tipos de datos soportados por PHP ....................................................................... 12 11. Strings .......................................................................................................................... 13 12. Operadores .................................................................................................................. 14 12.1. Aritméticos .......................................................................................................................... 14 12.2. Operadores de asignación ................................................................................................ 14 12.3. Operadores de Comparación............................................................................................ 14 12.4. Operadores incremento y decremento .......................................................................... 15 12.5. Operadores lógicos ............................................................................................................ 15 12.6. Operadores sobre cadenas ............................................................................................... 15 12.7. Operaciones sobre arrays ................................................................................................. 15 13. Sentencias alternativas ............................................................................................. 16 13.1. Sentencia if .......................................................................................................................... 16 13.2. Sentencia if...else ............................................................................................................... 16 13.3. Sentencia if...elseif...else ................................................................................................... 16 14. Sentencia switch ......................................................................................................... 17 15. Bucle while................................................................................................................... 18 16. Bucle do...while ........................................................................................................... 18 17. Bucle for ....................................................................................................................... 19 18. Bucle foreach (para arrays) ...................................................................................... 19 19. Ejemplo de paginación: ............................................................................................. 19 20. Funciones .................................................................................................................... 22 20.1. Funciones con parámetros ............................................................................................... 22 20.2. Funciones con argumentos por defecto ......................................................................... 23 20.3. Funciones que devuelven valores ................................................................................... 23 21. Arrays ........................................................................................................................... 24 2 21.1. Inicialización de arrays ...................................................................................................... 24 21.2. Obtener la longitud de un array función count() ........................................................... 24 21.3. Recorrer un array................................................................................................................ 25 21.4. Arrays asociativos .............................................................................................................. 25 21.5. Recorrido de arrays asociativos ...................................................................................... 25 22. Formularios.................................................................................................................. 26 22.1. Elementos de un formulario ............................................................................................. 26 22.2. Formulario y proceso en un único archivo .................................................................... 30 22.3. Subida de ficheros al servidor ......................................................................................... 31 22.4. Validación ............................................................................................................................ 34 22.5. Validar datos Mediante expresiones regulares ............................................................. 35 22.6. Ejemplo de valiadación y subida de ficheros con control de errores........................ 36 23. Bases de Datos ........................................................................................................... 40 23.1. Conexión a la base de datos............................................................................................ 40 23.2. Cerrar la conexión .............................................................................................................. 40 23.3. Crear base de datos ........................................................................................................... 40 23.4. Creación de tablas .............................................................................................................. 41 23.5. Insertar valores en las tablas............................................................................................ 42 23.6. Recoger el ID del último registro insertado ................................................................... 43 23.7. Inserciones multiples ......................................................................................................... 43 23.8. Mostrar datos de una tabla ............................................................................................... 44 23.9. Borrar datos de una tabla.................................................................................................. 45 23.10. Modificar datos de una tabla ........................................................................................ 46 23.11. Limitar los datos seleccionados .................................................................................. 46 24. Sesiones .................................................................................................................................47 24.1. Crear un Login. ................................................................................................................... 50 25. Métodos para pasar variables entre archivos. Carrito de la compra................. 60 26. Bibliografía .............................................................................................................................63 3 1. ¿Qué es PHP? • PHP es un lenguaje de script del lado del servidor. Otros lenguajes similares son ASP, JSP o ColdFusion • Los scripts PHP están incrustados en los documentos html y el servidor los interpreta y ejecuta antes de servir las páginas al cliente • El cliente no ve el código PHP sino los resultados que produce • Es un módulo que se añade al servidor web y fue concebido inicialmente para Apache • Por sus ventajas: es potente, fácil de aprender, de libre distribución, permite el acceso a bases de datos y otras funcionalidades orientadas a la red • Dispone de abundante soporte en la Web 2. Requisitos: • Servidor web Apache (www.apache.org) • Con el módulo PHP (www.php.net) • y la base de datos MySQL (www.mysql.com) si se desea crear páginas dinámicas 3. Otras utilidades • Herramientas para la gestión de MySQL, como PHPMyAdmin (www.phpmyadmin.net) • Editores de PHP, como DevPHP (www.sourceforge.net), (www.eclipse.org) o Aptana Studio (www.aptana.com) 4 Eclipse 4. Preparar el servidor. Servidor local Linux: Existen manuales para realizar las instalaciones necesarias en un servidor local, en este caso se elige Ubuntu como Sistema Operativo basado en Linux. Ubuntu 14.04: https://www.howtoforge.com/ubuntu-lamp-server-with-apache2- php5-mysql-on-14.04-lts Ubuntu 15.10: https://www.howtoforge.com/tutorial/install-apache-with-php-and- mysql-on-ubuntu-lamp/ En howtoforge se pueden encontrar las instalaciones para cualquier versión de Linux. Basándonos en lo anterior los pasos necesarios son los siguientes: Instalación de MySQL em linea de comandos sudo apt-get install mysql-server mysql-client Durante la instalación nos pedirá el password del super usuario root, y que lo confirmemos. Instalación de Apache2 sudo apt-get install apache2 Para comprobar que todo ha ido bien podemos abrir la ventana del navegador y en la url escribir http://localhost o http://127.0.0.1 deberá de aparecer la siguiente imagen: La raíz de documentos de apache por defecto se encuentra en /var/www/html, en el caso anterior el archivo que se muestra es index.html. 5 Instalación de PHP5 y el módulo para Apache2: sudo apt-get install php5 libapache2-mod-php5 Para que los cambios tengan efecto en apache2 reiniciamos el servicio: sudo service apache2 restart Para comprobar que todo ha ido bien podemos crear un archivo con una función php y visualizarlo en el navegador: gedit /var/www/html/info.php Donde colocamos el siguiente contenido: <?php phpinfo(); ?> En un navegador escribimos la siguiente url http://localhost/info.php Veremos algo parecido a la siguiente imagen: Damos soporte a MySQL en PHP5, es necesario instalar php5-mysql. También es buena idea instalar otros módulos que pueden ser necesarios en otras aplicaciones, se pueden buscar los módulos PHP5 disponibles con el comando aptcache search php5. Instalaremos los siguientes, con la siguiente orden: 6 sudo apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl Para que los cambios tengan efecto en apache2 reiniciamos el servicio: sudo service apache2 restart Finalmente instalamos phpMyAdmin, es una interfaz gráfica Web que nos permite gestionar nuestras bases de datos MySQL, la instalamos con el siguiente comando: apt-get install phpmyadmin Durante la instalación respondemos a las siguientes cuestiones: Web server to reconfigure automatically: <– apache2 Configure database for phpmyadmin with dbconfig-common <–No Podremos acceder con el navegador escribiendo la url http://localhost/phpmyadmin, veremos algo parecido a esto: En otros sistemas operativos es más cómodo utilizar paquetes que contienen todo lo necesario y son sencillos de instalar, uno de los más conocidos es XAMPP, existen versiones para Linux, Mac y Windows. Seguimos configurando el servidor, vamos a Crear una base de datos donde se guardará la información. 7 Entramos en MySQL con el comando mysql -u root -p Creamos la base de datos create database prueba; Creamos y damos privilegios a un usuario sobre la base de datos grant all privileges on prueba.* to usrprueba identified by 'pass'; Este comando fuerza al servidor a recargar los privilegios logrando que dichos cambios se produzcan al instante sin necesidad de reiniciar. flush privileges; Salimos de MySQL con el comando Exit Modificamos fichero /etc/php5/apache2/php.ini, establecemos la codificación de caracteres utf-8 por defecto y el nivel de error a E_WARNING sudo gedit /etc/php5/apache2/php.ini Descomentamos las siguientes dos lineas: [intl] intl.default_locale = es_utf8 intl.error_level = E_WARNING Si queremos subir algo al servidor de un tamaño superior a 2M hay que modificar estas líneas (permitimos subir hasta 10Mb) upload_max_filesize = 10M post_max_size = 10M 8 5. Sintaxis de PHP Básico Un script PHP se puede colocar en cualquier parte del documento. Un script PHP comienza con <?php y termina con ?> <!DOCTYPE html> <html> <body> <h1>Mi primera página en PHP</h1> <?php echo "Hola Mundo!"; ?> </body> </html> 6. Comentarios: <!DOCTYPE html> <html> <body> <?php // un comentario de una línea # Este también es un comentario de una línea /* Esto es un comentario de multiples líneas Se expande sobre varias líneas */ // También puedes usar comentarios para dejar sin efecto partes del código $x = 5 /* + 15 */ + 5; echo $x; ?> </body> </html> 9 7. Incluir ficheros include() y require() Ambos incluyen y evalúan el fichero especificado Diferencia: en caso de error include() produce un warning y require() un error fatal Se usará require() si al producirse un error debe interrumpirse la carga de la página <html> <head> <title>Título</title> <?PHP // Incluir bibliotecas de funciones require ("conecta.php"); require ("fecha.php"); require ("cadena.php"); require ("globals.php"); ?> </head> <body> <?PHP include ("cabecera.html"); ?> // Código html + PHP . . . <?PHP include ("pie.html"); ?> </body> </html> 10 8. Mayúsculas y minúsculas: En PHP, todas las palabras clave (por ejemplo, si, de lo contrario, mientras que, eco, etc.), clases, funciones y funciones definidas por el usuario no distinguen entre mayúsculas y minúsculas. Ahora bien, todos los nombres de variables distinguen entre mayúsculas y minúsculas. 9. Variables Las variables son "contenedores" para almacenar información. <?php $txt = "¡Hola mundo!"; $x = 5; $y = 10.5; ?> Después de la ejecución de las declaraciones anteriores, la variable $txt celebrará el valor ¡Hola, mundo!, La variable $ x conendrá el valor5, y la variable $y contendrá el valor 10.5. Reglas para las variables de PHP: • Una variable comienza con el signo $, seguido por el nombre de la variable. • Un nombre de variable debe comenzar con una letra o el carácter de subrayado. • Un nombre de variable no puede empezar con un número. • Un nombre de variable sólo puede contener caracteres y guiones alfanuméricos (AZ, 0-9 y _). • Los nombres de variables distinguen entre mayúsculas y minúsculas ($edad y $EDAD son dos variables diferentes) La declaración de eco PHP se utiliza a menudo para los datos de salida a la pantalla. El siguiente ejemplo le mostrará cómo texto de salida y una variable: <?php $txt = "W3Schools.com"; echo "I love $txt!"; 11 ?> El siguiente ejemplo producirá el mismo resultado que el ejemplo anterior: <?php $txt = "W3Schools.com"; echo "I love " . $txt . "!"; ?> 10. Tipos de datos soportados por PHP • String • Integer, número no decimal entre -2,147,483,648 y 2,147,483,647. $x = 5985; • Float (Números con decimanes) $x = 10.365; • Boolean $x = true; $y = false; • Array Cadena de texto, $x = "Hello world!"; Guarda multiples valores en una sola variable $cars = array("Volvo","BMW","Toyota"); • NULL Una variable que no contiene ningún valor $x = "Hello world!"; $x = null; La función gettype() devuelve el tipo de una variable. Las funciones is_type comprueban si una variable es de un tipo dado: is_array(), is_bool(), is_float(), is_integer(), is_null(), is_numeric(), is_object(), is_resource(), is_scalar(), is_string() La función var_dump($x); nos devuelve el tipo y el valor de variable, ejercicio: probar los con los tipos de datos anteriores. 12 11. Strings strlen("Hello world!"); Longitud de la cadena str_word_count("Hello world!"); Número de palabras strrev("Hello world!"); invierte la cadena strpos("Hello world!", "world"); Devuelve la posición de world dentro de la primera cadena (6) str_replace("world", "Dolly", "Hello world!"); reemplaza una cadena por otra // outputs Hello Dolly! rtrim(), ltrim(), trim() Eliminan caracteres a la derecha, a la izquierda o por ambos lados de una cadena strcmp() / strcasecmp() Compara dos cadenas con/sin distinción de mayúsculas strtolower() / strtoupper() Convierte una cadena a minúscula / mayúscula Se pueden consultar todas las funciones http://www.w3schools.com/php/php_ref_string.asp 13 de cadena en este enlace 12. Operadores 12.1. 12.2. 12.3. Aritméticos + Suma $x + $y - Resta $x - $y * Multiplicación $x * $y / División $x / $y % Resto $x % $y ** Potencias $x ** $y Operadores de asignación x=y x=y x += y x=x+y x -= y x=x–y x *= y x=x*y x /= y x=x/y x %= y x=x%y Operadores de Comparación == Iguales $x == $y === Idénticos $x === $y != Distintos $x != $y <> Distintos $x <> $y !== No idénticos $x !== $y > Mayor que $x > $y < Menor que $x < $y >= Mayor o igual que $x >= $y <= Menor o igual que $x <= $y 14 12.4. 12.5. 12.6. Operadores incremento y decremento ++$x Pre-incremento $x++ Post-incremento --$x Pre-decremento $x-- Post-decremento Operadores lógicos And And $x and $y Or Or $x or $y Xor Xor $x xor $y && And $x && $y || Or $x || $y ! Not !$x Operadores sobre cadenas . Concatenación $txt1 . $txt2 .= Asigna Concatenación 12.7. Concatenación de $txt1 y $txt2 $txt1 .= $txt2 Añade $txt2 a $txt1 Operaciones sobre arrays + Union $x + $y Union de $x y $y == Igualdad $x == $y Devuelve true si $x y $y tienen los mismos pares indice/valor Devuelve true si $x y $y tienen los === Identidad $x === $y mismos pares en el mismo orden y del mismo tipo != Distintos $x != $y Devuelve true si $x no es igual a $y <> Distintos $x <> $y Devuelve true si $x no es igual a $y !== No idénticos $x !== $y Devuelve true si $x no es idéntico a $y 15 13. Sentencias alternativas 13.1. Sentencia if if (condición) { Se ejecuta este código si la condición es cierta; } <?php $t = date("H"); //recoge la hora actual // si la hora es menor que 20 imprime el mensaje if ($t < "20") { echo "Ten un buen día!"; } ?> 13.2. Sentencia if...else if (condición) { Se ejecuta este código si la condición es cierta; } else { Se ejecuta este código si la condición es falsa; } <?php $t = date("H"); if ($t < "20") { echo "Ten un buen día!"; } else { echo "Ten una buena noche!"; } ?> 13.3. Sentencia if...elseif...else if (condición { Se ejecuta este código si la condición es cierta; } elseif (condición) { Se ejecuta este código si esta condición es cierta; 16 } else { se ejecuta este código si todas las condiciones son falsas; } <?php $t = date("H"); if ($t < "10") { echo "Ten una buena mañana!"; } elseif ($t < "20") { echo "Ten un buen día!"; } else { echo "Ten una buena noche!"; } ?> 14. Sentencia switch switch (n) { case label1: codigo ejecutado si n=label1; break; case label2: codigo ejecutado si n=label2; break; case label3: codigo ejecutado si n=lab el3; break; ... default: codigo ejecutado si n es diferente de todas labels; } Si omitimos algún break; se ejecuta la sentencia del siguiente case, hasta que encuentre un break. <?php $favcolor = "red"; switch ($favcolor) { 17 case "red": echo "Your favorite color is red!"; break; case "blue": echo "Your favorite color is blue!"; break; case "green": echo "Your favorite color is green!"; break; default: echo "Your favorite color is neither red, blue, nor green!"; } ?> 15. Bucle while while (mientras la condición sea cierta) { codigo que será ejecutado; } <?php $x = 1; while($x <= 5) { echo "El número es: $x <br>"; $x++; } ?> 16. Bucle do...while do { Código que se ejecutarça; } while (mientras la condición sea cierta); <?php $x = 6; do { 18 echo "El número es: $x <br>"; $x++; } while ($x<=5); ?> 17. Bucle for for (valor inicial; condición ; incremento) { Código que será ejecutado; } <?php for ($x = 0; $x <= 10; $x++) { echo "El número es: $x <br>"; } ?> 18. Bucle foreach (para arrays) foreach ($array as $valor) { Código que será ejecutado; } <?php $colores = array("red", "green", "blue", "yellow"); foreach ($colores as $valor) { echo "$valor <br>"; } ?> 19. Ejemplo de paginación: Muestra por pantalla los caracteres de la tabla Unicode del al 0 al 5000 en 5 columnas con pares código valor, se muestra paginada, de modo que en cada pantalla se muestran 500 códigos y unos enlaces permiten pasar a la siguiente página y volver a la anterior: 19 <?php include("cabecera.html")?> <h2 style="text-align:center">Ejercicios</h2> <hr/> <h3>Ejercicio 3.11</h3><hr/> <?php //Definimos del número de registro que queremos mostrar en cada página $registrosLimite = 500; //si la variable $pagina se ha enviado: aumentamos su valor y le damos valor a la variable inicio, en caso contrario la inicializamos a 0 las dos variables if( isset($_GET['pagina'] ) ) { $pagina = $_GET['pagina'] + 1; $inicio = $registrosLimite * $pagina ; } else { $pagina = 0; $inicio = 0; } //Actualizamos la variable que indica los registros que nos quedan por mostrar $registrosFaltan = 5000 - ($pagina * $registrosLimite); //en un caso u otro mostraremos los enlaces que nos interesa, pasando el valor de página por la url (método GET) if( $pagina > 0 && $registrosFaltan > $registrosLimite { $Anteriores = $pagina - 2; echo "<a href=\"$_PHP_SELF?pagina=$Anteriores\">Anteriores ".$registrosLimite." Registros</a> |"; echo "<a href=\"$_PHP_SELF?pagina=$pagina\"> Siguientes ".$registrosLimite." Registros</a>"; } 20 ) else if( $pagina == 0 ) { echo "<a href=\"$_PHP_SELF?pagina=$pagina\"> Siguientes ".$registrosLimite." Registros</a>"; } else if( $registrosFaltan <= $registrosLimite ) { $Anteriores = $pagina - 2; echo "<a href=\"$_PHP_SELF?pagina=$Anteriores\">Anteriores ".$registrosLimite." Registros</a>"; } //Se crea la tabla y la primera fila echo '<table style="textalign:center;width:100%;padding:4px;bordercollapse:collapse;border:1px silver solid"><tr style="background-color:#444;color:white;">'; //Se crea la cabecera de la tabla for($x=1;$x<=5;$x++) echo '<th>Codigo</th><th>Valor</th>'; echo'</tr><tr>'; //Se imprimen los pares valor, código, con en inicio y límite marcado por las variables de paginación for($i=$inicio+1;$i<= $inicio+ $registrosLimite;$i++){ echo'<td style="backgroundcolor:#CCC;padding:4px;border:1px silver solid">'.$i.'</td><td style="padding:4px;border:1px silver solid">&#'.$i.';</td>'; //Una nueva fila cada 5 pares valor, código if($i%5==0) echo'</tr><tr>'; } //Se cierra la última fila y la tabla echo '</tr></table>'; ?> <?php include("pie.html")?> 21 20. Funciones function NombreFuncion() { Código de la función; } <?php function writeMsg() { echo "Hola mundo!"; } writeMsg(); // llamada a la función ?> 20.1. Funciones con parámetros A las funciones se les puede parar valores, si en la definición de la función se han declarado los parámetros, éstos actúan como variables dentro de la función, su valor será el valor que se le haya pasado a la función. <?php function familyName($nombre, $anio) { echo "$nombre Nacido en el año $anio <br>"; } familyName("Juan", "1975"); familyName("Pedro", "1978"); familyName("Pablo", "1983"); ?> Por defecto los parámetros se pasan por valor Paso por referencia (podemos modificar el valor de la variable en la función): <?php function incrementa (&$a) { $a = $a + 1; } $a=1; incrementa ($a); print $a; // Muestra un 2 ?> 22 20.2. Funciones con argumentos por defecto A los parámetros de las funciones se les pueden pasar valores por defecto <?php function setHeight($minheight = 50) { echo "The height is : $minheight <br>"; } setHeight(350); setHeight(); // Usa el valor por defecto of 50 setHeight(135); setHeight(80); ?> 20.3. Funciones que devuelven valores Las funciones pueden devolver valores utilizando la palabra reservada return <?php function suma($x, $y) { $z = $x + $y; return $z; } echo "5 + 10 = " . suma(5, 10) . "<br>"; echo "7 + 13 = " . suma(7, 13) . "<br>"; echo "2 + 4 = " . suma(2, 4); ?> 20.4. Funciones de fecha y hora date() Formatea una fecha según un formato dado $fecha = date ("j/n/Y H:i"); print ("$fecha"); Resultado: 26/9/2005 17:36 23 21. Arrays Son variables que pueden guardar multiples datos en una sola variable (se accede a los valore mediante índices) <?php $cars = array("Volvo", "BMW", "Toyota"); echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."; ?> 21.1. Inicialización de arrays $cars = array("Volvo", "BMW", "Toyota"); $cars[0] = "Volvo"; $cars[1] = "BMW"; $cars[2] = "Toyota"; <?php $cars = array("Volvo", "BMW", "Toyota"); echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . "."; ?> 21.2. Obtener la longitud de un array función count() <?php $cars = array("Volvo", "BMW", "Toyota"); echo count($cars); ?> 24 21.3. Recorrer un array <?php $cars = array("Volvo", "BMW", "Toyota"); $arrlength = count($cars); for($x = 0; $x < $arrlength; $x++) { echo $cars[$x]; echo "<br>"; } ?> 21.4. Arrays asociativos $age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43"); $age['Peter'] = "35"; $age['Ben'] = "37"; $age['Joe'] = "43"; <?php $age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43"); echo "Peter is " . $age['Peter'] . " years old."; ?> 21.5. Recorrido de arrays asociativos <?php $age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43"); foreach($age as $x => $x_value) { echo "Key=" . $x . ", Value=" . $x_value; echo "<br>"; } ?> <?php $color = array (‘rojo’=>101, ‘verde’=>51, ‘azul’=>255); $medidas = array (10, 25, 15); foreach ($color as $clave => $valor){ print “Clave: $clave; Valor: $valor<br>\n”; } ?> 25 22. Formularios <html> <body> <form action="welcome.php" method="post"> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> <input type="submit"> </form> </body> </html> welcome.php: <html> <body> Welcome <?php echo $_POST["name"]; ?><br> Your email address is: <?php echo $_POST["email"]; ?> </body> </html> 22.1. Elementos de un formulario • TEXT Introduzca la cadena a buscar: <input type="text" name="cadena" value="valor por defecto" size="20"> <?PHP $cadena = $_REQUEST["cadena"]; print ($cadena); ?> 26 • RADIO Sexo: <input type="radio" name="sexo" value="M" checked = "chequed">Mujer <input type="radio" name="sexo" value="H">Hombre <?PHP $sexo = $_REQUEST['sexo']; print ($sexo); ?> • CHECKBOX <input type="checkbox" name="extras[]" value="garaje" checked = “chequed”>Garaje <input type="checkbox" name="extras[]" value="piscina">Piscina <input type="checkbox" name="extras[]" value="jardin">Jardín <?PHP $extras = $_REQUEST['extras']; foreach ($extras as $extra) print ("$extra<br>\n"); ?> • BUTTON <input type="button" name="actualizar" value="Actualizar datos"> <?PHP $actualizar = $_REQUEST['actualizar']; if ($actualizar) print ("Se han actualizado los datos"); ?> 27 • FILE <form action="procesa.php" method="post“ enctype="multipart/form-data"> <input type="file" name="fichero"> </form> • HIDDEN <?PHP print(“<input type='hidden' name='username' value='$usuario'>\n”); ?> <?PHP $username = $_REQUEST['username']; print ($username); ?> • PASSWORD Contraseña: <input type="password" name="clave"> <?PHP $clave = $_REQUEST['clave']; print ($clave); ?> • SUBMIT <input type="submit" name="enviar" value="Enviar datos"> <?PHP $enviar = $_REQUEST['enviar']; if ($enviar) print ("Se ha pulsado el botón de enviar"); ?> 28 • SELECT simple Color: <select name=“color"> <option value=“rojo" selectED>Rojo <option value=“verde">Verde <option value=“azul">Azul </select> <?PHP $color = $_REQUEST[‘color’]; print ($color); ?> • SELECT múltiple Idiomas: <select multiple size="3" name="idiomas[]"> <option value="ingles" selectED>Inglés <option value="frances">Francés <option value="aleman">Alemán <option value="holandes">Holandés </select> <?PHP $idiomas = $_REQUEST['idiomas']; foreach ($idiomas as $idioma) print ("$idioma<br>\n"); ?> • TEXTAREA Comentario: <textarea cols="50" rows="4" name="comentario"> Este libro me parece ... </textarea> <?PHP $comentario = $_REQUEST['comentario']; print ($comentario); ?> 29 22.2. Formulario y proceso en un único archivo La forma habitual de trabajar con formularios en PHP es utilizar un único programa que procese el formulario o lo muestre según haya sido o no enviado, respectivamente Ventajas: • Disminuye el número de ficheros • Permite validar los datos del formulario en el propio formulario Esquema de funcionamiento: si se ha enviado el formulario: Procesar formulario si no: Mostrar formulario fsi La 1ª vez que se carga la página se muestra el formulario La 2ª vez se procesa el formulario Para saber si se ha enviado el formulario se acude a la variable correspondiente al botón de envío. Si este botón aparece de la siguiente forma en el formulario html: <input type="submit" name="enviar" value="procesar"> Entonces la condición anterior se transforma en: if (isset($enviar)) o bien if ($enviar == “procesar”) Ejemplo tabla.php: Se introduce un valor y se muestra la tabla de multiplicar de ese valor <html> <head> <title>formulario y proceso juntos</title> <meta charset="UTF-8"> </head> <body> 30 <H1>Tabla de multiplicar</H1> <?php if(isset($_REQUEST['mostrar'])){ $tabla = $_POST['tabla']; for($i=1;$i<=10;$i++) echo $tabla ." X " .$i. " = ". $tabla * $i. "<br/>"; ?> <a href="tabla.php"> Volver </a> <?php } else{ ?> <form action="tabla.php" method="post"> Introduce el número de tabla <input type="text" name="tabla"> <input type="submit" value="mostrar tabla" name="mostrar"> </form> <?php } ?> </body> </html> 22.3. Subida de ficheros al servidor Para subir un fichero al servidor se utiliza el elemento de entrada FILE. Hay que tener en cuenta una serie de consideraciones importantes: El elemento FORM debe tener el atributo enctype="multipart/form-data“ El fichero tiene un límite en cuanto a su tamaño, este límite se fija de dos formas diferentes: En el fichero de configuración php.ini (visto en la preparación del servidor) En el propio formulario (lo vemos en el siguiente ejemplo) 31 Ejemplo, Dos ficheros fichero.html muestra el formulario, subirFichero.php lo procesa: fichero.html <!DOCTYPE html> <html> <body> <form action="subirFichero.php" method="post" enctype="multipart/form-data"> Selecciona una image para subir: <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="Upload Image" name="submit"> </form> </body> </html> subirFichero.php <?php //la capreta uploads deberá estar junto con el archivo php (ruta relativa) $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Así tenemos la extensión del archivo, en este ejemplo solo permitimos extensiones de tipo imagen if(isset($_POST["submit"])) { //la siguiente función nos permite comprobar si el archivo es correcto $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { 32 echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } // comprobamos is el archivo ya existe if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; } // Comprobamos el tamaño máximo permitido if ($_FILES["fileToUpload"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Tipo de archivos permitidos if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { //aquí es donde se sube el fichero if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { 33 echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } ?> 22.4. Validación Toda la información proveniente de un formulario debe considerarse por norma como contaminada, y hay que validarla antes de darla por buena y procesarla. Lo más eficiente es mostrar los errores sobre el propio formulario para facilitar su corrección. Procedimiento: Si se ha enviado el formulario: validar datos fsi Si se ha enviado el formulario y no hay errores: Procesar formulario si no: Mostrar formulario con valores por defecto o ya enviados fsi <?php // Se definen las variables y se les da valor vacio $name = $email = $gender = $comment = $website = ""; Evitamos problemas de seguridad al recoger los datos, quitamos espacios en blanco, quitamos caracteres innecesarios llamando a la función test_input() if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $email = test_input($_POST["email"]); $website = test_input($_POST["website"]); $comment = test_input($_POST["comment"]); 34 $gender = test_input($_POST["gender"]); } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> 22.5. Validar datos Mediante expresiones regulares Nombres <?php $name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "Solo se permiten letras y espacios en blanco"; } ?> E-mail <?php $email = test_input($_POST["email"]); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $emailErr = "Formato de e-mail no valido"; } ?> URL <?php $website = test_input($_POST["website"]); if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z09+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { websiteErr = "Invalid URL"; }?> 35 22.6. Ejemplo de valiadación y subida de ficheros con control de errores <?php include("cabecera.html")?> <?php //esta función nos permite evitar espacios en blanco y caracteres slash y especiales, evitamos posibles intrusiones function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image $error=false; $nombre= test_input($_REQUEST['nombre']); $precio= test_input($_REQUEST['precio']); $color= test_input($_REQUEST['color']); $sub=$_POST["submit"]; $errores['imagen']=""; if(isset($sub)) { // Nombre del producto if (trim($nombre) == "") { $errores["nombre"] = "¡Debe introducir el nombre del producto!"; $error = true; } else $errores["nombre"] = ""; // Precio if (trim($precio) == "") 36 { $errores["precio"] = "¡Debe introducir el precio del producto!"; $error = true; } else if (!is_numeric($precio)) { $errores["precio"] = "¡El precio debe de ser un número (utilize punto '.' para separar los decimales)!"; $error = true; }else $errores["precio"] = ""; //Imagen $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { $errores["imagen"]=""; } else { $errores["imagen"] = "El archivo no es una imagen. "; $error = true; } // Check if file already exists if (file_exists($target_file)) { $errores["imagen"] .= "La imagen ya existe. "; $error = true; } // Check file size if ($_FILES["fileToUpload"]["size"] > 500000) { $errores["imagen"] .="Su imagen es muy grande. "; $error = true; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { 37 $errores["imagen"] . "Solamente los tipos JPG, JPEG, PNG & GIF están permitidos. "; $error = true; } // Check if $uploadOk is set to 0 by an error if ($error==false && move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { } else { $error = true; $errores["imagen"] .="Ha habido un error en el proceso."; } } if (isset($sub) && $error==false){ //Todo correcto, mostramos los datos del producto y la imagen echo "<h1> Datos del producto introducido</h1><hr>"; echo "nombre: ". $nombre."<br/>"; echo "precio: ". $precio."<br/>"; echo "color: ". $color."<br/>"; echo "imagen: <img src=" .$target_file."><br><br>"; //Aquí realizariamos los pasos para insertar el producto en una base de datos, se verá más adelante echo "<a href='productos2.php'>Volver a crear un producto</a>"; }else{ ?> <h1> Formulario de Inserción de Productos</h1> <hr/> <form class="form-horizontal" action="nuevoproducto.php" method="post" enctype="multipart/form-data"> 38 <input type="text" class="form-control" id="nombre" placeholder="Nombre - Valor requerido" name="nombre" required value="<?php echo $nombre;?>" > <?PHP if ($errores["nombre"] != "") print ("<span style='color:red'>" . $errores["nombre"] . "</span>"); ?> <br> <input type="text" class="form-control" placeholder="Precio - Valor requerido" name="precio" required value="<?php echo $precio;?>" > <?PHP if ($errores["precio"] != "") print ("<span style='color:red'>" . $errores["precio"] . "</span>"); ?> <br> Color <input type="color" placeholder="Color" class="form-control" value="<?php echo $color;?>" name="color"> <br> <label for="fileToUpload">Imagen - Valor requido</label><input type="file" name="fileToUpload" id="fileToUpload" accept="image/*" required> <?PHP if ($errores["imagen"] != "") print ("<span style='color:red'>" . $errores["imagen"] . "</span>"); ?> <br> <input type="submit" class="btn btn-default" value="Enviar" name="submit"> </form> <?php include("pie.html")?> 39 23. Bases de Datos 23.1. Conexión a la base de datos <?php $servernam e = "localhost"; $username = "username"; $password = "password"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password); // Chequea la connecxión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } echo "Conexión Válida"; ?> 23.2. Cerrar la conexión <?php mysqli_close($conn); ?> 23.3. Crear base de datos <?php $servername = "localhost"; $username = "username"; $password = "password"; // Crear la conexión $conn = mysqli_connect($servername, $username, $password); // Chequea la conexión if (!$conn){ 40 die("Connection failed: " . mysqli_connect_error()); } // Crea la base de datos $sql = "CREATE DATABASE myDB"; if (mysqli_query($conn, $sql)) { echo "Base de datos creada correctamente"; } else { echo "Error al crear la base de datos: " . mysqli_error($conn); } mysqli_close($conn); ?> 23.4. Creación de tablas <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } // sql para crear la tabla $sql = "CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; 41 if (mysqli_query($conn, $sql)) { echo "La tabla MyGuests creada correctamente"; } else { echo "Error al crear la tabla: " . mysqli_error($conn); } mysqli_close($conn); ?> 23.5. Insertar valores en las tablas <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) valueS ('John', 'Doe', '[email protected]')"; if (mysqli_query($conn, $sql)) { echo "Nuevo Registro credo correctamente"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?> 42 23.6. Recoger el ID del último registro insertado <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) valueS ('John', 'Doe', '[email protected]')"; if (mysqli_query($conn, $sql)) { $last_id = mysqli_insert_id($conn); echo "Nuevo registro creado correctamente. El último ID insertado es: " . $last_id; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?> 23.7. Inserciones multiples <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión 43 $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) valueS ('John', 'Doe', '[email protected]');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) valueS ('Mary', 'Moe', '[email protected]');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) valueS ('Julie', 'Dooley', '[email protected]')"; if (mysqli_multi_query($conn, $sql)) { echo "New records created successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?> 23.8. Mostrar datos de una tabla <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión: " . mysqli_connect_error()); 44 } $sql = "select id, firstname, lastname FROM MyGuests"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { // mostramos los datos de cada fila while($row = mysqli_fetch_assoc($result)) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 registros"; } mysqli_close($conn); ?> 23.9. Borrar datos de una tabla <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } // sql to delete a record $sql = "DELETE FROM MyGuests WHERE id=3"; if (mysqli_query($conn, $sql)) { echo "Registro borrado correctamente"; } else { echo "Error al borrar el registro: " . mysqli_error($conn); } 45 mysqli_close($conn); ?> 23.10. Modificar datos de una tabla <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Crea la conexión $conn = mysqli_connect($servername, $username, $password, $dbname); // Chequea la conexión if (!$conn){ die("Conexión fallida: " . mysqli_connect_error()); } $sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2"; if (mysqli_query($conn, $sql)) { echo "Registro modificado correctamente"; } else { echo "Error al modificar el registro: " . mysqli_error($conn); } mysqli_close($conn); ?> 23.11. Limitar los datos seleccionados Obtiene los 30 primeros registros $sql = "select * FROM Orders LIMIT 30"; Obtiene 10 registros empezando en el 16 $sql = "select * FROM Orders LIMIT 10 OFFSET 15"; $sql = "select * FROM Orders LIMIT 15, 10"; 46 24. Sesiones A veces es necesario mantener el estado de una conexión entre distintas páginas o entre distintas visitas a un mismo sitio, como por ejemplo aplicaciones personalizadas, carrito de la compra, control de acceso, etc. HTTP es un protocolo sin estado: cada conexión entre el cliente y el servidor es independiente de las demás. Las variables de sesión resuelven este problema, guardando información de usuario que puede ser accesible desde múltiples páginas, por defecto las variables de sesión permanecen hasta que el usuario cierra el navegador. Por lo tanto las variables de sesión mantienen información de un solo usuario y son disponibles en todas las páginas de la aplicación. Funciones de PHP para el manejo de sesiones: session_start() inicializa una sesión y le asigna un identificador de sesión único. Si la sesión ya está iniciada, carga todas las variables de sesión. $_SESSION variable global de PHP que permite registrar variables de sesión. $_SESSION[‘nombre’] = valor; registra una variable de sesión. if (isset($_SESSION[‘nombre’])) comprueba si una variable está registrada. Devuelve true en caso afirmativo y false en caso contrario unset ($_SESSION[‘nombre’]); elimina una variable de sesión session_unset(); Borra todas las variables de sesión. session_destroy() cierra una sesión. Conviene llamar a session_destroy() para cerrar la sesión. El manejo de las sesiones se realiza de la siguiente forma: Todas las páginas deben realizar una llamada a session_start() para cargar las variables de la sesión. Esta llamada debe estar colocada antes de cualquier código HTML Ej: "sesion1.php". En esta página iniciamos la sesión y creamos variables de sesión: <?php // Inicio de sesión session_start(); ?> 47 <!DOCTYPE html> <html> <body> <?php //Se crean variables de sesión $_SESSION["colorfav"] = "verde"; $_SESSION["animalfav"] = "gato"; ?> </body> </html> "sesion2.php". En esta página accedemos a la información de sesión creada en la página anterior ("sesion1.php"): <?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Echo de las variables de sesión que han sido creadas en la página sesion1.php echo "Mi color favorito es" . $_SESSION["colorfav"] . ".<br>"; echo "Mi animal favorito es " . $_SESSION["animalfav"] . "."; ?> </body> </html> Otra forma de mostrar todas las variables de sesión es imprimir directamente la variable global $_SESSION: <?php session_start(); ?> <!DOCTYPE html> <html> <body> 48 <?php print_r($_SESSION); ?> </body> </html> Para modificar una variable de sesión, simplemente se sobrescribe: <?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // to change a session variable, just overwrite it $_SESSION["favcolor"] = "yellow"; print_r($_SESSION); ?> </body> </html> Destruir la sesión, para borrar todas las variables de sesión y destruir la sesión se utilizan session_unset() y session_destroy(): <?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // borrar todas las variables de sesión session_unset(); // Destruir la sesión session_destroy(); ?> </body> </html> 49 24.1. Crear un Login. Una cuestión frecuente en un sitio web es controlar el acceso de los usuarios a una zona determinada del mismo utilizar PHP junto con una base de datos para controlar el acceso de los usuarios. La nueva versión de PHP5 incorpora unas funciones que ayudan en esta tarea: password_hash(texto, algoritmo) password_hash($clave, PASSWORD_DEFAULT) PASSWORD_DEFAULT utilizará automáticamente el algoritmo de cifrado más robusto que tenga disponible nuestra instalación de PHP. PASSWORD_DEFAULT, codifica la contraseña utilizando el algoritmo bcrypt y el resultado es una cadena de 60 caracteres de longitud, cuyos primeros caracteres son $2y$10$. El algoritmo utilizado y la longitud de la contraseña codificada cambiarán en las próximas versiones de PHP, cuando se añadan algoritmos todavía más seguros. Si guardas las contraseñas en una base de datos, la recomendación es que reserves 255 caracteres para ello y no los 60 que se pueden utilizar actualmente. Para comprobar el password, la nueva función password_verify() simplifica este trabajo al máximo, ya que solamente hay que pasarle como primer argumento la contraseña del usuario y como segundo argumento la contraseña codificada: $original = 'admin1234'; $codificado = '$2y$10$a8ThA3xOuWB6QPeFL/VRZeynSxoT6chW4RS1uh5l0xOBEePFnUNpG'; $iguales = password_verify($original, $codificado); if ($iguales) { echo 'Puedes pasar a la zona privada'; } else { echo 'La contraseña indicada no es correcta'; } Como las contraseñas codificadas por password_hash() ya contienen en su interior el coste y el salt utilizados para codificar la contraseña original, no hay que indicar ningún parámetro más a la función password_verify(). 50 Veamos un ejemplo con acceso a la base de datos donde tenemos la información de los usuarios, se creará una sesión si el usuario y la clave introducidos en el formulario de acceso coinciden con los de la base de datos, tendremos un enlace en la cabecera para cerrar la sesión. Los datos de la base de datos son los siguientes: Tabla usuarios: CREATE TABLE usuarios ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, usuario VARCHAR(30) NOT NULL, clave VARCHAR(255) NOT NULL, ) Datos para la tabla usuarios (la clave que aparece es el resultado que devuelve la función password_hash(“admin1234”, PASSWORD_DEFAULT)): INSERT INTO usuarios (usuario, clave) VALUES ('admin', '$2y$10$a8ThA3xOuWB6QPeFL/VRZeynSxoT6chW4RS1uh5l0xOBEePFnUNpG'); Ficheros: index.php, login.php, logout.php y style.css. Se va a colocar el código fuente de estos ficheros a continuación, ¡Cuidado con los números de página al copiar! Hay que eliminarlos para que la aplicación funcione. Fichero index.php, si no existe la variable de sesión 'usuario_valido' nos manda a la página login.php utilizando la función header(), si la variable existe muestra la pantalla de inicio de la aplicación: <?php session_start(); if (!isset($_SESSION['usuario_valido'])) { header("Location:login.php"); } ?> <!DOCTYPE html> <html> <head> <title>Web de prueba</title> 51 <link rel="stylesheet" href="style.css" type="text/css" media="screen"> <style> /*estilos para el menú desplegable*/ ul { margin: 0; padding: 0; list-style: none; width: 150px; border-bottom: 1px solid #ccc; } ul li { position: relative; } li ul { position: absolute; left: 149px; top: 0; display: none; } ul li a { display: block; text-decoration: none; color: #777; background: #fff; padding: 5px; border: 1px solid #ccc; border-bottom: 0; } li:hover ul, li.over ul { display: block; } </style> <script type="text/javascript"> // función para el menú desplegable startList = function() { if (document.all && document.getElementById) { navRoot = document.getElementById("nav"); for (i=0; i< navRoot.childNodes.length; i++) { node = navRoot.childNodes[i]; if (node.nodeName=="LI") { 52 node.onmouseover=function() { this.className+=" over"; } node.onmouseout=function() { this.className=this.className.replace(" over", ""); } } } } } window.onload = startList; </script> </head> <body> <div class="header"> EJEMPLO DE LOGIN <p> <font size=2pt> [ <A HREF='logout.php'>Cerrar Sesión</A> ]</font> </p> </div> <div class="container"> <div class="menu"> <ul id="nav"> <li><a href="index.php">Inicio</a> <li><a href="#">lugar 1</a> <li><a href="#">lugar 2</a> <li><a href="#">lugar 3</a> <ul> <li><a href="#">lugar 4</a> <li><a href="#">lugar 5</a> <li><a href="#">lugar 6</a> </ul> <li><a href="#">lugar 7</a> <li><a href=#>lugar 8</a> 53 </ul> </div> <div class="contenido"> <p>Aquí viene el contenido de la página de inicio</p> </div> <div class="cleaner">&nbsp;</div> </div> <div class="footer">datos personales</div> </body> </html> Fichero login.php, hay que poner los datos de la conexión a la base de datos: 'localhost', 'usuario', 'clave', 'basededatos' en la función de conexión a la base de datos mysqli_connect. <?php // Iniciar sesión session_start(); function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } // Si se ha enviado el formulario $usuario =$_REQUEST['usuario']; $clave = $_REQUEST['clave']; if (isset($usuario) && isset($clave)) { $usuario = test_input($_REQUEST['usuario']); $clave = test_input($_REQUEST['clave']); $conexion = mysqli_connect ('localhost', 'usuario', 'clave', 'basededatos') or die ('No se puede contectar con el servidor'); $instruccion = "select usuario, clave from usuarios where usuario = '$usuario'"; $resultado = mysqli_query ( $conexion,$instruccion) 54 or die ("Fallo en la consulta1"); if (mysqli_num_rows($resultado) > 0) { $row = mysqli_fetch_assoc($resultado); $clavecodificada= $row["clave"]; $iguales = password_verify($clave, $clavecodificada); if ($iguales) { $_SESSION["usuario_valido"] = $usuario; } } mysqli_close ($conexion); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ejemplo de login</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <?php // Sesión iniciada if (isset($_SESSION["usuario_valido"])) { header("Location:index.php"); ?> <?php } // Intento de entrada fallido else if (isset ($usuario)) { print ("<br><br>\n"); print ("<p align='center'>Acceso no autorizado</p>\n"); 55 print ("<p align='center'>[ <a href='login.php'>Conectar</A> ]</p>\n"); } // Sesión no iniciada else { print("<br><br>\n"); print("<center>"); print("<p>Esta zona tiene el acceso restringido.<br> " . " para entrar debe identificarse</p>\n"); print("<form class='entrada' name='login' action='login.php' method='post'>\n"); print("<p><label class='etiquetaentrada'>Usuario:</label>\n"); print(" <input type='text' name='usuario' size='15'></p>\n"); print("<p><label class='etiquetaentrada'>Clave:</label>\n"); print(" <input type='password' name='clave' size='15'></p>\n"); print("<p><input type='submit' value='entrar'></p>\n"); print("</form>\n"); print("<p>NOTA: si no dispone de identificación o tiene problemas " . "para entrar<br>póngase en contacto con el " . "<a href='MAILTO:webmaster@localhost'>administrador</A> del sitio</p>\n"); print("</center>"); } ?> </body> </html> El archivo logout.php, encargado de cerrar la sesión: <?php session_start (); 56 ?> <html> <head> <meta charset="UTF-8"> <title>Desconectar</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <?php if (isset($_SESSION["usuario_valido"])) { // borrar todas las variables de sesión session_unset(); // Destruir la sesión session_destroy(); print ("<br><br><p align='center'>Conexión finalizada</p>\n"); print ("<p align='center'>[ <a href='login.php'>Conectar</a> ]</p>\n"); } else { print ("<br><br>\n"); print ("<p align='center'>No existe una conexión activa</p>\n"); print ("<p align='center'>[ <a href='login.php'>Conectar</a> ]</p>\n"); } ?> </body> </html> Estilos aplicados en el ejemplo “style.css”: /* Body: Cuerpo del texto, lo que se aplica si no hay ningún otro estilo que lo modifique */ body { 57 background-color: #ddd; /* Color de fondo */ font-family: Vernada, Arial, Times; /* Tipo de letra a usar */ font-size: 11px; /* Tamaño de la letra */ color: #666; /* Color de la letra */ margin: 5px; /* Margen con respecto a la capa */ } /* Header : Zona de contenido que se emplea como cabecera */ .header { margin: auto; /* Se emplea para que la capa se redimensione de forma automática */ width: 740px; /* Tamaño de la capa ?? Escogido para 800x600 */ background-color: #ccc; padding: 8px; /* Zona de margen interior de la capa, se aplica en todos los bordes */ border: 2px solid #999; /* Zona de margen externo de la capa, con un color aplicado */ font-size: 15pt; font-weight: bold; text-align: center; /* Justificado del texto centrado */ color: #003366; /* 740 + 8x2 + 2x2 = 760 = espacio dejado para el navegador */ } /* Container : Contenedor que engloba al menú y a la zona de contenido central */ .container { margin: auto; width: 760px; background-color: #FFF; margin-top: 2px; /* el margen se puede aplicar solo a un borde */ } /* Menu: Zona de contenido a la izquierda que contiene el menú de navegación */ .menu { font-size: 11pt; color: #003366; background-color: #ccc; width: 150px; /* Un tamaño recomendable para un menu */ float: left; /* Para que se apile a la izquierda */ 58 } /* Contenido : Zona de contenido principal */ .contenido { width: 590px; /* 590 + 150 + 10 + 10 = 760 …. Voilá */ background-color: #eee; float: left; /* Se apila a la izda … pero después de la OTRA */ padding: 10px 10px 10px 10px; text-align: justify; color: #000; } /* Añadido especial para que el Firefox coopere */ .cleaner { clear: both; /* Esto impide que ninguna capa se acople a izda o dcha ?? pone orden */ font-size: 1px; /* Firefox descarta las capas sin contenido, por eso ponemos un pixel */ } /* Pie de pagina : Para informacion de contacto u otras cosas */ .footer { clear: both; width: 760px; margin:auto; background-color: #FFF; margin-top: 2px; text-align: center; } a:link, a:visited, a:hover { text-decoration: none; color: #006699; font-weight: bold; } a:hover { text-decoration: underline; } 59 25. Métodos para pasar variables entre archivos. Carrito de la compra. Sesiones, url ( GET), campos ocultos en formularios. La forma habitual para pasar valores entre archivos son los campos de los formularios, que se recogen, por ejemplo, con $_REQUEST. Si queremos pasar uno o varios valores ocultos al usuario utilizaremos campos ocultos <input type="hidden" value="Valor que tendrá la variable" name="nombre del campo"> Lo recogeremos en el archivo que procese el formulario mediante el método elegido en el formulario ($_GET o $_POST) o el método general $_REQUEST En otras ocasiones podemos pasar valores a través de la URL, <a href = "nombreArchivo.php?variable1=24&variable2=<?php echo $var;?> "> enlace </a>, en este caso recogemos el valor con $_GET['variable1']; $_GET['variable2']; Tener una sesión activa permite tener variables disponibles en $_SESSION['variable']; serán accesibles si la sesión está activa. Carrito de la compra, en una tienda online accedemos al carrito al comprar un producto (añadir al carrito), generalmente nos interesará almacenar el id del producto (con una consulta a la base de datos podremos acceder al resto de la información del producto) y la cantidad que se desea adquirir (de 1 en adelante, simpre que haya stock disponible), $carrito[$codarticulo]= $cantidad, por lo tanto podemos optar por $_SESSION['carrito']=$carrito; de esta forma tendremos accesible los productos que hay en el carrito <!--//Llamada al carrito desde la página del producto--> <form action="carrito.php" method="post"> …...... Cantidad: <input type="number" name="cantidad" value="1" min="0" max="20" size=1> <input type="hidden" value="true" name="agregar"> <input type="hidden" value="<?php echo $codProducto ?>" name="codArticulo"> <input type="submit" name=”agregar” value="Añadir al Carrito"> </form> Veamos el código del carrito <?php /*CARRITO*/ //Lo primero sesión activa session_start(); //Extraer las variables del formularios 60 $codArticulo = $_REQUEST['codArticulo']; $cantidad = $_REQUEST['cantidad']; //Recuperamos la posibles variable de sesión del carrito $carrito = $_SESSION['carrito']; /* AGREGAR NUEVO PRODUCTO AL CARRITO*/ // Comprobamos si hemos llegado pulsando agregar if (isset($agregar)) { //Coprobamos si existe ese código de producto en el carrito, la cantidad es la que ha indicado el usuario al añadir el producto al carrito if (!isset($carrito[$codArticulo])) { $cantidad = $cantidad; } //Si ese producto ya está en el carrito, hay que incrementar la cantidad a la solicitada por el usuario else{ $c =$carrito[$codArticulo]; $cantidad += $c; } $carrito[$codArticulo] = $cantidad; $_SESSION['carrito'] = $carrito; //actualizamos la variable de sesión carrito }//fin agregar /* VACIAR EL CARRITO, si hemos llegado al carrito pulsando vaciar */ if (isset($vaciar)) { unset($_SESSION['carrito']); } /* ACTUALIZAR EL CONTENIDO DEL CARRITO: ELIMINAR Y MODIFICAR LAS UNIDADES DE PRODUCTOS */ if (isset($actualizar)) { foreach($carrito as $codArticulo => $cantidad) { if($_REQUEST['elim'.$codArticulo]) { // Si el cliente ha solicitado eliminar unset($carrito[$codArticulo]); } else { // Comprueba si el cliente ha solicitado modificar unidades if ((int)$_REQUEST['cant'.$codArticulo] != $cantidad) { $carrito[$codArticulo] = $_REQUEST['cant'.$codArticulo]; } if ((int)$_REQUEST['cant'.$codArticulo] <= 0) { $carrito[$codArticulo] = 1; } } } $_SESSION['carrito'] = $carrito; // Actualiza el carrito modificado }//fin actualizar //si no hay sesión del carrito o está vacio, mostramos mensaje de carrito vacio if (!isset($_SESSION['carrito']) || count($_SESSION['carrito']) == 0) { echo "No hay ningún producto en su carrito<br><br>\n"; } else { //en caso contrario podemos mostrar los productos del carrito echo "Productos actuales en el carrito: <b>". count($carrito) ."</b>"; /* RECORRE LOS ARTÍCULOS ALMACENADOS EN EL CARRITO */ foreach($carrito as $codArticulo => $cantidad) { //LANZAMOS LA CONSULTA PARA RECOGER LOS DATOS DEL PRODUCTO $query = "select nombre, precio, stock from productos where id = $codArticulo"; $resultado = mysqli_query( $conn, $query) or die ("Error al acceder a la base de datos"); $articulo = mysqli_fetch_assoc($resultado); //HABRÍA QUE PREPAR LA TABLA Y MOSTAR LOS DATOS QUE NOS INTERESE 61 …........................ }//fin foreach //aquí mostrar el total, gastos de envío, etc. //el formulario para actulizar o eleminar carrito //Y el botón para confirmar pedido y proceder al pago }//fin else ?> 62 26. Bibliografía • http://www.w3schools.com/php/default.asp • José Mariano González Romano, Desarrollo de sitios Web con PHP y MySQL. Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla. http://lsi.us.es/cursos/cursophp 63