Ciclo Formativo de Grado Superior en

Anuncio
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"> </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
Descargar