Vous êtes sur la page 1sur 134

Introduccin a PHP

AitorGmezGoiri
aitor@twolf.eu www.twolf.eu

16 a 18 de Julio de 2008 e-ghost ESIDE Universidad de Deusto

Copyleft
Esta presentacin ha sido realizada por Aitor Gmez Goiri (twolf), en base a la presentacin realizada por Jorge Garca 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 trminos 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

ndice

Introduccin Fundamentos de PHP Informacin de usuario Acceso a base de datos Otros

ndice

Introduccin Fundamentos de PHP Informacin de usuario Acceso a base de datos Otros

Introduccin

Qu es? Caractersticas Pros y contras Historia PHP5 Cmo funciona? Configuracin del servidor Apache

Qu es?

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

Aplicaciones web Aplicaciones para lnea de comandos (PHPCLI) Aplicaciones con interfaz grfica

Open Source

Caractersticas

Alto rendimiento Integracin con bases de datos Bibliotecas incorporadas Facilidad de aprendizaje y uso Portabilidad Gran documentacin on-line (php.net) etc.

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 ms de 20 millones de dominios

Historia

1994: Rasmus Lerdorf quiere mostrar su currculum vtae y guardar ciertos datos cmo estadsticas sobre el trfico que reciba su web y crea Personal Home Page

Se empez a extender...

acceso a bases de datos generacin de pginas web dinmicas

1997: se liber la versin PHP/FI 2.0 1998: PHP3

Historia (2)

2000: PHP 4: se reescribe el ncleo (llamado Zend Engine)


Ms modular, rendimiento, funcionalidad... Su uso se extendi enormemente Zend Engine 2.0 En 2008, se convirti en la nica versin estable bajo desarrollo.

2004: PHP5

Renovarse o morir (aplicaciones y servidores)

El curso se centra en esta versin


10

PHP 5

Modelo de orientacin a objetos

El anterior era un poco rudimentario

Excepciones Nuevas extensiones


SimpleXML, para el proceso sencillo de XML PDO, interfaz de orientacin a objetos para interactuar con la base de datos. Extensiones DOM y XSL

Para ms detalles, aqu.

11

Cmo funciona?

Nosotros vemos pginas web en un navegador:

Mozilla, Konqueror, Opera, Nautilus... (y hojas de estilo, Javascript, etc, pero eso est fuera del alcance de este curso ;-)

Un navegador interpreta HTML

Un navegador NO sabe interpretar PHP Entonces, quin lo hace por l?

12

Cmo funciona? (2)

El navegador puede:

Mostrar una pgina alojada en el ordenador en el que l est instalado


ste es el ordenador cliente La pgina se muestra tal y como est guardada, no hay proceso posible: tiene que ser HTML

Pedir una pgina a un servidor

El servidor puede procesar la pgina antes de enviarla al navegador

13

Cmo funciona? (3)

Ejemplo: peticin de una pgina PHP a un servidor web

Servidor web interpreta cdigo PHP para generar la pgina HTML. Es probable que en el cdigo se hagan llamadas a bases de datos para obtener datos con lo que completar dicho HTML.
14

Configuracin 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 travs de mdulos, como el mdulo PHP

Si est cargado y configurado, en caso de que el fichero pedido sea una pgina PHP, se procesa y lo que se enva es el resultado

15

Configuracin servidor (2)

El proceso descrito aqu es para configurar el servidor en una distribucin Ubuntu GNU/Linux

No debera 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

16

Configuracin servidor (3)

Para comprobar que el servidor Apache est activo:


http://localhost Aparecer la siguiente pgina

Accedemos a travs del servidor, no directamente

17

Configuracin servidor (4)

Activaremos el mdulo userdir


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

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 deberis trastear con el grupo www-data, el directorio /var/www o los ficheros /etc/apache2/conf.d/ algo.conf
18

Configuracin servidor (5)

Finalmente, comprobamos que funciones las pginas PHP


Suponiendo que el usuario que se llama ubuntu Creamos el fichero: /home/ubuntu/public_html/info.php


<?php phpinfo(); ?>

Accedemos a l a travs del servidor:


http://localhost/~ubuntu/info.php

19

ndice

Introduccin Fundamentos de PHP Informacin de usuario Acceso a base de datos Otros

