Introducción a PHPe-ghost.deusto.es/docs/2008/cursillos/presentacion_php.pdf · 2017-03-03 ·...

134
Introducción a PHP Aitor Gómez Goiri [email protected] www.twolf.eu 16 a 18 de Julio de 2008 e-ghost ESIDE – Universidad de Deusto

Transcript of Introducción a PHPe-ghost.deusto.es/docs/2008/cursillos/presentacion_php.pdf · 2017-03-03 ·...

Introducción a PHP

Aitor Gómez [email protected]

16 a 18 de Julio de 2008e-ghost

ESIDE – Universidad de Deusto

CopyleftEsta presentación ha sido realizada por Aitor Gómez Goiri (twolf), en base a la presentación realizada por Jorge García Ochoa de Aspuru (bardok) para los cursillos de Julio de 2005 y 2006.

El logotipo de la portada es propiedad de Vincent Pontier (El Roubio).

El resto del contenido está licenciado bajo los términos de la licencia “Reconocimiento – No comercial – Compartir igual” de Creative Commons.

Para ver una copia de esta licencia visite:http://creativecommons.org/licenses/by-nc-sa/2.5/es

3

Índice

Introducción Fundamentos de PHP Información de usuario Acceso a base de datos Otros

4

Índice

Introducción Fundamentos de PHP Información de usuario Acceso a base de datos Otros

5

Introducción

¿Qué es? Características Pros y contras Historia PHP5 ¿Cómo funciona? Configuración del servidor Apache

6

¿Qué es?

PHP Hypertext Preprocessor Lenguaje interpretado o de scripting Sintaxis similar a C, Java o Perl Proposito general

Aplicaciones web Aplicaciones para línea de comandos (PHPCLI) Aplicaciones con interfaz gráfica

Open Source

7

Características

Alto rendimiento Integración con bases de datos Bibliotecas incorporadas Facilidad de aprendizaje y uso Portabilidad Gran documentación on-line (php.net) etc.

8

Pros y contras

“PHP is the BASIC of the 21st Century“ “PHP Sucks, But It Doesn't Matter”

Wikipedia, Meneame, Digg, WordPress, largo etc. Usado en más de 20 millones de dominios

9

Historia

1994: Rasmus Lerdorf quiere mostrar su currículum vítae y guardar ciertos datos cómo estadísticas sobre el tráfico que recibía su web y crea Personal Home Page Se empezó a extender...

acceso a bases de datos generación de páginas web dinámicas

1997: se liberó la versión PHP/FI 2.0 1998: PHP3

10

Historia (2)

2000: PHP 4: se reescribe el núcleo (llamado Zend Engine) Más modular, rendimiento, funcionalidad... Su uso se extendió enormemente

2004: PHP5 Zend Engine 2.0 En 2008, se convirtió en la única versión estable bajo

desarrollo. Renovarse o morir (aplicaciones y servidores)

El curso se centra en esta versión

11

PHP 5

Modelo de orientación a objetos El anterior era un poco rudimentario

Excepciones Nuevas extensiones

SimpleXML, para el proceso sencillo de XML PDO, interfaz de orientación a objetos para interactuar

con la base de datos. Extensiones DOM y XSL

Para más detalles, aquí.

12

¿Cómo funciona?

Nosotros vemos páginas web en un navegador: Mozilla, Konqueror, Opera, Nautilus...

Un navegador interpreta HTML (y hojas de estilo, Javascript, etc, pero eso está fuera

del alcance de este curso ;-)

Un navegador NO sabe interpretar PHP Entonces, ¿quién lo hace por él?

13

¿Cómo funciona? (2)

El navegador puede: Mostrar una página alojada en el ordenador en el que

él está instalado Éste es el ordenador “cliente” La página se muestra tal y como está guardada, no hay

proceso posible: tiene que ser HTML Pedir una página a un servidor

El servidor puede procesar la página antes de enviarla al navegador

14

¿Cómo funciona? (3)

Ejemplo: petición de una página PHP a un servidor web

Servidor web interpreta código PHP para generar la página HTML.

Es probable que en el código se hagan llamadas a bases de datospara obtener datos con lo que completar dicho HTML.

15

Configuración del servidor

Vamos a utilizar el servidor Apache http://www.apache.org Servidor HTTP Open Source

En principio, soporta el protocolo HTTP Se pide un fichero, el servidor lo devuelve

Extensible a través de módulos, como el módulo PHP Si está cargado y configurado, en caso de que el fichero

pedido sea una página PHP, se procesa y lo que se envía es el resultado

16

Configuración servidor (2)

El proceso descrito aquí es para configurar el servidor en una distribución Ubuntu GNU/Linux No debería variar sustancialmente para otras

distribuciones Instalar los paquetes apache, php5, apache-common

y apache utils apt-get install apache2 libapache2-mod-php5 Versiones (julio 2008):

Apache: 2.2.8-1 PHP: 5.2.4-2

17

Configuración servidor (3)

Para comprobar que el servidor Apache está activo: http://localhost Aparecerá la siguiente página

Accedemos a través del servidor, no directamente

18

Configuración servidor (4)

Activaremos el módulo “userdir”

nos permite que para cada usuario, si tiene un directorio llamado “public_html” en su carpeta home, exista un directorio virtual del tipo:

http://www.midominio.net/~usuario Nosotros vamos a trabajar con ese directorio.

Si no deberéis trastear con el grupo www-data, el directorio /var/www o los ficheros /etc/apache2/conf.d/algo.conf

sudo a2enmod userdirsudo /etc/init.d/apache2 force-reload

19

Configuración servidor (5)

Finalmente, comprobamos que funciones las páginas PHP Suponiendo que el usuario que se llama “ubuntu” Creamos el fichero: “/home/ubuntu/public_html/info.php”

<?php phpinfo();?>

Accedemos a éla través del servidor:http://localhost/~ubuntu/info.php

20

Índice

Introducción Fundamentos de PHP Información de usuario Acceso a base de datos Otros

21

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

22

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

23

Primeros pasos

