Introducción a PHP Aitor Gómez Goiri [email_address] www.twolf.eu 16 a 18 de Julio de 2008 e-ghost ESIDE – Universidad de ...
Copyleft Esta presentación ha sido realizada por  Aitor Gómez Goiri  (twolf), en base a la presentación realizada por  Jor...
Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><l...
Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><l...
Introducción <ul><li>¿Qué es? </li></ul><ul><li>Características </li></ul><ul><li>Pros y contras </li></ul><ul><li>Histori...
¿Qué es? <ul><li>PHP Hypertext Preprocessor </li></ul><ul><li>Lenguaje interpretado o de scripting </li></ul><ul><li>Sinta...
Características <ul><li>Alto rendimiento </li></ul><ul><li>Integración con bases de datos </li></ul><ul><li>Bibliotecas in...
Pros y contras <ul><li>“ PHP is the BASIC of the 21st Century “ </li></ul><ul><li>“ PHP Sucks, But It Doesn't Matter ” </l...
Historia <ul><li>1994: Rasmus Lerdorf quiere mostrar su currículum vítae y guardar ciertos datos cómo estadísticas sobre e...
Historia (2) <ul><li>2000: PHP 4: se reescribe el núcleo (llamado Zend Engine) </li></ul><ul><ul><li>Más modular, rendimie...
PHP 5 <ul><li>Modelo de orientación a objetos </li></ul><ul><ul><li>El anterior era un poco rudimentario </li></ul></ul><u...
¿Cómo funciona? <ul><li>Nosotros vemos páginas web en un navegador: </li></ul><ul><ul><li>Mozilla, Konqueror, Opera, Nauti...
¿Cómo funciona? (2) <ul><li>El navegador puede: </li></ul><ul><ul><li>Mostrar una página alojada en el ordenador en el que...
¿Cómo funciona? (3) <ul><li>Ejemplo: petición de una página PHP a un servidor web </li></ul>Servidor web interpreta  códig...
Configuración del servidor <ul><li>Vamos a utilizar el servidor Apache </li></ul><ul><ul><li>http://www.apache.org </li></...
Configuración servidor (2) <ul><li>El proceso descrito aquí es para configurar el servidor en una distribución Ubuntu GNU/...
Configuración servidor (3) <ul><li>Para comprobar que el servidor Apache está activo: </li></ul><ul><ul><li>http://localho...
Configuración servidor (4) <ul><li>Activaremos el módulo “userdir” </li></ul><ul><ul><li>nos permite que para cada usuario...
Configuración servidor (5) <ul><li>Finalmente, comprobamos que funciones las páginas PHP </li></ul><ul><ul><li>Suponiendo ...
Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><l...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Primeros pasos <ul><li>Como se dijo en la introducción: </li></ul><ul><ul><li>PHP se incrusta dentro del código HTML </li>...
Primeros pasos (2) <ul><li>¿Cómo incrustar PHP dentro del HTML? </li></ul><ul><ul><li>Con la etiqueta <?php [instrucciones...
Primeros pasos (3) <ul><li>¿Cómo procesa el código? </li></ul><ul><ul><li>Tenemos la página: </li></ul></ul><ul><ul><li>El...
Primeros pasos (4) <ul><li>El servidor devolvería el siguiente fragmento: </li></ul><html> <body> Hola mundo! </body> </ht...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Sintaxis <ul><li>Es muy similar a la de C, Java o Perl. </li></ul><ul><ul><li>Las instrucciones se escriben separadas por ...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Tipos <ul><li>Existen distintos  tipos : </li></ul><ul><ul><li>Boolean, integer, float, string, array, object,... </li></u...
Variables <ul><li>Tienen dos particularidades: </li></ul><ul><ul><li>Pueden cambiar de tipo fácilmente </li></ul></ul><ul>...
Variables (2) <ul><li>Dentro de un string delimitado con  comillas dobles  se evalúan las variables </li></ul><ul><li>Con ...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Operadores <ul><li>Aritméticos </li></ul><ul><li>Asignación </li></ul>
Operadores (2) <ul><li>Comparación </li></ul><ul><li>Lógicos </li></ul><ul><li>Otros </li></ul>
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Estructuras de control <ul><li>Condicionales </li></ul><ul><li>Bucles </li></ul><ul><li>include y require </li></ul>
Condicionales <ul><li>Condicional simple if (<condición>) {...} </li></ul><ul><li>Condicional y alternativa if (<condición...
Condicionales (2) <ul><ul><li>Condicional múltiple switch (<expresión>) { case <valor 1>: ... break; case <valor 2>: ... b...
Condicionales (3) <ul><li>Ejemplo </li></ul>//$x = 4; //descomentadlo después de probarlo una vez if( ! isset($x) ) { echo...
Bucles <ul><li>while </li></ul><ul><ul><li>Mientras se cumpla una condición, se ejecuta al código que hay en el (puede no ...
Bucles (2) <ul><li>do ... while </li></ul><ul><ul><li>Se ejecuta el código mientras se cumpla una condición (al menos se e...
Bucles (3) <ul><li>for </li></ul><ul><ul><li>Ejecuta un código mientas se cumpla una condición (puede no ejecutarse ningun...
Bucles (4) <ul><li>Foreach </li></ul><ul><ul><li>Se ejecuta un determinado código por cada uno de los elementos de una col...
Bucles (5) <ul><li>Ejemplo </li></ul><ul><li>Nota: para todo lo anterior existe una  sintaxis alternativa . </li></ul>
include y require <ul><li>Para incluir y evaluar un archivo determinado... </li></ul><ul><ul><li>include ,  require ,  inc...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Matrices <ul><li>Acceso a una posición </li></ul><ul><ul><li>A través de “[...]” </li></ul></ul><ul><ul><ul><li>echo ($mat...
Matrices (2) <ul><ul><ul><li>Podemos especificar el índice de cada uno de los elementos: </li></ul></ul></ul><ul><ul><ul><...
Matrices (3) <ul><li>Modificación de elementos </li></ul><ul><ul><li>Podemos modificar un elemento de una matriz reasignan...
Matrices (4) <ul><li>Recorrido de un array con “foreach” </li></ul><ul><ul><li>La estructura foreach, además de ser utiliz...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Funciones <ul><li>Podemos definir nuestras propias funciones </li></ul><ul><li>Ejemplo </li></ul>function <nombre_función>...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Errores <ul><li>Para tratar los errores que se produzcan en nuestra aplicación web podemos optar por: </li></ul><ul><ul><l...
Excepciones <ul><li>Similar  a otros lenguajes </li></ul><ul><ul><li>se lanzan con throw, dentro del bloque try se captura...
Función die <ul><li>Equivalente a exit </li></ul><ul><ul><li>Cuando se devuelve, se detiene el script y se muestra el mens...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Métodos avanzados de escape <ul><li>PHP permite construcciones como: </li></ul><?php function negrita($texto) { ?> <span s...
Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y varia...
Objetos <ul><li>Definición de una clase </li></ul>class NombreClase [extends ClasePadre] [implements Iinterfaz] { const CO...
Objetos (2) <ul><li>Creación de objetos </li></ul><ul><ul><li>Si tenemos una clase &quot;ClaseA&quot; podremos crear objet...
Objetos (3) <ul><li>Operador de resolución :: </li></ul><ul><ul><li>Es un símbolo que permite acceso a los miembros o méto...
Objetos (4) <ul><li>Constructores </li></ul><ul><ul><li>Un constructor es un método de nombre __construct() al que se llam...
Objetos (5) <ul><li>Destructor __destruct() </li></ul><ul><ul><li>Se le llamará tan pronto como se borren todas las refere...
Objetos (6) <ul><li>PHP soporta herencia de clases </li></ul><?php class ClaseA { protected $attrA = 'A'; function getAttr...
Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><l...
Información de usuario <ul><li>Superglobales </li></ul><ul><li>GET y POST </li></ul><ul><li>Sesiones </li></ul>
Superglobales <ul><li>Son variables incorporadas (matrices asociativas) disponibles en todos los ámbitos </li></ul><ul><ul...
Superglobales (2) <ul><ul><li>$_SESSION </li></ul></ul><ul><ul><ul><li>contiene variables de sesión </li></ul></ul></ul><u...
GET y POST <ul><li>Información desde formularios </li></ul><ul><ul><li>La información de un formulario puede enviarse con ...
GET y POST (2) <ul><li>Ejemplo: crear el siguiente fichero PHP (ejerparams.php): </li></ul><ul><li>Acceder a la página con...
GET y POST (3) <ul><li>Creamos la página &quot;formparams.html&quot; y enviamos los datos a &quot;ejerparams.php&quot;: </...
GET y POST (4) <ul><li>Para acceder a un dato en concreto dentro de los arrays &quot;$_POST&quot; y &quot;$_GET&quot; </li...
GET y POST (5) <ul><ul><ul><li>Si se seleccionan los dos checkboxes anteriores: </li></ul></ul></ul><ul><li>Ejemplo con $_...
Sesiones <ul><li>Variables de sesión </li></ul><ul><ul><li>Podemos guardar información del usuario que se mantendrá mientr...
Sesiones (2) <ul><li>Ejemplo: página pública/privada </li></ul><ul><ul><li>public_private.php </li></ul></ul><?php session...
Sesiones (3) <html><body> <?php if ($registrado) { ?> <p>Bienvenido, <b><?=$login?></b></p> <p><a href=&quot;private_login...
Sesiones (4) <ul><ul><li>private_login.php </li></ul></ul><?php session_start(); ?> <html> <body> <?php if (isset($_SESSIO...
Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><l...
Acceso a base de datos <ul><li>Introducción </li></ul><ul><li>Configuración del servidor de base de datos </li></ul><ul><l...
Introducción <ul><li>Es posible acceder a bases de datos a través de PHP </li></ul><ul><ul><li>Uso de módulos de bases de ...
Configuración del servidor de BB.DD. <ul><li>Paquetes a instalar </li></ul><ul><ul><li>En el caso de utilizar Ubuntu, los ...
Configuración del servidor de BB.DD. (2) <ul><li>Accedemos a PHPMyAdmin </li></ul><ul><ul><li>http://localhost/phpmyadmin ...
Creación de un usuario <ul><li>Creamos un usuario sobre el que trabajar </li></ul><ul><ul><li>Privilegios </li></ul></ul><...
Creación de una tabla <ul><li>Nos identificamos como “php” </li></ul><ul><li>Seleccionamos la tabla “php” que se ha creado...
Estructura de una tabla <ul><li>Completamos y grabamos </li></ul>
PHP Data Objects <ul><li>Una vez instalado el módulo de MySQL, tenemos un  API de funciones  para interactuar con distinta...
PHP Data Objects (2) <ul><li>Conexión con el servidor de base de datos </li></ul><ul><ul><li>La conexión a la base de dato...
PHP Data Objects (3) <ul><li>Trabajar con las tablas </li></ul><ul><ul><li>$pdo->query(&quot;sentencia_sql&quot;); </li></...
PHP Data Objects (4) <ul><li>Una vez realizada la selección, podemos recorrer el resultado utilizando el método  fetch  o ...
Importar archivo <ul><ul><li>Seleccionamos el fichero “animales.sql” y continuamos. </li></ul></ul><ul><ul><li>Antes de ej...
Prepared Statements <ul><li>El anterior método (PDO->query()), está bien cuando se va a ejecutar una sentencia SQL una úni...
Prepared Statements (2) <ul><li>Ejemplo insercionPreparada.php: </li></ul><ul><ul><li>Probar las otras formas de inserción...
Ejercicio favoritos <ul><li>Dar de alta una tabla en la base de datos (con la estructura que se quiera) </li></ul><ul><ul>...
Ejercicio favoritos (1) <ul><li>Propuesta de tabla </li></ul>
Ejercicio favoritos (2) <ul><li>Propuesta interfaz </li></ul>
Ejercicio favoritos (3) <ul><li>Estructura </li></ul><ul><ul><li>Si quisiéramos dividir la aplicación en varias capas (en ...
Ejercicio favoritos (4) <ul><li>Propuesta de estructura (2) </li></ul><ul><ul><li>Recuperación de los datos del grupo sele...
Ejemplo práctico <ul><li>Vamos a realizar el siguiente ejemplo: </li></ul><ul><ul><li>Desde un formulario se envía un fich...
Ejemplo práctico (2) <ul><li>El formulario </li></ul><ul><ul><li>Tiene que tener codificación: </li></ul></ul><ul><ul><ul>...
Ejemplo práctico (3) <ul><li>Traducido a HTML... </li></ul><form enctype=&quot;multipart/form-data&quot; action=&quot;proc...
Ejemplo práctico (4) <ul><li>Insertar el fichero </li></ul><ul><ul><li>Hemos definido, en la tabla “FICHEROS” los siguient...
Ejemplo práctico (5) <ul><li>Insertar el fichero </li></ul><ul><ul><li>Vamos a usar la función “comillas_inteligentes”: </...
Ejemplo práctico (6) <ul><li>Insertar fichero (2) </li></ul><ul><ul><li>Cogemos los datos de la imagen (estará en el fiche...
Ejemplo práctico (7) <ul><li>Recuperar la imagen </li></ul><ul><ul><li>Usaremos una página que recibe como parámetro el có...
Ejemplo práctico (8) <ul><li>Recuperar la imagen </li></ul><ul><ul><li>Si llamamos a la página, por ejemplo con: </li></ul...
Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><l...
Otros <ul><li>SimpleXML </li></ul><ul><li>XTemplate </li></ul><ul><li>PHP en línea de comandos </li></ul><ul><li>PEAR </li...
SimpleXML <ul><li>La  extensión SimpleXML  es una forma fácil y sencilla de hacer uso de documentos XML. </li></ul><ul><li...
SimpleXML (2) <ul><li>Para los siguientes ejemplos supondremos que existe el archivo animales.xml con el siguiente conteni...
SimpleXML (2) <ul><li>Para  acceder  a los datos, entre otros, podemos usar: </li></ul><ul><ul><li>$elem->nomElem </li></u...
SimpleXML (3) <ul><li>Ejemplo simple de lectura </li></ul><ul><li>Explorando el XML... </li></ul>$xml = new SimpleXMLEleme...
SimpleXML (4) <ul><li>Modificar el XML </li></ul><ul><ul><li>$nuevoElemento = $xml->addChild('nombre'); </li></ul></ul><ul...
SimpleXML (5) <ul><li>Ejemplos de modificación </li></ul><ul><ul><li>Que SimpleXML no escriba en ficheros no quiere decir ...
SimpleXML (6) <ul><li>Que SimpleXML no escriba en ficheros no quiere decir que en PHP no haya otras formas de hacerlo. </l...
XTemplate <ul><li>XTemplate  es una clase cuyo  objetivo  es permitir  separar  la vista (capa de presentación) de la lógi...
XTemplate (2) <ul><li>Por lo tanto, para hacer uso de XTemplate, tendremos: </li></ul><ul><ul><li>Una plantilla en base a ...
XTemplate (3) <ul><li>La  plantilla HTML  debe contener ciertos elementos: </li></ul><ul><ul><li>Secciones. </li></ul></ul...
XTemplate (4) <ul><li>Ejemplo: listadoUsuarios.html </li></ul><!-- BEGIN: main --> <html><head><title>Listado usuarios</ti...
XTemplate (5) <ul><li>Para usar XTemplate debemos: </li></ul><ul><ul><li>Bajarnos el  código  :-) </li></ul></ul><ul><ul><...
XTemplate (6) <ul><li>Métodos  de la  clase XTemplate  más importantes: </li></ul><ul><ul><li>Set null string </li></ul></...
XTemplate (7) <ul><ul><li>Parse </li></ul></ul><ul><ul><ul><li>Analiza sintácticamente el trozo de código delimitado por <...
XTemplate (8) <ul><li>Ejemplo de uso de una plantilla (listado.php): </li></ul>// definición del array $usu[0]['USERNAME']...
PHP en línea de comandos <ul><li>PHP no sólo funciona junto a un servidor web. Una forma curiosa de usarlo consiste en eje...
PHP en línea de comandos (2) <ul><li>Instalar el interprete para línea de comandos </li></ul><ul><ul><li>sudo aptitude ins...
PEAR <ul><li>PHP Extensión and Application Repository  promueve la reutilización de código que realizan tareas comunes </l...
PEAR (2) <ul><li>Para usar alguno de los paquetes de PEAR, basta con: </li></ul><ul><ul><li>Instalar “php-pear” </li></ul>...
PEAR (3) <ul><li>Ejemplo: </li></ul><ul><ul><li>Instalaremos los paquetes “ Mail ” y  “ Net_SMTP ” </li></ul></ul><ul><ul>...
PEAR (4) <ul><li>Lo cual nos devolverá: (porque hemos activado el modo debug) </li></ul>DEBUG: Recv: 220 smtp-in2.deusto.e...
¿Por dónde continuar? <ul><li>A continuación os enumero algunos documentos y sitios webs utiles para los que queráis conti...
¿Por dónde continuar? (2) <ul><ul><li>PHP Tutorials - Herong's Tutorial Notes </li></ul></ul><ul><ul><ul><li>Libro escrito...
¿Por dónde continuar? (3) <ul><ul><li>Chuleta de PHP </li></ul></ul><ul><ul><ul><li>Para recordar algunas funciones útiles...
Agur ;-) <ul><li>Para cualquier corrección, sugerencia, o comentario en general, no dudéis en poneros en contacto conmigo ...
Upcoming SlideShare
Loading in …5
×

Introducción a PHP5

7,522 views

Published on

Presentación usada en un cursillo de introducción a PHP.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,522
On SlideShare
0
From Embeds
0
Number of Embeds
75
Actions
Shares
0
Downloads
518
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Introducción a PHP5

  1. 1. Introducción a PHP Aitor Gómez Goiri [email_address] www.twolf.eu 16 a 18 de Julio de 2008 e-ghost ESIDE – Universidad de Deusto
  2. 2. Copyleft Esta 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. 3. Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><li>Acceso a base de datos </li></ul><ul><li>Otros </li></ul>
  4. 4. Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><li>Acceso a base de datos </li></ul><ul><li>Otros </li></ul>
  5. 5. Introducción <ul><li>¿Qué es? </li></ul><ul><li>Características </li></ul><ul><li>Pros y contras </li></ul><ul><li>Historia </li></ul><ul><li>PHP5 </li></ul><ul><li>¿Cómo funciona? </li></ul><ul><li>Configuración del servidor Apache </li></ul>
  6. 6. ¿Qué es? <ul><li>PHP Hypertext Preprocessor </li></ul><ul><li>Lenguaje interpretado o de scripting </li></ul><ul><li>Sintaxis similar a C, Java o Perl </li></ul><ul><li>Proposito general </li></ul><ul><ul><li>Aplicaciones web </li></ul></ul><ul><ul><li>Aplicaciones para línea de comandos (PHPCLI) </li></ul></ul><ul><ul><li>Aplicaciones con interfaz gráfica </li></ul></ul><ul><li>Open Source </li></ul>
  7. 7. Características <ul><li>Alto rendimiento </li></ul><ul><li>Integración con bases de datos </li></ul><ul><li>Bibliotecas incorporadas </li></ul><ul><li>Facilidad de aprendizaje y uso </li></ul><ul><li>Portabilidad </li></ul><ul><li>Gran documentación on-line ( php.net ) </li></ul><ul><li>etc. </li></ul>
  8. 8. Pros y contras <ul><li>“ PHP is the BASIC of the 21st Century “ </li></ul><ul><li>“ PHP Sucks, But It Doesn't Matter ” </li></ul><ul><ul><li>Wikipedia, Meneame, Digg, WordPress, largo etc. </li></ul></ul><ul><li>Usado en más de 20 millones de dominios </li></ul>
  9. 9. Historia <ul><li>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 </li></ul><ul><ul><li>Se empezó a extender... </li></ul></ul><ul><ul><ul><li>acceso a bases de datos </li></ul></ul></ul><ul><ul><ul><li>generación de páginas web dinámicas </li></ul></ul></ul><ul><li>1997: se liberó la versión PHP/FI 2.0 </li></ul><ul><li>1998: PHP3 </li></ul>
  10. 10. Historia (2) <ul><li>2000: PHP 4: se reescribe el núcleo (llamado Zend Engine) </li></ul><ul><ul><li>Más modular, rendimiento, funcionalidad... </li></ul></ul><ul><ul><li>Su uso se extendió enormemente </li></ul></ul><ul><li>2004: PHP5 </li></ul><ul><ul><li>Zend Engine 2.0 </li></ul></ul><ul><ul><li>En 2008, se convirtió en la única versión estable bajo desarrollo. </li></ul></ul><ul><ul><ul><li>Renovarse o morir (aplicaciones y servidores) </li></ul></ul></ul><ul><ul><li>El curso se centra en esta versión </li></ul></ul>
  11. 11. PHP 5 <ul><li>Modelo de orientación a objetos </li></ul><ul><ul><li>El anterior era un poco rudimentario </li></ul></ul><ul><li>Excepciones </li></ul><ul><li>Nuevas extensiones </li></ul><ul><ul><li>SimpleXML , para el proceso sencillo de XML </li></ul></ul><ul><ul><li>PDO , interfaz de orientación a objetos para interactuar con la base de datos. </li></ul></ul><ul><ul><li>Extensiones DOM y XSL </li></ul></ul><ul><li>Para más detalles, aquí . </li></ul>
  12. 12. ¿Cómo funciona? <ul><li>Nosotros vemos páginas web en un navegador: </li></ul><ul><ul><li>Mozilla, Konqueror, Opera, Nautilus... </li></ul></ul><ul><li>Un navegador interpreta HTML </li></ul><ul><ul><li>(y hojas de estilo, Javascript, etc, pero eso está fuera del alcance de este curso ;-) </li></ul></ul><ul><li>Un navegador NO sabe interpretar PHP </li></ul><ul><li>Entonces, ¿quién lo hace por él? </li></ul>
  13. 13. ¿Cómo funciona? (2) <ul><li>El navegador puede: </li></ul><ul><ul><li>Mostrar una página alojada en el ordenador en el que él está instalado </li></ul></ul><ul><ul><ul><li>Éste es el ordenador “cliente” </li></ul></ul></ul><ul><ul><ul><li>La página se muestra tal y como está guardada, no hay proceso posible: tiene que ser HTML </li></ul></ul></ul><ul><li>Pedir una página a un servidor </li></ul><ul><ul><li>El servidor puede procesar la página antes de enviarla al navegador </li></ul></ul>
  14. 14. ¿Cómo funciona? (3) <ul><li>Ejemplo: petición de una página PHP a un servidor web </li></ul>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 datos para obtener datos con lo que completar dicho HTML.
  15. 15. Configuración del servidor <ul><li>Vamos a utilizar el servidor Apache </li></ul><ul><ul><li>http://www.apache.org </li></ul></ul><ul><ul><li>Servidor HTTP Open Source </li></ul></ul><ul><ul><ul><li>En principio, soporta el protocolo HTTP </li></ul></ul></ul><ul><ul><ul><ul><li>Se pide un fichero, el servidor lo devuelve </li></ul></ul></ul></ul><ul><ul><li>Extensible a través de módulos, como el módulo PHP </li></ul></ul><ul><ul><ul><li>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 </li></ul></ul></ul>
  16. 16. Configuración servidor (2) <ul><li>El proceso descrito aquí es para configurar el servidor en una distribución Ubuntu GNU/Linux </li></ul><ul><ul><li>No debería variar sustancialmente para otras distribuciones </li></ul></ul><ul><li>Instalar los paquetes apache, php5, apache-common y apache utils </li></ul><ul><ul><li>apt-get install apache2 libapache2-mod-php5 </li></ul></ul><ul><ul><li>Versiones (julio 2008): </li></ul></ul><ul><ul><ul><li>Apache: 2.2.8-1 </li></ul></ul></ul><ul><ul><ul><li>PHP: 5.2.4-2 </li></ul></ul></ul>
  17. 17. Configuración servidor (3) <ul><li>Para comprobar que el servidor Apache está activo: </li></ul><ul><ul><li>http://localhost </li></ul></ul><ul><ul><li>Aparecerá la siguiente página </li></ul></ul><ul><ul><ul><li>Accedemos a través del servidor, no directamente </li></ul></ul></ul>
  18. 18. Configuración servidor (4) <ul><li>Activaremos el módulo “userdir” </li></ul><ul><ul><li>nos permite que para cada usuario, si tiene un directorio llamado “public_html” en su carpeta home, exista un directorio virtual del tipo: </li></ul></ul><ul><ul><ul><li>http://www.midominio.net/~usuario </li></ul></ul></ul><ul><ul><li>Nosotros vamos a trabajar con ese directorio . </li></ul></ul><ul><li>Si no deberéis trastear con el grupo www-data, el directorio /var/www o los ficheros /etc/apache2/conf.d/algo.conf </li></ul>sudo a2enmod userdir sudo /etc/init.d/apache2 force-reload
  19. 19. Configuración servidor (5) <ul><li>Finalmente, comprobamos que funciones las páginas PHP </li></ul><ul><ul><li>Suponiendo que el usuario que se llama “ubuntu” </li></ul></ul><ul><ul><li>Creamos el fichero: “/home/ubuntu/public_html/info.php” <?php phpinfo(); ?> </li></ul></ul><ul><ul><li>Accedemos a él a través del servidor: http://localhost/~ubuntu/info.php </li></ul></ul>
  20. 20. Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><li>Acceso a base de datos </li></ul><ul><li>Otros </li></ul>
  21. 21. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  22. 22. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  23. 23. Primeros pasos <ul><li>Como se dijo en la introducción: </li></ul><ul><ul><li>PHP se incrusta dentro del código HTML </li></ul></ul><ul><ul><li>PHP se procesa en el servidor </li></ul></ul><ul><ul><ul><li>Sirve para crear páginas HTML que después se enviarán al cliente, y para realizar otras operaciones </li></ul></ul></ul><ul><ul><ul><ul><li>Podemos generar una página según el contenido de un formulario... </li></ul></ul></ul></ul><ul><ul><ul><ul><li>... o según el contenido de una base de datos... </li></ul></ul></ul></ul><ul><ul><ul><ul><li>... o según la hora del servidor... </li></ul></ul></ul></ul><ul><ul><ul><ul><li>... </li></ul></ul></ul></ul>
  24. 24. Primeros pasos (2) <ul><li>¿Cómo incrustar PHP dentro del HTML? </li></ul><ul><ul><li>Con la etiqueta <?php [instrucciones] ?> </li></ul></ul><ul><ul><ul><li>El servidor procesa el código que hay entre “<?php” y “?>” (o símplemente “<? .... ?>”) <?php echo (&quot;Hola mundo!&quot;); ?> </li></ul></ul></ul><ul><ul><li>Con la etiqueta <?=[expresión]?> </li></ul></ul><ul><ul><ul><li>El servidor evalúa la expresión, y escribe su resultado en la página web <?=&quot;Hola mundo!&quot; ?> </li></ul></ul></ul><ul><ul><ul><ul><li>No puede haber más código que la expresión que queremos evaluar y sacar por pantalla </li></ul></ul></ul></ul>
  25. 25. Primeros pasos (3) <ul><li>¿Cómo procesa el código? </li></ul><ul><ul><li>Tenemos la página: </li></ul></ul><ul><ul><li>El servidor comienza a procesar la página </li></ul></ul><ul><ul><ul><li>Si encuentra HTML, lo envía directamente al cliente </li></ul></ul></ul><ul><ul><ul><li>Si encuentra una etiqueta de PHP, procesa el código, y si el código escribe algo, esa &quot;escritura&quot; se incluye en el HTML que se envía al cliente </li></ul></ul></ul><html> <body> <?php echo 'Hola mundo!'; ?> </body> </html>
  26. 26. Primeros pasos (4) <ul><li>El servidor devolvería el siguiente fragmento: </li></ul><html> <body> Hola mundo! </body> </html>
  27. 27. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  28. 28. Sintaxis <ul><li>Es muy similar a la de C, Java o Perl. </li></ul><ul><ul><li>Las instrucciones se escriben separadas por ';' </li></ul></ul><ul><ul><li>Las estructuras de control son muy similares </li></ul></ul><ul><ul><ul><li>if, while, switch, for, etc. </li></ul></ul></ul><ul><ul><li>Las llamadas a función se realizan con paréntesis </li></ul></ul><ul><ul><ul><li>phpinfo(); </li></ul></ul></ul><ul><ul><ul><li>strlen('abcdef'); // 6 </li></ul></ul></ul><ul><ul><li>Los comentarios en el código se realizan con: </li></ul></ul><ul><ul><ul><li>// Una sola línea </li></ul></ul></ul><ul><ul><ul><li># Una sola línea </li></ul></ul></ul><ul><ul><ul><li>/* Varias líneas */ </li></ul></ul></ul>
  29. 29. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  30. 30. Tipos <ul><li>Existen distintos tipos : </li></ul><ul><ul><li>Boolean, integer, float, string, array, object,... </li></ul></ul><ul><li>Nos “desentendemos” de ellos </li></ul><ul><ul><li>no es declarado por el programador </li></ul></ul><ul><ul><li>PHP lo decide en tiempo de ejecución dependiendo del contexto en el que es usado la variable </li></ul></ul><?php $un_bool = TRUE; // un valor booleano $un_str = &quot;foo&quot;; // 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. 31. Variables <ul><li>Tienen dos particularidades: </li></ul><ul><ul><li>Pueden cambiar de tipo fácilmente </li></ul></ul><ul><ul><ul><li>Ej.: si en una variable hemos guardado un entero, podemos utilizarlo como un String, y viceversa (siempre que el String represente un entero) </li></ul></ul></ul><ul><ul><li>El nombre de la variable lleva '$' delante </li></ul></ul><ul><ul><ul><li>$usuario = 'jose'; </li></ul></ul></ul><ul><li>Es posible concatenar variables (strings) con el operador '.' </li></ul><?php $mensaje1 = 'Hola'; $mensaje2 = 'mundo!'; echo $mensaje1.' '.$mensaje2; ?>
  32. 32. Variables (2) <ul><li>Dentro de un string delimitado con comillas dobles se evalúan las variables </li></ul><ul><li>Con la función “unset()” podemos quitar el valor de una variable </li></ul><ul><li>La función “isset()” nos indica si una variable está inicializada </li></ul>$nombre = 'juan'; echo (&quot;El valor de la variable nombre es $nombre.&quot;); $var = &quot;pepe&quot;; unset($var); // Ahora no tiene valor (NULL) if (isset($var)) { echo 'Tiene valor'; }
  33. 33. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  34. 34. Operadores <ul><li>Aritméticos </li></ul><ul><li>Asignación </li></ul>
  35. 35. Operadores (2) <ul><li>Comparación </li></ul><ul><li>Lógicos </li></ul><ul><li>Otros </li></ul>
  36. 36. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  37. 37. Estructuras de control <ul><li>Condicionales </li></ul><ul><li>Bucles </li></ul><ul><li>include y require </li></ul>
  38. 38. Condicionales <ul><li>Condicional simple if (<condición>) {...} </li></ul><ul><li>Condicional y alternativa if (<condición>) {...} else {...} </li></ul>
  39. 39. Condicionales (2) <ul><ul><li>Condicional múltiple switch (<expresión>) { case <valor 1>: ... break; case <valor 2>: ... break; ... case <valor n>: ... break; default: ... break; } </li></ul></ul>
  40. 40. Condicionales (3) <ul><li>Ejemplo </li></ul>//$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. 41. Bucles <ul><li>while </li></ul><ul><ul><li>Mientras se cumpla una condición, se ejecuta al código que hay en el (puede no ejecutarse nunca) </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul>$a = 1; while ( $a < 10) { echo &quot;<p>El número actual es $a</p>&quot;; $a++; }
  42. 42. Bucles (2) <ul><li>do ... while </li></ul><ul><ul><li>Se ejecuta el código mientras se cumpla una condición (al menos se ejecuta una vez) </li></ul></ul><ul><ul><li>Ejemplo </li></ul></ul>$a = 0; do { $a++; echo ('<p>El número es '.$a.'</p>'); } while ( $a < 10);
  43. 43. Bucles (3) <ul><li>for </li></ul><ul><ul><li>Ejecuta un código mientas se cumpla una condición (puede no ejecutarse ninguna vez) </li></ul></ul><ul><ul><li>Opcionalmente, se puede proporcionar: </li></ul></ul><ul><ul><ul><li>Una expresión de inicialización, se ejecuta la primera vez </li></ul></ul></ul><ul><ul><ul><li>Una expresión de condición </li></ul></ul></ul><ul><ul><ul><li>Una expresión de paso, se ejecuta al final de cada pasada del bucle </li></ul></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul>for ($a = 1; $a <= 10; $a++) { echo ('<p>El número es '.$a.'</p>'); }
  44. 44. Bucles (4) <ul><li>Foreach </li></ul><ul><ul><li>Se ejecuta un determinado código por cada uno de los elementos de una colección </li></ul></ul><ul><ul><li>Por ejemplo, si tenemos un array con 3 elementos: </li></ul></ul>$arr = array('perro','gato','okapi','ornitorrinco'); foreach ($arr as $elem) { // En cada vuelta, elem guarda uno de los strings echo (&quot;<p>El elemento es: $elem.</p>&quot;); } foreach ($arr as $index => $elem) { // En cada vuelta, elem guarda uno de los strings, e index el índice echo (&quot;<p>El elemento $index es: $elem.</p>&quot;); }
  45. 45. Bucles (5) <ul><li>Ejemplo </li></ul><ul><li>Nota: para todo lo anterior existe una sintaxis alternativa . </li></ul>
  46. 46. include y require <ul><li>Para incluir y evaluar un archivo determinado... </li></ul><ul><ul><li>include , require , include_once y require_once . </li></ul></ul><ul><ul><li>Diferencia: include() produce un Warning mientras que require() produce un Error Fatal. </li></ul></ul><ul><ul><ul><li>utilizar require() cuando queramos que un fichero no encontrado cuelgue el procesamiento de la página </li></ul></ul></ul>vars.php <?php $color = 'verde'; $fruta = 'manzana'; ?> test.php <?php echo &quot;Una $fruta $color&quot;; // Una include 'vars.php'; echo &quot;Una $fruta $color&quot;; // Una manzana verde ?>
  47. 47. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  48. 48. Matrices <ul><li>Acceso a una posición </li></ul><ul><ul><li>A través de “[...]” </li></ul></ul><ul><ul><ul><li>echo ($matriz[1]); </li></ul></ul></ul><ul><ul><li>El índice de una matriz puede ser cualquier cosa </li></ul></ul><ul><ul><ul><li>echo ($matriz[&quot;gato&quot;]); </li></ul></ul></ul><ul><li>Creación de una matriz </li></ul><ul><ul><li>A través de “array()” </li></ul></ul><ul><ul><ul><li>$profesiones = array('Taxista', 'Bombero', 'Alcalde'); </li></ul></ul></ul><ul><ul><ul><li>En la posición 0 del array está el string 'Taxista&quot;, en la 1 'Bombero' y así sucesivamente </li></ul></ul></ul>
  49. 49. Matrices (2) <ul><ul><ul><li>Podemos especificar el índice de cada uno de los elementos: </li></ul></ul></ul><ul><ul><ul><ul><li>$matriz = array('nombre' => 'Aitor', 'apellido' => 'Gomez', 'edad' => 23); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Si hacemos: echo $matriz['nombre']; // Obtenemos 'Aitor' </li></ul></ul></ul></ul><ul><li>Creación con corchetes </li></ul><ul><ul><li>Podemos crear elementos de una matriz sobre la marcha: </li></ul></ul>$matriz[7] = &quot;Texto de la posición 7&quot;; // si no especificamos un índice, se inserta en la siguiente posición $matriz[] = &quot;Esto iría en la posición 8&quot;;
  50. 50. Matrices (3) <ul><li>Modificación de elementos </li></ul><ul><ul><li>Podemos modificar un elemento de una matriz reasignando un valor </li></ul></ul><ul><ul><ul><li>$matriz = array(3 => &quot;Oso&quot;, 5 => &quot;Perro&quot;); </li></ul></ul></ul><ul><ul><ul><li>$matriz[3] = &quot;Gato&quot;; </li></ul></ul></ul><ul><li>Eliminación de elementos </li></ul><ul><ul><li>Podemos eliminar elementos, o la matriz entera con &quot;unset()&quot; </li></ul></ul>$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. 51. Matrices (4) <ul><li>Recorrido de un array con “foreach” </li></ul><ul><ul><li>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: </li></ul></ul>$modelo['identificador'] = 3; $modelo['fabricante'] = 'ABB'; $modelo['nombre'] = 'detector presencia'; foreach ($modelo as $clave => $valor) { echo &quot;El $clave es $valor<br />&quot;; }
  52. 52. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  53. 53. Funciones <ul><li>Podemos definir nuestras propias funciones </li></ul><ul><li>Ejemplo </li></ul>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. 54. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  55. 55. Errores <ul><li>Para tratar los errores que se produzcan en nuestra aplicación web podemos optar por: </li></ul><ul><ul><li>Hacer uso de excepciones </li></ul></ul><ul><ul><li>Finalizar el script (con funciones die, exit, etc.) </li></ul></ul>
  56. 56. Excepciones <ul><li>Similar a otros lenguajes </li></ul><ul><ul><li>se lanzan con throw, dentro del bloque try se capturan excepciones potenciales y se tratan con catch </li></ul></ul>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. 57. Función die <ul><li>Equivalente a exit </li></ul><ul><ul><li>Cuando se devuelve, se detiene el script y se muestra el mensaje. </li></ul></ul><?php $x = 15; $y = 0; echo 'llego aquí<br />'; if($y==0) die('División imposible.'); // Probad a comentarlo echo ($x/$y); echo '<br />llego al final'; ?>
  58. 58. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  59. 59. Métodos avanzados de escape <ul><li>PHP permite construcciones como: </li></ul><?php function negrita($texto) { ?> <span style=&quot; font-weight: bold;&quot;><?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. 60. Fundamentos de PHP <ul><ul><li>Primeros pasos </li></ul></ul><ul><ul><li>Sintaxis </li></ul></ul><ul><ul><li>Tipos y variables </li></ul></ul><ul><ul><li>Operadores </li></ul></ul><ul><ul><li>Estructuras de control </li></ul></ul><ul><ul><li>Matrices </li></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Errores </li></ul></ul><ul><ul><li>Métodos avanzados de escape </li></ul></ul><ul><ul><li>Orientación a objetos </li></ul></ul>
  61. 61. Objetos <ul><li>Definición de una clase </li></ul>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; } }
  62. 62. Objetos (2) <ul><li>Creación de objetos </li></ul><ul><ul><li>Si tenemos una clase &quot;ClaseA&quot; podremos crear objetos mediante el operador &quot;new&quot; $objeto = new ClaseA(); </li></ul></ul><ul><li>El puntero &quot;$this&quot; </li></ul><ul><ul><li>Es una referencia al propio objeto. Se usa dentro de los métodos </li></ul></ul>class ClaseA { protected $num; function getNum() // Si no se especifica nada, es público { return $this->num; // &quot;num&quot; no lleva &quot;$&quot; } }
  63. 63. Objetos (3) <ul><li>Operador de resolución :: </li></ul><ul><ul><li>Es un símbolo que permite acceso a los miembros o métodos estáticos y constantes. </li></ul></ul><ul><li>Desde afuera: usan el nombre de la clase. </li></ul><ul><li>Desde dentro: usan self o parent. </li></ul>class MiClase extends ClasePadre { public static $my_static = 'static var'; public static function doubleColon() { parent::doubleColon(); echo self::$my_static . &quot; &quot;; } } MiClase::doubleColon();
  64. 64. Objetos (4) <ul><li>Constructores </li></ul><ul><ul><li>Un constructor es un método de nombre __construct() al que se llama al crearse el objeto. </li></ul></ul>class Persona { private $nombre; function __construct($nom) { $this->nombre = $nom; } function __toString() { return $this->nombre; } } $p = new Persona(&quot;Twolf&quot;); echo $p;
  65. 65. Objetos (5) <ul><li>Destructor __destruct() </li></ul><ul><ul><li>Se le llamará tan pronto como se borren todas las referencias a un objeto en particular </li></ul></ul><ul><li>Métodos mágicos </li></ul><ul><ul><li>Existen unos nombres de métodos que tienen asociada una funcionalidad concreta </li></ul></ul><ul><ul><li>__toString() </li></ul></ul><ul><ul><ul><li>Permite a una clase decidir como actuar cuando se la convierte en cadena </li></ul></ul></ul><ul><ul><li>__clone() </li></ul></ul><ul><ul><ul><li>Se llama al crear una copia de un objeto </li></ul></ul></ul>
  66. 66. Objetos (6) <ul><li>PHP soporta herencia de clases </li></ul><?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. 67. Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><li>Acceso a base de datos </li></ul><ul><li>Otros </li></ul>
  68. 68. Información de usuario <ul><li>Superglobales </li></ul><ul><li>GET y POST </li></ul><ul><li>Sesiones </li></ul>
  69. 69. Superglobales <ul><li>Son variables incorporadas (matrices asociativas) disponibles en todos los ámbitos </li></ul><ul><ul><li>$GLOBALS </li></ul></ul><ul><ul><ul><li>para definir variables globales </li></ul></ul></ul><ul><ul><li>$_SERVER </li></ul></ul><ul><ul><ul><li>contiene información tal como cabeceras, rutas y ubicaciones de scripts </li></ul></ul></ul><?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 />'; ?>
  70. 70. Superglobales (2) <ul><ul><li>$_SESSION </li></ul></ul><ul><ul><ul><li>contiene variables de sesión </li></ul></ul></ul><ul><ul><li>$_POST </li></ul></ul><ul><ul><ul><li>variables pasadas a través del método HTTP POST </li></ul></ul></ul><ul><ul><li>$_GET </li></ul></ul><ul><ul><ul><li>variables pasadas a través del método HTTP GET </li></ul></ul></ul><ul><ul><li>$_REQUEST </li></ul></ul><ul><ul><ul><li>contiene datos de $_GET, $_POST, y $_COOKIE. </li></ul></ul></ul><ul><ul><li>etc. </li></ul></ul>
  71. 71. GET y POST <ul><li>Información desde formularios </li></ul><ul><ul><li>La información de un formulario puede enviarse con el método &quot;get&quot; o el método &quot;post&quot; </li></ul></ul><ul><li>Existen dos matrices en PHP llamadas $_GET y $_POST </li></ul><ul><ul><li>Se accede por el nombre del parámetro </li></ul></ul><ul><ul><li>Se obtiene el valor del parámetro </li></ul></ul>
  72. 72. GET y POST (2) <ul><li>Ejemplo: crear el siguiente fichero PHP (ejerparams.php): </li></ul><ul><li>Acceder a la página con la URL: </li></ul><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. 73. GET y POST (3) <ul><li>Creamos la página &quot;formparams.html&quot; y enviamos los datos a &quot;ejerparams.php&quot;: </li></ul><ul><ul><li>Modificación: en lugar de utilizar el método &quot;get&quot; utilizar el &quot;post&quot; </li></ul></ul><html> <body> <form method=&quot;get&quot; action=&quot;ejerparams.php&quot;> Login: <input type=&quot;text&quot; name=&quot;login&quot; /><br /> Password: <input type=&quot;password&quot; name=&quot;pass&quot; /><br /> Email: <input type=&quot;text&quot; name=&quot;email&quot; /><br /> <input type=&quot;submit&quot; value=&quot;Enviar&quot; /> </form> </body> </html>
  74. 74. GET y POST (4) <ul><li>Para acceder a un dato en concreto dentro de los arrays &quot;$_POST&quot; y &quot;$_GET&quot; </li></ul><ul><ul><li>La clave para acceder a un elemento es el nombre del parámetro </li></ul></ul><ul><li>Múltiples valores en un parámetro: </li></ul><ul><ul><li>Un parámetro puede tener distintos valores a la vez: </li></ul></ul><ul><ul><ul><li>El nombre del parámetro será &quot;nombreparametro[]&quot;: </li></ul></ul></ul><ul><ul><ul><li>El parámetro &quot;nombreparametro&quot; es un array con los elementos seleccionados. </li></ul></ul></ul>echo 'El nombre de usuario utilizado es '.$_GET['login']; <input type=&quot;checkbox&quot; name=&quot;sel[]&quot; value=&quot;v1&quot;/>Valor 1 <input type=&quot;checkbox&quot; name=&quot;sel[]&quot; value=&quot;v2&quot;/>Valor 2
  75. 75. GET y POST (5) <ul><ul><ul><li>Si se seleccionan los dos checkboxes anteriores: </li></ul></ul></ul><ul><li>Ejemplo con $_REQUEST (ejrequest.php) </li></ul>sel[0] => &quot;v1&quot; sel[1] => &quot;v2&quot; <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=&quot;get&quot; action=&quot;ejrequest.php&quot;> <select name=&quot;provincia&quot;> <option value=&quot;Álava&quot;>Álava</option> ... <option value=&quot;Murcia&quot;>Murcia</option> </select><input type=&quot;submit&quot; value=&quot;Enviar&quot; /> </form> <?php } ?> </body></html>
  76. 76. Sesiones <ul><li>Variables de sesión </li></ul><ul><ul><li>Podemos guardar información del usuario que se mantendrá mientras no se cierre el navegador </li></ul></ul><ul><ul><ul><li>Se transmite de unas páginas a otras </li></ul></ul></ul><ul><ul><ul><li>El ejemplo más clásico: carrito de la compra </li></ul></ul></ul><ul><ul><ul><li>Otra utilidad: validación de usuarios </li></ul></ul></ul><ul><li>Todo lo que guardemos en el array &quot;$_SESSION&quot; quedará almacenado de este modo </li></ul><ul><ul><li>Para poder usarlo: lo primero en la página, llamada a &quot;session_start();&quot; </li></ul></ul>
  77. 77. Sesiones (2) <ul><li>Ejemplo: página pública/privada </li></ul><ul><ul><li>public_private.php </li></ul></ul><?php session_start(); if (isset($_GET[&quot;accion&quot;])) { $accion = $_GET[&quot;accion&quot;]; if ($accion == &quot;Login&quot;) { $_SESSION[&quot;login&quot;] = $_GET[&quot;login&quot;]; } else if ($accion == &quot;Desconectar&quot;) { unset($_SESSION[&quot;login&quot;]); } } $registrado = isset($_SESSION[&quot;login&quot;]); if ($registrado) $login = $_SESSION[&quot;login&quot;]; ?>
  78. 78. Sesiones (3) <html><body> <?php if ($registrado) { ?> <p>Bienvenido, <b><?=$login?></b></p> <p><a href=&quot;private_login.php&quot;>Link a una página privada</a></p> <form method=&quot;get&quot; action=&quot;public_private.php&quot;> <input type=&quot;submit&quot; name=&quot;accion&quot; value=&quot;Desconectar&quot; /> </form> <?php } else { ?> <p>Por favor, introduce tu nombre de usuario</p> <form method=&quot;get&quot; action=&quot;public_private.php&quot;> Nombre de usuario: <input type=&quot;text&quot; name=&quot;login&quot; /><br /> <input type=&quot;submit&quot; name=&quot;accion&quot; value=&quot;Login&quot; /> </form> <?php } ?> </body></html>
  79. 79. Sesiones (4) <ul><ul><li>private_login.php </li></ul></ul><?php session_start(); ?> <html> <body> <?php if (isset($_SESSION[&quot;login&quot;])) { echo (&quot;El nombre de usuario es &quot;.$_SESSION[&quot;login&quot;]); } else { echo(&quot;No hay nombre de usuario&quot;); } ?> </body> </html>
  80. 80. Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><li>Acceso a base de datos </li></ul><ul><li>Otros </li></ul>
  81. 81. Acceso a base de datos <ul><li>Introducción </li></ul><ul><li>Configuración del servidor de base de datos </li></ul><ul><li>Creación de un usuario en la base de datos </li></ul><ul><li>Creación de una tabla </li></ul><ul><li>PHP Data Objects </li></ul><ul><li>Importar un archivo a base de datos </li></ul><ul><li>Prepared statements </li></ul><ul><li>Ejercicio favoritos </li></ul><ul><li>Ejemplo práctico: guardar ficheros </li></ul>
  82. 82. Introducción <ul><li>Es posible acceder a bases de datos a través de PHP </li></ul><ul><ul><li>Uso de módulos de bases de datos </li></ul></ul><ul><ul><li>Gran cantidad de bases de datos soportadas </li></ul></ul><ul><ul><li>En nuestro caso usaremos MySQL como servidor de bases de datos junto con PHPMyAdmin para administrar las mismas </li></ul></ul><ul><li>Existen distintas formas de acceso a base de datos, nosotros usaremos PDO . </li></ul><ul><ul><li>es nativa en PHP5 (a diferencia de AdoDB ) </li></ul></ul><ul><ul><li>nos abstrae del tipo de base de datos concreto que usemos (a diferencia de las funciones de mysql ) </li></ul></ul><ul><ul><li>hace uso de orientación a objetos </li></ul></ul>
  83. 83. Configuración del servidor de BB.DD. <ul><li>Paquetes a instalar </li></ul><ul><ul><li>En el caso de utilizar Ubuntu, los paquetes a instalar son: </li></ul></ul><ul><ul><ul><li>mysql-client, mysql-server, php5-mysql, phpmyadmin </li></ul></ul></ul><ul><ul><ul><ul><li>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 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>php5-mysql instala el módulo que permite a PHP interactuar con MySQL </li></ul></ul></ul></ul><ul><ul><ul><ul><li>phpmyadmin permite administración web </li></ul></ul></ul></ul><ul><ul><ul><li>La instalación para el cursillo tiene cómo contraseña para el usuario administrador (root): &quot;r00tr00t&quot;. </li></ul></ul></ul><ul><ul><ul><li>No obstante crearemos un nuevo usuario para nuestros menesteres </li></ul></ul></ul>
  84. 84. Configuración del servidor de BB.DD. (2) <ul><li>Accedemos a PHPMyAdmin </li></ul><ul><ul><li>http://localhost/phpmyadmin </li></ul></ul>
  85. 85. Creación de un usuario <ul><li>Creamos un usuario sobre el que trabajar </li></ul><ul><ul><li>Privilegios </li></ul></ul><ul><ul><li>Agregar a un nuevo usuario </li></ul></ul><ul><ul><li>Todos los privilegios de datos y estructura </li></ul></ul>
  86. 86. Creación de una tabla <ul><li>Nos identificamos como “php” </li></ul><ul><li>Seleccionamos la tabla “php” que se ha creado y sobre la que tenemos todos los privilegios </li></ul><ul><li>Creamos una tabla “ejemplo” con dos campos </li></ul>
  87. 87. Estructura de una tabla <ul><li>Completamos y grabamos </li></ul>
  88. 88. PHP Data Objects <ul><li>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. </li></ul><ul><li>Pasos a seguir: </li></ul><ul><ul><li>Conexión con el servidor de Base de Datos </li></ul></ul><ul><ul><li>Trabajar con las tablas </li></ul></ul><ul><ul><ul><li>En caso de selección, trabajar con los registros </li></ul></ul></ul><ul><ul><li>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) </li></ul></ul>
  89. 89. PHP Data Objects (2) <ul><li>Conexión con el servidor de base de datos </li></ul><ul><ul><li>La conexión a la base de datos devuelve un identificativo de la conexión a la base de datos </li></ul></ul><ul><li>Si ha habido error, lanzará una excepción </li></ul><ul><ul><li>Debemos encerrar la construcción del objeto PDO en un try/catch </li></ul></ul>$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. 90. PHP Data Objects (3) <ul><li>Trabajar con las tablas </li></ul><ul><ul><li>$pdo->query(&quot;sentencia_sql&quot;); </li></ul></ul><ul><li>La sentencia SQL puede ser una inserción, borrado, actualización o selección </li></ul><ul><ul><li>$pdo->query('INSERT INTO animales VALUES (“1”, “gato”)'); </li></ul></ul><ul><li>En el caso de realizarse una selección, se devolverá un objeto PDOStatement con el resultado de la misma </li></ul><ul><ul><li>$res = $pdo->query('SELECT * FROM animales'); </li></ul></ul>
  91. 91. PHP Data Objects (4) <ul><li>Una vez realizada la selección, podemos recorrer el resultado utilizando el método fetch o simplemente haciendo un foreach </li></ul><ul><li>Ejemplo completo en seleccionSimple.php </li></ul><ul><li>Antes de probarlo, importaremos la sencilla tabla de animales. </li></ul><ul><ul><li>Mediante la pestaña de “import” de PHPMyAdmin. </li></ul></ul>$sql = 'SELECT * FROM animales'; foreach ($pdo->query($sql) as $row) { echo '('.$row['identificador'].','.$row['denominacion'].')'.” ”; }
  92. 92. Importar archivo <ul><ul><li>Seleccionamos el fichero “animales.sql” y continuamos. </li></ul></ul><ul><ul><li>Antes de ejecutar seleccionSimple.php, no os olvidéis de verificar que los datos de la conexión son los correctos. </li></ul></ul>
  93. 93. Prepared Statements <ul><li>El anterior método (PDO->query()), está bien cuando se va a ejecutar una sentencia SQL una única vez. </li></ul><ul><li>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(). </li></ul><ul><li>La consulta solo será “preparada” una vez, pero podrá ser ejecutada tantas veces como se desee con los mismos o diferentes parámetros. </li></ul>
  94. 94. Prepared Statements (2) <ul><li>Ejemplo insercionPreparada.php: </li></ul><ul><ul><li>Probar las otras formas de inserción preparada que existen en dicho fichero descomentandolas. </li></ul></ul>$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. 95. Ejercicio favoritos <ul><li>Dar de alta una tabla en la base de datos (con la estructura que se quiera) </li></ul><ul><ul><li>Insertar elementos en la tabla </li></ul></ul><ul><li>Crear una página que tenga </li></ul><ul><ul><li>Un formulario que permita altas, bajas y modificaciones en la tabla </li></ul></ul><ul><ul><li>Un listado con los elementos de la tabla </li></ul></ul><ul><ul><ul><li>Los elementos son enlaces que, pulsados, nos llevan a la misma página, pero con el elemento seleccionado (sus datos aparecen en el formulario) </li></ul></ul></ul>
  96. 96. Ejercicio favoritos (1) <ul><li>Propuesta de tabla </li></ul>
  97. 97. Ejercicio favoritos (2) <ul><li>Propuesta interfaz </li></ul>
  98. 98. Ejercicio favoritos (3) <ul><li>Estructura </li></ul><ul><ul><li>Si quisiéramos dividir la aplicación en varias capas (en archivos y carpetas), podríamos empezar consultando aquí . </li></ul></ul><ul><ul><li>En el ejercicio dividiremos la propia página en varios &quot;bloques&quot;. </li></ul></ul><ul><li>Propuesta de estructura </li></ul><ul><ul><li>Conexión a la base de datos </li></ul></ul><ul><ul><li>Gestión de los comandos </li></ul></ul><ul><ul><ul><li>Todos los elementos de tipo &quot;submit&quot; tienen como nombre &quot;accion&quot; y como &quot;value&quot; la accion que realizan </li></ul></ul></ul>
  99. 99. Ejercicio favoritos (4) <ul><li>Propuesta de estructura (2) </li></ul><ul><ul><li>Recuperación de los datos del grupo seleccionado (si lo hay) </li></ul></ul><ul><ul><ul><li>Al seleccionar un grupo, se pasará como parámetro el código del mismo </li></ul></ul></ul><ul><ul><li>Página web en sí </li></ul></ul><ul><ul><ul><li>Formulario: si hay algún grupo seleccionado, sus valores se muestran en los componentes, se muestran los botones &quot;modificar&quot; y &quot;eliminar&quot; y se guarda el código seleccionado en un campo &quot;hidden&quot; </li></ul></ul></ul><ul><ul><ul><li>Listado: recorrido de la tabla. Cada elemento es un link a la propia página con el formato: </li></ul></ul></ul><ul><ul><ul><ul><li>&quot;gestiongrupos.php?selectedcodigo=<codigo>&quot; (ej.: gestiongrupos.php?selectedcodigo=3) </li></ul></ul></ul></ul>
  100. 100. Ejemplo práctico <ul><li>Vamos a realizar el siguiente ejemplo: </li></ul><ul><ul><li>Desde un formulario se envía un fichero con una imagen </li></ul></ul><ul><ul><li>El fichero se almacena en una base de datos </li></ul></ul><ul><ul><li>Desde un fichero php, accedemos a la base de datos, y recuperamos ficheros, para mostrarlos </li></ul></ul><ul><ul><ul><li>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 </li></ul></ul></ul>
  101. 101. Ejemplo práctico (2) <ul><li>El formulario </li></ul><ul><ul><li>Tiene que tener codificación: </li></ul></ul><ul><ul><ul><li>multipart/form-data </li></ul></ul></ul><ul><ul><li>El fichero se envía con un control “file” </li></ul></ul><ul><ul><li>El control hidden “MAX_FILE_SIZE” indica el tamaño máximo del fichero a enviar </li></ul></ul><ul><ul><ul><li>Tiene que estar ANTES del control file </li></ul></ul></ul>
  102. 102. Ejemplo práctico (3) <ul><li>Traducido a HTML... </li></ul><form enctype=&quot;multipart/form-data&quot; action=&quot;procesar_fichero.php&quot; method=&quot;post&quot;> <fieldset> <legend>Selección de ficheros</legend> <input type=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;1000000&quot; /> <label for=&quot;fichero&quot;>Selecciona el fichero (imagen jpeg): <input type=&quot;file&quot; name=&quot;fichero&quot; id=&quot;fichero&quot; /> </label> <br /> <input type=&quot;submit&quot; value=&quot;Enviar&quot; /> </fieldset> </form>
  103. 103. Ejemplo práctico (4) <ul><li>Insertar el fichero </li></ul><ul><ul><li>Hemos definido, en la tabla “FICHEROS” los siguientes campos: </li></ul></ul><ul><ul><ul><li>FIC_Codigo: autonumérico, clave primaria </li></ul></ul></ul><ul><ul><ul><li>FIC_Data: los datos de la imagen </li></ul></ul></ul><ul><ul><ul><li>FIC_Type: tipo de fichero </li></ul></ul></ul><ul><li>El fichero se encuentra en el array “$_FILES['fichero']” </li></ul><ul><ul><li>$_FILES['fichero']['name'] : nombre del fichero </li></ul></ul><ul><ul><li>$_FILES['fichero']['size'] : tamaño del fichero </li></ul></ul><ul><ul><li>$_FILES['fichero']['type'] : tipo del fichero </li></ul></ul><ul><ul><li>$_FILES['fichero']['tmp_name'] : fichero temporal </li></ul></ul>
  104. 104. Ejemplo práctico (5) <ul><li>Insertar el fichero </li></ul><ul><ul><li>Vamos a usar la función “comillas_inteligentes”: </li></ul></ul><ul><ul><ul><li>Escapa el string, y le pone comillas simples si no es un valor numérico </li></ul></ul></ul><ul><ul><ul><ul><li>Para poder meter los datos sin problemas en la sentencia SQL </li></ul></ul></ul></ul>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 = &quot;'&quot; . mysql_real_escape_string($valor) . &quot;'&quot;; } return $valor; }
  105. 105. Ejemplo práctico (6) <ul><li>Insertar fichero (2) </li></ul><ul><ul><li>Cogemos los datos de la imagen (estará en el fichero temporal), y los metemos en la base de datos </li></ul></ul>$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(&quot;insert into FICHEROS(FIC_Data,FIC_Type) VALUES(%s,%s)&quot; ,comillas_inteligentes($data) ,comillas_inteligentes($type_f) ); mysql_query($comando);
  106. 106. Ejemplo práctico (7) <ul><li>Recuperar la imagen </li></ul><ul><ul><li>Usaremos una página que recibe como parámetro el código de la imagen </li></ul></ul><ul><ul><li>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 </li></ul></ul><ul><ul><ul><li>Para ello tenemos que cambiar la cabecera HTTP “Content-type” </li></ul></ul></ul><ul><ul><ul><li>El tipo de fichero lo tenemos en la base de datos (lo hemos guardado cuando nos lo han mandado) </li></ul></ul></ul>
  107. 107. Ejemplo práctico (8) <ul><li>Recuperar la imagen </li></ul><ul><ul><li>Si llamamos a la página, por ejemplo con: </li></ul></ul><ul><ul><ul><li>.../visualizar_img.php?codigo=4 </li></ul></ul></ul><ul><ul><li>Devolverá la imagen con el código 4, si es que existe </li></ul></ul><ul><ul><ul><li>Tras recuperar los datos, los escribimos, sin más </li></ul></ul></ul>$sql_data = &quot;SELECT FIC_Data, FIC_Type FROM FICHEROS WHERE FIC_Codigo=$codigo&quot;; $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(&quot;Content-type: $tipo&quot;); echo ($datos); }
  108. 108. Índice <ul><li>Introducción </li></ul><ul><li>Fundamentos de PHP </li></ul><ul><li>Información de usuario </li></ul><ul><li>Acceso a base de datos </li></ul><ul><li>Otros </li></ul>
  109. 109. Otros <ul><li>SimpleXML </li></ul><ul><li>XTemplate </li></ul><ul><li>PHP en línea de comandos </li></ul><ul><li>PEAR </li></ul><ul><li>PHP en el IDE Eclipse </li></ul><ul><ul><li>PDT </li></ul></ul><ul><ul><li>PHPeclipse </li></ul></ul><ul><li>¿Por dónde continuar? </li></ul>
  110. 110. SimpleXML <ul><li>La extensión SimpleXML es una forma fácil y sencilla de hacer uso de documentos XML. </li></ul><ul><li>Convierte XML a un objeto SimpleXML. </li></ul><ul><ul><li>De dos maneras: </li></ul></ul><ul><ul><ul><li>Haciendo uso del constructor </li></ul></ul></ul><ul><ul><ul><ul><li>$xml = new SimpleXMLElement('prueba.xml',null,TRUE); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>$a = new SimpleXMLElement('<a><b/></a>'); </li></ul></ul></ul></ul><ul><ul><ul><li>Usando funciones </li></ul></ul></ul><ul><ul><ul><ul><li>$xml = simplexml_load_file('prueba.xml'); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>$xml = simplexml_load_string('<animales><animal raza=&quot;perro&quot;>guau</animal></animales>'); </li></ul></ul></ul></ul>
  111. 111. SimpleXML (2) <ul><li>Para los siguientes ejemplos supondremos que existe el archivo animales.xml con el siguiente contenido. </li></ul><animales> <animal raza=&quot;perro&quot;> <patas>4</patas> <clase>mammalia</clase> <longevidad>15</longevidad> </animal> <animal raza=&quot;gato&quot;> <patas>4</patas> <clase>mammalia</clase> <longevidad>16</longevidad> </animal> <animal raza=&quot;periquito&quot;> <patas>2</patas> <clase>aves</clase> <longevidad>6</longevidad> </animal> </animales>
  112. 112. SimpleXML (2) <ul><li>Para acceder a los datos, entre otros, podemos usar: </li></ul><ul><ul><li>$elem->nomElem </li></ul></ul><ul><ul><ul><li>Accedemos al elemento de nombre 'nomElem' </li></ul></ul></ul><ul><ul><ul><ul><li>Si hay varios elementos con dicho nombre, devolverá una matriz </li></ul></ul></ul></ul><ul><ul><li>$elem->children() </li></ul></ul><ul><ul><ul><li>Devuelve una lista con sus subelementos sobre la que podemos iterar </li></ul></ul></ul><ul><ul><li>$elem->attributes() </li></ul></ul><ul><ul><ul><li>Devuelve una lista con sus atributos </li></ul></ul></ul><ul><ul><ul><li>Podemos acceder a un atributo concreto: </li></ul></ul></ul><ul><ul><ul><ul><li>$elem->attributes()->nombreAtributo </li></ul></ul></ul></ul>
  113. 113. SimpleXML (3) <ul><li>Ejemplo simple de lectura </li></ul><ul><li>Explorando el XML... </li></ul>$xml = new SimpleXMLElement('animales.xml',null,TRUE); foreach ($xml->animal as $animal) { echo 'El '.$animal->attributes()->raza; echo ' (<span style=&quot;font-style:italic&quot;>'.$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. 114. SimpleXML (4) <ul><li>Modificar el XML </li></ul><ul><ul><li>$nuevoElemento = $xml->addChild('nombre'); </li></ul></ul><ul><ul><li>$nuevoElemento = $xml->addChild('nombre','valor'); </li></ul></ul><ul><ul><li>$elemento->addAttribute('nombre','valor'); </li></ul></ul><ul><li>Mostrarlo </li></ul><ul><ul><li>$xml->asXML(); </li></ul></ul><ul><ul><li>El objeto SimpleXML no facilita la escritura en un archivo </li></ul></ul><ul><ul><li>Para ver correctamente en el navegador podemos hacer uso de la función htmlentities que traduce los caracteres especiales a caracteres HTML . </li></ul></ul>
  115. 115. SimpleXML (5) <ul><li>Ejemplos de modificación </li></ul><ul><ul><li>Que SimpleXML no escriba en ficheros no quiere decir que en PHP no haya múltiples formas de hacerlo . </li></ul></ul><ul><li>Para más ejemplos, aquí . </li></ul>$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. 116. SimpleXML (6) <ul><li>Que SimpleXML no escriba en ficheros no quiere decir que en PHP no haya otras formas de hacerlo. </li></ul><ul><ul><li>La que se propone a continuación hace uso de las funciones de manejo de ficheros . </li></ul></ul>$nombre_archivo = 'animales.xml'; $contenido = $xml->asXML(); if (is_writable($nombre_archivo)) { if (!$gestor = fopen($nombre_archivo, 'w')) { echo &quot;No se puede abrir el archivo ($nombre_archivo)&quot;; exit; } if (fwrite($gestor, $contenido) === FALSE) { echo &quot;No se puede escribir al archivo ($nombre_archivo)&quot;; exit; } echo &quot;Éxito, se escribió ($contenido) al archivo ($nombre_archivo)&quot;; fclose($gestor); } else echo &quot;No se puede escribir sobre el archivo $nombre_archivo&quot;;
  117. 117. XTemplate <ul><li>XTemplate es una clase cuyo objetivo es permitir separar la vista (capa de presentación) de la lógica del script PHP. </li></ul><ul><ul><li>Almacena el HTML de forma independiente al código </li></ul></ul><ul><ul><ul><li>Podemos editar el HTML con nuestro editor preferido </li></ul></ul></ul><ul><ul><ul><li>Los programadores se dedican a lo suyo (código) y los diseñadores concentran sus fuerzas en la presentación. </li></ul></ul></ul><ul><ul><li>Podemos parametrizar el HTML, hacer bucles, etc. (para hacer dinámica la página, si no a ver para que queremos PHP... :-D) </li></ul></ul><ul><li>Se usa en muchos proyectos comerciales libres </li></ul><ul><ul><li>SugarCRM, Drupal entre otros . </li></ul></ul>
  118. 118. XTemplate (2) <ul><li>Por lo tanto, para hacer uso de XTemplate, tendremos: </li></ul><ul><ul><li>Una plantilla en base a la cual se generará el HTML final. </li></ul></ul><ul><ul><ul><li>Esta plantilla está escrita 100% en HTML. </li></ul></ul></ul><ul><ul><li>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. </li></ul></ul>
  119. 119. XTemplate (3) <ul><li>La plantilla HTML debe contener ciertos elementos: </li></ul><ul><ul><li>Secciones. </li></ul></ul><ul><ul><ul><li>Son los trozos en los que se divide la plantilla. </li></ul></ul></ul><ul><ul><ul><li>Delimitadas por: </li></ul></ul></ul><ul><ul><ul><ul><li><!-- BEGIN: nombreSeccion --> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><!-- END: nombreSeccion --> </li></ul></ul></ul></ul><ul><ul><ul><li>Pueden ser analizadas más de una vez, creando bucles. </li></ul></ul></ul><ul><ul><li>Código a reemplazar </li></ul></ul><ul><ul><ul><li>Entre corchetes </li></ul></ul></ul><ul><ul><ul><li>Cómo se verá, se pueden usar matrices con claves para hacer varias asignaciones a la vez </li></ul></ul></ul><ul><ul><ul><ul><li>Para ello en la plantilla habrá algo semejante a: {DATA.ID} y {DATA.NAME} </li></ul></ul></ul></ul>
  120. 120. XTemplate (4) <ul><li>Ejemplo: listadoUsuarios.html </li></ul><!-- 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=&quot;30%&quot;>{PERSONA.APELLIDO1}</td> <td width=&quot;30%&quot;>{PERSONA.APELLIDO2}</td></tr> <!-- END: row --> <!-- BEGIN: norow --> <tr> <td colspan=&quot;3&quot; align=&quot;center&quot;>Nada.</td></tr> <!-- END: norow --> </tbody> </table> <!-- END: table --> </body></html> <!-- END: main -->
  121. 121. XTemplate (5) <ul><li>Para usar XTemplate debemos: </li></ul><ul><ul><li>Bajarnos el código :-) </li></ul></ul><ul><ul><li>Incluir el archivo xtemplate.class.php, allá donde queramos usar sus funcionalidades </li></ul></ul><ul><ul><ul><li>require_once('PATH/xtemplate.class.php'); </li></ul></ul></ul><ul><ul><li>Crear nuestra clase XTemplate, en base al archivo en el que se incluye el HTML </li></ul></ul><ul><ul><ul><li>$xtpl = new XTemplate('listaDetalles.html'); </li></ul></ul></ul><ul><li>El archivo que nos bajemos contiene documentación y ejemplos muy ilustrativos que también se pueden encontrar en su sitio web . </li></ul>
  122. 122. XTemplate (6) <ul><li>Métodos de la clase XTemplate más importantes: </li></ul><ul><ul><li>Set null string </li></ul></ul><ul><ul><ul><li>Asignar un valor a los nulos </li></ul></ul></ul><ul><ul><ul><ul><li>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. </li></ul></ul></ul></ul><ul><ul><ul><li>$xtpl->set_null_string('-'); </li></ul></ul></ul><ul><ul><li>Assign </li></ul></ul><ul><ul><ul><li>Esencial. Sirve para asignar un valor a los elementos del HTML encerrados entre corchetes. </li></ul></ul></ul><ul><ul><ul><li>$xtpl->assign('TITULO', $titulo); </li></ul></ul></ul><ul><ul><ul><li>$xtpl->assign('PERSONA', $arrayConDatos); // asigna $array['ID'] a PERSONA.ID, $array['NAME']... </li></ul></ul></ul>
  123. 123. XTemplate (7) <ul><ul><li>Parse </li></ul></ul><ul><ul><ul><li>Analiza sintácticamente el trozo de código delimitado por <!-- BEGIN: nombre --> y <!-- END: nombre --> </li></ul></ul></ul><ul><ul><ul><li>En otras palabras, va generando el trozo correspondiente del HTML final en base a la plantilla </li></ul></ul></ul><ul><ul><ul><li>$xtpl->parse('main.table.row.cell'); </li></ul></ul></ul><ul><ul><li>Text </li></ul></ul><ul><ul><ul><li>Devuelve un string con el HTML construido por el parse. </li></ul></ul></ul><ul><ul><li>Out </li></ul></ul><ul><ul><ul><li>Imprime el HTML que se ha construido con “parse”. </li></ul></ul></ul><ul><ul><ul><li>$xtpl->out('main'); </li></ul></ul></ul><ul><ul><ul><li>Equivalente a echo $xtpl->text('main'); </li></ul></ul></ul>
  124. 124. XTemplate (8) <ul><li>Ejemplo de uso de una plantilla (listado.php): </li></ul>// 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=&quot;checked&quot;':''); $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. 125. PHP en línea de comandos <ul><li>PHP no sólo funciona junto a un servidor web. Una forma curiosa de usarlo consiste en ejecutar un script desde la consola. </li></ul><ul><li>Mirar ejemplo: scriptTiempo </li></ul><ul><ul><li>No funciona del todo bien </li></ul></ul><ul><ul><li>Es arcaico y nada óptimo </li></ul></ul><ul><ul><ul><li>Busca datos dentro de una página HTML mediante expresiones regulares y sabiendo de antemano en que línea mirar </li></ul></ul></ul><ul><ul><li>Sirve para hacerse una idea </li></ul></ul>
  126. 126. PHP en línea de comandos (2) <ul><li>Instalar el interprete para línea de comandos </li></ul><ul><ul><li>sudo aptitude install php5-cli </li></ul></ul><ul><li>Comprobar si el script tiene los permisos necesarios para ejecutarse </li></ul><ul><li>Abrimos la consola y nos ubicamos en la carpeta del script (de lo contrario bastaría con especificar su ruta el ejecutarlo). </li></ul><ul><li>Ejecutarlo </li></ul><ul><ul><li>sudo ./scriptTiempo </li></ul></ul><ul><ul><li>sudo ./scriptTiempo -a </li></ul></ul><ul><ul><li>etc. </li></ul></ul>
  127. 127. PEAR <ul><li>PHP Extensión and Application Repository promueve la reutilización de código que realizan tareas comunes </li></ul><ul><li>Objetivos: </li></ul><ul><ul><li>promover una biblioteca de código bien estructurada </li></ul></ul><ul><ul><li>mantener un sistema de distribución y mantenimiento de paquetes de código </li></ul></ul><ul><ul><li>promover un estilo de codificación estándar </li></ul></ul><ul><li>Si la funcionalidad de base que ofrece PHP es ya de por si extensa, PEAR la aumenta sustancialmente . </li></ul>
  128. 128. PEAR (2) <ul><li>Para usar alguno de los paquetes de PEAR, basta con: </li></ul><ul><ul><li>Instalar “php-pear” </li></ul></ul><ul><ul><ul><li>sudo aptitude install php-pear </li></ul></ul></ul><ul><ul><ul><li>PEAR es sistema de distribución y mantenimiento de paquetes de código que mencionábamos antes </li></ul></ul></ul><ul><ul><li>Instalar el paquete que queramos usar haciendo uso de PEAR </li></ul></ul><ul><ul><ul><li>sudo pear install <nombre_paquete> </li></ul></ul></ul><ul><ul><li>Incluirlo en el script en el que lo vayamos a usar: </li></ul></ul><ul><ul><ul><li>require_once 'nombre_paquete.php'; </li></ul></ul></ul>
  129. 129. PEAR (3) <ul><li>Ejemplo: </li></ul><ul><ul><li>Instalaremos los paquetes “ Mail ” y “ Net_SMTP ” </li></ul></ul><ul><ul><ul><li>sudo pear install Mail Net_SMTP </li></ul></ul></ul><ul><ul><li>Lo usamos: </li></ul></ul><?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 más interesante aún (si cabe).'; $obj->send($recipients, $headers, $body); ?>
  130. 130. PEAR (4) <ul><li>Lo cual nos devolverá: (porque hemos activado el modo debug) </li></ul>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 más interesante aún (si cabe). . DEBUG: Recv: 250 2.0.0 Ok: queued as 2F2F346A7E7 DEBUG: Send: QUIT DEBUG: Recv: 221 2.0.0 Bye
  131. 131. ¿Por dónde continuar? <ul><li>A continuación os enumero algunos documentos y sitios webs utiles para los que queráis continuar profundizando en PHP (espero que todos ;-) ). </li></ul><ul><ul><li>PHP5 Power Programming </li></ul></ul><ul><ul><ul><li>Libro muy completo, actualizado y encima gratuito (open publication license). Está en inglés, pero creo que puede ser un buen libro de referencia. </li></ul></ul></ul><ul><ul><li>PHP.net </li></ul></ul><ul><ul><ul><li>Dónde mejor viene cada cosa explicada. </li></ul></ul></ul><ul><ul><li>W3Schools </li></ul></ul><ul><ul><ul><li>Web muy útil: sencilla pero clarificadora. Es la suelo usar para dudas puntuales de CSS o HTML. </li></ul></ul></ul>
  132. 132. ¿Por dónde continuar? (2) <ul><ul><li>PHP Tutorials - Herong's Tutorial Notes </li></ul></ul><ul><ul><ul><li>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. </li></ul></ul></ul><ul><ul><li>Curso de la Universidad de Sevilla </li></ul></ul><ul><ul><ul><li>Bueno para reforzar cosas vistas. Trata con mayor detalle algunos de los temas básicos vistos y propone ejercicios interesantes para practicar. </li></ul></ul></ul><ul><ul><li>Desarrolloweb.com </li></ul></ul><ul><ul><ul><li>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 :-) </li></ul></ul></ul>
  133. 133. ¿Por dónde continuar? (3) <ul><ul><li>Chuleta de PHP </li></ul></ul><ul><ul><ul><li>Para recordar algunas funciones útiles del lenguaje. En este curso no las hemos visto. </li></ul></ul></ul><ul><ul><li>Y cualquiera que podáis encontrar... </li></ul></ul><ul><ul><ul><li>...si veis alguno que creáis interesante, comentadme y actualizo este documento. </li></ul></ul></ul>
  134. 134. Agur ;-) <ul><li>Para cualquier corrección, sugerencia, o comentario en general, no dudéis en poneros en contacto conmigo en: </li></ul><ul><ul><li>aitor @ twolf . eu </li></ul></ul><ul><li>Espero que os haya resultado útil el cursillo y en cualquier caso, gracias por aguantar tan pacientemente mi inexperiencia. </li></ul>

×