20

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
21

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
22

Primeros pasos

Como se dijo en la introduccin:


PHP se incrusta dentro del cdigo HTML PHP se procesa en el servidor

Sirve para crear pginas HTML que despus se enviarn al cliente, y para realizar otras operaciones

Podemos generar una pgina segn el contenido de un formulario... ... o segn el contenido de una base de datos... ... o segn la hora del servidor... ...

23

Primeros pasos (2)

Cmo incrustar PHP dentro del HTML?

Con la etiqueta <?php [instrucciones] ?>

El servidor procesa el cdigo que hay entre <?php y ? > (o smplemente <? .... ?>) <?php echo ("Hola mundo!"); ?> El servidor evala la expresin, y escribe su resultado en la pgina web <?="Hola mundo!" ?>

Con la etiqueta <?=[expresin]?>

No puede haber ms cdigo que la expresin que queremos evaluar y sacar por pantalla

24

Primeros pasos (3)

Cmo procesa el cdigo?

Tenemos la pgina:
<html> <body> <?php echo 'Hola mundo!'; ?> </body> </html>

El servidor comienza a procesar la pgina


Si encuentra HTML, lo enva directamente al cliente Si encuentra una etiqueta de PHP, procesa el cdigo, y si el cdigo escribe algo, esa "escritura" se incluye en el HTML que se enva al cliente
25

Primeros pasos (4)

El servidor devolvera el siguiente fragmento:


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

26

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
27

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. phpinfo(); strlen('abcdef'); // 6 // Una sola lnea # Una sola lnea /* Varias lneas */
28

Las llamadas a funcin se realizan con parntesis


Los comentarios en el cdigo se realizan con:


Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
29

Tipos

Existen distintos tipos:

Boolean, integer, float, string, array, object,... no es declarado por el programador PHP lo decide en tiempo de ejecucin 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; ?>
30

Nos desentendemos de ellos


Variables

Tienen dos particularidades:

Pueden cambiar de tipo fcilmente

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

El nombre de la variable lleva '$' delante

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


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

Variables (2)

Dentro de un string delimitado con comillas dobles se evalan las variables


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

Con la funcin unset() podemos quitar el valor de una variable


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

La funcin isset() nos indica si una variable est inicializada if (isset($var))


{ echo 'Tiene valor'; }
32

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
33

Operadores

Aritmticos

Operador Simbolo Ejemplo Resultado Negacin -3 -3 Adicin + 3+3 6 Substraccin 45-5 40 Multiplicacin * 5*3 15 Divisin / 60/3 20 Mdulo % 7%2 1 Incremento ++ $x=3; $x++; 4 Operador Asignacin Asignacin Asignacin Asignacin Asignacin Asignacin Asignacin Simbolo $x = $y $x += $y $x -= $y $x *= $y $x /= $y $x %= $y $s .= $x Equivalencia $x = $y $x = $x + $y $x = $x $y $x = $x * $y $x = $x / $y $x = $x % $y $s = $s . $x
34

Asignacin

y suma y resta y multiplicacin y divisin y resto y concatenacin

Operadores (2)

Comparacin

Operador Igual Idntico Diferente

Smbolo Ejemplo Resultado == 3 == 3 cierto === 3 === 3 falso != 7 !=7 falso <> 9 <> 8 cierto No idnticos !== 4 !== 4 cierto Menor < 1<3 cierto Mayor > 3>4 falso Menor o igual <= 2 <= 1 falso

Lgicos Otros

Operador Y (and) O (or) NO (not)

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

35

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
36

Estructuras de control

Condicionales Bucles include y require

37

Condicionales

Condicional simple if (<condicin>) {...}

Condicional y alternativa if (<condicin>) {...} else {...}

38

Condicionales (2)

Condicional mltiple switch (<expresin>) { case <valor 1>: ... break; case <valor 2>: ... break; ... case <valor n>: ... break; default: ... break; }
39

Condicionales (3)

Ejemplo
//$x = 4; //descomentadlo despus 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; } }
40

Bucles

while

Mientras se cumpla una condicin, se ejecuta al cdigo que hay en el (puede no ejecutarse nunca) Ejemplo:
$a = 1; while ( $a < 10) { echo "<p>El nmero actual es $a</p>"; $a++; }