Como se dijo en la introducción: PHP se incrusta dentro del código HTML PHP se procesa en el servidor

Sirve para crear páginas HTML que después se enviarán al cliente, y para realizar otras operaciones

Podemos generar una página según el contenido de un formulario...

... o según el contenido de una base de datos... ... o según la hora del servidor... ...

24

Primeros pasos (2)

¿Cómo incrustar PHP dentro del HTML? Con la etiqueta <?php [instrucciones] ?>

El servidor procesa el código que hay entre “<?php” y “?>” (o símplemente “<? .... ?>”)<?php echo ("Hola mundo!"); ?>

Con la etiqueta <?=[expresión]?> El servidor evalúa la expresión, y escribe su resultado en

la página web<?="Hola mundo!" ?>

No puede haber más código que la expresión que queremos evaluar y sacar por pantalla

25

Primeros pasos (3)

¿Cómo procesa el código? Tenemos la página:

El servidor comienza a procesar la página Si encuentra HTML, lo envía directamente al cliente Si encuentra una etiqueta de PHP, procesa el código, y

si el código escribe algo, esa "escritura" se incluye en el HTML que se envía al cliente

<html> <body> <?php echo 'Hola mundo!'; ?> </body> </html>

26

Primeros pasos (4)

El servidor devolvería el siguiente fragmento:

<html> <body> Hola mundo! </body> </html>

27

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

28

Sintaxis

Es muy similar a la de C, Java o Perl. Las instrucciones se escriben separadas por ';' Las estructuras de control son muy similares

if, while, switch, for, etc. Las llamadas a función se realizan con paréntesis

phpinfo(); strlen('abcdef'); // 6

Los comentarios en el código se realizan con: // Una sola línea # Una sola línea /* Varias

líneas */

29

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

30

Tipos

Existen distintos tipos: Boolean, integer, float, string, array, object,...

Nos “desentendemos” de ellos no es declarado por el programador PHP lo decide en tiempo de ejecución dependiendo del

contexto en el que es usado la variable <?php $un_bool = TRUE; // un valor booleano $un_str = "foo"; // una cadena $un_int = 12; // un entero

echo gettype($un_bool); // imprime: boolean

// Si este valor es un entero, incrementarlo en cuatro if (is_int($un_int)) $un_int += 4;?>

31

Variables

Tienen dos particularidades: Pueden cambiar de tipo fácilmente

Ej.: si en una variable hemos guardado un entero, podemos utilizarlo como un String, y viceversa(siempre que el String represente un entero)

El nombre de la variable lleva '$' delante $usuario = 'jose';

Es posible concatenar variables (strings) con el operador '.'

<?php $mensaje1 = 'Hola'; $mensaje2 = 'mundo!'; echo $mensaje1.' '.$mensaje2; ?>

32

Variables (2)

Dentro de un string delimitado con comillas dobles se evalúan las variables

Con la función “unset()” podemos quitar el valor de una variable

La función “isset()” nos indica si una variable está inicializada

$nombre = 'juan'; echo ("El valor de la variable nombre es $nombre.");

$var = "pepe"; unset($var); // Ahora no tiene valor (NULL)

if (isset($var)){ echo 'Tiene valor';}

33

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

34

Operadores

Aritméticos

Asignación

Operador Ejemplo ResultadoNegación - -3 -3Adición + 3+3 6Substracción - 45-5 40Multiplicación * 5*3 15División / 60/3 20Módulo % 7%2 1Incremento ++ 4

Simbolo

$x=3; $x++;

Operador EquivalenciaAsignaciónAsignación y sumaAsignación y restaAsignación y multiplicaciónAsignación y divisiónAsignación y restoAsignación y concatenación

Simbolo$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$s .= $x $s = $s . $x

35

Operadores (2)

Comparación

Lógicos

Otros

Operador Símbolo Ejemplo ResultadoIgual == 3 == 3 ciertoIdéntico === 3 === ”3” falsoDiferente != 7 !=7 falso

<> 9 <> 8 ciertoNo idénticos !== “4” !== 4 ciertoMenor < 1 < 3 ciertoMayor > 3 > 4 falsoMenor o igual <= 2 <= 1 falso

Operador Ejemplo Resultado&& TRUE && FALSE falso|| TRUE || FALSE cierto! ! TRUE falso

SimboloY (and)O (or)NO (not)

36

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

37

Estructuras de control

Condicionales Bucles include y require

38

Condicionales

Condicional simple

if (<condición>){...}

Condicional y alternativa

if (<condición>){...}else{...}

39

Condicionales (2)

Condicional múltiple

switch (<expresión>){

case <valor 1>: ...break;

case <valor 2>: ...break;

...case <valor n>: ...

break;default: ...

break;}

40

Condicionales (3)

Ejemplo//$x = 4; //descomentadlo después de probarlo una vez

if( ! isset($x) ) {echo '<p>Por favor, establezca un valor para la variable.</p>';

}else {

echo '<p>La variable está correctamente definida y es</p>';switch ($x) {

case 1: echo (' el uno.</p>');break;

case 2: echo (' el dos.</p>');break;

case 3: echo (' el tres.</p>');break;

default: echo ('distinta a 1, 2 o 3.</p>');break;

}}

41

Bucles

while Mientras se cumpla una condición, se ejecuta al código

que hay en el (puede no ejecutarse nunca) Ejemplo:

$a = 1;while ( $a < 10) {

echo "<p>El número actual es $a</p>";$a++;

}

42

Bucles (2)

do ... while Se ejecuta el código mientras se cumpla una condición

(al menos se ejecuta una vez) Ejemplo

$a = 0;do{ $a++; echo ('<p>El número es '.$a.'</p>');}while ( $a < 10);

43

Bucles (3)

for Ejecuta un código mientas se cumpla una condición

(puede no ejecutarse ninguna vez) Opcionalmente, se puede proporcionar:

Una expresión de inicialización, se ejecuta la primera vez Una expresión de condición Una expresión de paso, se ejecuta al final de cada

pasada del bucle Ejemplo:

for ($a = 1; $a <= 10; $a++) {echo ('<p>El número es '.$a.'</p>');

}

44

Bucles (4)

Foreach Se ejecuta un determinado código por cada uno de los

elementos de una colección Por ejemplo, si tenemos un array con 3 elementos:

$arr = array('perro','gato','okapi','ornitorrinco');foreach ($arr as $elem){ // En cada vuelta, elem guarda uno de los strings echo ("<p>El elemento es: $elem.</p>");}foreach ($arr as $index => $elem){ // En cada vuelta, elem guarda uno de los strings, e index el índice echo ("<p>El elemento $index es: $elem.</p>");}

45

Bucles (5)

Ejemplo

Nota: para todo lo anterior existe una sintaxis alternativa.

46

include y require

Para incluir y evaluar un archivo determinado... include, require, include_once y require_once. Diferencia: include() produce un Warning mientras que

require() produce un Error Fatal. utilizar require() cuando queramos que un fichero no

encontrado cuelgue el procesamiento de la páginavars.php<?php

$color = 'verde';$fruta = 'manzana';

?>

test.php<?php

echo "Una $fruta $color"; // Una

include 'vars.php';

echo "Una $fruta $color"; // Una manzana verde

?>

47

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

48

Matrices

Acceso a una posición A través de “[...]”

echo ($matriz[1]); El índice de una matriz puede ser cualquier cosa

echo ($matriz["gato"]); Creación de una matriz

A través de “array()” $profesiones = array('Taxista', 'Bombero', 'Alcalde'); En la posición 0 del array está el string 'Taxista", en la 1

'Bombero' y así sucesivamente

49

Matrices (2)

Podemos especificar el índice de cada uno de los elementos:

$matriz = array('nombre' => 'Aitor', 'apellido' => 'Gomez', 'edad' => 23);

Si hacemos:echo $matriz['nombre']; // Obtenemos 'Aitor'

Creación con corchetes Podemos crear elementos de una matriz sobre la

marcha:

$matriz[7] = "Texto de la posición 7"; // si no especificamos un índice, se inserta en la siguiente posición $matriz[] = "Esto iría en la posición 8";

50

Matrices (3)

Modificación de elementos Podemos modificar un elemento de una matriz

reasignando un valor $matriz = array(3 => "Oso", 5 => "Perro"); $matriz[3] = "Gato";

Eliminación de elementos Podemos eliminar elementos, o la matriz entera con

"unset()"

$matriz = array(3 => 'Oso', 5 => 'Lagarto'); unset($matriz[3]); // No hay nada en la posición 3 unset($matriz); // No hay nada en la matriz

51

Matrices (4)

Recorrido de un array con “foreach” La estructura foreach, además de ser utilizada como

hemos visto en la sección de estructuras de control, resulta especialmente útil para obtener los índices del array:

$modelo['identificador'] = 3;$modelo['fabricante'] = 'ABB';$modelo['nombre'] = 'detector presencia';

foreach ($modelo as $clave => $valor){ echo "El $clave es $valor<br />";}

52

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

53

Funciones

Podemos definir nuestras propias funciones

Ejemplo

function <nombre_función> ($parm1, $parm2, ...){ ... return <resultado>;}

function negrita($texto) {return '<b>'.$texto.'</b>';

}

echo 'Quiero '.negrita('remarcar').' lo que es '.negrita('importante');

54

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

55

Errores

Para tratar los errores que se produzcan en nuestra aplicación web podemos optar por: Hacer uso de excepciones Finalizar el script (con funciones die, exit, etc.)

56

Excepciones

Similar a otros lenguajes se lanzan con throw, dentro del bloque try se capturan

excepciones potenciales y se tratan con catch

function division($dividendo, $divisor) {if($divisor==0) throw new Exception('No dividas entre cero!',0);return $dividendo/$divisor;

}

try {echo division(15,0);

} catch(Exception $e) {echo $e->getMessage();

}

57

Función die

Equivalente a exit Cuando se devuelve, se detiene el script y se muestra

el mensaje.

<?php$x = 15;$y = 0;echo 'llego aquí<br />';

if($y==0) die('División imposible.'); // Probad a comentarloecho ($x/$y);

echo '<br />llego al final';?>

58

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

59

Métodos avanzados de escape

PHP permite construcciones como:

<?phpfunction negrita($texto) {

?><span style=" font-weight: bold;"><?php echo $texto; ?></span><?php

}

$numero=15;$limite=16;

if($numero<$limite) $ret='menor';else $ret='mayor o igual';

?><p>El número especificado es <?php negrita($ret); ?> que <?php negrita($limite); ?>.</p>

60

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Métodos avanzados de escape Orientación a objetos

61

Objetos

Definición de una claseclass NombreClase [extends ClasePadre] [implements Iinterfaz]{

const CONSTANTE = 1;static private $instanciasCreadas = 0;protected $atributo;

public function __construct($a) {$this->atributo = $a;self::metodoEstatico();

}function __destruct() {}

static private function metodoEstatico() {self::$instanciasCreadas++;

}public function __toString() {

return 'Clase con atributo '.$this->atributo;}

}

62

Objetos (2)

Creación de objetos Si tenemos una clase "ClaseA" podremos crear objetos

mediante el operador "new"$objeto = new ClaseA();

El puntero "$this" Es una referencia al propio objeto. Se usa dentro de los

métodos

class ClaseA{ protected $num; function getNum() // Si no se especifica nada, es público { return $this->num; // "num" no lleva "$" }}

63

Objetos (3)

Operador de resolución :: Es un símbolo que permite acceso a los miembros o

métodos estáticos y constantes.

Desde afuera: usan el nombre de la clase. Desde dentro: usan self o parent.

class MiClase extends ClasePadre{ public static $my_static = 'static var';

public static function doubleColon() { parent::doubleColon(); echo self::$my_static . "\n"; }}

MiClase::doubleColon();

64

Objetos (4)

Constructores Un constructor es un método de nombre __construct()

al que se llama al crearse el objeto.

class Persona{

private $nombre;function __construct($nom)

{ $this->nombre = $nom; }

function __toString() { return $this->nombre; }}$p = new Persona("Twolf");echo $p;

65

Objetos (5)

Destructor __destruct() Se le llamará tan pronto como se borren todas las

referencias a un objeto en particular

Métodos mágicos Existen unos nombres de métodos que tienen asociada

una funcionalidad concreta __toString()

Permite a una clase decidir como actuar cuando se la convierte en cadena

__clone() Se llama al crear una copia de un objeto

66

Objetos (6)

PHP soporta herencia de clases<?php

class ClaseA { protected $attrA = 'A'; function getAttrA() { return $this->attrA; } } class ClaseB extends ClaseA { private $attrB = 'B'; function getAttrB() { return $this->attrB; } } $obj = new ClaseB; echo $obj->getAttrA(); echo $obj->getAttrB();

?>

67

Índice

Introducción Fundamentos de PHP Información de usuario Acceso a base de datos Otros

68

Información de usuario

Superglobales GET y POST Sesiones

69

Superglobales

Son variables incorporadas (matrices asociativas) disponibles en todos los ámbitos $GLOBALS

para definir variables globales $_SERVER

contiene información tal como cabeceras, rutas y ubicaciones de scripts

<?phpecho $_SERVER['SERVER_ADDR'].'<br />';echo $_SERVER['SERVER_NAME'].'<br />';echo $_SERVER['QUERY_STRING'].'<br />';echo $_SERVER['DOCUMENT_ROOT'].'<br />';echo $_SERVER['REMOTE_ADDR'].'<br />';

?>

70

Superglobales (2)

$_SESSION contiene variables de sesión

$_POST variables pasadas a través del método HTTP

POST $_GET

variables pasadas a través del método HTTP GET

$_REQUEST contiene datos de $_GET, $_POST, y

$_COOKIE. etc.

71

GET y POST

Información desde formularios La información de un formulario puede enviarse con el

método "get" o el método "post"

Existen dos matrices en PHP llamadas $_GET y $_POST Se accede por el nombre del parámetro Se obtiene el valor del parámetro

72

GET y POST (2)

Ejemplo: crear el siguiente fichero PHP (ejerparams.php):

Acceder a la página con la URL:

<html> <body> <?php foreach ($_GET as $nombre => $param) { ?> <p><?=$nombre.': '.$param?></p> <? } ?> </body> </html>

http://localhost/~ubuntu/ejerparams.php?login=bardok&[email protected]

73

GET y POST (3)

Creamos la página "formparams.html" y enviamos los datos a "ejerparams.php":

Modificación: en lugar de utilizar el método "get" utilizar el "post"

<html> <body> <form method="get" action="ejerparams.php"> Login: <input type="text" name="login" /><br /> Password: <input type="password" name="pass" /><br /> Email: <input type="text" name="email" /><br /> <input type="submit" value="Enviar" /> </form> </body> </html>

74

GET y POST (4)

Para acceder a un dato en concreto dentro de los arrays "$_POST" y "$_GET" La clave para acceder a un elemento es el nombre del

parámetro

Múltiples valores en un parámetro: Un parámetro puede tener distintos valores a la vez:

El nombre del parámetro será "nombreparametro[]":

El parámetro "nombreparametro" es un array con los elementos seleccionados.

echo 'El nombre de usuario utilizado es '.$_GET['login'];

<input type="checkbox" name="sel[]" value="v1"/>Valor 1<input type="checkbox" name="sel[]" value="v2"/>Valor 2

75

GET y POST (5)

Si se seleccionan los dos checkboxes anteriores:

Ejemplo con $_REQUEST (ejrequest.php)

sel[0] => "v1"sel[1] => "v2"

<html><head><title>Ejemplo de uso de $_REQUEST</title></head><body><?php

if( isset($_REQUEST['provincia']) ) {?>

<p>Eres de <?php echo $_REQUEST['provincia']; ?>.</p><?php } else { ?>

<form method="get" action="ejrequest.php"><select name="provincia">

<option value="Álava">Álava</option>...<option value="Murcia">Murcia</option>

</select><input type="submit" value="Enviar" /></form>

<?php } ?></body></html>

76

Sesiones

Variables de sesión Podemos guardar información del usuario que se

mantendrá mientras no se cierre el navegador Se transmite de unas páginas a otras El ejemplo más clásico: carrito de la compra Otra utilidad: validación de usuarios

Todo lo que guardemos en el array "$_SESSION" quedará almacenado de este modo Para poder usarlo: lo primero en la página, llamada a

"session_start();"

77

Sesiones (2)

Ejemplo: página pública/privada public_private.php

<?php session_start(); if (isset($_GET["accion"])) { $accion = $_GET["accion"]; if ($accion == "Login") { $_SESSION["login"] = $_GET["login"]; } else if ($accion == "Desconectar") { unset($_SESSION["login"]); } } $registrado = isset($_SESSION["login"]); if ($registrado) $login = $_SESSION["login"];?>

78

Sesiones (3)

<html><body> <?php if ($registrado) { ?> <p>Bienvenido, <b><?=$login?></b></p> <p><a href="private_login.php">Link a una página privada</a></p> <form method="get" action="public_private.php"> <input type="submit" name="accion" value="Desconectar" /> </form> <?php } else { ?> <p>Por favor, introduce tu nombre de usuario</p> <form method="get" action="public_private.php"> Nombre de usuario: <input type="text" name="login" /><br /> <input type="submit" name="accion" value="Login" /> </form> <?php } ?></body></html>

79

Sesiones (4)

private_login.php

<?php session_start();?><html> <body> <?php if (isset($_SESSION["login"])) { echo ("El nombre de usuario es ".$_SESSION["login"]); } else { echo("No hay nombre de usuario"); } ?> </body></html>

80

Índice

Introducción Fundamentos de PHP Información de usuario Acceso a base de datos Otros

81

Acceso a base de datos

Introducción Configuración del servidor de base de datos Creación de un usuario en la base de datos Creación de una tabla PHP Data Objects Importar un archivo a base de datos Prepared statements Ejercicio favoritos Ejemplo práctico: guardar ficheros

82

Introducción

Es posible acceder a bases de datos a través de PHP Uso de módulos de bases de datos Gran cantidad de bases de datos soportadas En nuestro caso usaremos MySQL como servidor de

bases de datos junto con PHPMyAdmin para administrar las mismas

Existen distintas formas de acceso a base de datos, nosotros usaremos PDO. es nativa en PHP5 (a diferencia de AdoDB) nos abstrae del tipo de base de datos concreto que

usemos (a diferencia de las funciones de mysql) hace uso de orientación a objetos

83

Configuración del servidor de BB.DD.

Paquetes a instalar En el caso de utilizar Ubuntu, los paquetes a instalar

son: mysql-client, mysql-server, php5-mysql, phpmyadmin

En caso de que la base de datos tenga un ordenador servidor propio, habría que instalar mysql-server en él, y mysql-client en el servidor web

php5-mysql instala el módulo que permite a PHP interactuar con MySQL

phpmyadmin permite administración web La instalación para el cursillo tiene cómo contraseña para

el usuario administrador (root): "r00tr00t". No obstante crearemos un nuevo usuario para nuestros

menesteres

84

Configuración del servidor de BB.DD. (2)

Accedemos a PHPMyAdmin http://localhost/phpmyadmin

85

Creación de un usuario

Creamos un usuario sobre el que trabajar Privilegios Agregar a un nuevo usuario Todos los privilegios de datos y estructura

86

Creación de una tabla

Nos identificamos como “php” Seleccionamos la tabla “php” que se ha creado y

sobre la que tenemos todos los privilegios Creamos una tabla “ejemplo” con dos campos

87

Estructura de una tabla

Completamos y grabamos

88

PHP Data Objects

Una vez instalado el módulo de MySQL, tenemos un API de funciones para interactuar con distintas bases de datos. Por supuesto existe un driver para MySQL.

Pasos a seguir: Conexión con el servidor de Base de Datos Trabajar con las tablas

En caso de selección, trabajar con los registros Cerrar la conexión con la base de datos

(con el método que explicamos, PDO, no hará falta que nos encarguemos explícitamente de cerrar nada, ya que es una tarea que se realizará implícitamente al destruir el objeto correspondiente)

89

PHP Data Objects (2)

Conexión con el servidor de base de datos

La conexión a la base de datos devuelve un identificativo de la conexión a la base de datos

Si ha habido error, lanzará una excepción Debemos encerrar la construcción del objeto PDO en

un try/catch

$pdo = new PDO('mysql:dbname=nombreDB;host=nombreHost','usuario','password');

try { $pdo = new PDO('mysql:dbname=php;host=localhost','php','php');} catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage();}

90

PHP Data Objects (3)

Trabajar con las tablas $pdo->query("sentencia_sql");

La sentencia SQL puede ser una inserción, borrado, actualización o selección $pdo->query('INSERT INTO animales VALUES (“1”,

“gato”)');

En el caso de realizarse una selección, se devolverá un objeto PDOStatement con el resultado de la misma $res = $pdo->query('SELECT * FROM animales');

91

PHP Data Objects (4)

Una vez realizada la selección, podemos recorrer el resultado utilizando el método fetch o simplemente haciendo un foreach

Ejemplo completo en seleccionSimple.php Antes de probarlo, importaremos la sencilla tabla de

animales. Mediante la pestaña de “import” de PHPMyAdmin.

$sql = 'SELECT * FROM animales';foreach ($pdo->query($sql) as $row) {

echo '('.$row['identificador'].','.$row['denominacion'].')'.”\n”;}

92

Importar archivo

Seleccionamos el fichero “animales.sql” y continuamos. Antes de ejecutar seleccionSimple.php, no os olvidéis

de verificar que los datos de la conexión son los correctos.

93

Prepared Statements

El anterior método (PDO->query()), está bien cuando se va a ejecutar una sentencia SQL una única vez.

Para consultas que se van a realizar múltiples veces, se puede obtener un mejor rendimiento “preparando” el objeto PDOStatement a usar, y realizando después las llamadas necesarias a PDOStatement->execute().

La consulta solo será “preparada” una vez, pero podrá ser ejecutada tantas veces como se desee con los mismos o diferentes parámetros.

94

Prepared Statements (2)

Ejemplo insercionPreparada.php:

Probar las otras formas de inserción preparada que existen en dicho fichero descomentandolas.

$stmt = $pdo->prepare('INSERT INTO animales (identificador, denominacion) VALUES (:id, :name)');$stmt->bindParam(':name', $name);$stmt->bindParam(':id', $id);

// inserta una fila$name = 'vaca';$value = 8;$stmt->execute();

// inserta otra fila con valores distintos$name = 'pajaro';$value = 9;$stmt->execute();

95

Ejercicio favoritos

Dar de alta una tabla en la base de datos (con la estructura que se quiera) Insertar elementos en la tabla

Crear una página que tenga Un formulario que permita altas, bajas y modificaciones

en la tabla Un listado con los elementos de la tabla

Los elementos son enlaces que, pulsados, nos llevan a la misma página, pero con el elemento seleccionado (sus datos aparecen en el formulario)

96

Ejercicio favoritos (1)

Propuesta de tabla

Campo Tipo Longitud Extra Primaria ÍndiceINT 5 Sí

nombre VARCHAR 20 SíVARCHAR 30LONGTEXT

codigo auto_increment

urldescripcion

97

Ejercicio favoritos (2)

Propuesta interfaz

98

Ejercicio favoritos (3)

Estructura Si quisiéramos dividir la aplicación en varias capas (en

archivos y carpetas), podríamos empezar consultando aquí.

En el ejercicio dividiremos la propia página en varios "bloques".

Propuesta de estructura Conexión a la base de datos Gestión de los comandos

Todos los elementos de tipo "submit" tienen como nombre "accion" y como "value" la accion que realizan

99

Ejercicio favoritos (4)

Propuesta de estructura (2) Recuperación de los datos del grupo seleccionado (si

lo hay) Al seleccionar un grupo, se pasará como parámetro el

código del mismo Página web en sí

Formulario: si hay algún grupo seleccionado, sus valores se muestran en los componentes, se muestran los botones "modificar" y "eliminar" y se guarda el código seleccionado en un campo "hidden"

Listado: recorrido de la tabla. Cada elemento es un link a la propia página con el formato:

"gestiongrupos.php?selectedcodigo=<codigo>"(ej.: gestiongrupos.php?selectedcodigo=3)

100

Ejemplo práctico

Vamos a realizar el siguiente ejemplo: Desde un formulario se envía un fichero con una

imagen El fichero se almacena en una base de datos Desde un fichero php, accedemos a la base de datos, y

recuperamos ficheros, para mostrarlos Lo interesante es que la imagen no está en un fichero,

está en la base de datos, y el fichero php se “convierte” en la propia imagen

101

Ejemplo práctico (2)

El formulario Tiene que tener codificación:

multipart/form-data El fichero se envía con un control “file” El control hidden “MAX_FILE_SIZE” indica el tamaño

máximo del fichero a enviar Tiene que estar ANTES del control file

102

Ejemplo práctico (3)

Traducido a HTML...

<form enctype="multipart/form-data" action="procesar_fichero.php" method="post"> <fieldset> <legend>Selección de ficheros</legend> <input type="hidden" name="MAX_FILE_SIZE" value="1000000" /> <label for="fichero">Selecciona el fichero (imagen jpeg): <input type="file" name="fichero" id="fichero" /> </label> <br /> <input type="submit" value="Enviar" /> </fieldset></form>

103

Ejemplo práctico (4)

Insertar el fichero Hemos definido, en la tabla “FICHEROS” los siguientes

campos: FIC_Codigo: autonumérico, clave primaria FIC_Data: los datos de la imagen FIC_Type: tipo de fichero

El fichero se encuentra en el array “$_FILES['fichero']” $_FILES['fichero']['name'] : nombre del fichero $_FILES['fichero']['size'] : tamaño del fichero $_FILES['fichero']['type'] : tipo del fichero $_FILES['fichero']['tmp_name'] : fichero temporal

104

Ejemplo práctico (5)

Insertar el fichero Vamos a usar la función “comillas_inteligentes”:

Escapa el string, y le pone comillas simples si no es un valor numérico

Para poder meter los datos sin problemas en la sentencia SQL

function comillas_inteligentes($valor) { // Retirar las barras if (get_magic_quotes_gpc()) { $valor = stripslashes($valor); } // Colocar comillas si no es entero if (!is_numeric($valor)) { $valor = "'" . mysql_real_escape_string($valor) . "'"; } return $valor; }

105

Ejemplo práctico (6)

Insertar fichero (2) Cogemos los datos de la imagen (estará en el fichero

temporal), y los metemos en la base de datos$nombre_f = $_FILES['fichero']['name'];$type_f = $_FILES['fichero']['type'];$tmp_name_f = $_FILES['fichero']['tmp_name'];...// Leer el fichero en un array de bytes$data = file_get_contents($tmp_name_f);// Pasamos la codificación a BASE 64$data = base64_encode($data);// Meter el fichero en la base de datos$comando = sprintf("insert into FICHEROS(FIC_Data,FIC_Type) VALUES(%s,%s)" ,comillas_inteligentes($data) ,comillas_inteligentes($type_f) );mysql_query($comando);

106

Ejemplo práctico (7)

Recuperar la imagen Usaremos una página que recibe como parámetro el

código de la imagen Si hemos recuperado correctamente la imagen,

tendremos que indicar que el fichero php no va a devolver texto, sino una imagen de un formato concreto

Para ello tenemos que cambiar la cabecera HTTP “Content-type”

El tipo de fichero lo tenemos en la base de datos (lo hemos guardado cuando nos lo han mandado)

107

Ejemplo práctico (8)

Recuperar la imagen Si llamamos a la página, por ejemplo con:

.../visualizar_img.php?codigo=4 Devolverá la imagen con el código 4, si es que existe

Tras recuperar los datos, los escribimos, sin más$sql_data = "SELECT FIC_Data, FIC_Type FROM FICHEROSWHERE FIC_Codigo=$codigo";$res_data = mysql_query($sql_data,$db);if ($arr_data = mysql_fetch_array($res_data)){ $datos = $arr_data['FIC_Data']; $datos = base64_decode($datos); $tipo = $arr_data['FIC_Type']; header("Content-type: $tipo"); echo ($datos);}

108

Índice

Introducción Fundamentos de PHP Información de usuario Acceso a base de datos Otros

109

Otros

SimpleXML XTemplate PHP en línea de comandos PEAR PHP en el IDE Eclipse

PDT PHPeclipse

¿Por dónde continuar?

110

SimpleXML

La extensión SimpleXML es una forma fácil y sencilla de hacer uso de documentos XML.

Convierte XML a un objeto SimpleXML. De dos maneras:

Haciendo uso del constructor $xml = new SimpleXMLElement('prueba.xml',null,TRUE); $a = new SimpleXMLElement('<a><b/></a>');

Usando funciones $xml = simplexml_load_file('prueba.xml'); $xml = simplexml_load_string('<animales><animal

raza="perro">guau</animal></animales>');

111

SimpleXML (2)

Para los siguientes ejemplos supondremos que existe el archivo animales.xml con el siguiente contenido.

<animales><animal raza="perro">

<patas>4</patas><clase>mammalia</clase><longevidad>15</longevidad>

</animal><animal raza="gato">

<patas>4</patas><clase>mammalia</clase><longevidad>16</longevidad>

</animal><animal raza="periquito">

<patas>2</patas><clase>aves</clase><longevidad>6</longevidad>

</animal></animales>

112

SimpleXML (2)

Para acceder a los datos, entre otros, podemos usar: $elem->nomElem

Accedemos al elemento de nombre 'nomElem' Si hay varios elementos con dicho nombre, devolverá una matriz

$elem->children() Devuelve una lista con sus subelementos sobre la que

podemos iterar $elem->attributes()

Devuelve una lista con sus atributos Podemos acceder a un atributo concreto:

$elem->attributes()->nombreAtributo

113

SimpleXML (3)

Ejemplo simple de lectura

Explorando el XML...

$xml = new SimpleXMLElement('animales.xml',null,TRUE);

foreach ($xml->animal as $animal) {echo 'El '.$animal->attributes()->raza;echo ' (<span style="font-style:italic">'.$animal->clase. '</span>)';echo ' vive una media de '.$animal->longevidad.' años y tiene ';echo $animal->patas.' patas.<br />';

}

foreach ($xml->animal as $animal) {echo '<ul><li>Animal: '.$animal->attributes()->raza.'</li>';echo '<ul>';foreach ($animal->children() as $elemento=>$valor) {

echo '<li>'.$elemento.': '.$valor.'</li>';}echo '</ul></ul>';

}

114

SimpleXML (4)

Modificar el XML $nuevoElemento = $xml->addChild('nombre'); $nuevoElemento = $xml->addChild('nombre','valor'); $elemento->addAttribute('nombre','valor');

Mostrarlo $xml->asXML(); El objeto SimpleXML no facilita la escritura en un

archivo Para ver correctamente en el navegador podemos

hacer uso de la función htmlentities que traduce los caracteres especiales a caracteres HTML.

115

SimpleXML (5)

Ejemplos de modificación Que SimpleXML no escriba en ficheros no quiere decir

que en PHP no haya múltiples formas de hacerlo.

Para más ejemplos, aquí.

$xml = new SimpleXMLElement('animales.xml',null,TRUE);

$panda = $xml->addChild('animal');$panda->addAttribute('raza','oso panda');$patas = $panda->addChild('patas','4');$clase = $panda->addChild('clase','mammalia');$edad = $panda->addChild('longevidad','12');

echo $xml->asXML(); // Mejor ved el código fuente//echo htmlentities($xml->asXML()); // Para verlo bien desde el navegador

116

SimpleXML (6)

Que SimpleXML no escriba en ficheros no quiere decir que en PHP no haya otras formas de hacerlo. La que se propone a continuación hace uso de las

funciones de manejo de ficheros.$nombre_archivo = 'animales.xml';$contenido = $xml->asXML();if (is_writable($nombre_archivo)) { if (!$gestor = fopen($nombre_archivo, 'w')) { echo "No se puede abrir el archivo ($nombre_archivo)"; exit; } if (fwrite($gestor, $contenido) === FALSE) { echo "No se puede escribir al archivo ($nombre_archivo)"; exit; } echo "Éxito, se escribió ($contenido) al archivo ($nombre_archivo)"; fclose($gestor);} else echo "No se puede escribir sobre el archivo $nombre_archivo";

117

XTemplate

XTemplate es una clase cuyo objetivo es permitir separar la vista (capa de presentación) de la lógica del script PHP. Almacena el HTML de forma independiente al código

Podemos editar el HTML con nuestro editor preferido Los programadores se dedican a lo suyo (código) y los

diseñadores concentran sus fuerzas en la presentación. Podemos parametrizar el HTML, hacer bucles, etc.

(para hacer dinámica la página, si no a ver para que queremos PHP... :-D)

Se usa en muchos proyectos comerciales libres SugarCRM, Drupal entre otros.

118

XTemplate (2)

Por lo tanto, para hacer uso de XTemplate, tendremos: Una plantilla en base a la cual se generará el HTML

final. Esta plantilla está escrita 100% en HTML.

El objeto XTemplate, que nos provee de unos métodos a los que llamaremos desde nuestra aplicación en PHP para ir “rellenando” la plantilla con datos.

119

XTemplate (3)

La plantilla HTML debe contener ciertos elementos: Secciones.

Son los trozos en los que se divide la plantilla. Delimitadas por:

<!-- BEGIN: nombreSeccion --> <!-- END: nombreSeccion -->

Pueden ser analizadas más de una vez, creando bucles. Código a reemplazar

Entre corchetes Cómo se verá, se pueden usar matrices con claves para

hacer varias asignaciones a la vez Para ello en la plantilla habrá algo semejante a: {DATA.ID} y

{DATA.NAME}

120

XTemplate (4)

Ejemplo: listadoUsuarios.html<!-- BEGIN: main --><html><head><title>Listado usuarios</title></head><body>

<h1>{TITULO}</h1><!-- BEGIN: table --><table><thead>

<tr><th>Nombre</th><th colspan=”2”>Apellidos</th></tr></thead><tbody><!-- BEGIN: row -->

<tr> (...)<td width="30%">{PERSONA.APELLIDO1}</td><td width="30%">{PERSONA.APELLIDO2}</td></tr>

<!-- END: row --><!-- BEGIN: norow -->

<tr> <td colspan="3" align="center">Nada.</td></tr><!-- END: norow -->

</tbody></table><!-- END: table -->

</body></html><!-- END: main -->

121

XTemplate (5)

Para usar XTemplate debemos: Bajarnos el código :-) Incluir el archivo xtemplate.class.php, allá donde

queramos usar sus funcionalidades require_once('PATH/xtemplate.class.php');

Crear nuestra clase XTemplate, en base al archivo en el que se incluye el HTML

$xtpl = new XTemplate('listaDetalles.html'); El archivo que nos bajemos contiene documentación y

ejemplos muy ilustrativos que también se pueden encontrar en su sitio web.

122

XTemplate (6)

Métodos de la clase XTemplate más importantes: Set null string

Asignar un valor a los nulos Nulo: cuando no existe la variable que se trata de asignar,

cuando no se asigna una variable, cuando el valor de lo asignado es “”, etc.

$xtpl->set_null_string('-'); Assign

Esencial. Sirve para asignar un valor a los elementos del HTML encerrados entre corchetes.

$xtpl->assign('TITULO', $titulo); $xtpl->assign('PERSONA', $arrayConDatos);

// asigna $array['ID'] a PERSONA.ID, $array['NAME']...

123

XTemplate (7)

Parse Analiza sintácticamente el trozo de código delimitado por

<!-- BEGIN: nombre --> y <!-- END: nombre --> En otras palabras, va generando el trozo correspondiente

del HTML final en base a la plantilla $xtpl->parse('main.table.row.cell');

Text Devuelve un string con el HTML construido por el parse.

Out Imprime el HTML que se ha construido con “parse”. $xtpl->out('main'); Equivalente a echo $xtpl->text('main');

124

XTemplate (8)

Ejemplo de uso de una plantilla (listado.php):// definición del array$usu[0]['USERNAME']='twolf';(...)require_once('xtpl/xtemplate.class.php');$xtpl = new XTemplate('listadoUsuarios.html');$xtpl->set_null_string('-');$xtpl->assign('TITULO','Listado de usuarios');if(isset($usu) && is_array($usu)) {

$primero = true;foreach($usu as $usuario) {

$xtpl->assign('CHECKED',($primero)?'checked="checked"':'');$xtpl->assign('PERSONA',$usuario);$primero = false;$xtpl->parse('main.table.row');

}} else $xtpl->parse('main.table.norow');$xtpl->parse('main.table'); $xtpl->parse('main');$xtpl->out('main');

125

PHP en línea de comandos

PHP no sólo funciona junto a un servidor web. Una forma curiosa de usarlo consiste en ejecutar un script desde la consola.

Mirar ejemplo: scriptTiempo No funciona del todo bien Es arcaico y nada óptimo

Busca datos dentro de una página HTML mediante expresiones regulares y sabiendo de antemano en que línea mirar

Sirve para hacerse una idea

126

PHP en línea de comandos (2)

Instalar el interprete para línea de comandos sudo aptitude install php5-cli

Comprobar si el script tiene los permisos necesarios para ejecutarse

Abrimos la consola y nos ubicamos en la carpeta del script (de lo contrario bastaría con especificar su ruta el ejecutarlo).

Ejecutarlo sudo ./scriptTiempo

sudo ./scriptTiempo -a

etc.

127

PEAR

PHP Extensión and Application Repository promueve la reutilización de código que realizan tareas comunes

Objetivos: promover una biblioteca de código bien estructurada mantener un sistema de distribución y mantenimiento

de paquetes de código promover un estilo de codificación estándar

Si la funcionalidad de base que ofrece PHP es ya de por si extensa, PEAR la aumenta sustancialmente.

128

PEAR (2)

Para usar alguno de los paquetes de PEAR, basta con: Instalar “php-pear”

sudo aptitude install php-pear PEAR es sistema de distribución y mantenimiento de

paquetes de código que mencionábamos antes Instalar el paquete que queramos usar haciendo uso de

PEAR sudo pear install <nombre_paquete>

Incluirlo en el script en el que lo vayamos a usar: require_once 'nombre_paquete.php';

129

PEAR (3)

Ejemplo: Instalaremos los paquetes “Mail” y “Net_SMTP”

sudo pear install Mail Net_SMTP Lo usamos:

<?phprequire_once 'Mail.php';$params['host'] = 'mail.deusto.es'; // p.e.$params['auth'] = TRUE; $params['debug'] = TRUE;$params['username'] = '[email protected]';$params['password'] = 'passwd';$obj = &Mail::factory('smtp',$params);$recipients = '[email protected]';$headers['From'] = '[email protected]';$headers['To'] = '[email protected]';$headers['Subject'] = 'Asunto interesante';$body = 'Mensaje más interesante aún (si cabe).';$obj->send($recipients, $headers, $body);?>

130

PEAR (4)

Lo cual nos devolverá:(porque hemos activado el modo debug)

DEBUG: Recv: 220 smtp-in2.deusto.es ESMTPDEBUG: Send: EHLO localhost(...)DEBUG: Send: MAIL FROM:<[email protected]>(...)DEBUG: Send: DATADEBUG: Recv: 354 End data with <CR><LF>.<CR><LF>DEBUG: Send: From: [email protected]: [email protected]: Asunto interesante

Mensaje más interesante aún (si cabe)..

DEBUG: Recv: 250 2.0.0 Ok: queued as 2F2F346A7E7DEBUG: Send: QUITDEBUG: Recv: 221 2.0.0 Bye

131

¿Por dónde continuar?

A continuación os enumero algunos documentos y sitios webs utiles para los que queráis continuar profundizando en PHP (espero que todos ;-) ). PHP5 Power Programming

