Post on 20-Jun-2015
description
Introducción a PHP
Aitor Gómez Goiriaitor@twolf.euwww.twolf.eu
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&pass=1234$email=mail@server.com
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'] = '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 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:<9aigomez@rigel.deusto.es>(...)DEBUG: Send: DATADEBUG: Recv: 354 End data with <CR><LF>.<CR><LF>DEBUG: Send: From: 9aigomez@rigel.deusto.esTo: tulvur@gmail.comSubject: 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.