41

Bucles (2)

do ... while

Se ejecuta el cdigo mientras se cumpla una condicin (al menos se ejecuta una vez) Ejemplo
$a = 0; do { $a++; echo ('<p>El nmero es '.$a.'</p>'); } while ( $a < 10);

42

Bucles (3)

for

Ejecuta un cdigo mientas se cumpla una condicin (puede no ejecutarse ninguna vez) Opcionalmente, se puede proporcionar:

Una expresin de inicializacin, se ejecuta la primera vez Una expresin de condicin Una expresin de paso, se ejecuta al final de cada pasada del bucle

Ejemplo:
for ($a = 1; $a <= 10; $a++) { echo ('<p>El nmero es '.$a.'</p>'); }
43

Bucles (4)

Foreach

Se ejecuta un determinado cdigo por cada uno de los elementos de una coleccin 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>"); }
44

Bucles (5)

Ejemplo

Nota: para todo lo anterior existe una sintaxis alternativa.


45

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 pgina
vars.php <?php $color = 'verde'; $fruta = 'manzana'; ?> test.php <?php echo "Una $fruta $color"; // Una include 'vars.php'; echo "Una $fruta $color"; // Una manzana verde ?>
46

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
47

Matrices

Acceso a una posicin

A travs de [...]

echo ($matriz[1]); echo ($matriz["gato"]);

El ndice de una matriz puede ser cualquier cosa

Creacin de una matriz

A travs de array()

$profesiones = array('Taxista', 'Bombero', 'Alcalde'); En la posicin 0 del array est el string 'Taxista", en la 1 'Bombero' y as sucesivamente

48

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'

Creacin con corchetes

Podemos crear elementos de una matriz sobre la marcha:


$matriz[7] = "Texto de la posicin 7"; // si no especificamos un ndice, se inserta en la siguiente posicin $matriz[] = "Esto ira en la posicin 8";

49

Matrices (3)

Modificacin de elementos

Podemos modificar un elemento de una matriz reasignando un valor


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

Eliminacin 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 posicin 3 unset($matriz); // No hay nada en la matriz

50

Matrices (4)

Recorrido de un array con foreach

La estructura foreach, adems de ser utilizada como hemos visto en la seccin 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 />"; }

51

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
52

Funciones

Podemos definir nuestras propias funciones


function <nombre_funcin> ($parm1, $parm2, ...) { ... return <resultado>; }

Ejemplo
function negrita($texto) { return '<b>'.$texto.'</b>'; } echo 'Quiero '.negrita('remarcar').' lo que es '.negrita('importante');

53

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
54

Errores

Para tratar los errores que se produzcan en nuestra aplicacin web podemos optar por:

Hacer uso de excepciones Finalizar el script (con funciones die, exit, etc.)

55

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(); }

56

Funcin 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('Divisin imposible.'); // Probad a comentarlo echo ($x/$y); echo '<br />llego al final'; ?>

57

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
58

Mtodos avanzados de escape

PHP permite construcciones como:


<?php function 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 nmero especificado es <?php negrita($ret); ?> que <?php negrita($limite); ?>.</p>

59

Fundamentos de PHP

Primeros pasos Sintaxis Tipos y variables Operadores Estructuras de control Matrices Funciones Errores Mtodos avanzados de escape Orientacin a objetos
60

Objetos

Definicin de una clase


class 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; } }
61

Objetos (2)

Creacin de objetos

Si tenemos una clase "ClaseA" podremos crear objetos mediante el operador "new" $objeto = new ClaseA(); Es una referencia al propio objeto. Se usa dentro de los mtodos
class ClaseA { protected $num; function getNum() { return $this->num; } }

El puntero "$this"

// Si no se especifica nada, es pblico // "num" no lleva "$"

62

Objetos (3)

Operador de resolucin ::

Es un smbolo que permite acceso a los miembros o mtodos estticos 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();
63

Objetos (4)

Constructores

Un constructor es un mtodo 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;
64

Objetos (5)

Destructor __destruct()

Se le llamar tan pronto como se borren todas las referencias a un objeto en particular Existen unos nombres de mtodos que tienen asociada una funcionalidad concreta __toString()

Mtodos mgicos