Libro muy completo, actualizado y encima gratuito (open publication license). Está en inglés, pero creo que puede ser un buen libro de referencia.

PHP.net Dónde mejor viene cada cosa explicada.

W3Schools Web muy útil: sencilla pero clarificadora. Es la suelo usar

para dudas puntuales de CSS o HTML.

132

¿Por dónde continuar? (2)

PHP Tutorials - Herong's Tutorial Notes Libro escrito por el autor mientras aprendía PHP (con

bastantes ejemplos). Es gratuito en su versión ONLINE, pero por 5$ lo tenéis en PDF.

Curso de la Universidad de Sevilla Bueno para reforzar cosas vistas. Trata con mayor

detalle algunos de los temas básicos vistos y propone ejercicios interesantes para practicar.

Desarrolloweb.com Un manual (que puede que en algunas secciones no se

encuentre actualizado) y muchos ejemplos, muy detallados. Es una referencia un poco nostálgica, porque es donde comencé yo en esto de PHP :-)

133

¿Por dónde continuar? (3)

Chuleta de PHP Para recordar algunas funciones útiles del lenguaje. En

este curso no las hemos visto. Y cualquiera que podáis encontrar...

...si veis alguno que creáis interesante, comentadme y actualizo este documento.

134

Agur ;-)

Para cualquier corrección, sugerencia, o comentario en general, no dudéis en poneros en contacto conmigo en:

aitor @ twolf . eu

Espero que os haya resultado útil el cursillo y en cualquier caso, gracias por aguantar tan pacientemente mi inexperiencia.