Permite a una clase decidir como actuar cuando se la convierte en cadena Se llama al crear una copia de un objeto
65

__clone()

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(); ?>
66

ndice

Introduccin Fundamentos de PHP Informacin de usuario Acceso a base de datos Otros

67

Informacin de usuario

Superglobales GET y POST Sesiones

68

Superglobales

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

$GLOBALS

para definir variables globales contiene informacin tal como cabeceras, rutas y ubicaciones de scripts
<?php echo $_SERVER['SERVER_ADDR'].'<br />'; echo $_SERVER['SERVER_NAME'].'<br />'; echo $_SERVER['QUERY_STRING'].'<br />'; echo $_SERVER['DOCUMENT_ROOT'].'<br />'; echo $_SERVER['REMOTE_ADDR'].'<br />'; ?>
69

$_SERVER

Superglobales (2)

$_SESSION contiene variables de sesin $_POST


variables pasadas a travs del mtodo HTTP


POST

$_GET variables pasadas a travs del mtodo HTTP GET $_REQUEST


contiene datos de $_GET, $_POST, y $_COOKIE.


70

etc.

GET y POST

Informacin desde formularios

La informacin de un formulario puede enviarse con el mtodo "get" o el mtodo "post"

Existen dos matrices en PHP llamadas $_GET y $_POST


Se accede por el nombre del parmetro Se obtiene el valor del parmetro

71

GET y POST (2)

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


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

Acceder a la pgina con la URL:


http://localhost/~ubuntu/ejerparams.php? login=bardok&pass=1234$email=mail@server.com
72

GET y POST (3)

Creamos la pgina "formparams.html" y enviamos los datos a "ejerparams.php":


<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>

Modificacin: en lugar de utilizar el mtodo "get" utilizar el "post"

73

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 parmetro


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

Mltiples valores en un parmetro:

Un parmetro puede tener distintos valores a la vez:

El nombre del parmetro ser "nombreparametro[]":


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

El parmetro "nombreparametro" es un array con los elementos seleccionados.


74

GET y POST (5)

Si se seleccionan los dos checkboxes anteriores:


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

Ejemplo con $_REQUEST (ejrequest.php)


<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>
75

Sesiones

Variables de sesin

Podemos guardar informacin del usuario que se mantendr mientras no se cierre el navegador

Se transmite de unas pginas a otras El ejemplo ms clsico: carrito de la compra Otra utilidad: validacin de usuarios

Todo lo que guardemos en el array "$_SESSION" quedar almacenado de este modo

Para poder usarlo: lo primero en la pgina, llamada a "session_start();"

76

Sesiones (2)

Ejemplo: pgina pblica/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"]; ?>
77

Sesiones (3)
<html><body> <?php if ($registrado) { ?> <p>Bienvenido, <b><?=$login?></b></p> <p><a href="private_login.php">Link a una pgina 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>
78

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>

79

ndice

Introduccin Fundamentos de PHP Informacin de usuario Acceso a base de datos Otros

80

Acceso a base de datos


Introduccin Configuracin del servidor de base de datos Creacin de un usuario en la base de datos Creacin de una tabla PHP Data Objects Importar un archivo a base de datos Prepared statements Ejercicio favoritos Ejemplo prctico: guardar ficheros
81

Introduccin

Es posible acceder a bases de datos a travs de PHP


Uso de mdulos 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 orientacin a objetos
82

Configuracin 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, habra que instalar mysql-server en l, y mysql-client en el servidor web php5-mysql instala el mdulo que permite a PHP interactuar con MySQL phpmyadmin permite administracin web

La instalacin para el cursillo tiene cmo contrasea para el usuario administrador (root): "r00tr00t". No obstante crearemos un nuevo usuario para nuestros menesteres
83

Configuracin del servidor de BB.DD. (2)

Accedemos a PHPMyAdmin

http://localhost/phpmyadmin

84

Creacin de un usuario

Creamos un usuario sobre el que trabajar


Privilegios Agregar a un nuevo usuario Todos los privilegios de datos y estructura

85

Creacin 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

86

Estructura de una tabla

Completamos y grabamos

87

PHP Data Objects

Una vez instalado el mdulo de MySQL, tenemos un API de funciones para interactuar con distintas bases de datos. Por supuesto existe un driver para MySQL. Pasos a seguir:

Conexin con el servidor de Base de Datos Trabajar con las tablas

En caso de seleccin, trabajar con los registros

Cerrar la conexin con la base de datos (con el mtodo que explicamos, PDO, no har falta que nos encarguemos explcitamente de cerrar nada, ya que es una tarea que se realizar implcitamente al destruir el objeto correspondiente)
88

PHP Data Objects (2)

Conexin con el servidor de base de datos


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

La conexin a la base de datos devuelve un identificativo de la conexin a la base de datos Debemos encerrar la construccin del objeto PDO en un try/catch
try { $pdo = new PDO('mysql:dbname=php;host=localhost','php','php'); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }

Si ha habido error, lanzar una excepcin

89

PHP Data Objects (3)

Trabajar con las tablas

$pdo->query("sentencia_sql");

La sentencia SQL puede ser una insercin, borrado, actualizacin o seleccin

$pdo->query('INSERT INTO animales VALUES (1, gato)');

En el caso de realizarse una seleccin, se devolver un objeto PDOStatement con el resultado de la misma

$res = $pdo->query('SELECT * FROM animales');

90

PHP Data Objects (4)

Una vez realizada la seleccin, podemos recorrer el resultado utilizando el mtodo fetch o simplemente haciendo un foreach
$sql = 'SELECT * FROM animales'; foreach ($pdo->query($sql) as $row) { echo '('.$row['identificador'].','.$row['denominacion'].')'.\n; }

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

Mediante la pestaa de import de PHPMyAdmin.


91

Importar archivo

Seleccionamos el fichero animales.sql y continuamos. Antes de ejecutar seleccionSimple.php, no os olvidis de verificar que los datos de la conexin son los correctos.

92

Prepared Statements

El anterior mtodo (PDO->query()), est bien cuando se va a ejecutar una sentencia SQL una nica vez. Para consultas que se van a realizar mltiples veces, se puede obtener un mejor rendimiento preparando el objeto PDOStatement a usar, y realizando despus 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 parmetros.

93

Prepared Statements (2)

Ejemplo insercionPreparada.php:
$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();

Probar las otras formas de insercin preparada que existen en dicho fichero descomentandolas.
94

Ejercicio favoritos

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

Insertar elementos en la tabla Un formulario que permita altas, bajas y modificaciones en la tabla Un listado con los elementos de la tabla

Crear una pgina que tenga

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

95

Ejercicio favoritos (1)

Propuesta de tabla

Campo codigo nombre url descripcion

Tipo Longitud Extra Primaria ndice INT 5 auto_increment S VARCHAR 20 S VARCHAR 30 LONGTEXT

96

Ejercicio favoritos (2)

Propuesta interfaz

97

Ejercicio favoritos (3)

Estructura

Si quisiramos dividir la aplicacin en varias capas (en archivos y carpetas), podramos empezar consultando aqu. En el ejercicio dividiremos la propia pgina en varios "bloques". Conexin a la base de datos Gestin de los comandos

Propuesta de estructura

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

Ejercicio favoritos (4)

Propuesta de estructura (2)

Recuperacin de los datos del grupo seleccionado (si lo hay)

Al seleccionar un grupo, se pasar como parmetro el cdigo del mismo Formulario: si hay algn grupo seleccionado, sus valores se muestran en los componentes, se muestran los botones "modificar" y "eliminar" y se guarda el cdigo seleccionado en un campo "hidden" Listado: recorrido de la tabla. Cada elemento es un link a la propia pgina con el formato:

Pgina web en s

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


99

Ejemplo prctico

Vamos a realizar el siguiente ejemplo:

Desde un formulario se enva 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

100

Ejemplo prctico (2)

El formulario

Tiene que tener codificacin:

multipart/form-data

El fichero se enva con un control file El control hidden MAX_FILE_SIZE indica el tamao mximo del fichero a enviar

Tiene que estar ANTES del control file

101

Ejemplo prctico (3)

Traducido a HTML...
<form enctype="multipart/form-data" action="procesar_fichero.php" method="post"> <fieldset> <legend>Seleccin 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>

102

Ejemplo prctico (4)

Insertar el fichero

Hemos definido, en la tabla FICHEROS los siguientes campos:


FIC_Codigo: autonumrico, 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'] : tamao del fichero $_FILES['fichero']['type'] : tipo del fichero $_FILES['fichero']['tmp_name'] : fichero temporal
103

Ejemplo prctico (5)

Insertar el fichero

Vamos a usar la funcin comillas_inteligentes:

Escapa el string, y le pone comillas simples si no es un valor numrico

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; }

104

Ejemplo prctico (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 codificacin 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);
105

Ejemplo prctico (7)

Recuperar la imagen

Usaremos una pgina que recibe como parmetro el cdigo 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)

106

Ejemplo prctico (8)

Recuperar la imagen

Si llamamos a la pgina, por ejemplo con:

.../visualizar_img.php?codigo=4 Tras recuperar los datos, los escribimos, sin ms


$sql_data = "SELECT FIC_Data, FIC_Type FROM FICHEROS WHERE 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); }
107

Devolver la imagen con el cdigo 4, si es que existe

ndice

Introduccin Fundamentos de PHP Informacin de usuario Acceso a base de datos Otros

108

Otros

SimpleXML XTemplate PHP en lnea de comandos PEAR PHP en el IDE Eclipse


PDT PHPeclipse

Por dnde continuar?

109

SimpleXML

La extensin SimpleXML es una forma fcil 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>'); $xml = simplexml_load_file('prueba.xml'); $xml = simplexml_load_string('<animales><animal raza="perro">guau</animal></animales>');

Usando funciones

110

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>
111

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 Devuelve una lista con sus atributos Podemos acceder a un atributo concreto:

$elem->attributes()

$elem->attributes()->nombreAtributo

112

SimpleXML (3)

Ejemplo simple de lectura


$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.' aos y tiene '; echo $animal->patas.' patas.<br />'; }

Explorando el XML...
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>'; }
113

SimpleXML (4)

Modificar el XML

$nuevoElemento = $xml->addChild('nombre'); $nuevoElemento = $xml->addChild('nombre','valor'); $elemento->addAttribute('nombre','valor'); $xml->asXML(); El objeto SimpleXML no facilita la escritura en un archivo Para ver correctamente en el navegador podemos hacer uso de la funcin htmlentities que traduce los caracteres especiales a caracteres HTML.
114

Mostrarlo

SimpleXML (5)

Ejemplos de modificacin

Que SimpleXML no escriba en ficheros no quiere decir que en PHP no haya mltiples formas de hacerlo.
$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 cdigo fuente //echo htmlentities($xml->asXML()); // Para verlo bien desde el navegador

Para ms ejemplos, aqu.


115

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 continuacin 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";
116

XTemplate

XTemplate es una clase cuyo objetivo es permitir separar la vista (capa de presentacin) de la lgica del script PHP.

Almacena el HTML de forma independiente al cdigo


Podemos editar el HTML con nuestro editor preferido Los programadores se dedican a lo suyo (cdigo) y los diseadores concentran sus fuerzas en la presentacin.

Podemos parametrizar el HTML, hacer bucles, etc. (para hacer dinmica la pgina, si no a ver para que queremos PHP... :-D) SugarCRM, Drupal entre otros.
117

Se usa en muchos proyectos comerciales libres

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 mtodos a los que llamaremos desde nuestra aplicacin en PHP para ir rellenando la plantilla con datos.

118

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 ms de una vez, creando bucles. Entre corchetes Cmo se ver, se pueden usar matrices con claves para hacer varias asignaciones a la vez

Cdigo a reemplazar

Para ello en la plantilla habr algo semejante a: {DATA.ID} y {DATA.NAME}


119

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 -->
120

XTemplate (5)

Para usar XTemplate debemos:


Bajarnos el cdigo :-) 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 documentacin y ejemplos muy ilustrativos que tambin se pueden encontrar en su sitio web.
121

XTemplate (6)

Mtodos de la clase XTemplate ms 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('-'); 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']...
122

Assign

XTemplate (7)

Parse

Analiza sintcticamente el trozo de cdigo 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'); Devuelve un string con el HTML construido por el parse. Imprime el HTML que se ha construido con parse. $xtpl->out('main'); Equivalente a echo $xtpl->text('main');
123

Text

Out

XTemplate (8)

Ejemplo de uso de una plantilla (listado.php):


// definicin 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');
124

PHP en lnea de comandos

PHP no slo 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 pgina HTML mediante expresiones regulares y sabiendo de antemano en que lnea mirar

Sirve para hacerse una idea

125

PHP en lnea de comandos (2)

Instalar el interprete para lnea 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 bastara con especificar su ruta el ejecutarlo). Ejecutarlo

sudo ./scriptTiempo sudo ./scriptTiempo -a etc.


126

PEAR

PHP Extensin and Application Repository promueve la reutilizacin de cdigo que realizan tareas comunes Objetivos:

promover una biblioteca de cdigo bien estructurada mantener un sistema de distribucin y mantenimiento de paquetes de cdigo promover un estilo de codificacin estndar

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

127

PEAR (2)

Para usar alguno de los paquetes de PEAR, basta con:

Instalar php-pear

sudo aptitude install php-pear PEAR es sistema de distribucin y mantenimiento de paquetes de cdigo que mencionbamos antes

Instalar el paquete que queramos usar haciendo uso de PEAR

sudo pear install <nombre_paquete> require_once 'nombre_paquete.php';


128

Incluirlo en el script en el que lo vayamos a usar:

PEAR (3)

Ejemplo:

Instalaremos los paquetes Mail y Net_SMTP

sudo pear install Mail Net_SMTP

Lo usamos:

<?php require_once 'Mail.php'; $params['host'] = 'mail.deusto.es'; // p.e. $params['auth'] = TRUE; $params['debug'] = TRUE; $params['username'] = '9aigomez@rigel.deusto.es'; $params['password'] = 'passwd'; $obj = &Mail::factory('smtp',$params); $recipients = 'tulvur@gmail.com'; $headers['From'] = '9aigomez@rigel.deusto.es'; $headers['To'] = 'tulvur@gmail.com'; $headers['Subject'] = 'Asunto interesante'; $body = 'Mensaje ms interesante an (si cabe).'; $obj->send($recipients, $headers, $body); ?>
129

PEAR (4)

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


DEBUG: Recv: 220 smtp-in2.deusto.es ESMTP DEBUG: Send: EHLO localhost (...) DEBUG: Send: MAIL FROM:<9aigomez@rigel.deusto.es> (...) DEBUG: Send: DATA DEBUG: Recv: 354 End data with <CR><LF>.<CR><LF> DEBUG: Send: From: 9aigomez@rigel.deusto.es To: tulvur@gmail.com Subject: Asunto interesante Mensaje ms interesante an (si cabe). . DEBUG: Recv: 250 2.0.0 Ok: queued as 2F2F346A7E7 DEBUG: Send: QUIT DEBUG: Recv: 221 2.0.0 Bye
130

Por dnde continuar?

A continuacin os enumero algunos documentos y sitios webs utiles para los que queris continuar profundizando en PHP (espero que todos ;-) ).

PHP5 Power Programming

Libro muy completo, actualizado y encima gratuito (open publication license). Est en ingls, pero creo que puede ser un buen libro de referencia. Dnde mejor viene cada cosa explicada. Web muy til: sencilla pero clarificadora. Es la suelo usar para dudas puntuales de CSS o HTML.
131

PHP.net

W3Schools

Por dnde continuar? (2)

PHP Tutorials - Herong's Tutorial Notes

Libro escrito por el autor mientras aprenda PHP (con bastantes ejemplos). Es gratuito en su versin ONLINE, pero por 5$ lo tenis en PDF. Bueno para reforzar cosas vistas. Trata con mayor detalle algunos de los temas bsicos vistos y propone ejercicios interesantes para practicar. Un manual (que puede que en algunas secciones no se encuentre actualizado) y muchos ejemplos, muy detallados. Es una referencia un poco nostlgica, porque es donde comenc yo en esto de PHP :-)
132

Curso de la Universidad de Sevilla

Desarrolloweb.com

Por dnde continuar? (3)

Chuleta de PHP

Para recordar algunas funciones tiles del lenguaje. En este curso no las hemos visto. ...si veis alguno que creis interesante, comentadme y actualizo este documento.

Y cualquiera que podis encontrar...

133

Agur ;-)

Para cualquier correccin, sugerencia, o comentario en general, no dudis 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.

134