php_y_mysql

165
Módulo 1 Programación en PHP y Bases de datos Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web Objetivos En este primer apartado, vamos a examinar una serie de aspectos relacionados de manera general con el mundo de la programación web (servidores, lenguajes, ...), para acabar centrándonos en el lenguaje PHP Nuestros objetivos : Reconocer los diferentes lenguajes existentes para programación web. Comprender la funcionamiento general del protocolo HTTP de acuerdo al modelo cliente/servidor, ejemplificado en el caso de PHP. Instalar y configurar el software necesario tanto en Windows como en Linux para el desarrollo de aplicaciones PHP. Conocer herramientas de desarrollo. Contenidos Introducción a los lenguajes web. Servidores web: Instalación y configuración de Apache y PHP. Paquetes integrados de desarrollo: EasyPHP (Windows) y XAMPP (Windows/Linux) Instalación y configuración IDE para PHP: Maguma (Windows). Instalación y configuración IDE para PHP: Bluefish y Nvu (linux). Índice de apartados Introducci ó n a los lenguajes web Lenguajes del lado del servidor: PHP Instalaci ó n de componentes en WindowsXP Instalaci ó n de componentes en Linux Entornos de edici ó n Windows Entornos de edici ó n Linux Página 1 de 1 Programación en PHP y Bases de datos

description

program

Transcript of php_y_mysql

Page 1: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

Objetivos

En este primer apartado, vamos a examinar una serie de aspectos relacionados de manera general con el mundo de la programación web (servidores, lenguajes, ...), para acabar centrándonos en el lenguaje PHP

Nuestros objetivos :

Reconocer los diferentes lenguajes existentes para programación web. Comprender la funcionamiento general del protocolo HTTP de acuerdo al modelo cliente/servidor, ejemplificado en el caso de PHP. Instalar y configurar el software necesario tanto en Windows como en Linux para el desarrollo de aplicaciones PHP. Conocer herramientas de desarrollo.

Contenidos

Introducción a los lenguajes web. Servidores web: Instalación y configuración de Apache y PHP. Paquetes integrados de desarrollo: EasyPHP (Windows) y XAMPP (Windows/Linux) Instalación y configuración IDE para PHP: Maguma (Windows). Instalación y configuración IDE para PHP: Bluefish y Nvu (linux).

Índice de apartados

Introducción a los lenguajes web

Lenguajes del lado del servidor: PHP

Instalación de componentes en WindowsXP

Instalación de componentes en Linux

Entornos de edición Windows

Entornos de edición Linux

Página 1 de 1Programación en PHP y Bases de datos

Page 2: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

Introducción a los lenguajes web

Uno de los conceptos centrales en Internet es el de página web. Las páginas web, en tanto que documento hipermedia, se han revelado con el paso de los años como un medio de comunicación muy potente, de cuya evolución da cuenta tanto su aceptación popular en su aplicación a multitud de actividades de la vida cotidiana como, ya en lo estrictamente técnico, la variedad actual de lenguajes y tecnologías de diseño web de que disponemos.

En la actualidad nos encontramos, pues, con un gran abanico de herramientas que, más allá de dotar a las páginas web de una apariencia atractiva, son capaces de introducir un componente dinámico e interactivo que aumenta su versatilidad a la hora de atender a requerimientos más exigentes. Ésta última característica se consigue por medio de scripts programables según algún lenguaje orientado a la programación web. Hoy son nombres más que populares el Javascript / VisualScript, los CGI en Perl o C, Java, VisualNet, ASP y PHP, entre otros. Pero existen diferencias entre estas tecnologías o lenguajes mencionados.

Sin perder la idea de página web, podemos decir que en Internet podemos encontrar, de manera general, dos tipos de páginas:

las que se presentan sin contenidos "amoldables" a diferentes necesidades y sin funcionalidades más allá del hipermedia (que llamaremos estáticas). las páginas que tienen capacidades especiales y ofrecen un margen de interactividad mayor (que llamaremos dinámicas).

Páginas estáticas

Las primeras páginas son las que denominamos páginas estáticas, construidas a partir del lenguaje HTML. Para ser precisos, el HTML no es lenguaje de programación, sino más bien, se trata de un lenguaje descriptivo que tiene como objeto dar formato al texto, imágenes u otro objeto que pretendamos visualizar en el navegador (incluso, en este sentido, se hace necesaria la aportación de algún lenguaje adicional como CSS para la mejora de sus prestaciones). Estas páginas son muy sencillas de crear, aunque ofrecen pocas ventajas tanto a los desarrolladores como a los visitantes, ya que, como hemos dicho, sólo se pueden presentar textos planos acompañados de imágenes y a lo sumo contenidos multimedia como pueden ser videos o sonidos. En efecto, el lenguaje HTML no permite realizar un simple cálculo matemático o crear una página de la nada a partir de una base de datos.

Páginas dinámicas

Es esta deficiencia del lenguaje HTML la que ha hecho necesaria la introducción de otros lenguajes complementarios mucho más versátiles y de una dificultad mayor, susceptibles de dar respuesta de manera inteligente a las demandas del navegador y a la automatización de determinadas tareas tediosas e irremediables como pueden ser las actualizaciones, el tratamiento de pedidos de una tienda virtual... Estos lenguajes, capaces de recrear a partir de la implementación de ciertos "scripts", páginas automatizadas, concretan la idea de página dinámica.

Página 1 de 3Introducción a los lenguajes web

Page 3: php_y_mysql

Lenguajes de lado del servidor o del cliente

Ya en el contexto del diseño de páginas dinámicas, hemos de hacer una distinción importante: debemos distinguir entre aquellas cuyo código es interpretado en su totalidad por el cliente (es decir, el navegador) y aquellas otras en las que parte del código es preinterpretado por un servidor. Abundemos algo más en esta idea.

El navegador es una especie de aplicación capaz de interpretar el código HTML (principalmente) incluido en una página web y presentar como resultado el documento que acabamos viendo por pantalla. Cuando, por ejemplo, nosotros pinchamos sobre un enlace hipertexto, estamos realizando una petición de un fichero HTML residente en el servidor, el cual es enviado e interpretado por nuestro navegador (el cliente) a través de una comunicación mediatizada por el protocolo HTTP.

Sin embargo, si la página que pedimos está hecha con algún lenguaje de programación para generar contenidos dinámicos (no es, por tanto, únicamente un archivo HTML), el navegador será incapaz de interpretarla. En este caso, será de todo punto necesario que sea el propio servidor quien ejecute e interprete el código adicional no HTML, para luego enviarlos al cliente (navegador) en forma de un archivo HTML totalmente legible por él (en la página siguiente, volveremos sobre esta idea).

A continuación, citamos algunas de las consecuencias más significativas que obtendríamos a resultas de esta distinción:

un lenguaje de lado del cliente es totalmente independiente del servidor, lo cual permite que la página pueda ser albergada en cualquier sitio, ya que únicamente depende del navegador. un lenguaje del lado del servidor es independiente del cliente por lo que es mucho menos rígido respecto al cambio de un navegador a otro o respecto a las versiones del mismo. los scripts en lenguaje del lado del servidor son almacenados, obviamente, en éste, que es quien los ejecuta y traduce a HTML, por lo que su código queda inaccesible para el usuario, que solo recibe código HTML. Sin embargo, el código de los scripts en lenguajes de lado del cliente, sí que suele ser visualizable desde el navegador (por ejemplo, como ocurre en el caso de Javascript). aspectos como el acceso a Base de Datos o almacenamiento externo de información están reservados mayormente a lenguajes de lado del servidor.

Lenguajes de lado del cliente

Un ejemplo de lenguaje de script del lado del cliente que permite generar contenidos dinámicos sería Javascript ( o bien, su versión Microsoft, VBScript).

Este lenguaje se utiliza tanto del lado del cliente -como soporte a la interacción del usuario- como en páginas de Internet interactivas (DHTML), como del lado del servidor, dentro de las tecnologías de páginas dinámicas.

Su código se inserta dentro del código HTML de las páginas web a fin de aportar algún tipo de interactividad como pueder ser el movimiento de imágenes por la pantalla, la exposición de menús de navegación interactivos, el control del las propiedades de visulaización de objetos en el navegador, etc.; no hay casi ninguna página web que no incorpore alguna rutina en lenguaje (java)script.

En suma, los scripts en este lenguaje no generan ningún tipo de código compilado, simplemente el navegador se encarga de interpretarlo una vez se ha descargado la página HTML en el que su código es embebido en el ordenador del cliente.

Página 2 de 3Introducción a los lenguajes web

Page 4: php_y_mysql

En la siguente página estudiaremos con algo más de detenimiento los lenguajes del lado del servidor (como es el caso de PHP), en relación a la dinámica de funcionamiento del servidor que les da soporte.

Página 3 de 3Introducción a los lenguajes web

Page 5: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

Lenguajes del lado del servidor: PHP

En la página anterior acabamos hablando de lenguajes cuyo código se interpreta en el cliente. Ahora lo haremos de aquellos en los que la interpretación se hace en el servidor, previo envío de la página al cliente.

Para escribir páginas dinámicas de servidor existen varios lenguajes. Podemos citar algunos que cuentan con mayor aceptación:

Practical Extraction and Report Language ( PERL): es un lenguaje de programación desarrollado por Larry Wall (lwall at netlabs.com) inspirado en otras herramientas de UNIX. PERL es el lenguaje más utilizado para la creación de programas CGI en los servidores web. Es más rápido que los programas shell script de UNIX, puede leer y escribir ficheros binarios, y puede procesar ficheros grandes. La ventaja más importante de PERL sobre C es que PERL no necesita ser recompilado, es un lenguaje interpretado. Active Server Pages (ASP): es una tecnología del lado servidor de Microsoft para páginas web generadas dinámicamente, que ha sido comercializada como un anexo a Internet Information Server (IIS). EL estándard ASP permite poder utilitzar cualquier lenguaje para la programación, si bién Microsoft favorece que se utilice el VBScript, y en segundo término el JScript (versión del estándard Javascript hecha por Microsoft). En teoría, y mediante la programación, es posible adaptar versiones de lenguajes como Pascal, C y otros, para utilizarlos dentro de páginas ASP. Java Server Pages (JSP): es la tecnología para generar páginas web de forma dinámica en el servidor, desarrollado por Sun Microsystems, basado en scripts que utilizan una variante del lenguaje Java. La tecnología JSP, o de JavaServer Pages, es una tecnología Java que permite a los programadores generar dinámicamente HTML, XML o algún otro tipo de página web. Esta tecnología permite al código Java y a algunas acciones predefinidas ser embebidas en el contenido estático.

La principal ventaja de JSP frente a otros lenguajes es que permite integrarse con clases Java (.class) lo que permite separar en niveles las aplicaciones web, almacenando en clases java las partes que consumen más recursos así como las que requieren más seguridad, y dejando la parte encargada de formatear el documento 'html ' en el archivo jsp.

Además Java se caracteriza por ser un lenguaje que puede ejecutarse en cualquier sistema, lo que sumado a jsp le da mucha versatilidad.

Página 1 de 4Lenguajes del lado del servidor:PHP

Page 6: php_y_mysql

Hipertext Preprocesor (PHP)

PHP (acrónimo recursivo de "PHP: Hypertext Preprocessor", originado inicialmente del nombre PHP Tools, o Personal Home Page Tools) es un lenguaje de programación interpretado.

Aunque fue concebido en el tercer trimestre de 1994 por Rasmus Lerdorf no fue hasta el día 8 de Junio de 1995 que fue lanzada la versión 1.0.

Se utiliza entre otras cosas para la programación de páginas web activas, y se destaca por su capacidad de mezclarse con el código HTML. Aunque su creación y desarrollo se da en el ámbito de los sistemas libres, bajo la licencia GNU, existe además un compilador comercial denominado (Zend Optimizer).

El desarrollo del código abierto por un lado y el firme respaldo comercial por el otro, han llevado a PHP a alcanzar una popularidad más que notable. El nuevo soporte JAVA y DCOM, las avanzadas características de XML y las mejoras de la programación orientada a objetos (POO) que incorpora su última versión PHP5, han incrementado la aceptación de PHP en entornos comerciales, y lo han convertido en una herramienta viable para la programación en entornos empresariales.

Características

Posee una sintaxis semejenate de la de C. Dispone de una alta conectividad con la mayoría de Sistemas de Gestión de Bases de Datos. Es Open-Source y de obtención gratuita. Portable y multiplataforma (W95, 98, 2000, XP, NT, Unix, Linux...); lo cual permite su desarrollo desde S.O de base heterogéneos. Proporciona soporte para la mayoría de protocolos de comunicación de Internet (HTTP, IMAP, FTP, LDAP, INMP...). Desde su versión 4, incorpora la posibilidad de desarrollar según la metodología de orientación a objetos, si bien es desde la versión 5 cuando todos los conceptos de este paradigma están disponibles .

Funcionamiento cliente/servidor en PHP

En este punto queremos reincidir en algo ya comentado en la página anterior. Nos referimos al funcionamiento del servidor y su interpretación del código PHP, a cada solicitud de un cliente.

La siguiente figura ilustra el proceso de comunicación petición/respuesta de una página PHP por parte de un cliente a un servidor de HTTP como Apache.

Página 2 de 4Lenguajes del lado del servidor:PHP

Page 7: php_y_mysql

Figura 1. Esquema de comunicación cliente/servidor

El proceso, por tanto, seguiría los siguientes pasos:

El cliente (navegador) envía una solicitud a través de HTTP (por ejemplo, una página "ejemplo.php") al servidor web.

Figura 2. Solicitud de página por parte del cliente

El servidor web reacciona, lee el código del script pone en funcionamiento el intérprete de PHP para que convierta en HTML el código PHP existente (como el servidor es el único que ejecuta el código, el cliente nunca podrá verlo, a lo sumo puede observar el resultado en HTML).

Un código PHP (en negrita) de una página, embebido en HTML, podría ser éste ...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Ejemplo funcionamiento cliente/servidor_PHP</title> </head>

<body> <h2> Ejemplo de funcionamiento cliente/servidor en PHP</h2>

<?php

Página 3 de 4Lenguajes del lado del servidor:PHP

Page 8: php_y_mysql

$dia_num = date('d'); $dia_nom = date('l'); $mes = date('F'); $anyo = date('Y');

echo "<br> Today is <b>$dia_num $dia_nom, $mes of $anyo </b>";

?>

</body> </html>

... del cual, una vez interpretado por el servidor, obtendríamos finalmente una página de código HTML ...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Ejemplo funcionamiento cliente/servidor_PHP</title> </head>

<body> <h2> Ejemplo de funcionamiento cliente/servidor en PHP</h2> <br> Today is <b>09 Tuesday, August of 2005 </b>

</body> </html>

... que sería enviada por éste como respuesta al cliente y visualizada en su navegador.

Figura 3. Respuesta por parte del servidor y su resultado en el cliente.

Página 4 de 4Lenguajes del lado del servidor:PHP

Page 9: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

Instalación de componentes en Windows XP

En esta página y siguientes vamos a exponer el procedimiento de instalación y configuración del software necesario para el desarrollo de páginas web en Windows y en Linux (ya que presentan, como puede imaginarse, dinámicas de funcionamiento diferentes).

Más en concreto, instalaremos:

Un servidor web (Apache) El intérprete PHP (lenguaje de programación) El MySQL (Servidor de Bases de Datos)

Instalación en Windows XP

El proceso de instalación en Windows puede acometerse de 2 maneras (también, cabe decir, en Linux):

una rápida y sencilla: supone instalar alguno de los paquetes integrados de aplicaciones que automatizan y ajustan todas las herramientas necesarias para ponerse a trabajar.

otra manual y más laboriosa: supone la instalación y configuración separada de cada componente, que en el caso de Windows no abordaremos, pero sí en el de Linux.

Instalación rápida Dentro de la enorme variedad de paquetes existentes (Foxserv, Nusphere, Appserv), aconsejaremos la instalación de uno de estos dos:

EasyPHP XAMPP

Tras un simple proceso de instalación, en el que en este caso no nos vamos a detener, XAMPP ofrece un entorno mínimo mediante el cual podemos controlar cada uno de los servicios que son instalados:

Página 1 de 11Instalación de componentes en WIN XP

Page 10: php_y_mysql

Figura 1. XAMPP en Windows

Como se puede apreciar a partir de la imagen, podemos controlador la actividad tanto del servidor Apache, como del de MySQL, como también el del FTP (FileZillaFTP) y de correo (Mercury). Pulsando en el botón "Explore", accederemos a la carpeta (htdocs) donde se alojan todos los scripts que creemos.

Pero vamos a detenernos a explicar pormenorizadamente la instalación de EasyPHP.v.1.8 .

Este paquete instala los siguientes componentes:

servidor Apache 1.3.27 PHP 4.3.3 MySQL 4.0.15 phpMyAdmin 2.5.3

Instalación de EasyPHP.v.1.7 Una vez hayamos descargado el paquete desde la web de EasyPHP, lanzamos el fichero de instalación y se nos mostrará la pantalla de selección de idioma durante la instalación.

Página 2 de 11Instalación de componentes en WIN XP

Page 11: php_y_mysql

Figura 2. Pantalla 1 de instalación de EasyPHP

En la siguiente pantalla, aparece el mensaje de bienvenida. Pulsamos en "Següent".

Figura 3. Instalación de EasyPHP

A continuación, se nos muestran las pantallas de aceptación de la licencia. La aceptamos y seguimos con la pulsación en "Següent".

Página 3 de 11Instalación de componentes en WIN XP

Page 12: php_y_mysql

Figura 4. Instalación de EasyPHP

Figura 5. Instalación de EasyPHP

En las siguientes pantallas, elegimos el punto de instalación del software en nuestro sistema y el nombre que daremos al acceso directo:

Figura 6. Instalación de EasyPHP

Página 4 de 11Instalación de componentes en WIN XP

Page 13: php_y_mysql

Figura 7. Instalación de EasyPHP

Una vez introducidos estos datos, continuaremos con la instalación:

Figura 8. Instalación de EasyPHP

Página 5 de 11Instalación de componentes en WIN XP

Page 14: php_y_mysql

La siguiente pantalla nos avisará de la correcta finalización del proceso de instalación:

Figura 9. Instalación de EasyPHP

A continuación, se lanzará un pequeña aplicación residente, desde la cual podemos controlar los servicios instalados y otras opciones que ofrece este paquete. Al igual que en XAMPP, podemos lanzar o parar los servidores de Apache y MySQL.

Figura 10. Instalación de EasyPHP El botón con una especie de gran "e" a la parte izquierda, nos da acceso mediante un menú a un conjunto de opciones a través de las cuales podemos visualizar los "logs" - ficheros de configuración, extensiones instaladas en PHP, etc... (ver más abajo)

Página 6 de 11Instalación de componentes en WIN XP

Page 15: php_y_mysql

Figura 11. Instalación de EasyPHP

En concreto, la opción de "Administración" abre en el navegador una página incluida en el paquete que nos permite acceder a cierta información sobre el software instalado. Veamos ahora las opciones disponibles con más detalle.

Figura 12. Instalación de EasyPHP

Opciones del menú EasyPHP.

Página 7 de 11Instalación de componentes en WIN XP

Page 16: php_y_mysql

Una vez comprobemos que los servidores están en funcionamiento (los iconos con los semáforos aparecerán en verde), pasamos a examinar las opciones disponibles:

Ayuda : lleva a algunos enlaces con ayuda sobre como opera 'EasyPHP', como comenzar con PHP o bien como llegar a las FAQ de EasyPHP.

Figura 13. submenú de "Ayuda"

Ficheros 'log' : nos permite ver el contenido de los ficheros ".log" del Apache y del MySQL; estos recogen las incidencias que se producen en el funcionamento y son, por tanto, muy útiles a la hora de buscar los posibles problemas de funcionamento que puedan surgir.

Configuración : da acceso a un submenú desde el cual podemos acceder a los ficheros de configuración o bien a las bases de datos (ver figura 2).

Subopciones: Apache: accedemos, con el "Bloc de Notas" del Windows, al fichero 'httpd.conf ', que contiene todas las directivas de configuración del servidor web Apache.

Extensiones PHP: con esta opción se abre un cuadro donde se listan las extensiones (bibliotecas) disponibles de PHP y su estado, esto es, si están instalados o no. Con vista a las prácticas posteriores, podemos activar ya la opción correspondiente a la biblioteca gráfica GD (php_gd2).

Figura 14. submenú de "Configuración"

PHP : esta opción solo está disponible con los servidores parados. Abre, con el

Página 8 de 11Instalación de componentes en WIN XP

Page 17: php_y_mysql

"Bloc de Notas ", el fichero de configuración del PHP (php.ini).

MySql: abre el fichero de configuración del servidor de base de datos. Este fichero se llama "my.ini" y se encuentra en la carpeta c:\windows.

PhpMyAdmin: abre el navegador con la aplicación de gestión de las bases de datos PHPMyAdmin (y no el fichero "config.inc.php" , que es el que contiene su configuración).

EasyPHP: da acceso al cuadro de configuración de 'EasyPHP' que hemos visto antes con información del estado de funcionamento y control de 'EasyPHP'.

"Iniciar EasyPHP al iniciar el Windows (solo administradores)" . Hará que automáticamente se ejecute 'EasyPHP' al iniciarse el Windows. "Iniciar servidores cuando esta aplicación se haya iniciado" . Inicia los servidores al mismo tiempo que 'EasyPHP' se ejecuta. "Comprobar nuevas versiones al inicio del sistema". Comprobación de la existencia de nuevas versiones de 'EasyPHP' cada vez que se inicia. "Uso automática de las modificaciones al configurar el servidor". En el caso de modificar los ficheros de configuración 'httpd.conf o my.ini', el sistema reinicia los servidores, para cargar los nuevos valores configurados.

Explorar: permite ver el contenido del directorio raíz de nuestro servidor (www).

Administración: esta opción nos redirecciona a la página de administración de EasyPHP, http://localhost/home/.

Web local: pinchando sobre esta opción se abrirá el navegador con la página inicial, por defecto, de nuestro servidor web. Más abajo haremos un comentario. Si el servidor está parado, esta opción no se puede seleccionar.

Reiniciar: permite parar y volver a lanzar el servidor. Recordemos que si hacemos cambios en la configuración del servidor hay que volver a ponerlo en marcha. Si el servidor esta parado, esta opción no está, obviamente, disponible.

Iniciar/Parar: esta opción no necesita comentario.

Poniendo a prueba a EasyPHP

El servidor Apache está accesible localmente por medio de las direcciones http://localhost/ o http://127.0.0.1/.

Si el ordenador en el cual se ha efectuado la instalación forma parte de una red, se puede acceder a la página inicial de vuestro servidor desde otra máquina, que actuará como cliente. Habría que introducir desde el ordenador cliente cualquiera de esta dos direcciones:

http://nombre_del_servidor/ (nombre de red del servidor) http://dirección_ip_servidor/ (dirección IP del servidor)

Comprobemos ahora el correcto funcionamiento PHP.

Para ello, podemos acceder a la opción "Administración" de "EasyPHP", que nos llevará a la dirección http://localhost/home/ y (o bién http://127.0.0.1/home/) accederemos a la página de administración de EasyPHP.

Una vez allí, en el apartado de "PHP 4.3.10" y uno de sus enlaces con el nombre "PHPINFO". Esta enlace ejecuta un script que contiene una llamada a la función de PHP llamada phpinfo() , la cual devuelve información sobre la configuración, versión del PHP instalado, sistema

Página 9 de 11Instalación de componentes en WIN XP

Page 18: php_y_mysql

operativo, servidor sobre el cual corre, extensiones instaladas, variables del servidor, etc... Si esta pantalla se carga sin problemas, sabremos que el Apache ha interpretado correctamente su código PHP.

Figura 15. "phpinfo" en ejecución Si surgen problemas con el EasyPHP

Si, una vez hecha la instalación, el EasyPHP no acaba de funcionar bien, podría suceder alguna de estas cosas:

> Instalaciones previas.

Comprueba que no existen versiones anteriores instaladas de 'EasyPHP' o de algún otro paquete (AppServ, FoxServ, etc.) o de alguno de sus componentes (Apache, Mysql). Por ejemplo, el puerto que utiliza el servidor Apache es el 80, si éste ya está siendo utilizado habría que escoger otro. Con la aplicación tcpview se pueden consultar cuáles son los puertos utilizados en un momento dado.

> Cortafuegos o firewalls.

Si existe un cortafuegos en el sistema (muy probable en el caso de tener como S.O un Windows XP) conviene asegurarse que éste no tiene los puertos que necesitamos para nuestros servicios cerrados.

Página 10 de 11Instalación de componentes en WIN XP

Page 19: php_y_mysql

> Apache y MySQL como servicio.

Puede darse el caso que Apache no arranque y no se esté produciendo ninguna de las causas anteriores. Una posible solución al problema consiste en seleccionar la opción "Iniciar los servidores como un servicio (solo administradores)" en el cuadro de configuración de EasyPHP que hemos comentado anteriormente. De esta manera tanto Apache como MySql operarán como a un servicio de Windows más.

> FAQ de EasyPHP

Por último, añadir que puede encontrarse más información de ayuda en el FAQ de EasyPHP.

Página 11 de 11Instalación de componentes en WIN XP

Page 20: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

Instalación de componentes en Linux (Lliurex)

Al igual que en Windows necesitaremos instalar los tres servicios que en el punto anterior se detallaron: el servidor web (Apache), el intérprete de PHP, y el servidor de bases de datos (MySQL).

Instalación en Linux (Lliurex) El proceso de instalación en linux puede acometerse de 2 maneras:

Paquete integrado: supone instalar alguno de los paquetes integrados de aplicaciones que automatizan y ajustan todas las herramientas necesarias para ponerse a trabajar.

Instalación de paquetes: supone la instalación y configuración separada de cada componente, pero es la forma más eficiente y adecada de hacerlo en linux.

Instalación del paquete integrado Hemos seleccionado XAMPP como paquete integrado. Instalaremos en Lliurex este paquete y veremos como comprobar que todo esta listo para empezar a trabajar.Solo necesitamos 4 pasos para realizar la instalación del paquete integrado:Paso 1: Descargar el paquete de la siguiente página:

http://www.apachefriends.org

Seleccionaremos el sistema operativo y la versión a descargar, el fichero a descargar se llama xampp-lij¡nux-1.4.15.tar.gz y ocupa 39 MB. Este paquete instalará los siguientes componentes (entre muchos otros):

Apache 2.0.54 PHP 5.0.4 MySQL 4.1.13 phpMyAdmin 2.6.3-PL1

Paso 2: Descomprimir el archivo.

Abrir un terminar de linux como administrador root: su. Extraer el archivo al directorio /opt:

tar xvfz xampp-linux-1.4.15.tar.gz -C /opt

Ahora XAMPP ya está instalado en el directorio /opt/lampp.

Página 1 de 15Instalación de componentes en Linux

Page 21: php_y_mysql

Paso 3: Poner en marcha. Para ello solo hay que ejecutar la siguiente sentencia:

/opt/lampp/lampp start

Si todo ha funcionado correctamente veremos la siguiente pantalla:

Figura 1. Start de XAMPP.

Apache, el interprete de PHP y MySQL estan en marcha.

Paso 4: Comprobación. Todo ha sido bastante sencillo, pero debemos comprobar que realmente todo funciona. Para ello, en nuestro navegador teclear la siguiente dirección:

http://localhost

Ahora debemos ver la página principal de XAMPP que contiene algnunos enlaces para comprobar el software instalado y algunos pequeños programa de ejemplo.

Página 2 de 15Instalación de componentes en Linux

Page 22: php_y_mysql

Figura 2. Página de Bienvenida de XAMPP.

Una vez comprobado que Apache sirve la página principal de XAMPP podemos ver que software ha instalado y si lo ha instalado correctamente, pulsamos sobre la opción status y veremos la siguiente pantalla:

Página 3 de 15Instalación de componentes en Linux

Page 23: php_y_mysql

Figura 3. Status de XAMPP.

Se puede comprobar que MySQL y PHP estan activados. Y podemos llamar a otra herramienta, muy útil, que veremos más adelante como es phpMyAdmin.

Página 4 de 15Instalación de componentes en Linux

Page 24: php_y_mysql

Figura 4. Herramientas de XAMPP.

En el apartado de "Demos" podemos ejecutar un pequeño programa phpinfo() que nos muestra información sobre la configuración, versión del PHP instalado, sistema operativo, servidor sobre el cual corre, extensiones instaladas, variables del servidor, etc ... Si esta pantalla se carga sin problemas, sabremos que el Apache ha interpretado correctamente su código PHP.

Instalación de componentes en Linux (Lliurex)

Algunos de los parámetros para poner en marcha XAMPP son los siguientes:

Parámetros Descripción

start Comienza XAMPP.

Página 5 de 15Instalación de componentes en Linux

Page 25: php_y_mysql

stop Para XAMPP.

restart Para y comienza XAMPP.

startapache Comienza solo Apache.

startmysql Comienza solo MySQL.

stopapache Para Apache.

stopmysql Para MySQL.

Configuración: para poder cambiar la configuración de cada uno de los servicios instalado es necesario conocer, donde están sus ficheros de configuración, en la tabla siguiente se muestra esta información:

Fichero Directorio contenido

/opt/lampp/bin/ Comandos de XAMPP, por ejemplo el monitor de MySQL.

/opt/lampp/htdocs/ Documentación de Apache.

/opt/lampp/etc/httpd.conf Configuración de Apache.

/opt/lampp/etc/my.cnf Configuración de MySQL.

/opt/lampp/etc/php.ini Configuración de PHP.

/opt/lampp/phpmyadmin/config.inc.php Configuración de phpmyadmin.

Para parar XAMPP simplemente debemos escribir el siguiente comando:

/opt/lampp/lampp stop

Y podremos ver:

Stopping LAMPP 1.4.15... LAMPP: Stopping Apache... LAMPP: Stopping MySQL... LAMPP stopped.

Para desinstalar el paquete debemos escribir: rm -rf /opt/lampp

Instalación de paquetes.

Para explicar el procedimiento de instalación de paquetes, partiremos de una instalación reciente de "Lliurex" en disco duro y utilizaremos Synaptic para seleccionar e instalar los paquetes instalados. Necesitaremos tener una conexión a internet configurada y funcionando.

Podemos encontrar el gestor de paquetes sysnaptic, en las herramientas del sistema del menú "Aplicaciones".

Lo primero que haremos es comprobar que repositorios tenemos por defecto. En el menú superior, opción de "configuración", aparece un submenú con el nombre repositorios, si

Página 6 de 15Instalación de componentes en Linux

Page 26: php_y_mysql

pulsamos obtendremos la siguiente pantalla:

Figura 5. Repositorio Lliurex.

Pulsaremos sobre el botón Nuevo y daremos de alta un nuevo repositorio, estos son los datos del nuevo repositorio.

Figura 6. Nuevo repositorio Debian.

Después de pulsar el botón de aceptar, pediremos al gestor que recarge la lista de paquetes conocidos, botón recargar, esta función tardará más o menos tiempo dependiendo de la

Página 7 de 15Instalación de componentes en Linux

Page 27: php_y_mysql

conexión a internet que tengamos.

Si realizamos una búsqueda, botón buscar, de paquetes que contengan la palabra "Apache2", podremos seleccionar los paquetes para instalar. Para seleccionar un paquete, situarse encima de él, pulsar el botón derecho del ratón y seleccionar marcar para instalación. La mayoría de la veces la selección de un paquete conlleva la selección de otros.Estos son los paquetes que debén quedar selecionados:

Figura 7. Paquetes seleccionados para el servidor Apache2.

Después de pulsar el botón Aplicar el gestor de paquetes se conectará con el repositorio e instalará los paquetes seleccionados:

Página 8 de 15Instalación de componentes en Linux

Page 28: php_y_mysql

Figura 8. Descarga e instalación de paquetes.

El mismo procedimiento seguiremos con el servidor de bases de datos Mysql y el interprete de php, a continuación se muestran los paquetes que deben ser instalados en ambos casos:

Página 9 de 15Instalación de componentes en Linux

Page 29: php_y_mysql

Figura 9. Paquetes seleccionados para el servidor MySQL.

Página 10 de 15Instalación de componentes en Linux

Page 30: php_y_mysql

Figura 10. Paquetes seleccionados para el interprete de PHP.

Una vez comprobado que tenemos todos los paquetes instalados (realizar la comprobación), comprobaremos que funcionan los servidores. Comenzaremos por el servidor web: Apache2. Para comprobar el funcionamiento tan solo tenemos que abrir un navegador y escribir la siguiente dirección http://localhost, si funciona el servidor web obtendremos la siguiente pantalla:

Figura 11. Comprobación de que Apache2 funciona.

Página 11 de 15Instalación de componentes en Linux

Page 31: php_y_mysql

Para comprobar que tenemos el servidor de bases de datos funcionando, tan solo tenemos que abrir una terminal como root y ejecutar el comando "mysql", obtendremos la siguiente pantalla:

Figura 12. Comprobación de que MySQL funciona.

Salir escribiendo el comando "exit". Por último para comprobar que el servidor web interpreta código php, ejecutaremos un pequeño programa que muestra las variables de php. El fichero es el siguiente phpinfo.php. Bajar el fichero, alojarlo en "/var/www/" y con el navegador cargar la siguiente dirección:

http://localhost/phpinfo.php Si todo ha funcionado correctamente, obtendremos la siguiente pantalla:

Página 12 de 15Instalación de componentes en Linux

Page 32: php_y_mysql

Figura 13. Comprobación de que el interprete de php funciona.

Configuración de la sección parámetros globales del fichero Httpd.conf (serrvidor web Apache).Todos los parámetros que se establecen dentro de esta sección son globales para el funcionamiento del servidor, por lo que no admiten estar dentro de ninguna directiva.

Para el caso de apache2, el fichero de configuración se denomina apache2.conf, y a diferencia del tradicional httpd.conf tiene modulos de configuración en ficheros externos que se incluyen.

ServerRoot: especifica la ubicación del directorio raíz donde se encuentra instalado el Apache, a partir del cual se crea el árbol de directorios comentado anteriormente. Esta directiva no debería cambiar a no ser que se mueva la carpeta de instalación de apache a otro directorio. Se encuentra disponible a través del módulo Core.

TimeOut: el valor se utiliza para configurar, medido en segundos, tres parámetros:

El tiempo tal que puede tardar una petición en ser recibida entera. La cantidad de tiempo que espera entre recepción de paquetes TCP. La cantidad de tiempo entre ACK's en transmisiones TCP.

Pasado este tiempo se produce un mensaje de error en el que se indica que se ha consumido el tiempo máximo de espera. Establecer un valor muy pequeño puede dar lugar a que los usuarios reciban este mensaje de error, y establecer un valor muy pequeño dará lugar a una sobrecarga de la máquina. Se encuentra disponible a través del módulo Core.

KeepAlive: especifica si se utilizarán conexiones persistentes, es decir, que todas las peticiones de un usuario se atenderán con la misma conexión. Se encuentra disponible a través del módulo Core.

MaxKeepAliveRequests: número máximo de conexiones persistentes. (número máximo de usuarios concurrentes si KeepAlive esta en ON). Para establecer este parámetro, hay que tener en cuenta el ancho de banda de salida de nuestro servidor, por el cual deberá ser enviada toda la información, si se establece un valor muy grande respecto al ancho de banda, el tiempo de respuesta se verá incrementado para cada usuario. Se encuentra disponible a través del módulo Core.

KeepAliveTimeout: tiempo que espera en segundos entre peticiones de un usuario, antes de considerar que este ha terminado, y cerrar su conexión.

Si el valor es muy pequeño provocará que algunos usuarios no puedan visualizar la página debido a que el número máximo de conexiones persistentes se ha superado, mientras que si se establece un valor muy grande se estarán utilizando muchos recursos de la máquina. Se encuentra disponible a través del módulo Core.

Listen: esta directiva permite especificar que puerto se utilizará para atender las peticiones. Por defecto se utiliza el puerto 80 (www), también permite especificar que direcciones IP atenderá, por defecto todas. Para atender dos direcciones IP distintas, con distintos puerto, se utilizaría:

Listen 192.168.255.5:80 Listen 192.168.255.8:8080

Se encuentra disponible a través de varios módulos beos, leader, mpm_winnt,

Página 13 de 15Instalación de componentes en Linux

Page 33: php_y_mysql

mpmt_os2, perchild, prefork, threadpool ó worker

LoadModule: Directiva que sirve para cargar módulos que incluyen distintas funcionalidades. La sintaxis es:

LoadModule nombreModulo ubicacionFichero

Se encuentra disponible a través del módulo mod_so.

Descripción de las directivas de funcionamiento.

Esta es la sección principal de configuración del servidor, en ella podemos encontrar las siguientes opciones:

ServerAdmin: especifica la dirección de correo electrónico del administrador, esta dirección aparece en los mensajes de error, para permitir al usuario notificar un error al administrador. No puede estar dentro de ninguna sección. Se encuentra disponible a través del módulo Core.

ServerName: especifica el nombre y el puerto que el servidor utiliza para identificarse, normalmente se determina automáticamente, pero es recomendable especificarlo explícitamente para que no haya problemas al iniciar el servidor. Si el servidor no tiene un nombre registrado en las DNS, se recomienda poner su número IP. No puede estar dentro de ninguna sección.

La sintaxis es:

ServerName direccionIP:Puerto p.e. ServerName localhost:80

Se encuentra disponible a través del módulo Core.

DocumentRoot: la carpeta raíz que se ubica en el servidor, desde la que se servirán los documentos. Por defecto, todas las peticiones, tendrán como raíz esta carpeta, a no ser que se utilicen alias (directorios virutales en IIS)

Por defecto, la carpeta raíz suele estar en la carpeta "/var/www/" o en la carpeta htdocs, que se encuentra en la carpeta de instalación de Apache. No puede estar dentro de ninguna sección.

Si se cambia este directorio por otro, es muy importante que se ponga el nuevo valor, no solo en esta línea, sino también en la sección "<Directory>" en la que se establecen los parámetros de configuración de este directorio.

Esta línea empieza por "<Directory> " seguido de la carpeta raíz que originalmente hay en DocumentRoot.

Se encuentra disponible a través del módulo Core.

DirectoryIndex: especifica el fichero por defecto que buscará en cada directorio, en caso de que no se especifique ninguno. Por defecto es index.html. Es decir, que si por ejemplo se pone en el navegador: www.desarrolloweb.com el servidor por defecto servirá www.desarrolloweb.com/index.html

En esta directiva se pueden especificar más de un fichero, la sintaxis es la siguiente:

DirectoryIndex fichero1 fichero2 fichero3

El orden con el que se especifica el nombre de fichero determinará la prioridad a la hora de decidir que fichero es el que se muestra.

Página 14 de 15Instalación de componentes en Linux

Page 34: php_y_mysql

La directiva se puede encontrar fuera de cualquier sección, dentro de una sección o dentro de un fichero ".htaccess".

Se encuentra disponible a través del módulo mod_dir.

AccessFileName: es el nombre del fichero de configuración que se buscará en cada uno de los directorios del servidor para conocer la configuración del mismo. Este fichero permite configurar el comportamiento de cada uno de los directorios individualmente. Para que esta configuración funcione, la directiva AllowOverride tiene que tener un valor que lo permita. No puede estar dentro de ninguna sección.

El nombre de fichero que se especifica por defecto es el del fichero ".htaccess".

Como medida de seguridad, la configuración del Apache establece que no se muestre la existencia de este fichero a ningún usuario, aunque este establecida la opción de listado de directorios. Si se decide cambiar el nombre, habrá que redefinir la seguridad para que no se muestre el contenido del nuevo fichero. Esto se hace en el fichero httpd.conf en una sección File como la que se presenta a continuación en la que se establece que todos los ficheros que comiencen por .ht no se mostrarán.

<Files ~ "^\.ht"> Order allow,deny Deny from all </Files>

Se encuentra disponible a través del módulo Core.

Página 15 de 15Instalación de componentes en Linux

Page 35: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

En este apartado queremos referirnos a las diferentes opciones existentes en la actualidad para el desarrollo de scripts en PHP. Estos entornos facilitan el desarrollo del código, su depuración, etc.

A continuación, ofrecemos un pequeño listado de diferentes soluciones de software libre/propietario tanto para Windows como para Linux, para pasar posteriormente a explicar la instalación, a modo de ejemplo, veremos un entorno para Windows (Maguma) y en Linux (Bluefish y Nvu) en el siguiente apartado del tema.

Índice:

Entornos de edición para PHP

Maguma Open Studio PHP (Windows) Bluefish editor (Linux) Nvu versión 1.0 (linux)

En la web cyberzoide.developpez.com puede encontrarse una exhaustiva compartiva de herramientas de edición para PHP.

Entornos de edición para PHP

Entornos de edición:

Dreamveawer MX2004: el programa de edición web para Windows por excelencia. En su última versión dispone de una barra de accesos rápidos a funciones para PHP (también para otros lenguajes). Incorpora función de autocompletar, colorea el código, etc.

Figura 1. Barra de herramientas de PHP en Dreamveawer

HTMLKit: un editor de HTML para Windows con conectores (plug-in) para PHP, coloración de código, ayuda del PHP integrable y con una amplia comunidad de usuarios. Quanta Plus: editor para Linux (KDE) con buenas prestaciones. HAPedit: entorno de desarrollo para Windows de código abierto, gratuito y modular.

Página 1 de 10Entornos de desarrollo.

Page 36: php_y_mysql

Colorea HTML, PHP, ASP, JavaScript, CSS, SQL. Compilación de código PHP, integración de la documentación oficial de PHP, gestión de proyectos, cliente FTP, etc. Anjuta DevStudio: editor para Linux (Gnome) con coloración de código, función de autocompletar, etc. Maguma Studio PHP : versión de código abierto para Windows de este IDE. Presenta coloración del código, gestión de proyectos, ejecución de scripts desde el mismo entorno, etc. Instalaremos este software a continuación.

Maguma Open Studio PHP (Windows)

El programa se puede conseguir desde la web http://www.maguma.com , entrando en su sección "Products". El programa es gratuito en su versión "Open Studio", pero se nos informa que pagando 19€ se tiene la posiblidad de adquirir la versión "Pro", que incluye un gestor CVS y un "sistema de ventanas especial".

La descarga del programa puede efectuarse por dos vías:

1) desde la misma página, previo registro como usuario

2) accediendo a "Sourceforge.net" , tal y como aparece en uno de los enlaces disponibles.

Una vez dispongamos del fichero instalador, procederemos con la instalación:

Figura 2. Instalación de Maguma Open Studio (1)

Pulsamos en "Next" en esta primera pantalla de bienvenida, para pasar a la pantalla de la licencia, la cual aceptaremos, y acabar pulsando nuevamente en el botón "Next".

Página 2 de 10Entornos de desarrollo.

Page 37: php_y_mysql

Figura 3. Instalación de Maguma Open Studio (2)

En la siguiente pantalla (figura 3) se nos pregunta acerca de aquellos componentes de apoyo que deseamos instalar. Marcamos las dos primeras casillas que instalarán manuales de consulta para HTML, CSS y PHP.

El tercer componente permite instalar un debugger para la corrección de código previa compilación (se deja al alumno la opción de hacerlo y probarlo).

Página 3 de 10Entornos de desarrollo.

Page 38: php_y_mysql

Figura 4. Instalación de Maguma Open Studio (3)

En la siguiente pantalla, se nos ofrece la posibilidad de seleccionar la carpeta de destino para Maguma:

Figura 5. Instalación de Maguma Open Studio (4)

Acto seguido, tenemos la posiblidad de confirmar la creación de iconos de acceso directo al

Página 4 de 10Entornos de desarrollo.

Page 39: php_y_mysql

programa en el Escritorio o en la barra de accesos rápidos y, por otro lado, de asociar las extensiones de ficheros tipo PHP a Maguma .

Figura 6. Instalación de Maguma Open Studio (5)

Y, por último, se nos da un informe de todo aquello que va a instalarse. Pulsando en el botón "Install", procederemos con la instalación.

Página 5 de 10Entornos de desarrollo.

Page 40: php_y_mysql

Figura 7. Instalación de Maguma Open Studio (6)

Si todo ha ido bien, se nos mostrará una última pantalla en la que se nos confirmará la finalización del proceso de instalación:

Figura 8. Instalación de Maguma Open Studio (6)

Configuración de Maguma Open Studio PHP

Una vez instalado, lo primero que debemos hacer es acudir a la opción "Preferences" dentro del menú "View" para hacer algunos ajustes generales.

Página 6 de 10Entornos de desarrollo.

Page 41: php_y_mysql

Figura 9. Menú de preferencias en Maguma Open Studio

En la parte izquierda de la ventana, tenemos las diferentes categorías sobre las que realizar ajustes. En nuestro caso, comentaremos solo las básicas al objeto de hacer el entorno operativo.

Desde el apartado "PHP Parsing", indicaremos a Maguma cómo utilizaremos el PHP. Ya que tenemos un servidor web instalado, elegimos la segunda opción "Using an existing websever".

Figura 10. Menú de preferencias en Maguma Open Studio

Página 7 de 10Entornos de desarrollo.

Page 42: php_y_mysql

A continuación, pasamos a la opción "PHP Interpreter" en la introduciremos la ruta al intérprete de PHP.

Figura 11. Menú de preferencias en Maguma Open Studio

Y, por último, indicaremos en la opción "Server Settings" la ruta de la carpeta "htdocs" (carpeta en la que vamos depositando todas las páginas PHP que desarrollemos).

Página 8 de 10Entornos de desarrollo.

Page 43: php_y_mysql

Figura 12. Menú de preferencias en Maguma Open Studio

Con los ajustes previos, garantizamos la operatividad básica con el entorno. Ajustes secundarios, que dejamos a elección del alumno, serían, por ejemplo, la definición de colores distintivos para el código (opción "Colors" en "Editor"), la definición de combinación de teclas de acceso rápido (opción "Editor Keys" en "Editor"), la definición de macros (a partir de la opción "Autocomplete" en "Editor") o la activación/desactivación y configuración de la aparición de información automática sobre la sintaxis de las funciones de PHP en la escritura de código (opción "Function Insight " en "Editor").

Funcionamiento.

Por último, por lo que a Maguma se refiere, comentaremos algún aspecto sobre el entorno de edición.

Vistas

Tenemos acceso a tres "vistas" diferentes, a las cuales podemos acceder mediante las pestañas superiores:

Editor View: es la ventana de trabajo. Internal Preview: es una ventana de previsualización interna desde la cual podemos ver el resultado de ejecutar el script sin tener que recurrir al navegador (en el caso, por ejemplo, de estar usando formularios, esta opción no funcionará correctamente). External Preview: pulsando sobre esta pestaña accederemos al navegador que tengamos definido por defecto en el Windows.

Página 9 de 10Entornos de desarrollo.

Page 44: php_y_mysql

Ventana flotante (Tool Box).

En esta ventana , podemos encontrar informaciones diversas (Toolbox, información sobre las clases, Snnipet Library, etc.).

Figura 13.Ventana flotante

En la figura anterior se muestra la "Snippet Library". Si seleccionamos la macro "do connect", se generará el código necesario para una conexión a la Base de Datos MySQL, de la cual hablaremos en apartados posteriores. El contenido de esta ventana viene dado por la selección hecha en el menú "View".

Algunas características reseñables.

Revisión de la sintaxis mientras se escriben palabras reservadas de PHP. Ayuda "en línea" que agiliza la escritura de código. Posibilidad de definir "puntos de ruptura" (disponible en el menú "Run" --> "Toogle Breakpoint") ) y "seguimiento de variables" (menú "Run" --> "Add watches"). Posibilidad de confirgurar opciones de FTP (desde "File" --> "FTP Manager"). Faciladades para el trabajo con clases (por un lado, en la ventana flotante o "Tool Box", encontramos el "Class Browser"; por otro, con la 'opción de menú "Tools" --> "Use Class Wizard" se abre un cuadro de gestión de clases. Posibilidad de de depurar código (si en la instalación incluimos el debugger).

Página 10 de 10Entornos de desarrollo.

Page 45: php_y_mysql

Módulo 1 Programación en PHP y Bases de datos

Módulo 1: Introducción a los lenguajes web. Instalación de un servidor web

En este apartado queremos referirnos a las diferentes opciones existentes en la actualidad para el desarrollo de scripts en PHP. Estos entornos facilitan el desarrollo del código, su depuración, etc.

Índice

Bluefish editor (Linux) Nvu versión 1.0 (Linux)

En la web cyberzoide.developpez.com puede encontrarse una exhaustiva compartiva de herramientas de edición para PHP.

Bluefish editor (Linux)

Bluefish es un editor para programadores y diseñadores web experimentados. Reconoce diversos lenguajes de programación y de marcas, pero se centra en la edición de sitios web dinámicos e interactivos. Bluefish es un proyecto open source con licencia GPL. Para más información, podemos visitar la página principal de Bluefish en: http://bluefish.openoffice.nl/

No será necesario realizar instalación, puesto que Lliurex lleva instalada la versión 1.0 en castellano.

Página 1 de 12Editores Linux

Page 46: php_y_mysql

Figura 1. Bluefish versión 1.0

Bluefish es una potente herramienta de edición de páginas Web que soporta múltiples lenguajes tanto de programación como de marcas. Permite la creación de páginas web tanto estáticas como dinámicas. Bluefish permite un control total sobre el código, ya que se edita manualmente desde un editor texto WYSIWYG. Para facilitar el proceso de edición, Bluefish incorpora un gran número de características que hacen más sencilla la creación de páginas. Posee diversos métodos para insertar código y marcas de texto a través de barras de herramientas, cajas de diálogos y menús predefinidos y personalizados por el usuario. Posee diversas funcionalidades como el resaltado sintáctico, búsqueda y reemplazo avanzado, escalabilidad y referencias de funciones de lenguajes.

Bluefish posee diversas características, siendo las más significativas las siguientes:

Interfaz WYSIWYG: Lo que se ve es lo que se necesita.

Interfaz de múltiples documentos: Permite tener abiertos más de 500 documentos simultáneamente.

Resaltado de sintaxis personalizable, basado en expresiones regulares, con soporte para subpatrones. Hay incluidos patrones por defecto para diversos lenguajes como C, ColdFusion, Gettext po, HTML, Java, Pascal, Perl, PHP, Python, XML.

Soporte de múltiples codificaciones. Bluefish puede convertir entre diversos juegos de caracteres, soporta caracteres multibyte, unicode, UTF-8, etc.

Diversos asistentes para inicio rápidos, tablas, marcos, etc.

Ventana de inserción de imágenes con todas las características deseables.

Cajas de diálogo para muchas marcas HTML con todos sus atributos.

Barra de herramientas HTML y menús desplegables.

Buena funcionalidad de deshacer/rehacer.

Página 2 de 12Editores Linux

Page 47: php_y_mysql

Barra de herramientas personalizable por el usuario que permite un rápido acceso a las funciones más utilizadas.

Creación de miniaturas de imagen y enlazado automático con la imagen original.

Fácil creación de múltiples miniaturas de imagen para fácil creación de un álbum de fotos o páginas de capturas de pantallas.

Integración con muchos programas configurable por el usuario, incluyendo aplicaciones como weblint, tidy, make, javac, etc.

Referencia de funciones basada en XML. Actualmente, están incluidas referencias para HTML y PHP. También está disponible una referencia para GTK. También puede crearse una referencia de funciones propia.

Página 3 de 12Editores Linux

Page 48: php_y_mysql

Figura 2 Bluefish versión 1.0

En dicha ventana principal se observan distintas zonas:

Barra de Menú:

Archivo: Con las opciones típicas de abrir y guardar archivos, así como cerrar. También permite abrir una página en Internet (Abrir URL). Otra opción interesante es la opción Abrir avanzado que permite realizar búsquedas avanzadas dentro del sistema de archivos para encontrar un determinado documento.

Página 4 de 12Editores Linux

Page 49: php_y_mysql

Edición: Opciones de Deshacer/Rehacer, así como las de cortar, copiar y pegar. También están las opciones de buscar y reemplazar. Además, la búsqueda y reemplazo permite utilizar expresiones regulares, con toda la potencia que esto supone. Otra característica interesante es que permite reemplazar caracteres ASCII o de una codificación determinada por entidades HTML : es decir, convierte los acentos y las eñes como acute. Así mismo, está la opción de desplazar un bloque de texto a la derecha o a la izquierda, lo cual viene muy bien para estructurar el código. Si se selecciona la opción Preferencias se muestra una ventana con múltiples pestañas, donde se pueden personalizar multitud de aspectos de la edición en Bluefish.

Ver: Permite mostrar y ocultar las distintas barras de herramientas y el panel izquierdo.

Etiquetas: En esta opción están la mayoría de etiquetas HTML, organizadas en distintos submenús. Al seleccionar una opción, se insertan las etiquetas HTML correspondientes en el texto.

Diálogos: Esta opción también permite generar automáticamente código HTML de una manera sencilla. Cuando se selecciona una opción, se muestra una caja de diálogo con parámetros que ha de rellenar el usuario. Al pulsar el botón Aceptar se genera en el documento el código HTML correspondiente. Por ejemplo, la opción Inicio rápido genera todo el encabezado de inicio de una página HTML.

Documento : Aquí se incluyen algunas opciones que afectan a todo el documento. Por ejemplo, se puede incrementar o decrementar la tabulación para clarificar el texto, activar/desactivar opciones como el Resaltar sintaxis, Sangrado automático, Ajuste de línea o Número de línea.

También puede indicarse el tipo de documento. Esto es útil a la hora de que el resaltado de sintaxis sea el adecuado. También se puede establecer la codificación del documento (si se trabaja con UTF-8 o con ISO8859-15).

Además, se puede revisar la ortografía y contar las palabras del documento, así como visualizar el archivo que se está editando en una ventana flotante aparte.

Ir: Permite desplazarse por los múltiples documentos abiertos, así como ir a una línea determinada dentro de un documento.

Proyecto: Los proyectos son una especie de Guardar estado de Bluefish. Todos los archivos abiertos cuando se guarda el proyecto, se abren automáticamente la siguiente vez que se abre el proyecto. Además, se puede establecer un directorio base local, de forma que la raíz del árbol de exploración del panel izquierdo será dicho directorio. Si Bluefish está instalado con soporte de gnome-vfs, el directorio base puede ser remoto.

Externo: Aquí se incluyen algunas herramientas externas a la aplicación pero que pueden ser invocadas desde aquí. Para que funcionen, estas herramientas deberán estar instaladas en el sistema y correctamente configuradas. Por ejemplo, para que funcione el Analizador de código HTML, debe estar instalado el paquete Weblint (apt-get install weblint) y para el Validador de código HTML, el paquete Tidy (apt-get install tidy).

También permite visualizar la página web que se está editando en distintos navegadores, para ver la apariencia final. Evidentemente, para que funcione la opción de un navegador en concreto, dicho navegador debe estar instalado en el sistema.

Ayuda: Muestra una caja de diálogo con los créditos de la aplicación.

Página 5 de 12Editores Linux

Page 50: php_y_mysql

Barra de herramientas principal: Incluye botones con las acciones más habituales, tales como Nuevo, Abrir, Guardar, Cortar, Copiar, Pegar, Buscar, Deshacer,...Barra de herramientas HTML: Contiene la mayoría de etiquetas HTML. Los botones están clasificados en diferentes pestañas. En cada una de ellas hay una categoría de etiquetas HTML.

La primera pestaña es la Barra rápida, que inicialmente está vacía. En esta barra se pueden añadir los botones que se deseen de manera que el usuario se configure una barra personalizada. Para añadir un botón a esta barra, hacer clic derecho sobre el botón y seleccionar la opción Añadir de la barra rápida. Menú personalizado: Además de la Barra rápida, Bluefish permite crear un menú personalizado. Por defecto viene con uno, con funciones para diversos lenguajes de programación (DHTML, Active HTML, apache, docbook, HTML, php, sql, C Programming, Replace). Seleccionando la opción Menú personalizado -> Editar menú se muestra una caja de diálogo para poder añadir y modificar las entradas al menú.Barra de estado: Situada en la zona inferior de la ventana, muestra información sobre las acciones efectuadas. Para comprender su uso observe lo que sucede cuando presiona los diferentes botones, etc.

Panel izquierdo: En la zona izquierda de la zona de trabajo, se muestra un panel con un árbol de exploración del sistema de archivos. Las carpetas pueden desplegarse o replegarse. Haciendo clic derecho sobre las carpetas y archivos, se abre un menú contextual con múltiples funciones de manipulación de archivos.

Pulsando en la pestaña inferior con el dibujo de un libro, se muestra una referencia bastante completa tanto de HTML, como PHP.

Una función muy útil que proporciona GTK+ es tearoffs. Seleccionar una opción de menú, por ejemplo Archivo, y presionar sobre la pequeña línea punteada. Aparecerá una nueva ventana flotante que contiene todos los submenús de Archivo. De esta manera es posible acceder a las funciones de un menú de forma mucho más rápida. Nótese que el menú sigue siendo accesible no sólo desde la ventana aparecida, sino también desde el menú de la ventana principal. Por desgracia no hay manera de grabar su estado y posición de modo que, al reiniciar Bluefish, no habrá ningún menú flotante.

Crear un nuevo documento.

Seleccionar la opción de menú Archivo -> Nuevo. También se puede seleccionar el primer botón de la Barra de herramientas Principal o pulsar la combinación de teclas Ctrl+N. Aparecerá una nueva pestaña con un archivo de nombre “Sin título” en blanco.

Para introducir el encabezado inicial de una página HTML, se puede seleccionar la opción de menú Diálogos -> General -> Inicio Rápido, que mostrará un diálogo para elegir el tipo de documento, así como el título, las etiquetas META y establecer estilos. Al pulsar en el botón Aceptar, se insertará el código HTML en el documento.

Página 6 de 12Editores Linux

Page 51: php_y_mysql

Figura 3 Bluefish: dialogo inicio rápido.

Ya se puede empezar a introducir texto y etiquetas HTML, para ello se puede hacer uso de la Barra de Herramientas y de las opciones de menú Etiquetas y Diálogos. Cuando se selecciona una opción de menú o un botón, el código HTML se inserta en la posición donde esté el cursor en ese momento. Se inserta la etiqueta de inicio y la de cierre y el cursor se sitúa entre las dos. Si teniendo seleccionado un texto, se selecciona una etiqueta HTML, entonces la etiqueta de inicio se inserta al principio del texto seleccionado y la de cierre al final del mismo.

Algunas opciones habituales están también disponibles en el menú contextual (clic derecho del ratón), tales como cortar, copiar, pegar, etc.. Sí se hace clic derecho sobre una etiqueta, aparece una opción más Editar etiqueta, que según qué tipo de etiqueta sea, mostrará un diálogo u otro. Por ejemplo, si se hace clic derecho sobre la etiqueta H2, y se selecciona la opción Editar etiqueta, se mostrará un diálogo donde poder indicar propiedades de la etiqueta.

Guardar un archivo.

Seleccionar la opción de menú Archivo -> Guardar o Archivo -> Guardar Como si se desea guardar con otro nombre. En este último caso se mostrará una ventana para seleccionar la ubicación e introducir el nombre del archivo. Si se tienen varios documentos abiertos, el que se guardará es el que esté activo en ese momento (el que se muestra en la ventana principal). También existe la opción Guardar todo, que guarda todos los archivos abiertos en ese momento.

Si se desea validar la corrección de la página HTML, se puede realizar desde la opción de menú Externo -> Caja de salida -> Validador HTML Tidy. Se abrirá una ventana en la zona inferior con el resultado de la validación. Recordar que es necesario tener instalado el paquete Tidy para que esta opción funcione.

Si se desea ver la página HTML que se está creando en un navegador para comprobar el efecto final, seleccionando la opción de menú Externo se abre la página con el navegador que se seleccione. Evidentemente, para que funcione la opción de un navegador en concreto, dicho navegador debe estar instalado en el sistema.

Página 7 de 12Editores Linux

Page 52: php_y_mysql

Estableciendo las preferencias. Existen múltiples características de Bluefish que se pueden personalizar a través de la opción de menú Edición -> Preferencias. Aparecerá una ventana con diez pestañas. Además también se muestran los típicos botones de Aceptar, Aplicar y Cancelar.

Figura 4 Bluefish: preferencias.

Editor: Se puede establecer el tipo y tamaño de la fuente del editor de texto, el número de acciones de deshacer y algunas opciones para marcadores.

HTML: Se indica si las etiquetas HTML se insertan en minúsculas (por defecto) o mayúsculas. También permite el uso de etiquetas HTML antiguas. En la actualidad, la W3 recomienda usar CSS para dar formato a los documentos y no las antiguas etiquetas (por ejemplo, “font” o “center”).

Archivos: Se puede especificar la codificación del archivo (ISO-8859, UTF-8, ...), la creación de copias de respaldo, opciones del Explorador de archivos (panel izquierdo) y otras opciones relacionadas con archivos.

Interfaz de usuarios: Se puede especificar el tamaño inicial de la ventana principal y del panel izquierdo, así como establecer qué barras de herramientas se muestran al iniciar, o si las opciones del menú Externo se muestran en submenús o no. También se puede establecer la fuente y la posición de las pestañas del documento.

Imágenes: Se puede establecer un sufijo para las miniaturas y el formato en que se almacenarán.

Tipos de archivo: Aquí se indican las extensiones de los archivos para cada lenguaje, así como algunos parámetros adicionales. También se pueden añadir y borrar Tipos de archivo.

Resaltado de sintaxis: Se puede personalizar el resaltado de la sintaxis por el usuario. Seleccionando el tipo de archivo, se muestran los patrones definidos para él. Seleccionando un patrón, se pueden ver sus características y modificarlas.

Página 8 de 12Editores Linux

Page 53: php_y_mysql

Programas externos: Aquí se gestionan las entradas del menú Externo, pudiendo añadirse o quitarse opciones de menú. Por ejemplo, si se desea visualizar la página web con el navegador Firefox, añadir en la caja de texto Examinar una etiqueta que es la que se mostrará en el menú. Introducir en la caja de texto Comando la orden para abrirlo (Firefox %s). Luego seleccionar el botón Añadir.

Analizadores de salida: Aquí se gestionan los analizadores de salida (weblint, tidy, javac), pudiéndose añadir nuevos.

Servidores: De momento, esta sección únicamente posee una opción para activar la compatibilidad con servidores que funcionen con CES (Sistema de Gestión de Contenidos) Zope.

NVU Versión 1.0 Castellano (Linux).El software libre que pretende hacer la competencia a programas como el FrontPage de Microsoft o el Dreamweaver de Macromedia ha presentado recientemente su versión 1.0 final, después de más de un año de desarrollo. NVU está basado en el compositor de páginas HTML del antiguo Netscape, que posteriormente pasó a formar parte de la suite integrada Mozilla, y respaldado por Linspire (antigua Lindows), que con éste software parece completar la tríada de aplicaciones destinadas al entorno doméstico para competir directamente con sus homólogas para Windows y/o Mac (las otras dos son Lsongs, un clon de iTunes, y Lphoto para gestionar fotografías digitales).Dos de las principales bazas de NVU son el hecho de ser software libre, lo que garantiza entre otras libertades que se pueda disponer de su código fuente, y por otra parte que sea multiplataforma. Desde el site oficial (www.nvu.com) se pueden descargar los paquetes para los tres principales sistemas operativos, Windows, Mac OS X y Linux, y con el código fuente se pueden hacer ports para otros sistemas como Solaris o BeOS.Un dato destacable es que la interfaz de usuario gestiona las diferentes páginas que estemos editando (ficheros HTML) mediante un sistema de pestañas, idéntico al que utilizan los navegadores web Firefox o Safari. En general, la interfaz es altamente personalizable, pudiendo cambiar por ejemplo todos los botones de la barra de acceso rápido.NVU incluye también un editor de hojas de estilo CSS (Cascading Style Sheets), que ya estaba disponible como add-on para el compositor de páginas de Mozilla. También tenemos un fácil mecanismo para incluir formularios en nuestras páginas. Y cuando queramos comprobar si nuestra página sigue las normas marcadas por el W3C (World Wide Web Consortium, el organismo internacional encargado de marcar los estándares para los lenguajes utilizados en programación de páginas web), podemos invocar muy fácilmente el W3C's HTML Validator. En un futuro se preve hacer accesible también la herramienta de validación de CSS del mismo W3C.Algunas de sus funciones principales son:

Edición de páginas WYSIWYG (lo que ves, es lo que obtienes), convirtiendo la creación web en algo tan sencillo como tipear una letra con su procesador de textos. Administración de archivos integrada vía FTP. Código HTML fiable, capaz de funcionar con los navegadores más populares de la actualidad. Intercambio entre el modo WYSIWYG y HTML utilizando pestañas. Posibilidad de trabajar con múltiples páginas a la vez. Poderoso soporte para formularios, tablas y plantillas.

Instalación de nvu 1.0.La instalación del editor es muy sencilla, tan solo tenemos que descargar el fichero, descomprimirlo, y crear un enlace al fichero de inicio de nvu. Podemos descargar nvu 1.0 desde su página oficial: http://www.nvu.com

Página 9 de 12Editores Linux

Page 54: php_y_mysql

Figura 5. Descarga de NVU 1.0.

Podemos descargar la traducción al castellano en: http://nave.escomposlinux.org/productos/nvu/ En la misma página nos indican las instrucciones de instalación de la traducción.Una vez tengamos los dos ficheros descargados, descomprimimos el fichero de nvu en la carpeta que deseemos trabajar, en esta carpeta hay un fichero llamado nvu, que tras ejecutarlo obtendremos la siguiente pantalla:

Página 10 de 12Editores Linux

Page 55: php_y_mysql

Figura 6. Pantalla principal de NVU 1.0.

Para crear un enlace desde el escritorio, pulsar el botón derecho del ratón y seleccionar la opción de crear un lanzador, rellenar los campos que se solicitan, como se muestra en la siguiente pantalla:

Figura 7. Crear un acceso directo a NVU 1.0.

Para incorporar la traducción al castellano, seguir los siguientes pasos:

Ejecutar NVU. En el menú superior, pulsar sobre herramientas y seleccionar la opción Extensiones. Pulsar el botón instalar y seleccionar el fichero descargado.

Página 11 de 12Editores Linux

Page 56: php_y_mysql

Pulsar Install now.

Figura 8. Instalación de la traducción de NVU 1.0.

Si reiniciamos nvu lo encontraremos en castellano.

Figura 9. Pantalla principal de NVU 1.0 en castellano.

Página 12 de 12Editores Linux

Page 57: php_y_mysql

Módulo 2 Programación en PHP y Bases de datos

Lenguaje PHP Objectivos y contenidos En este módulo se verán las características más importantes del lenguaje PHP.

Sintaxis básica de PHP.

Variables: tipos y declaración. Constantes.

Expresiones y operadores.

Sentencias de control.

Página 1 de 1Programación en PHP y Bases de datos

Page 58: php_y_mysql

Módulo 2 Programación en PHP y Bases de datos

Sintaxis básica de PHP

El objetivo de este punto es ver las diferencias entre HTML y PHP y comenzar a familializarnos con la sintaxis de este lenguaje.

"Bienvenidos a PHP"

Escribiremos una página en HTML y otra en PHP con el mismo contenido, en PHP añadiremos comentarios, variables e incluiremos ficheros con código externo.

Bienvenidos a PHP en HTML

El código que se puede ver a continuación es muy sencillo. Es un simple mensaje de saludo en HTML.

<html> Bienvenidos a <b>PHP</b><br> <i>Saludos</i> </html>

Listado 1. "Bienvenidos" en HTML

Hacemos lo mismo en PHP

El resultado será identico pero se generará de forma diferente en PHP.

Copiar el código que aparece a continuación en vuestro editor y guardarlo con el siguiente nombre hola.php. Observar que el resultado es el mismo.

<html> HTML<br> ------------------<br> Bienvenidos a <b>PHP</b> <br> <i>Saludos</i> <br><br><br> <?php echo "PHP<br>"; echo "------------------<br>"; echo "Bienvenidos a <b>PHP</b>"; echo "<br>"; echo "<i>Saludos</i>"; echo "<br><br><br>"; ?> </html>

Listado 2. "Bienvenidos" en PHP

Si analizamos el código podremos observar las siguientes cosas:

El código PHP debe ir precedido por el siguiente signo "<?php" y se señala el final del

Página 1 de 4Sintaxis básica de PHP

Page 59: php_y_mysql

código con "?>" (también se acepta iniciarlo solamente con "<?"). Además podremos incluir el código en cualquier sitio y tantas veces como sea necesario.

En PHP podemos escribir código HTML, esto lo conseguiremos mediante la orden echo. Todo lo que este detrás de esta sentencia y tenga una correcta sintaxis se mostrará en la página resultante. PHP no analiza la validaz del código HTML que lleva insertado, este lo realizará el navegador correspondiente.

Por último es necesario marcar el final de línea con un punto y coma (;). Si no lo hacemos se producirá un error a la hora de generar la página.

Normalmente los servidores estan configurados para que revisen el código incluido en páginas que tienen la extensión .php. Por lo que, aunque nosotros escribamos código php en una página cuya extensión es .html , el servidor no lo interpretará y, por lo tanto, el resultado no será el esperado.

Saltos de línea.

En el navegador, comprobar el código HTML creado, visualizando la página anterior. Recordad que se puede ver con la opción de menú Ver | Código fuente (Internet Explorer 6.0) o bien Ver | Origen de la página (Netscape 7.0) y obtendremos algo parecido a lo siguiente.

<html> HTML<br> -----------------<br> Bienvenidos a <b>PHP</b> <br> <i>Saludos</i> <br><br><br> PHP<br>------------------<br>Bienvenidos a <b>PHP</b><br><i>Saludos</i><br><br><br></html>

Listado 3. Código HTML generado por PHP sin saltos de línea.

Los saltos de línea escritos directamente en el editor no se correponden con los generados

mediante el código PHP. Esto no afecta al funcionamiento de la página HTML, pero puede llegar a ser confuso, a la hora de analizar el código HTML creado. Podemos solucionarlo añadiendo un salto de línea de código (\n) al final de cada línea. Esta línea no afecta el código HTML generado pero si que producirá una presentación más clara cuando veamos el código fuente.

<?php echo "PHP<br> \n"; echo "------------------<br> \n"; echo "Bienvenidos a <b>PHP</b> \n"; echo "<br> \n"; echo "<i>Saludos</i> \n"; echo "<br><br><br> \n"; ?>

Listado 4. Saltos de línea.

Y el resultado esta vez sería:

<html> HTML<br> -----------------<br> Bienvenidos a <b>PHP</b> <br> <i>Saludos</i> <br><br><br>

Página 2 de 4Sintaxis básica de PHP

Page 60: php_y_mysql

PHP<br> ------------------<br> Bienvenidos a <b>PHP</b> <br> <i>Saludos</i> <br><br><br> </html>

Listado 5. Código HTML generado en PHP con saltos de línea

Signos de escape.

Para hacer un salto de línea en el código, tenemos que utilizar un signo de escape (\) en combinación con otro carácter (\n).

La siguiente tabla muestra algunos de los signos de escape más utilizados:

Igualmente, este signo puede servir para "emmascarar" signos especiales, que se utilizan ya en la sintaxis del lenguaje, como:

En el código siguiente la palabra PHP de la última frase será mostrada entre comillas dobles, gracias al enmascaramiento. En caso contrario, quedaría cortada la cadena y daría un error. También se podría evitar este problema alternando comillas simples.

código resultado

\n Crea una nueva línea.

\r Crea un salto de parrafo.

\t Crea una tabulación.

código resultado

\' Comillas simples.

\$ Signo dólar (este signo precede a todas las variables en PHP).

\\ La misma barra invertida.

\" Comillas dobles.

<?php echo "PHP<br> \n"; echo "------------------<br> \n"; echo "Bienvenidos a <b>PHP</b> \n"; echo "<br> \n"; echo "<i>Saludos</i> de \"PHP\" <br> \n"; echo "<br><br><br> \n"; ?>

Listado 6. Emmascaramiento mediante signos de escape.

Comentarios en el código.

Es recomendable comentar el código que escribimos, esto nos ayudará:

A recordar qué hace cada fragmento de código. A colocar observaciones o advertencias. A comentar, en el proceso de depuración, una línea para ver el funcionamiento y encontrar errores.

Página 3 de 4Sintaxis básica de PHP

Page 61: php_y_mysql

<html> <?php /* Práctica 1 Módulo 2 Curso de PHP (esto es un comentario de más de una línea) */ echo "PHP<br> \n"; echo "------------------<br> \n"; echo "Bienvenidos a <b>PHP</b> \n"; echo "<br> \n"; // Ahora explicaremos la inclusión de comillas dobles en una cadena // \n sirve para hacer saltos de línea en el código HTML generado echo "<i>Saludos</i> de \"PHP\" <br> \n"; echo "<br><br><br> \n"; ?> </html>

Listado 7. Código comentado.

Como se puede ver podemos hacer comentarios de más de una línea colocandolos entre /* y */.

Igualmente, podemos colocar un comentario de una sola línea después del signo //.

Página 4 de 4Sintaxis básica de PHP

Page 62: php_y_mysql

Módulo 2 Programación en PHP y Bases de datos

Variables: tipos y declaración. Inclusión de ficheros.

El objetivo de este punto es hacer una introducción a las posibilidades de PHP para trabajar nuevas características de la sintaxis y realizar la inserción de ficheros de código. Se verá:

Variables (tipos y declaración). Constantes. Inclusión de ficheros externos y bibliotecas.

Variables. En PHP podemos encontrar 5 tipos de variables: Integer, Double, String, Array y Object.

PHP gestiona de manera automática el tipo de variable y hace las conversiones convenientes.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 2 * Autor: Data: * Descripción: Tipos de variables en PHP * Pre condi.: * Post cond.: -----------------------------------------------------------------*/ // definición de variables $nombre = "Andrea"; // variables de texto o cadena (String) $apell1 = "León"; $apell2 = "Garcia"; $edad = 37; // variable numérica (Integer) $pobla = "Valencia"; //Inserción de variables dentro de la cadena echo "Tu nombre és: $nombre <br> \n"; echo "Tus apellidos són: $apell1 y $apell2 <br> \n"; echo "Tienes $edad años <br> \n"; echo "Vives en $pobla <br> \n"; ?> Listado 1. Definición y presentación de variables

Aclararemos algunos aspectos básicos:

Los nombres de las variables deben de comenzar con el signo dólar ($) seguido de una cadena de caracteres que comienza por un letra o un subrayado y que sigue con cualquier número de letras, números o subrayados.

El uso de mayúsculas y minúsculas esta permitido, pero hay que tener en cuenta que el interprete las diferencia. El mismo nombre con al menos una letra en mayúscula o minúscula diferente identifica a variables distintas.

No es necesario declarar el tipo de variable. PHP reconoce automáticamente el tipo de variable cuando se le hace una asignación.

Podemos elegir el nombre que queramos para las variables, pero es recomendable que tengan un significado descriptivo de para qué va a servir.

No podemos utilizar como nombre de variable ninguna palabra reservada del lenguaje PHP.

Página 1 de 4Variables. Tipos y declaración

Page 63: php_y_mysql

No es recomendable poner acentos o caracteres especiales en los nombres de variable (ç,ñ...), aunque podría funcionar correctamente.

Si vemos el listado 1 de este punto, veremos que se definen cuatro variables de tipo cadena ($nombre, $apell1 $apell2 y $pobla, los valores asignados están entre comillas y una variable numérica ($edad), con el valor sin comillas.

Después de la definición, se muestran los valores utilizando la sentencia echo. Hay que fijarse en que utilizamos dobles comillas (") para el contenido de echo, y podemos insertar directamente las variables dentro de la cadena, da igual el tipo de variable de que se trate:

echo "Tienes $edad años <br> \n"; echo "Vives en $pobla <br> \n";

A veces, este sistema de inserción puede ocasionar algún problema de interpretación, por lo que en el siguiente módulo, donde se verá la concatenación de cadenas y variables, veremos un sistema más seguro.

La inserción directa de variables en la cadena no funciona si esta esta entre comillas simples ('): echo 'Vives en $pobla <br> \n'; no funcionará.

PHP aporta algunas funciones muy interesantes para trabajar con variables, entre las cuales podemos destacar:

función resultado

gettype(variable)Devuelve el tipo de la variable pasada como argumento: integer, float, string, array, class, object o unknown type.

settype(variable, tipo)Recibiendo como parmetros una referencia a una variable y una cadena de caracteres, cambia el tipo de la variable referenciada al indicado por dicha cadena.

isset(variable) Devuelve TRUE si la variable pasada está ya definida. False en otro caso.

Constantes.PHP permite la definición de constantes, el valor asignado permanecerá invariante a lo largo de la ejecución del programa, para hacerlo se utiliza la siguiente función: define("constante",valor); Al hacer referencia a una constante no es necesario poner el signo dólar delante del nombre de la constante, puesto que en tal caso haría referencia a una variable.

Inclusión de código desde un fichero.Veremos ahora como incluir un fichero que nos servirá como encabezado de la página:

Copiar el siguiente código en vuestro editor y guardarlo como practica22.php

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 2 * Autor: * Descripción:

Página 2 de 4Variables. Tipos y declaración

Page 64: php_y_mysql

* Pre condi.: * Post cond.: -----------------------------------------------------------------*/ // Definición de constantes, normalmente en mayúsculas // definimos la constante del título del curso define("TITCUR","Programación en PHP y Bases de datos"); // definimos la constante para el salto de línea HTML define("B","<br>"); // inclusión de un fichero externo include( "cabecera.php" ); echo B; echo B; echo B; echo "PHP<br> \n"; echo "------------------<br> \n"; echo "Bienvenidos a <b>PHP</b> \n"; echo "<br> \n"; echo "<i>Saludos</i> de \"PHP\" <br> \n"; echo "<br><br><br> \n"; ?>

Listado 2. Código del fichero principal

Copiar también el código que ha continuación aparece y guardarlo como cabecera.php

<table style="text-align: left; width: 633px;" border="1" cellpadding="2" cellspacing="2"> <tbody onload="loadPage()"> <tr> <td> <?php echo "Programación en PHP y Bases de datos" ?><br> <?php echo "Fecha: ".date("d/m/Y"); ?> </tr> </td> </tbody onload="loadPage()"> </table>

Listado 3. Código del fichero incluido: 'cabecera.php'

En el código de practica22.php se hacen 2 cosas distintas:

Por una parte, se han definido unas constantes utilizando la función define().

define("TITCUR","Programación en PHP y Bases de datos");

Cada vez que utilicemos TITCUR en cualquier sitio del código, será sustituido por el valor que le hemos asignado.

define("B","<br>");

También se ha definido la constante B, que contendrá la etiqueta predefinida <br> del código HTML.

Por otro lado, se ha incluido la sentencia include() para incluir fichero externo.

include( "cabecera.php" );

El código del fichero cabecera.php será incluido en el lugar en que se colocó la sentecia include

Página 3 de 4Variables. Tipos y declaración

Page 65: php_y_mysql

y funcionará como si fuera un solo fichero.

La función include_once()no permite la inclusión del fichero más que una vez como máximo en un script. Igualmente, también existe require() y require_once(). La diferencia de include y require es que este último no permite la inclusión condicional, es decir, que aunque la sentencia este situada dentro de una sentencia alternativa siempre se incluirá el codigo, pase o no la ejecución del programa por ese punto.

En el fichero cabecera.php, también se utiliza otra función de PHP: date(). Dependiendo de los parametros que se le pasen, nos devolverá la fecha del sistema en el momento de ejecución del código en formatos diferentes.

Hay que tener en cuenta la ubicación del fichero cabecera.php. En el ejemplo que hemos visto suponemos que se encuantra en el mismo directorio que el fichero principal. En caso contrario, se debería indicar el camino donde se encuentra el fichero.

Si se incluye un fichero en el que se encuentra código php, se debe indicar la apertura y el cierre de este código con <?php y ?>.

Página 4 de 4Variables. Tipos y declaración

Page 66: php_y_mysql

Módulo 2 Programación en PHP y Bases de datos

Expresiones y Operadores

El objetivo de este módulo es familiarizarse con los diferentes tipos de operadores que nos ofrece PHP y como construir expresiones validas que nos permitirán:

hacer cálculos. realizar asignaciones. establecer comparaciones lógicas.

Operadores

Los operadores que veremos serán los siguientes:

aritméticos. de asignación. comparación. ejecución. incremento y decremento. lógicos.

Operadores aritméticos

Permiten hacer cálculos básicos y son los siguientes:

Por ejemplo:

ejemplo nombre resultado $a + $b Suma Suma de $a y $b

$a - $b Resta Resta entre $a y $b

$a * $b Multiplicación Producto de $a y $b

$a / $b División Cociente de $a entre $b

$a % $b Mòdulo Resto de $a dividido entre $b

<?php $a = 4; $b = 7; $c = $a + $b; //la variable $c será igual a 11 echo "\$a=".$a."<br> \n"; echo "\$b=".$b."<br> \n"; echo "\$c=\$a+\$b <br><br> \n"; echo "Resultado: ". $c; ?>

Observad que, para poder ver en pantalla el nombre de la variable y no su contenido, debemos recurrir a signo de escape (\) delante del signo de inici de variable ($).

Operadores de asignación

Página 1 de 4Expresiones y operadores

Page 67: php_y_mysql

En el ejemplo anterior hemos visto que con PHP las asignaciones básicas se hacen mediante el operador '='. Este operador hace que el operando de la izquierda coja el valor de la derecha.

Por ejemplo: $total = 2500;

la variable $total tendrá el valor 2500

Pero también hay operadores combinados, que permiten asignar y operar en un sólo paso:

$a = 4; $a += 6; // esto es equivalente a $a = $a + 6

y también con cadenas

$cadena = "Hola "; $cadena .= "José"; // $cadena tendrá el siquiente valor "Hola José"

Operadores de comparación

Como en la mayoria de lenguajes, PHP tiene sus comparadores que nos permitirán tomar decisiones. La siguiente tabla muestra una relación de operadores:

exemple nom resultat $a == $b Igual TRUE si $a es igual a $b

$a === $b Identidad TRUE si $a es igual a $b i si son del mismo tipo

$a != $b Distinto TRUE si $a no es igual a $b

$a < $b Menor que TRUE si $a es estrictamente menor que $b

$a > $b Mayor que TRUE si $a es estrictamente mayor que $b

$a <= $b Menor o igual que TRUE si $a es menor o igual que $b

$a >= $b Mayor o igual que TRUE si $a es mayor o igual que $b

Atención, el operador que valora la igualdad es un doble igual (==).

Operadores de incremento/decremento

Permiten incrementar/decrementar el valor de una variable en una unidad. El incremento/decremento puede hacerse antes o después de tomar el valor de la variable

ejemplo nombre efecto

++$a Preincremento Incrementa $a en uno y después devuelve $a

$a++ Postincremento Devuelve $a y después incrementa $a en uno

--$a Predecremento Decrementa $a en uno y después devuelve $a

$a-- Postdecremento Devuelve $a y después decrementa $a en uno

Página 2 de 4Expresiones y operadores

Page 68: php_y_mysql

Operadores lógicos

ejemplo nombre efecto $a and $b Y TRUE si tanto $a como $b son ciertos

$a or $b O TRUE si $a o $b son ciertos

$a xor $b O exclusiva TRUE si $a o $b son ciertos, pero no los dos a vez

!$a Negación TRUE si $a no es cierto

$a && $b Y TRUE si tanto $a como $b son ciertos

$a || $b O TRUE si $a o $b son ciertos

Atención, en realidad sólo disponemos de cuatro operadores lógicos. And y && son equivalentes, como or y || .

Vamos a ver un ejemplo

Aunque en el siguiente módulo veremos las estructuras de control, para poder comprobar el funcionamiento de estos operadores, avanzaremos el uso de la condición (if y else). Copia el código a tu editor y guárdalo con el nombre operador.php.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 3 * Autor: Fecha: * Descripción: ejemplo de operadores * Pre condi.: * Post condi.: -----------------------------------------------------------------*/ // Comprobación de una nota $nota = 5; // asignaciones $mensaje = ""; /* Lo primero es comprobar que la nota este comprendida entre 1 y 10 */ if( $nota >= 1 && $nota <= 10 ) { if($nota < 5 ) { //Si la nota es inferior a 5 $color="#AA0000"; // color del mensaje $mensaje = "No has superado la prueba."; } else{ // en caso contrario $color="#0000AA"; // color del mensaje $mensaje = "Prueba superada"; } } else{ $color="#000000"; // color del mensaje $mensaje = "Error! la nota debe estar entre 1 y 10"; } echo "<font color=$color> $mensaje Calificación: $nota </font> <br>"; ?>

Página 3 de 4Expresiones y operadores

Page 69: php_y_mysql

Listado 2.3.1. Ejemplo con operadores.

Realizar cálculos en PHP

Para comprobar en la práctica la capacidad de PHP, veremos un sencillo ejemplo de cálculo del IVA. Copiar este código y guardalo con el nombre m2p32.php.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 3 * Autor: Data: * Descripció: Calculo del IVA * Pre condi.: * Post condi.: -----------------------------------------------------------------*/ $neto = 200; //neto $iva = 0.16; $total_iva = $neto*$iva; // total iva a pagar $total = $neto+$total_iva; echo "<TABLE BGCOLOR=\"#AABBCC\"> \n"; echo "<TR><TD width=\"100\">Neto: </TD> <TD>".$neto." € </TD></TR><br> \n"; echo "<TR><TD width=\"100\">IVA: (".$iva."): </TD> <TD> ".$total_iva." € </TD></TR><br> \n"; echo "<TR><TD width=\"100\">Total: </TD> <TD>".$total." €</TD></TR> \n"; echo "</TABLE> \n"; ?>

Listado 2.3.2. Cálculo de IVA

En el ejemplo podemos ver los diferentes operadores de cálculo.

Tenemos dos variables ($neto y $iva) a partir de las ellas hacemos los cálculos pertinentes.

En la presentación de los resultados se genera una tabla en html.

Página 4 de 4Expresiones y operadores

Page 70: php_y_mysql

Módulo 2 Programación en PHP y Bases de datos

Sentencias de control de programa

En este tema veremos:

Sentencias de selección. Sentencias de iteración.

Las principales sentencias de control en PHP son:

sentencias sintaxis

if, else, elseif

if (expr) sentencia

o bien

if (expr){ sentencias }

if (expr){ sentencias; } elseif { sentencias; elseif { sentencias; else { sentencias; }

codicional compacta

$variable = (exp1) ? exp2 : exp3;

switch

switch ($i) { case 0: echo"i es igual a 0"; break; case 1: echo "i es igual a 1"; break; case 2: echo "i es igual a 2"; break; default: echo "Otro valor"; }

forfor (expr1; expr2; expr3){ sentencia }

foreach(expresion_array as $value) { sentencia}

Página 1 de 8Sentencias de control de programa

Page 71: php_y_mysql

foreach

o bien foreach(expresion_array as $key => $value) { sentencia}

whilewhile (expr) { sentencia }

Sentencias de selección.

Estructura if, else, elseif

La estructura if, else, elseif es, la estructura condicional clásica, implementada en todos los lenguajes.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 4 * Autor: * Descripción: Estructuras if, else, elseif * Pre condi.: * Post condi.: -----------------------------------------------------------------*/

$grupo = "B";

if ($grupo == "A"){ echo "El grupo es A"; } elseif ($grupo == "B") { echo "El grupo es B"; } elseif ($grupo == "C") { echo "El grupo es C"; } else { echo "El grupo no es ni A ni B ni C"; } ?>

Listado 2.4.1. Ejemplo estructura condicional

Condicional compacta

La sintaxis

$variable = (exp1) ? exp2 : exp3;

primero se evalua la expresión (exp1), si es cierta se asigna el resultado de evaluar la expresión (exp2) a la variable, en caso contrario se asigna a la variable el resultado de evaluar la expresión 3. Por ejemplo: <?php

Página 2 de 8Sentencias de control de programa

Page 72: php_y_mysql

/*----------------------------------------------------------------- * Módulo: 2 Práctica: 4 * Autor: * Descripción: Condicional compacta. Máximo de tres valores. * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

$a = 5; $b = 8; $c = 3;

// Si $a < $b $maximo = $b sino igual a $a $maximo = ($a<$b)? $b : $a;

// ya tenemos el mayor de $a y $b

$maximo = ($maximo<$c)? $c : $maximo;

// ya tenemos el mayor del anterior y el último número

// Escribimos el resultado

echo "El máximo de los tres valores es: $maximo"; ?>

Listado 2.4.2. Ejemplo de condicional campacta.

Estructura switch

La estructura switch es equivalente a una serie de if. Cuando se cumple el caso se sale del proceso utilizando la sentecia break colocada destrás de cada evaluación.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 4 * Autor: * Descripción: Ejemplo de uso de 'switch' * Pre condi.: * Post cond.: -----------------------------------------------------------------*/ $pla = 'ESO'; switch ($pla) { case 'ESO': echo 'Educación Secundaria Obligatoria'; break; case 'BACH': echo 'Bachillerato'; break; case 'CFGM': echo 'Ciclo Formativo de Grado Medio'; break; case 'CFGS': echo 'Ciclo Formativo de Grado Superior'; break; // si no ha coincidido con ninguna de las anteriores default: echo 'Codificación incorrecta'; }

Página 3 de 8Sentencias de control de programa

Page 73: php_y_mysql

?>

Listado 2.4.3. Ejemplo de uso de switch.

Otro ejemplo de switch sería la elección individual de un color:<html> <head> <title>Modificar el color de fondo</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="../css/nuevo.css"> </head> <body bgcolor="<?php if(isset($_POST["color"])) { switch(($_POST["color"])) { case 1: echo "#ffcc33"; break; case 2: echo "ffff99"; break; default: echo "silver"; } } else { echo "white"; } ?>"> <h1>Seleccione un color de fondo</h1> <form action="color.php" method="post"> <input type="radio" name="color" value="1"> naranja<br> <input type="radio" name="color" value="2"> amarillo<br> <input type="radio" name="color" value="x"> sorpresa<br><br> <input type="submit" value="Seleccionar un color"> </form> </body> </html>Listado 2.4.4. Ejemplo de uso de switch.

Sentecias de iteración (bucles)

Podemos decir, que un bucle es una repetición de una acción o conjunto de acciones hasta que se cumpla una condición o situación final que se ha definido en la cabecera del bucle.

Hay que tener en cuenta que con la utilización de los bucles, tenemos que tener mucho cuidado en su definición, puesto que como hemos dicho en el tema anterior PHP es un lenguaje interpretado que se ejecuta en la parte del servidor, un bucle infinito podría llegar a colgar el servidor web.

For

La estructura for es una de las complejas y al vez flexibles de PHP.

Sintaxis:

for (expr1; expr2; expr3){ sentencia }

Página 4 de 8Sentencias de control de programa

Page 74: php_y_mysql

Donde: expr1: inicializa la variable que usaremos en el bucle for. expr2: define la condición que debe cumplirse para poder entrar en el proceso for; en el momento en que no se cumpla se acaba el proceso. expr3: modifica el valor de la variable usada como contador del bucle, puede incrementar, decrementar, etc.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 4 * Autor: * Descripción: Ejemplo de 'for' * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

$num = 10; //definimos una variable

// expr1: $i valdrá 0 // expr2: la condición ($i ha de ser diferente a $num) // expr3: en cada pasada se incrementa $i en 1 ($i++) for($i=0; $i != $num ; $i++) { echo "\$num es diferente de ".$i."<br>"; } echo "<br><br>"; echo "Estamos fuera del bucle for <br>"; echo "\$num ($num) es igual a \$i ($i)"; ?>

Listado 2.4.5. Ejemplo de uso de for.

Otro ejemplo de bucle for, se pregunta cuantas veces quiere que repita una frase y las escribe:<html> <head> <title>El bucle for</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="../css/nuevo.css"> </head> <body> <h1>El bucle for</h1> <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post"> ¿Cuántas veces debe aparecer la frase? <input type="text" name="cantidad"> <input type="submit" value="enviar"> </form> <p> <?php if (isset($_post["cantidad"])) { for ($contador=1;$contador<=$_POST["cantidad"];$contador++) { echo "<b>$contador</b>: Loops are easy!<br>\n"; } echo "Se acabó.\n"; } ?> </p> </body> </html>Listado 2.4.6. Ejemplo de uso de for.

Página 5 de 8Sentencias de control de programa

Page 75: php_y_mysql

Foreach

La construcción foreach es la más sencilla cuando el bucle esté relacionado con un array, aunque los arrays los veremos en temas posteriores, no resultará complicado entender la estructura foreach. Una de sus dos sintaxis es::

foreach(expresion_array as $value) { sentencia}

Le pasamos un array como primer parametro y una variable como segundo, a cada iteracción del bucle la variable irá cogiendo un valor del array, avanzando al siguiente elemento en cada pasada, hasta llegar al final del array. Veamos un ejemplo que visualiza los días de la semana.

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 4 * Autor: * Descripción: Ejemplo de uso de 'foreach' * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

// Definimos un array con los dias de la semana $dia[0] = "Lunes"; $dia[1] = "Martes"; $dia[2] = "Miércoles"; $dia[3] = "Jueves"; $dia[4] = "Viernes"; $dia[5] = "Sabado"; $dia[6] = "Domingo";

// Y ahora se muestran por pantalla echo "Los días de la semana son:<br><br>\n";

foreach ($dia as $valor) { //en cada pasada se lee un nuevo valor del array echo "$valor<br>\n"; } ?>

Listado 2.4.7.Ejemplo de utilización de foreach.

Algunos ejemplos más para demostrar su uso:

<?php /* foreach ejemplo 1: sólo valor*/ $a = array(1, 2, 3, 17); foreach($a as $v) { print "Valor actual de \$a: $v.\n"; } /* foreach ejemplo 2: valor (con clave impresa para ilustrar) */ $a = array(1, 2, 3, 17); $i = 0; /* sólo para propósitos demostrativos */ foreach($a as $v) { print "\$a[$i] => $v.\n"; $i++; }

Página 6 de 8Sentencias de control de programa

Page 76: php_y_mysql

/* foreach ejemplo 3: clave y valor */ $a = array( "uno" => 1, "dos" => 2, "tres" => 3, "diecisiete" => 17 ); foreach($a as $k => $v) { print "\$a[$k] => $v.\n"; } /* foreach ejemplo 4: matriz multi-dimensional */ $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach($a as $v1) { foreach ($v1 as $v2) { print "$v2\n"; } } /* foreach ejemplo 5: matriz dinámica */ foreach(array(1, 2, 3, 4, 5) as $v) { print "$v\n"; } ?> Listado 2.4.8.Ejemplo de uso de foreach.

While

Un alternativa al for es utilizar while. Se trata de una estructura parecida a for pero que no incluye en su declaración ni la inicialización de una variable de control (la inicialización se debe hacer antes de entrar en el bucle), ni su incremento o decremento, esta modificación de la variable de control se debe realizar en el cuerpo de la estructura. Veamos un ejemplo:

<?php /*----------------------------------------------------------------- * Módulo: 2 Práctica: 4 * Autor: fecha: * Descripción: Ejemplo de uso de 'while' * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

// Números divisibles por $div hasta $total

$i = 0; //variable de control del while $div = 5; //número a dividir (divisor) $total = 100; //total

echo "<h2>Números divisibles por $div hasta $total.</h2>";

while ($i < $total){ // Si es divisible entre $div, lo mostramos if ($i%$div == 0 ){ echo $i." - ";

Página 7 de 8Sentencias de control de programa

Page 77: php_y_mysql

} // Incremento de $i $i++; } // fin del while ?>

Listado 2.4.9.Ejemplo de uso de while.

Do .. While.Los bucles do..while son muy similares a los bucles while, excepto que las condiciones se comprueban al final de cada iteración en vez de al principio. La principal diferencia frente a los bucles regulares while es que se garantiza la ejecución de la primera iteración de un bucle do..while (la condición se comprueba sólo al final de la iteración), mientras que puede no ser necesariamente ejecutada con un bucle while regular (la condición se comprueba al principio de cada iteración, si esta se evalúa como FALSE desde el principio la ejecución del bucle finalizará inmediatamente). Hay una sola sintaxis para los bucles do..while: <?php $i = 0; do { print $i; } while ($i>0); ?> Listado 2.4.10.Ejemplo de uso de do .. while.

El bucle de arriba se ejecutaría exactamente una sola vez, después de la primera iteración, cuando la condición se comprueba, se evalúa como FALSE ($i no es más grande que 0) y la ejecución del bucle finaliza. <?php do { if ($i < 5) { print "i no es lo suficientemente grande"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } print "i es correcto"; /* procesa i */ } while(0); ?> Listado 2.4.11.Ejemplo de uso de do .. while.

Página 8 de 8Sentencias de control de programa

Page 78: php_y_mysql

Módulo 2 Programación en PHP y Bases de datos

Ejercicio 1. Números primos.

El ejercicio consiste en dado un número positivo (se almacenará en una variable) mostrar en una tabla todos los números primos menores que él. Almacenar el fichero con el nombre mod2ejer1.php.

Ejercicio 2. Números divisibles.

El ejercicio consiste en generar una tabla que contenga verticalmente los números del 1 al 10, que serán los divisores. Horizontalmente, tendremos 10 números más (por ejemplo del 50 al 60) que serán, los dividendos. Los valores de los dividendos se deben almacenar en dos variables.

Se trata de rellenar la tabla con un asterisco (*), en la intersección de los números en el caso de ser divisible, en caso contrario se rellenará con un guión (-).

El color de fondo de cada casilla variará dependiendo del valor que contengan.

Almacenar el fichero con el nombre mod2ejer2.php.

Comprimir estos ficheros con el nombre inicial-nombre_primer-apellido_mod3ej1.zip y envíalo.

Página 1 de 1Ejercicios módulo 2

Page 79: php_y_mysql

Módulo 3 Programación en PHP y Bases de datos

Lenguaje PHP. Matrices, cadenas y fechas Objectivos

En este módulo se profundizará en el manejo de las matrices. La necesidad de su aprendizaje se basa en que gran parte de las funciones de PHP manejan vaiables de este tipo. La manipulación de las cadenas de caracteres es necesaria cuando se debe mostrar información al usuario, por lo que se verán gran variedad de funciones que manejan este tipo de datos. Y por último se estudiarán las funciones existentes en PHP para el manejo de fechas.

Contenidos

Arrays o Matrices.

Cadenas de caracteres.

Manipulación de fechas.

Page 80: php_y_mysql

Módulo 3 Programación en PHP y Bases de datos

Arrays o matrices

En muchas ocasiones, aparecen un conjunto de variables que contienen información semejante que ha de procesarse de forma similar. En estos casos existe una solución mejor que definir tantas variables como datos distintos tengamos, esta solución es utilizar arrays o matrices. Este tipo de variable funciona de manera parecida en otros lenguajes, pero con alguna particularidad. Definición de arrays

<?php /*----------------------------------------------------------------- * Módulo: 3 Práctica: 1 * Autor: Fecha: * Descripción: Definición de arrays * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

$nota[0]="Insuficiente"; $nota[1]="Suficiente"; $nota[2]="Bien"; $nota[]="Notable"; $nota[]="Sobresaliente";

/* Si no indicamos subíndice, automaticamente se asignará la siguiente posición libre */

echo "Calificación: ". $nota[3]; echo "<br><br>";

/* Definición de un array utilizando la función array

$nota=array("Insuficiente","Suficiente","Bien","Notable",

"Sobresaliente");

echo "Calificación: ". $nota[4]; ?>

Listado 3.1.1. Definición de los elementos de un array

Observar que el primer número de índice de los arrays es siempre 0 y no 1.

Arrays asociativos

Una de las particularidades de PHP es la posibilidad de poder substituir los números de índice por alguna palabra que se asocie a cada elemento. Ver el siguiente ejemplo:

<?php /*-----------------------------------------------------------------

Page 81: php_y_mysql

* Módulo: Práctica: 2 * Autor: Fecha: * Descripción: Arrays asociativos * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

$nota["I"]="Insuficiente"; $nota["S"]="Suficiente"; $nota["B"]="Bien"; $nota["N"]="Notable"; $nota["E"]="Sobresaliente";

echo "Valores asignados directamente <br>"; echo "Calificación: ". $nota["B"]; echo "<br><br>";

// Definición utilizando la función array

$nota=array("I"=>"Insuficiente","S"=>"Suficiente","B"=>"Bien", "N"=>"Notable","E"=>"Sobresaliente");

echo "Definición con función array <br>"; echo "Calificación: ". $nota["E"]; ?>

Listado 3.1.2. Definición de los elementos de un array asociativo

En lugar de asignar a cada elemento un número de índice, le asignamos una etiqueta o clave con la cual se relacionan. Al utilizar la función array debemos realizar la asignación del valor con el operador => .

Matrices o arrays de dos dimensionesCon el fin de ver las funciones que tiene PHP para la manipulación de matrices, utilizaremos como ejemplo un listado de alumnos, de los cuales almacenaremos una serie de datos personales. Utilizaremos un array asociativo con claves: nombre teléfono, correo, nota. Y una matriz indexada, de forma que cada alumno ocupe una posición de la matriz, para almacenar los 35 alumnos del curso./* Declaración implícita de una matriz bidimensional */ $M1[0][0] = 'José'; $M1[1][0] = 'María'; $M1[2][0] = 'Juan'; $M1[0][1] = '123456789'; /* Declaración implícita de una matriz bidimensional asociativa */ $M1[0]['Nombre'] = 'José'; $M1[1]['Nombre'] = 'María'; $M1[2]['Nombre'] = 'Juan'; $M1[0]['Telefono'] = '123456789'; /* Declaración de una matriz bidimensional asociativa utilizando la función array */ $curso=array(array('Nombre' =>'José', 'Telefono' =>'123456789', 'Correo' =>'[email protected]', 'Nota' =>'0'), array('Nombre' =>'María',

Page 82: php_y_mysql

'Telefono' =>'876543219', 'Correo' =>'[email protected]', 'Nota' =>'0'), array('Nombre' =>'Juan', 'Telefono' =>'432187659', 'Correo' =>'[email protected]', 'Nota' =>'0'));Listado 3.1.3. Declaración de la matriz ejemplo

Para acceder a los elementos de una matriz multidimensional el mecanismo es el mismo que para acceder a matrices unidimensionales, basta con añadir tantos corchetes al final del nombre de la variable como dimensiones tenga ésta. En nuestro ejemplo: para acceder a nombre del alumno que ocupa la 4 posición del listado, deberíamos escribir:$alu4 = $curso[3]["Nombre"];Si quisieramos recuperar todos los datos de un alumno, por ejemplo el tercero, obtendríamos una array. Deberíamos escribir:$alu3 = $curso[2];Las matrices como variables que son, pueden ser expandidas dentro de una cadena de caracteres delimitada con comillas dobles ("). Sin embargo debe ser diferente cuando se trabaje con matrices multidimensionales. hay que encerrar dicha referencia entre llaves ({}). Con matrices unidimensionales no hay que hacer nada especial siendo correctos los siguientes ejemplos:/* mostraría el nombre del alumno, siendo $alumno un array unidimensional asociativo */ echo "Alumno número 1 $alumno['nombre'] <br>\n"; /* en nuestro ejemplo de matriz bidimensional */ echo "Alumno número 1 {$curso[0]['Nombre']} <br>\n";

Recorrido de una matrizPara recorrer una matriz indexada necesitamos saber de antemano el número de elementos que la componen. Esta información nos la proporciana la función count(). Con la siguiente sintaxis: int count(cualquier_tipo mi_variable) Donde mi_variable representa la variable de la que se quiere obtener el número de elementos.

Si se trata de una matriz, tanto indexada como asociativa, la función devolverá el número de elementos. Si se trata de una variable que contiene un elemento, sea o no matriz, devolverá 1. Si la variable no tiene asignado ningún valor o tiene asignado el valor null, devolverá un 0.

Existe otra función de PHP que devuelve el numero de elementos, esta función es sizeof() y su sintaxis es la siguiente: int sizeof(array matriz)Para recorrer una matriz indexada tan solo debemos construir un bucle, que empieza en la posición 0 y que terminará cuando ya no queden más elementos que tratar. En cada interacción del bucle se accede a una posición distinta.Para recorrer una matriz asociativa PHP dispone de varias funciones:

Función resultado

each()Recupera el par formado por la clave y el valor del elemento actual y además avanza una posición el puntero de la matriz. Sintaxis: array each(array matriz);

Page 83: php_y_mysql

Devuelve false cuando no quedan elementos por tratar

List()Asigna los valores del elemento actual de una matriz a las variables que se hayan pasado com parametro. sintaxis: void list($var1, $var2, ...);

reset() Hace que el puntero interno apunte a la primera posición de la matriz.

end() Hace que el puntero interno apunte a la última posición de la matriz.

next() prev()

Permite ir al siguiente / anterior elemento. En caso de estar al principio o al final devuelve el valor falso.

current() Devuelve el contenido del elemento actual. Esta función no desplaza el puntero interno de posición y devuelve el valor false cuando se encuentre después del último elemento o si la matriz no tiene elementos.

Cuando se trata de matrices indexadas la navegación es sencilla, basta con acceder directamente a la posición que contiene el elemento buscado. Por lo contrario, cuando se trata de una matriz asociativa no puede aplicarse el mismo tratamiento. Hemos visto 4 funciones para poder desplazarnos en una matriz asociativa. En PHP existen una gran cantidad de funciones que permiten manipular matrices que permiten, por ejemplo, ordenarlas, realizar una busqueda, insertar elementos, tando detrás como delante de la matriz, etc. pero no es el objetivo de este curso entrar en profundidad todas y cada una de ellas. Todas estas funciones pueden ser consultadas en la siguiente direccción Funciones con arrays.

Un ejemploEn nuestro ejemplo construiremos una tabla, en la que cada fila será un alumno con todos sus datos, y las cabeceras serán las claves de la matriz asociativa.

<!doctype html public "-//W3C//DTD HTML 4.0 //EN"> <html> <head> <title>Title here!</title> </head> <body> <?php /* Declaración de una matriz bidimensional asociativa utilizando la función array */ $curso=array(array('Nombre' =>'José', 'Telefono' =>'123456789', 'Correo' =>'[email protected]', 'Nota' =>'0'), array('Nombre' =>'María', 'Telefono' =>'876543219', 'Correo' =>'[email protected]', 'Nota' =>'1'), array('Nombre' =>'Juan', 'Telefono' =>'432187659', 'Correo' =>'[email protected]', 'Nota' =>'2')); // escribe cabeceras echo "<TABLE BORDER=3 ALIGN=CENTER>\n"; echo "<TR>\n"; while ($elemento = each($curso[0])) echo "<TH>$elemento[0]</TH>\n";

Page 84: php_y_mysql

echo "</TR>\n"; reset($curso[0]); //recorrer la matriz for ($i = 0; $i < count($curso); $i++) { echo "<TR>\n"; // recorrer cada elemeto de la matriz asociativa // utilizamos el contructor list while (list($clave,$valor) = each($curso[$i])) echo "<TD>$valor</TD>\n"; echo "</TR>\n"; } echo "</TABLE>\n"; ?> </body> </html> Comprobar que si no escribimos la sentencia reset($curso[0]), el primer elemento de la matriz no será visualizado. Cuando recorramos una matriz asociativa debemos posicionar el puntero interno en el primer elemento.En el tema anterior vimos una sentencia que nos facilita el recorrido de las matrices, esta sentencia es foreach(), que en cada iteracción del bucle la variable irá cogiendo un valor del array y avanzando al siguiente elemento en cada pasada, hasta llegar al final del array de forma automática. Veamos el mismo ejemplo, pero utilizando la sentencia foreach.

<!doctype html public "-//W3C//DTD HTML 4.0 //EN"> <html> <head> <title>Title here!</title> </head> <body> <?php /* Declaración de una matriz bidimensional asociativa utilizando la función array */ $curso=array(array('Nombre' =>'José', 'Telefono' =>'123456789', 'Correo' =>'[email protected]', 'Nota' =>'0'), array('Nombre' =>'María', 'Telefono' =>'876543219', 'Correo' =>'[email protected]', 'Nota' =>'1'), array('Nombre' =>'Juan', 'Telefono' =>'432187659', 'Correo' =>'[email protected]', 'Nota' =>'2')); // escribe cabeceras echo "<TABLE BORDER=3 ALIGN=CENTER>\n"; echo "<TR>\n"; foreach ($curso[0] as $k=>$v) echo "<TH>$k</TH>\n"; echo "</TR>\n"; //recorrer la matriz foreach ($curso as $e) { echo "<TR>\n"; foreach ($e as $v) echo "<TD>$v</TD>\n";

Page 85: php_y_mysql

echo "</TR>\n"; } echo "</TABLE>\n"; ?> </body> </html>

Page 86: php_y_mysql

Módulo 3 Programación en PHP y Bases de datos

Cadenas de caracteresEn este capítulo se verán una serie de funciones de PHP, que se agruparán de forma temática abordando los siguientes aspectos: formas de mostrar en salida estándard el contenido de las cadenas de caracteres y funciones para manipular su contenido.

En PHP las cadenas se pueden especificar mediante tres tipos de delimitadores:

Comillas simples: ' Comillas dobles: " Documento incrustado: <<<

La primera de ellas es la más básica, y permite asignar a una variable de tipo cadena de caracteres todo el texto que vaya encerrado entre las dos comillas simples. Si el texto contiene comillas simples ('), ésta deberá ir precedida por el carácter barra invertida (\). Esto se denomina escapar un carácter.

Si dentro de de una cadena delimitada entre comillas simples se hace referencia al contenido de una variable, ésta no será tenida en cuenta. Por ejemplo:

<? // Ejemplo de comillas simples en el contenido de un cadena $cadena1 = 'Este es un ejemplo de \'comillas simples \' en texto'; $cafes = 2; // Ejemplo de utilización de variables en cadenas $cadena2 =' El contenido de la variable $cadena1, no es tenida en cuenta \n, este salto tampoco será interpretado'; $cadena3 ='El contenido de la variable $cafe, no es tenida en cuenta \n, este salto tampoco será interpretado'; echo $cadena1; echo $cadena2; echo $cadena3; ?>

La delimitación mediante comillas dobles realiza la misma función que las simples , pero es más avanzada, en este tipo de cadenas los caracteres especiales definidos por el lenguaje son interpretados. Deberemos recurrir a la técnica de escapar los caracteres especiales que pudiendo ser interpretados no nos interesa, por ejemplo dobles comillas y barra invertida.

En este tipo de cadenas, si podemos hacer referencia al contenido de las variables, siendo estas sustituidas por su contenido, en la cadena.

<? // Ejemplo de comillas dobles en el contenido de un cadena $cadena1 = "Este es un ejemplo de \"comillas dobles \" en texto";

Page 87: php_y_mysql

// Ejemplo de utilización de variables en cadenas $cadena2 ="El contenido de la variable $cadena1, SI es tenida en cuenta \n, y este salto también será interpretado"; echo $cadena1; echo $cadena2; ?>

Escribe el código de los dos listados anteriores y comprueba la diferencia de resultados.

Cuando se delimita una cadena utilizando la técnica del documento incrustado , es válido todo lo explicado para los delimitadores de comillas dobles. La diferencia radica en que con este tipo de delimitadores la cadena de caracteres puede ocupar tantas línas como sea necesario, además la cadena guardará la apariencia con la que fue escrita. Estas cadenas deben ir delimitadas por un identificador que el programador define. Por ejemplo:<? // ejemplo de delimitadores <<< $cadena1= <<< DELI1 Me llamo Jose. Soy profesor de informática. \n Esto es un salto interpretado. DELI1; $cadena2=<<< DELI2 Este es el contenido de la variabe $cadena1 DELI2; echo $cadena1, "\n"; echo $cadena2; ?>Escribe el código del ejemplo anterior y comprueba el resultado.

Visualización de cadenasPHP dispone de funciones que muestran el contenido de variablas con y sin formato específico. estas funciones son:

Función resultado

echo()

Es la más utilizada, muestra cadenas de caracteres en la salida estándar. No acepta formato de salida. Sintaxis: echo string arg1 [, string arg2]; Sintaxis: echo (string arg1 [, string arg2]);

print()Es la más sencilla, y muestra el contenido de una cadena de caracteres en la salida estándar. No acepta formato de salida. Sintaxis: printf(string cadena);

printf()Realiza la misma acción que la función anterior, con la diferencia que ésta si acepta argumentos de formato de salida. Sintaxis: printf(string formato [, cualquier valor , ...]);

Page 88: php_y_mysql

Aunque lo más lógico sería recurrir a etiquetas HTML para dar formato a la salida de la función echo(), veremos un ejemplo donde se puede apreciar como utilizar cada una de las funciones anteriores.<? // Escribir un literal con echo() echo "Esto es la cabecera del listado"; echo ("Esta sentencia es equivalente a la anterior"); // Escribe el contenido de cualquier variable $var1 = 18; $var2 = 35.20; $var3 = "José"; echo $var1; echo $var2; echo $var3; // combinación de cadenas y variables echo "La suma de ", $var1, " y ", $var2, " es ", $var1 + $var2; // combinación de cadenas y variables utilizando concatenación echo "La suma de " . $var1 . " y " . $var2 . " es " . ($var1 + $var2); // con print y printf print("Esta es otra forma de visualizar cadenas \n"); print("Mi nombre es $var3 \n"); // con formato printf("La suma: %d + %.5f = %.5f \n", $var1, $var2, $var1 + $var2); ?> Escribe el código del ejemplo anterior y comprueba el resultado.

Funciones de alteración del contenidoEn este apartado veremos algnunas de las funciones más utilizadas para manipular el contenido de las variables string.

Función resultado

chop()

Devuelve una cadena de caracteres a la que se han eliminado los caracteres en blanco y el de nueva línea que aparece al final de la cadena. Sintaxis: string chop(string cadena);

ltrim() rtrim() trim()

Eliminan los caracteres en blanco que aparecen a la izquierda, a la derecha y a la izquierda y la derecha, respectivamente. Sintaxis: string ltrim(string cadena);

str_pad()

Ajusta el tamaño de una cadena de caracteres a una longitud determinada, permitiendo especificar el carácter de relleno.Realiza la misma acción que la función anterior, con la diferencia que ésta si acepta argumentos de formato de salida. Sintaxis: string str_pad(string cadena, int longitud [, string relleno [, int lugar]]);

strtolower

1. Convierte todos los caracteres alfabéticos a minúsculas. 2. Convierte todos los caracteres alfabéticos a mayúsculas. 3. Convierte todos los caracteres alfabéticos a minúsculas,

Page 89: php_y_mysql

() strtoupper() ucfirst() ucwords()

excepto el primero de la cadena. 4. Convierte todos los caracteres alfabéticos a minúsculas,

excepto el primer carácter de cada palabra.

Sintaxis: string strtoupper(string cadena);

str_replace()

Recibe una cadena de caracteres y devuelve otra en la que se han sustituido todas las apariciones de una subcadena2 por otra subcadena1. Sintaxis: string str_replace(string subcadena1, string subcadena2, string cadena);

strstr()

Permite establecer una correspondencia entre los diferentes caracteres a traducir y sus sustitutos. Sintaxis: string strstr(string cadena, string originales, string traducidos); ejemplo: $nom = strstr($nom, "áéíóúÁÉÍÓÚ", "aeiouAEIOU");

Funciones de acceso al contenido

Función resultado

strlen()Devuelve un número entero que indica cuántos caracteres tiene la cadena que recibe como parámetro. Sintaxis: int strlen(string cadena);

strchr()

Devuelve la subcadena que comienza en la primera aparición del carácter indicado. Sintaxis: string strchr(string cadena, char caracter);

strstr()

Permite localizar una subcadena dentro de una cadena original. Es sensible a las mayúsculas y minúsculas. Existe stristr() que tiene la misma funcionalidad pero no es sensible. Sintaxis: string strstr(string cadena, string subcadena);

strpos() strrpos()

Indica la posición de la primera (última) ocurrencia de una cadena en otra. Sintaxis: int strpos(string cadena, string subcadena [, int pos_inicial]);

substr()Devuelve la porción de cadena original que empieza en una determinada posición y que tiene una determinada longitud. Sintaxis: string substr(string subcadena1, int comienzo, int longitud);

strcmp() strcasecmp() strncmp()

1. Permite comparar dos cadenas, siendo sensible a mayúsculas y minúsculas.

2. Permite comparar dos cadenas, NO siendo sensible a mayúsculas y minúsculas.

3. Permite comparar los n primeros caracteres de dos cadenas.

Sintaxis: int strcmp(string cadena1, string cadena2);

Page 90: php_y_mysql

Módulo 3 Programación en PHP y Bases de datos

Manipulación de fechasEn este capítulo se verán algunas de las funciones más utilizadas para el empleo de fechas.El día 1 de enero de 1970 a la 00:00:00 GMT comenzo la "era UNIX". Cuando se solicita la hora a un ordenador, realmente no se obtienen la hora, los minutos y los segundos de un día de un mes y de un año determinado, se obtienen los segundos transcurridos desde el inicio de la era de UNIX, a este valor se le denomina "timestamp".La función time() devuelve un número entero que representa la marca de tiempo (timestamp) correspondiente al instante en que se ejecuta dicha función.

<?php /*----------------------------------------------------------------- * Módulo: 3 Práctica: 1 * Autor: Fecha: * Descripción: * Pre condi.: * Post cond.: -----------------------------------------------------------------*/ ?> <html> <?php // definimos la constante para el salto de línea HTML define("B","<br>"); echo B; echo B; echo B; echo "PHP<br> \n"; echo "------------------<br> \n"; echo "Hola <b>Mundo</b> \n"; echo "Ahora son las: ",time()," \n"; ?> </html>

Page 91: php_y_mysql

Figura 3.3.1. Ejemplo de la función time().

Este número entero es poco útil, a la hora de mostrar el tiempo, la forma normal de trabajar sigue siendo con días, meses, años, horas, minutos y segundos. Y para ello PHP dispone de una función que se encarga de obtener la fecha del sistema presentada de una forma determinada.

Esta función es getdate() que devuelve una matriz asociativa con la información de la fecha y hora del sistema.Los elementos de la matriz son:

Clave Descripción Ejemplo de valores devueltos"seconds" Representación numérica de segundos 0 a 59"minutes" Representación numérica de minutos 0 a 59"hours" Representación numérica de horas 0 a 23"mday" Representación numérica del día del mes 1 a 31

"wday" Representación numérica del día de la semana 0 (para el Domingo) a 6 (para el Sábado)

"mon" Representación numérica de un mes 1 a 12

"year" Una representación numérica completa de un año, 4 dígitos Ejemplos: 1999 o 2003

"yday" Representación numérica del día del año 0 a 365

"weekday" Una representación textual completa del día de la semana Sunday a Saturday

"month" Una representación textual completa de un mes, como January o March January a December

0 Segundos desde el Epoch Unix, similar a los valores devueltos por time() y usados por date().

Depende del sistema, típicamente -2147483648 a 2147483647.

<?php /*----------------------------------------------------------------- * Módulo: 3 Práctica: 2 * Autor: Fecha: * Descripción: * Pre condi.:

Page 92: php_y_mysql

* Post cond.: -----------------------------------------------------------------*/ ?> <html> <?php // definimos la constante para el salto de línea HTML define("B","<br>"); echo B; echo B; echo B; echo "PHP<br> \n"; echo "------------------<br> \n\n"; $hora=getdate(); echo "Ahora son las: ",$hora[hours]," horas \n"; ?> </html>En el ejemplo anterior se muestra la hora actual del servidor.

Formato de fechasPHP dispone de la función date() que devuelve una cadena de caracteres que se corresonden con la fecha a la que se ha aplicado un determinado formato. Sintaxis: string date(strinf formto [,int hora]); Para la definición del formato disponemos de las siguientes opciones, no se han mostrado todas las opciones de que dispone, solo las más utilizadas:

Opción Descripción

d Día del mes con dos dígitos.

D Día de la semana con tres letras (ejemplo Mon).

F Nombre del mes completo.

h Hora con dos dígitos, con fromato 01 a 12.

H Hora con dos dígitos, con fromato 00 a 23.

i Minutos con dos dígitos.

l Ele minúscula, aparece el nombre completo del día de la semana (ingles).

m Mes con dos dígitos.

M Mes con tres letras (ejemplo Mar).

s Segundos con dos dígitos

Y Año con cuatro dígitos

y Año con dos dígitos

Veamos un ejemplo donde se muestra la utilización de estas opciones:<?php /*----------------------------------------------------------------- * Módulo: 3 Práctica: 3 * Autor: Fecha: * Descripción: * Pre condi.: * Post cond.:

Page 93: php_y_mysql

-----------------------------------------------------------------*/ ?> <html> <?php // definimos la constante para el salto de línea HTML define("B","<br>"); echo B; echo B; echo B; echo "PHP<br> \n"; echo "------------------<br> \n\n"; echo "Hoy es ", date("D"), ", ", date("d"), " de ", date("F"), " de ", date("Y"),"\n"; echo B; echo B; // directamente desde date() echo date("\ho\y e\s D, d \de F \de Y"); ?> </html> Escribe el código del ejemplo anterior y comprueba el resultado.

Figura 3.3.2. Ejemplo de la función date().

Manipulación de fechas

La función strftime() representa otra posibilidad de aplicar formato a una fecha. A diferencia de la anterior esta función utiliza las conversiones locales de la máquina desde la que se ejecuta el script para devolver una cadena con el formato definido. Los nombre del mes y del día de la semana, siguen los valores establecidos por la función setlocate(). El formato quedará definido por los siguientes valores:

Opción Descripción

%a Nombre del día de la semana abreviado (según idioma).

%A Nombre del día de la semana completo (según idioma).

Page 94: php_y_mysql

%b Nombre del mes abreviado.

%B Nombre del mes completo.

%c Representación de fecha y hora (según idioma).

%d Día del mes en formato 01 a 31.

%H Hora como un núnero de 00 a 23.

%I Hora como un núnero de 01 a 12.

%m Mes como un número de 01 a 12.

%M Minuto en número.

%S Segundos en número.

%x Representación por defecto de la fecha sin la hora.

%X Representación por defecto de la hora sin la fecha.

%y Año en número de 00 a 99.

%Y Año con cuatro dígitos.

Ahora veremos el ejemplo anterior, para que aparezca en castellano.<?php /*----------------------------------------------------------------- * Módulo: 3 Práctica: 4 * Autor: Fecha: * Descripción: * Pre condi.: * Post cond.: -----------------------------------------------------------------*/ ?> <html> <?php // definimos la constante para el salto de línea HTML define("B","<br>"); // definición de idioma setlocale(LC_TIME,"es_ES"); echo B; echo B; echo B; echo "PHP<br> \n"; echo "------------------<br> \n\n"; echo "Hoy es ", strftime("%A"), ", ", strftime("%d"), " de ", strftime("%B"), " de ", strftime("%Y"),"\n"; echo B; echo B; // directamente desde date() echo strftime("hoy es %A %d %B %Y "); ?> </html>Por último veremos la función checkdate(), que permite comprobar si una determinada combinación de día, mes y año representa una fecha válida. La función debe recibir tres parámetros numéricos correspondientes al mes, al día y al año y devuelve true si los parámetros resultan una fecha válida y false en cualquier otro caso.La sintaxis es la siguiente: int checkdate(int mes, int dia, int anio);

Page 95: php_y_mysql

Módulo 4 Programación en PHP y Bases de datos

Módulo 4: Entrada/Salida. Formularios. Ficheros Objetivos

Conocer el mecanismo de paso de información entre páginas a través de formularios y sus particularidades. Gestionar el almacenamiento y recuperación de información de manera externa a la página mediante el uso de ficheros.

Contenidos

En este módulo se expondrán, en suma, algunos de los métodos que permiten a una página web transferir información a otro, y guardarla para una posterior obtención.

Índice de apartados

Operatividad con formularios

Envío y validación de formularios.

Gestión de ficheros

Page 96: php_y_mysql

Módulo 4 Programación en PHP y Bases de datos

Módulo 4: Operatividad con formularios

En este apartado, vamos a ver como operar con formularios y, en particular, nos detendremos a examinar el tratamiento que éstos hacen de la información que se quiere transmitir.

Como prerequisito, resultaría conveniente recordar todo lo concerniente a HTML relacionado con su diseño, esto es, aquellas etiquetas implicadas en la creación de un formulario.

Aconsejamos a tal efecto la siguiente página:

http://www.desarrolloweb.com/articulos/647.php?manual=21

Un ejemplo para empezar ...

El siguiente ejemplo podría ser el formulario más sencillo que puede darse. Como se puede observar, contiene un campo de texto (en el que se nos sugiere introducir nuestro nombre) y un botón de envío.

Cópialo, guárdalo en tu carpeta de prácticas con el nombre practica41.htm y pruébalo en el navegador.

NOTA: para el correcto funcionamiento del paso de información a través de los formularios es conveniente que la directiva REGISTER_GLOBALS del fichero de configuaración "php.ini" está a "On".

<html> <body> <form method="post" action="practica41_resp.php"> <p> Introduce tu nombre: <input name="nombre" type="text"> <br> <input type="submit" name="enviar" value="enviar" > </p> </form> </body> </html>

>> Observaciones:

un formulario (como el anterior) hace de cada objeto "input" una variable, que tendrá aparejada un dato. En nuestro caso, se generarán dos variables:

nombre (perteneciente al botón tipo "text") enviar (perteneciente al botón tipo "submit")

la etiqueta "form" contiene dos parámetros importantes: method: define la modalidad de envío de la información. Los valores posibles son POST o GET; en el primer caso, los valores se transmiten de manera oculta (no aparecen en la barra de direcciones del navegador); en el segundo caso, aparecería, por ejemplo: http://localhost/processa.php?nom=jaume&curs=1&grup=A

Page 97: php_y_mysql

La clausula action: indica el nombre fichero receptor de los datos del formulario.

Como hemos sugerido, la acción de pulsar el botón de envió del formulario desencadena la transmisión de ciertos a datos a una página receptora, que deberá ser código PHP. Este podría ser un ejemplo ( cópialo, guárdalo en tu carpeta de prácticas con el nombre practica41_resp.php y pruébalo en el navegador).

<?php

/*----------------------------------------------------------------- * Módulo: 4 Práctica: 1 Fichero: practica41_resp.php * Descripción: Ejemplo formulario (1) * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

// Exponemos 2 posibilidades: la primera usa el array $_POST $op1 = $_POST['nombre'];

echo "Hola, ".$op1."!<br><br>"; echo "¿Te gusta el PHP?"; // Esta segunda no lo utiliza (si tienes activado el uso de variables globales $op2 = $nombre;

echo "Hola, ".$op2."! (este nombre no aparecerá)<br><br>"; echo "¿Te gusta el PHP?"; ?>

Este script muestra el contenido de la variable "nombre" originada en el formulario de dos formas. En primer lugar, recurre al array $_POST -que abordaremos a continuación-; en segundo lugar, vuelca su contenido en la variable "op", para mostrar finalmente su contenido por pantalla.

Arrays $_POST i $_GET

En versiones de PHP posteriores a la 4.2.0, existen dos formas de acceso a las variables transmitidas a través de un formulario:

A través de variables globales: cada nombre de variable del formulario (name="...") está disponible como variable global ($codi). Este es el sistema tradicional y el más simple de implementar, pero también más inseguro, por lo cual lo desaconsejamos (además, solo funcionará si en el " php.ini" la directiva register_globals está activada).

A través de tres arrays asociativos que PHP genera en este proceso:

Arrays Explicación

_POST o HTTP_POST_VARS Array asociativo que contiene las variables pasadas por el método POST

_GET o HTTP_GET_VARS Array asociativo que contiene las variables

Page 98: php_y_mysql

pasadas por el método GET

La manera de acceder a estos arrays sería, por ejemplo: $_POST['nombre'] donde "nombre" sería el nombre de la variable y, por tanto, equivalente a $nombre, teniendo en ambos casos el valor introducido en el formulario.

Sugerimos la ejecución de ambas páginas con el parámetro action ajustado a "GET", a fin de apreciar la diferencia.

Una variante ...

Veamos ahora una variante al ejemplo anterior.

Cópialo, guárdalo en tu carpeta de prácticas con el nombre practica41_b.php y pruébalo en el navegador.

<?

/*----------------------------------------------------------------- * Módulo: 4 Práctica: 1b Fichero: practica41_b.php * Descripción: Ejemplo formulario (2) * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

?>

<html> <body>

<form method="post" action="<? echo $_SERVER["PHP_SELF"]; ?>" > <p> Introduce tu nombre: <input name="nombre" type="text"> <br> <input type="submit" name="enviar" value="enviar" > </p> </form> </body> </html>

<? if(isset($_POST["enviar"])){ echo "Hola, ".$_POST["nombre"]."!<br><br>"; echo "¿Te gusta el PHP?"; } ?>

>> Observaciones:

en este caso, lo que antes eran dos páginas (una, la "emisora" de información, html, y la otra , la receptora de la información, php) han quedado fundidas en una única, almacenada como .php . Por tanto, todo la funcionalidad queda resuelta en una única página. Para ello, en el parámetro action insertamos un trozo de código PHP en el que mostramos el valor de la variable interna $PHP_SELF que contiene el nombre del fichero actual interpretado (cabe observar como código HTML y PHP se combinan para este cometido).

Page 99: php_y_mysql

la función isset() determina si una variable dada está definida. Con ello, nos aseguramos que "venimos del formulario", ya que lo que estamos comprobando es que el botón "enviar" haya sido pulsado y, por tanto, que la variable haya sido generada.

Variables Predefinidas. A partir de PHP 4.1.0, el método preferido para recuperar variables externas es mediante las superglobales. Antes de este punto, la gente recaía en register_globals o las matrices largas predefinidas en PHP ($HTTP_*_VARS). A partir de PHP 5.0.0, las matrices de tipo "long" de variables predefinidas, se pueden desactivar con la directiva register_long_arrays. Para más información visitad esta página: http://es2.php.net/manual/es/reserved.variables.php

Un ejemplo más completo

Veamos ahora un ejemplo con un formulario más completo.

Copia el código y guárdalo en tu carpeta de prácticas con el nombre practica42.htm .

<html> <head> <title>Practica42.htm</title> </head>

<body> <h2>Formulario de ejemplo (3): </h2> <form name="form1" method="post" action="practica42_resp.php"> <p>Nombre: <input name="nombre" type="text" id="nombre" maxlength="20"> </p> <p>Apellido: <input name="apellido" type="text" id="apellido" maxlength="20"> </p> <p>Selecciona un deporte: <select name="deporte" id="deporte"> <option>futbol</option> <option>basket</option> <option>tenis</option> <option>rugby</option> </select> </p> <p>Sexo:</p> <p> <input name="sexo" type="radio" value="m"> Masculino</p> <p> <input name="sexo" type="radio" value="f"> Femenino</p> <p> <input name="conducir" type="checkbox" id="conducir" value="checkbox"> ¿Te gusta conducir? </p> <p>Aficiones:</p> <p> <textarea name="aficiones" cols="50" rows="5" id="aficiones"></textarea> </p>

Page 100: php_y_mysql

<input type="submit" name="enviar" value="enviar" >

<p>&nbsp;</p> </form> <p>&nbsp;</p> <p>&nbsp;</p> </body> </html>

A continuación, se muestra un posible código de tratamiento de los datos enviados por el formulario anterior. Cópialo, guárdalo en tu carpeta de prácticas con el nombre practica42_resp.php y pruébalo en el navegador junto con su formulario.

<?

/*----------------------------------------------------------------- * Módulo: 4 Práctica: 2 Fichero: practica42_resp.php * Descripción: Ejemplo formulario (3) * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

// Comprobamos si venimos del formulario

if(!isset($_POST["enviar"])) echo "No hay datos"; else {

// Dependiendo del tipo de objeto, utilizamos una // estructura de control diferente

echo "Tu nombre es ".$_POST["nombre"]." ".$_POST["apellido"]."<br>";

if($_POST["conducir"]) echo "Has visto el anuncio de BMW <br>"; else echo "No tienes un BMW <br>";

if($_POST["sexo"]=="m") echo "Eres un hombre de pelo en pecho<br>"; else echo "Eres toda una mujer <br>";

switch($_POST["deporte"]){

case "futbol": echo "Eres futbolero<br>"; break; case "tenis": echo "Eres tenista<br>"; break; case "basket": echo "Eres del Pamesa<br>"; break; case "rugby": echo "Eres un bruto<br>"; break;

}

if($_POST["aficiones"]){ echo "Tus aficiones son:<br>";

Page 101: php_y_mysql

echo nl2br($_POST["aficiones"]); } else echo "No tienes aficiones"; }

echo "<p><a href=\"practica42.htm\">Volver al formulario</a></p>" ?>

>> Observaciones:

el script anterior no representa demasiadas dificultades; cada zona de código se ocupa de cada una de las variables recibidas del formulario, atendiendo al tipo de objeto de formulario que las genera. la función nl2br(), inserta saltos de línea HTML antes de cada salto de línea, buscando respetar la disposición de cada línea del "textarea" original. por último, tenemos un enlace de vuelta a la página del formulario.

Envío de ficheros desde un formulario

En este última sección, vamos a ver cómo podríamos hacer que una página web pudiera dar la posibilidad de "subir" un fichero seleccionado por el usuario al servidor.

Para ello, partiremos del siguiente código, que debes copiar, guardar como practica43.htm.

<HTML> <HEAD> <TITLE>Carga de ficheros</TITLE> </HEAD> <BODY> <FORM ENCTYPE="multipart/form-data"       ACTION="practica43_resp.php" METHOD="POST">  <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="1024000"> <INPUT TYPE="file" NAME="mifichero"> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </BODY> </HTML>

>> Observaciones:

El formulario anterior incluye algunas etiquetas novedosas:

En la etiqueta FORM: < FORM enctype=“multipart/form-data”..> que indica que el formulario está integrado por contenidos de diferente tipo, no solo texto plano. Un campo oculto que indica el tamaño máximo del archivo a enviar: < input type=“hidden” name=“MAX_FILE_SIZE” value=“1024000” > NOTA: a MAX_FILE_SIZE no se le puede dar un valor mayor que el valor que se haya especificado en la directiva upload_max_filesize en el "php.ini" . Por defecto se tiene un límite de 2 MB.

Page 102: php_y_mysql

Un campo con el nombre y ubicación para el archivo: < input type=“file” name=“mifichero” >

Para el uso de este tipo de formularios se añaden una serie de variables que operan sobre ciertas características del archivo a transferir:

Variable Descripción

$nombre_archivo o $nombre_archivo_tmp

Nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

$nombre_archivo_name Nombre original del fichero en la máquina cliente.

$nombre_archivo_size Tamaño del archivo en bytes.

$nombre_archivo_type Tipo MIME del archivo (un ejemplo podría ser "image/gif“).

Es decir, para nuestro caso, tendremos una variable $mifichero desmembrada en 4 variables más, cada una con su "extensión" ( _tmp,_name, _size y _type) . Pero como no podemos utilizar estas variables directamente por no tener a on la directiva de variables globales, utilizaremos la matriz $_FILES que contendrá estos valores:

Variable Descripción

$_FILES['mifichero']['name'] Nombre original del fichero en la máquina cliente.

$_FILES['mifichero']['type'] Tipo MIME del archivo (un ejemplo podría ser "image/gif“).

$_FILES['mifichero']['size'] Tamaño del archivo en bytes.

$_FILES['mifichero']['tmp_name'] Nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

$_FILES['mifichero']['error'] Es el código de error generado en la carga del fichero. 0 significa todo OK.

Veamos en el siguiente ejemplo cómo podríamos operar con ellas (cópialo, guárdalo como practica43_resp.php y ejecútalo junto al formulario anterior).

<?php /*----------------------------------------------------------------- * Módulo: 4 Práctica: 3 Fichero: practica43_resp.php * Descripción: Ejemplo formulario (2) * Pre condi.: * Post cond.: -----------------------------------------------------------------*/ // visualizamos el contenido de las variantes de "mifichero" echo "Nombre: <B>".$_FILES['mifichero']['tmp_name']."</B>"; echo "<BR>"; echo "Tipo: <B>".$_FILES['mifichero']['type']."</B>"; echo "<BR>"; echo "Nombre original: <B>".$_FILES['mifichero']['name']."</B>"; echo "<BR>"; echo "Tamaño: <B>".$_FILES['mifichero']['size']."</B>"; echo "<BR>";

Page 103: php_y_mysql

// En la siguiente línea indicamos la ruta donde guardaremos // el fichero "temporal" (adáptala a tu caso) $ruta = "./carpeta/".$_FILES['mifichero']['name']; echo "<BR>"; echo "Ruta y nombre : <B>".$ruta; echo "<BR>"; echo "<BR>"; // Comprobamos si podemos subir el fichero // si es así, lo copiamos a su destino // sino, damos el pertienente aviso por pantalla if(move_uploaded_file($_FILES['mifichero']['tmp_name'],$ruta)) echo "El archivo se ha subido con éxito"; else { echo "No pudo transferir el fichero: " . $_FILES['mifichero']['name']."<BR>"; echo "Error: " . $_FILES['mifichero']['error']; } // Si el archivo es demasiado grande, no se habrá subido if($_FILES['mifichero']['error']==2) echo "Archivo demasiado grande"; ?>

>> Observaciones:

en las primera líneas, mostramos el contenido de las diferentes "extensiones" del la matriz $_FILES['mifichero'], recibida del formulario. Hay que diferenciar entre el nombre del fichero original y el nombre del fichero temporal . El primero hace referencia al nombre sin más; el segundo es un nombre para el fichero temporal transferido, el cual hay que renombrar y guardar en el lugar que decidamos de nuestro disco duro. Esto es así porque, el fichero transferido es temporal y se perderá si no es guardado. definimos una variable $mifichero_def en el cual definimos la ruta del directorio donde alojaremos nuestro fichero transferido. "subimos" el fichero al servidor mediante la función move_uploaded_file() , comprobando si se da algún error en el proceso. por último, comprobamos si el valor de la variable $_FILES['mifichero']['error'] es 2, ya que en ese caso habremos excedido el tamaño permitido y no se habrá efectuado la transferencia.

Un álbun de fotos: carga de archivos a una página web.La idea es ofrecer a los usuarios un formulario HTML con un campo tipo file que nos permitirá cargar archivos.

Una vez cargado el archivo, PHP se vuelve a activar y comprobará que el archivo sea correcto. Solo se podrán utilizar archivos gráficos en formato GIF o JPEG. El tamaño máximo permitido será de 200 KBytes (200.000 bytes). Todas las imagenes se almacenarán en una carpeta llamada imagenes. Una vez cargado se recorrerá la carpeta de imagenes mostrando cada una de ellas.

Veamos el siguiente ejemplo cópialo, guárdalo como practica44.php y ejecútalo.

<?

/*-----------------------------------------------------------------

Page 104: php_y_mysql

* Módulo: 4 Práctica: 4 Fichero: practica44.php * Descripción: Carga de formularios * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Cargar un archivo</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> </head> <body> <h1>Mi álbum de fotos en línea</h1> <h3>Cargar archivo</h3> <form action='<?php echo $_SERVER['PHP_SELF'] ?>' method="post" enctype="multipart/form-data"> <input type="file" name="archivo"> <input type="submit" name='submit' value="Cargar archivo"> </form> <?php $ruta = "imagenes/"; // Indicar ruta if (isset($_FILES['archivo']) && $_FILES['archivo']['size'] > 0) { $tamanyomax = 200000; // Indicar tamaño en bytes $nombretemp = $_FILES['archivo']['tmp_name']; $nombrearchivo = $_FILES['archivo']['name']; $tamanyoarchivo = $_FILES['archivo']['size']; $tipoarchivo = GetImageSize($nombretemp); if ($tipoarchivo[2] == 1 || $tipoarchivo[2] == 2) { // GIF o JPG? if ($tamanyoarchivo <= $tamanyomax) { // Archivo demasiado grande? if (move_uploaded_file($nombretemp, $ruta . $nombrearchivo)) { echo "<p>El archivo se ha cargado <b>con éxito</b>. Tamaño de archivo: <b>$tamanyoarchivo</b> bytes, Nombre de imagen: <b>$nombrearchivo</b><br></p>"; } else { echo "<p>No se ha podido cargar el archivo.</p>"; } } else { echo "<p>El archivo tiene más de <b>$tamanyomax bytes</b> y es demasiado grande.</p>"; } } else { echo "<p>No es un archivo GIF o JPG válido.</p>"; } echo "<form action='{$_SERVER['PHP_SELF']}' method='post'> <input type='submit' value='OK'></form>"; } $filehandle = opendir($ruta); // Abrir archivos while ($file = readdir($filehandle)) { if ($file != "." && $file != "..") { $tamanyo = GetImageSize($ruta. $file); echo "<p><img src='$ruta$file' $tamanyo[3]><br></p>\n"; } } closedir($filehandle); // Fin lectura archivos ?> </body> </html>

Page 105: php_y_mysql

Si lo que queremos es mostrar la anchura máxima de la imagen (por ejemplo 600 píxeles) modificaremós ligeramente la página y utilizaremos la función getImageSize() y su valor índice 0.<?php $ruta = "imagenes/"; // Indicar ruta if (isset($_FILES['archivo']) && $_FILES['archivo']['size'] > 0) { $anchomax = 600; $nombretemp = $_FILES['archivo']['tmp_name']; $nombrearchivo = $_FILES['archivo']['name']; $tamanyoarchivo = $_FILES['archivo']['size']; $tipoarchivo = GetImageSize($nombretemp); if ($tipoarchivo[2] == 1 || $tipoarchivo[2] == 2) { // GIF o JPG? if ($tipoarchivo[0] <= $anchomax) { // Archivo demasiado ancho? if (move_uploaded_file($nombretemp, $ruta . $nombrearchivo)) { echo "<p>El archivo se ha cargado <b>con éxito</b>. Tamaño de archivo: <b>$tamanyoarchivo</b> bytes, Anchura: <b>$tipoarchivo[0]</b> Nombre de imagen: <b>$nombrearchivo</b><br></p>"; } else { echo "<p>No se ha podido cargar el archivo.</p>"; } } else { echo "<p>El archivo tiene una anchura superior a <b>$anchomax píxeles</b> y es demasiado ancho.</p>"; } } else { echo "<p>No es un archivo GIF o JPG válido.</p>"; } echo "<form action='{$_SERVER['PHP_SELF']}' method='post'> <input type='submit' value='OK'></form>";Por último será recomendable que no pueda cualquiera subir un archivo al albún, para ello anadiremos un campo en el formulario que solicite el password, este password lo guardaremos en un archivo llamado password.inc.php que lo ubicaremos en una carpeta no accesible desde la web, casi siempre existe por defecto en servidores externos y se llama ../cgi-bin. Una vez comprobado el password pasaremos a cargar el archivo:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Cargar un archivo</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <body> <h2>Cargar archivo</h2> <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post"> Contraseña: <input type="password" name="pass"> <input type="submit" value="Enviar"> </form> <?php $login = false; //include("../cgi-bin/password.inc.php"); include("./password.inc.php"); if (isset($_POST['pass']) && $_POST['pass'] == $pw) { $login = true; } else if (isset($_GET['formavis']) && $_GET['formavis'] == "zuxrkk") { $login = true; } if ($login) { echo <<<FORMULARIO <h1>Mi álbum de fotos en línea</h1> <h3>Cargar archivo</h3>

Page 106: php_y_mysql

<form action='{$_SERVER['PHP_SELF']}?formavis=zuxrkk' method="post" enctype="multipart/form-data"> <input type="file" name="archivo"> <input type="submit" name='submit' value="Cargar archivo"> </form> FORMULARIO; $ruta = "./imagenes/"; // Indicar ruta if (isset($_FILES['archivo']) && $_FILES['archivo']['size'] > 0) { $anchomax = 600; $nombretemp = $_FILES['archivo']['tmp_name']; $nombrearchivo = $_FILES['archivo']['name']; $tamanyoarchivo = $_FILES['archivo']['size']; $tipoarchivo = GetImageSize($nombretemp); if ($tipoarchivo[2] == 1 || $tipoarchivo[2] == 2) { // GIF o JPG? if ($tipoarchivo[0] <= $anchomax) { if (move_uploaded_file($nombretemp, $ruta . $nombrearchivo)) { echo "<p>El archivo se ha cargado <b>con éxito</b>. Tamaño de archivo: <b>$tamanyoarchivo</b> bytes, Ancho: <b>$tipoarchivo[0]</b> Nombre de imagen: <b>" . "$nombrearchivo</b><br></p>"; } else { echo "<p>No se ha podido cargar el archivo</p>"; } } else { echo "<p>El archivo tiene una anchura superior a <b>$anchomax píxeles</b> y es demasiado ancho.</p>"; } } else { echo "<p>No es un archivo GIF o JPG válido.</p>"; } echo "<form action='{$_SERVER['PHP_SELF']}?formavis=zuxrkk' method='POST'> <input type='submit' value='OK'></form>"; } $filehandle = opendir($ruta); // Abrir archivos while ($file = readdir($filehandle)) { if ($file != "." && $file != "..") { $tamanyo = GetImageSize($ruta . $file); echo "<p><img src='$ruta$file' $tamanyo[3]><br></p>\n"; } } closedir($filehandle); // Fin lectura archivos } ?> </body> </html>

Page 107: php_y_mysql

Módulo 4 Programación en PHP y Bases de datos

Envío y validación de formularios.

En este apartado veremos como enviar el contenido de los formularios por correo electrónico. En conjunción con el servicio SMTP instalado en el servidor (en el caso de linux suele ser Sendmail) se enviará la información.

En primer lugar crearemos un mini servicio de envío, después el servicio de envío universal y finalmente lo ampliaremos.

La función mail().

Su sintaxis es la siguiente: mail("e-mail del distanatario", "asunto", "mensaje", "De: e-mail del remitente") Es posible utilizar variables en lugar de las cadenas indicadas en la sintaxis. En caso de que el envío sea satisfactorio, la función devuelve el valor TRUE, en caso contrario el valor devuelto será FALSE. El mini sistema de envío: Mostraremos un formulario que solicita el correo electrónico del destinatario y un campo textarea con el contenido del mensaje, así como un botón para realizar el envío. Si este se realiza correctamete se indicará con un mensaje, en caso contrario dara un mensaje de error, ( cópialo, guárdalo en tu carpeta de prácticas con el nombre minimail.php y pruébalo en el navegador).

<html> <head> <title>Mini-Correo</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="../css/nuevo.css"> </head> <body> <h1>Mini-Correo</h1> <p>Envíeme un mensaje de e-mail</p> <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post"> Su dirección de correo electrónico: <input type="text" name="mail"> <br> Qué quiere decirme:<br> <textarea name="mensaje" cols="50" rows="5" wrap="soft"> </textarea> <br> <input type="submit" value="Enviar mensaje"> </form> <?php if (isset($_POST["mail"]) && $_POST["mail"] != "") { if(mail("[email protected]", "Tiene correo nuevo", "$mensaje", "De:".$_POST["mail"])) { echo "<p>¡Gracias! Su mensaje ha sido enviado.</p>\n"; }

Page 108: php_y_mysql

else { echo "<p>Por desgracia, se ha producido un error al enviar.</p>\n"; } } ?> </body> </html>

Si lo que queremos es un sistema de envío de formularios que envíe todos sus formularios, independientemente de cómo estén construidos y de cuántos campos tenga, necesitaremos utilizar los vectores asociativos para recorrer la totalidad de campos del formulario (para ello será necesario dar un nombre a todos los campos del formulario), ( cópialo, guárdalo en tu carpeta de prácticas con el nombre minimail2.php y pruébalo en el navegador).

<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Valoración de formularios</title> </head> <body> <?php /* LAS SIGUIENTES LÍNEAS SE PUEDEN EDITAR */ $destinatario="[email protected]"; $asunto="Escriba aquí el texto del mensaje"; $mensaje="Se han insertado los siguientes datos:\n\n"; /* FINAL DE EDICIÓN */ /* El bucle lee los pares atributo-valor: */ foreach($_POST as $name=> $value) { /* Todos los datos se almacenan en $mensaje: */ $mensaje.="$name=$value\n"; // Versión abreviada para la concatenación } /* ¡Enviar! Preparar el campo de mail en el formulario */ if (isset($_POST["mail"]) && $_POST["mail"]!="") { // ¿Campo mail establecido y no vacío? /* Se activa la función de envío mail() */ if(mail($destinatario, $asunto, $mensaje, "De: ".$_POST["mail"])) { /* ¿Ha tenido éxito la función mail()? El usuario verá las siguientes líneas */ echo "<h1>¡Gracias por sus comentarios!</h1>\n"; echo "<p>Su mensaje ha sido enviado.</p>\n"; } /* En caso contrario, se muestra un mensaje de error: */ else { echo "<h1>Desgraciadamente, no se ha podido enviar su mensaje.</h1>\n"; } } // cerrar la función externa if /* else si no se ha establecido la variable $mail: */ else { echo "<h1>Por favor, escriba su dirección de correo electrónico.</h1>\n"; } ?> </body> </html>

Esta página php recibirá en el vector $_POST con todos los campos del formulario que llamo a esta página, se van concatenando en la variable $mensaje con el objetivo de envialos por correo electrónico.

Page 109: php_y_mysql

Pero será necesario que la página que llame a esta tenga un formulario con un campo llamado mail (este campo será utilizado para saber de donde venimos), y por lo tanto daremos un mensaje de error en los casos de que el correo electrrónico del destinatario no existe o no se realice correctamente el envio y un mensaje de confirmación si el correo se envia correctamente,

Veremos una última versión del programa de envio de formulario por correo electrónico, en esta versión solicitaremos el nombre, los apellidos, el correo del destinatario y el cuerpo del mensaje. Mostraremos el correo antes de confirmar el envio y en caso de no estar conforme podremos volver atrás, modificar y volver a confirmar el envio, ( cópialo, guárdalo en tu carpeta de prácticas con el nombre minimail3.php y pruébalo en el navegador).

<html> <head> <title>El formulario para enviar su opinión</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="../css/nuevo.css"> </head> <body> <h1>El formulario para enviar su opinión</h1> <?php // ¿Botón submit vacío, 0 o no definido? if (empty($_POST["submit"])) { ?> <h3>1. Escriba sus datos</h3> <form action="<?PHP echo $_SERVER["PHP_SELF"]; ?>" method="post"> Nombre: <input type="text" name="nombre"><br> Apellido: <input type="text" name="apellido"><br> E-mail: <input type="text" name="mail"><br><br> Su opinión:<br> <textarea name="feedback" cols="50" rows="5" wrap="soft"> </textarea><br><br> <input type="reset" name="reset" value="xXx Borrar datos"> <!-- importante: ¡asignar el nombre submit al botón de envío! --> <input type="submit" name="submit" value="Enviar ahora --&gt;"> </form> <?php } // En caso contrario, es decir si el botón de submit existe else { ?> <h3>2. Vuelva a comprobar sus datos</h3> <?php foreach($_POST as $key => $value) { // repasa todos los campos del formulario if (empty($value)) { // ¿valor vacío, 0 o no definido? ?> <p>Por favor, rellene <b>todos los campos</b>.</p> <form> <input type="button" value="&lt;-- Volver al formulario" onclick="javascript:history.back()"> </form> <!-- Consejo de seguridad, visible sólo para usuarios sin JavaScript: --> <noscript>Utilice el botón ATRÁS del navegador para volver</noscript> <?php exit; // termina el bucle y el programa.

Page 110: php_y_mysql

} } echo "<p>Hola <b>".$_POST['nombre'].$_POST['apellido']."</b><br>\n"; echo "Su dirección de correo electrónico es <b>".$_POST["mail"]."</b>!<br>\n"; echo "Ha introducido la siguiente información:<br>\n"; // Eliminar las barras invertidas y mantener los saltos de línea para mostrar el contenido: echo "<i>" . stripslashes(nl2br($_POST["feedback"])) . "</i><br><br>\n"; echo "¿Son correctos estos datos?</p>\n"; // Los datos introducidos por el usuario se escriben en un campo: $mensaje=$_POST["nombre"].$_POST["apellido"].", ".$_POST["mail"]." ha escrito\n".$_POST["feedback"]; $mensaje=htmlspecialchars($mensaje); // Enmascarar los caracteres especiales de HTML $mensaje=stripslashes($mensaje); // Eliminar las barras invertidas // Crear un nuevo formulario para reenviarlo al script de envío echo "<form action=\"mail.php\" method=\"post\">\n"; // Truco: mostrar los datos de los campos ocultos del formulario: echo "<input type=\"hidden\" name=\"mail\" value=\"".$_POST["mail"]."\">\n"; echo "<input type=\"hidden\" name=\"mensaje\" value=\"$mensaje\">\n"; echo "<input type=\"button\" value=\"&lt;-- No, por favor corríjalo\" "; echo "onclick=\"javascript:history.back()\">\n"; // Concesión para los que desactiven JavaScript: echo "<noscript>Vuelva atrás utilizando el botón ATRÁS.</noscript>\n"; echo "<input type=\"submit\" name=\"mailsender\" "; echo "value=\"Perfecto --&gt;\"></form>\n"; } ?> </body> </html>

El fichero mail.php será el encargado de realizar el envío final:

<html> <head> <title>Mini-Correo</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="../css/nuevo.css"> </head> <body> <h1>Se envían los datos</h1> <?php if (isset($_POST["mail"]) && $_POST["mail"] != "") { if(mail("[email protected]", "Tiene correo nuevo",$_POST["mensaje"], "De:".$_POST["mail"])) { echo "<p>¡Gracias! Su mensaje ha sido enviado.</p>\n"; } else { echo "<p>Por desgracia, se ha producido un error al enviar.</p>\n"; } } ?> </body> </html>

Page 111: php_y_mysql

Módulo 4 Programación en PHP y Bases de datos

Gestión de Ficheros

En este apartado vamos a trabajar con ficheros. Anteriormente, fuimos capaces de comprobar la afinidad existente entre PHP y C en tanto que, por ejemplo, su sintaxis general o sus estructuras de control presentaban un alto grado de similitud. En el caso de la gestión de ficheros, PHP cuenta con un cuerpo de funciones base similar al existente en C, respetando incluso la sintaxis de éstas.

Por lo tanto, comenzaremos haciendo un repaso de las más importantes, al que sumaremos algunas específicas de PHP, al tiempo que lo ilustraremos con ejemplos concretos.

Funciones más importantes

fopen(archivo,modo): función de apertura de fichero que devuelve una valor numérico de tipo integer con la referencia al archivo abierto. Esta función dispone de diversos modos de apertura del fichero para lectura/escritura.

r Sólo lectura. El puntero al comienzo del archivo. r+ Lectura y escritura; apuntador al inicio del archivo. w Sólo escritura, si no existe el archivo lo crea, si existe lo convierte en fichero de longitud cero y el apuntador se coloca en el inicio. w+ Lectura y escritura, si no existe el archivo lo crea, si existe lo convierte en fichero de longitud cero y el apuntador se coloca en el inicio. a Modo append, sólo escritura, si no existe lo crea. Si existe, el apuntador se coloca al final del fichero. a+ Modo append, lectuta y escritura, si no existe lo crea. Si existe, el apuntador se coloca al final del fichero.

fclose(indicador_archivo): función que cierra un archivo valiéndose de su referencia en la apertura. Devuelve TRUE si el fichero se cerró correctamente, FALSE en caso contrario. file_exists(fichero): función que devuelve TRUE si el archivo especificado existe o FALSE en caso contrario.

fgets(indicador_archivo,longitud): función que devuelve una cadena de como mucho longitud - 1 bytes leídos del fichero apuntado por el indicador_archivo. La lectura acaba cuando son leídos (longitud - 1) bytes, cuando se llega a una nueva línea (el caracter de nueva línea se incluye en el valor devuelto), o cuando se llega a un EOF (lo que ocurra primero). fputs(indicador_archivo,cadena): función que escribe una cadena en el fichero indicado.

El fichero debe estar previamente abierto la función devuelve TRUE si se ha escrito con éxito y FALSE en caso contrario.

feof(indicador_archivo): función que comprueba si hemos alcanzado el final de fichero, devolviendo TRUE en tal caso.

flock(indicador_archivo, modo): bloquea o desbloquea el fichero para que no pueda ser abierto en modo escritura.

El siguiente ejemplo combina algunas de las funciones anteriores. Cópialo, guárdalo en tu carpeta de prácticas con el nombre practica43_2.php y pruébalo en el navegador.:

Page 112: php_y_mysql

<? /*----------------------------------------------------------------- * Módulo: 4 Práctica: 3 Fichero: practica43_2.php * Descripción: Ejemplo funciones de ficheros (I) * Pre condi.: * Post cond.: -----------------------------------------------------------------*/

$nombre="prueba.txt" if(file_exists($nombre)){ if($ref=fopen($nombre,"r")) while(!feof($ref)){ $linea=fgets($ref,11); echo $linea;} } else echo "El archivo no existe"; fclose($ref); ?>

>> Observaciones:

en la primera instrucción "if", comprobamos que el fichero $nombre existe con la ayuda de la función file_exists. de ser así, abrimos el fichero en modo lectura con la función fopen, para ... ... acto seguido, extraer once caracteres de cada una de las líneas del fichero de que conste el fichero mediante la función fgets hasta que alcancemos su final, detectado por la función feof . por último, cerramos el fichero abierto mediante la función fclose

Otras funciones que cabría tener presente serían:

readfile(fichero): función que visualiza el contenido de un fichero por la salida estándar (consola), preservando su disposición. file(): Si queremos acceder a todo el contenido de un fichero y operar con él, podemos usar la función file(). Esta función lee el fichero línea por línea y devuelve un array (un elemento por línea).

El siguiente ejemplo combina utiliza la función file. Cópialo, guárdalo en tu carpeta de prácticas con el nombre practica44.php y pruébalo en el navegador:

<?

/*----------------------------------------------------------------- * Módulo: 4 Práctica: 4 Fichero: practica44.php * Descripción: Ejemplo formulario (1)

Page 113: php_y_mysql

* Pre condi.: * Post cond.: -----------------------------------------------------------------*/

$nombre="prueba.txt"; if(file_exists($nombre)){

// Con "file" generamos el array "texto" // Cada línea dl fichero será un elemento del array $texto=file($nombre);

// Mostramos cada una de las líneas del array // apoyándonos en las funciones 'list' y 'each' while(list($linea,$contenido)=each($texto)) echo ($linea+1)." --> ".$contenido."<br>"; } else echo "El archivo no existe";

?>

>> Observaciones:

La función file nos permite volcar el contenido del fichero a un array de tantos elementos como líneas tenga el fichero. En el bucle "while" extraemos uno a uno, en cada iteración, los elementos del array $texto mediante la función each. Acto seguido, la función list se encarga de separar, por una lado, el índice del elemento, el cual es guardado en la variable $linea, y, por otro, el contenido del elemento, que es guardado en la variable $contenido . El contenido de ambas variables, $linea y $contenido , son mostrados en el navegador. Como se puede observar, en ningún momento hemos necesitado abrir y cerrar el fichero para poder acceder a su contenido, lo cual supone una ventaja.

Page 114: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Servidores de bases de datos Objectivos Los objetivos son:

Analizar diferentes motores de base de datos. Instalar el driver ODBC para acceder a la BD. Conocer herramientas para administrar las bases de datos. Conocer las operaciones básicas que se pueden hacer con SQL.

Contenidos

Análisis de bases de datos.

Drivers ODBC.

Instalación y configuración de PhpMyadmin.

Herramientas para administrar una BD.

Lenguaje SQL.

Conexión de PHP con MySQL.

Page 115: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Análisis de bases de datosEl objetivo de este módulo es conocer diferentes motores de bases de datos.

Bases de datos Open Source

Debido a las constantes actualizaciones y mejoras que van apareciendo en los distintos productos deberiamos tomar este análisis como una introducción a las bases de datos. Analizaremos tres ejemplos de bases de datos:

MySQL PostgreSQL Interbase Conclusiones

MySQL

Los origenes de Mysql datan de 1979, como una herramienta de BD llamada UNIREG, creada por Michael Widenius para la empresa sueca TcX. El 1994, TcX necesitaba un servidor SQL para el desarrollo de aplicaciones web. Probaron varios servidores comerciales para las inmensas tablas de TcX, pero todo lo que encontraron fue demasiado lento. Incluso analizaron mSQL, pero no implementaba alguna de las caracteristicas que TcX necesitaba. Se encargo a Widenius el desarrollo de un servidor de bases de datos, con una interface parecido a mSQL, ya que en aquel momento estaban disponibles algunas herramientas gratuitas para mSQL que se podían adaptar con poco esfuerzo al nuevo servidor.

En1995,David Axmark de Detron HB animó a TcX para que publicase MySQL en Intenet. MySQL no es un proyecto Open Source realmente, ya que bajo ciertas condiciones es necesaria una licencia. Pese a todo, MySQL es uno de los preferidos de la comunidad Open Source.

MySQL no se limita a la comunidad Open Source, también es portable a otros sistemas operativos comerciales, como Windows (NT/2000/95/98/ME/XP), Solaris y otros. Uno de los éxitos de su expansión ha sido la inclusión de esta base de datos en casi todas las distribuciones de Linux, además de estar disponible en casi todas las plataformas hardware y sistemas operativos. El gran propulsor de esta BD ha sido el lenguaje interpretado para web PHP, que ha hecho que Mysql creciera al mismo tiempo que lo ha hecho la comunidad PHP.

Características de MySQL

Es posiblemente un de los motores de BD más rápidos que se pueden encontrar, además de consumir pocos recursos de la máqina en la que esta instalada.

Es fácil de instalar y administrar frente a otros productos del mercado. Dispone de infinidad de

Page 116: php_y_mysql

utilidades, manuales y documentación que la comunidad de usuarios se ha encargado de realizar desinteresadamente.

La gestión de la base de datos utiliza SQL (Structured Query Language), además de utilizar protocolos de comunicación de bases de datos desarrollados por Microsoft, mediante ODBC o ADO.

Ofrece una gran capacidad de connectividad, ya que muchos clientes pueden conectar simultaneamente al servidor, y pueden utilizar deferentes bases de datos a la vez. Se puede acceder de forma interactiva utilizando diferentes interfaces que permiten introducir y visualizar las consultas. Además dispone de gran variedad de interfaces de programación para su acceso (C, Perl, Java, PHP,Python...).

Se trata de una BD preparada para el trabajo en red y se puede acceder desde cualquier sitio de internet como resultado de su gran fabilidad en materia de control de permisos y seguridad de acceso.

La versión 3.23 no cumplia la integridad referencial, con posibles problemas de inconsistencia de datos, y tampoco tenía transacciones. En versiones actuales la mayoria de las deficiencias que tenía han sido subsanadas. Aunque todavía no cumple el 100 % de los requisitos de una verdadera RDBMS, ofrece otras características que hace que sea considerada como idónea para su uso.

PostgreSQL

Se puede afirmar PostgreSQL es la segunda BD más popular implementada en el mercado Linux. PostgreSQL se diseño como una base de datos orientada a objetos, es decir, una ORDBMS, con la cual el concepto de tabla es sustituido por objeto, y se permite crear nuevos tipos de datos, hacer herencias de objetos, etc.

PostgreSQL es, sin lugar a dudas, la base de datos más implementada por los expertos, dispone de lo que MySQL le falta o faltaba, pero también carece de algunas de las características que posee MySQL. PostgreSQL tiene transacciones, integridad referencial, vistas y multitud de funcionalidades, por contra es un motor más lento y más pesado.

La versión 7 incorpora MVCC (Multiversion Concurrency Control), gracias a la cual los bloqueos actuan solo en la sesión del cliente, y no en la de otros clientes.

PostgreSQL es una RDBMS poco viable para un servidor de internet, pero si para un servidor con pocas conexiones que requieren mucha funcionalidad, como un comercio on-line. Para operaciones sencillas y muchas conexiones, el sistema resulta poco recomendable, al tener en cuenta la velocidad y recursos utilizados.

InterBase

Borland, siguiendo la política de liberar las herramientas de desarrollo, liberó InterBase. Se

Page 117: php_y_mysql

trata de una buena BD, con 17 años de antiguedad dentro del sector de las bases de datos comerciales. InterBase ofrece herramientas de pago para el mundo comercial.

Es una de las primeras BD Open Source que es compatible con SQL92 en el nivel de entrada (MySQL, PostgreSQL y mSQL no lo son). Esto significa que podemos adaptarla a cualquier aplicación que funcione sobre una BD compatible con SQL92, como Oracle, DB2, o Informix.

InterBase es un producto muy profesional, preparado para cualquier proyecto que necesite una BD fiable. Tiene la mayoria de la funcionalidades de una base de datos comercial, no consume demasiados recursos, y tiene una velocidad próxima a MySQL, con algunas funcionalidades de PostgreSQL.

Pero, Borland no ha liberado las herramientas más avanzadas, y la comunidad de usuarios es muy pequeña, comparando con los otros motores de BD.

Conclusiones

Hemos visto una introducción de las posibles alternativas que tenemos, y según el proyecto que tengamos que realizar, la posible solución variará, ya que necesitaremos priorizar unas características sobre otras que deberemos sacrificar.

Dependiendo de las fuentes que busquemos obtendremos una respuesta u otra, hay verdaderas batallas por establecer cuál de ellas es mejor, pero la realidad es que no hay nada perfecto, y dependiendo de nuestras habilidades y necesidades deberemos elegir uno u otro.

Se trata de buscar un motor de base de datos que pueda integrar un servidor web Apache, y accesible desde PHP, para la creación de entornos web dinámicos. Ante esto, la respuesta es mayoritaria (MySQL, APACHE, PHP) es la combinación más acertada, fiable, estable, y documentada que tenemos en la actualidad.

Page 118: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Instalación y conexión a una BD.

Veremos la forma de obtener e instalar el driver ODBC, para acceder a la base de datos utilizando este tipo de conexión. Una vez que el servidor web a solicitado al intérprete de php la ejecución de un determinado script, éste se puede encontrar con sentencias que pretenden manipular los datos de una base de datos. La forma en que el intérprete de PHP y el gestor de bases de datos pueden conectar es doble: ODBC (Open DataBase Connectivity) y funciones nativas. La primera consiste en una API estándar que oculta detalles de la conexión. Para poder utilizarla se hace necesario instalar o activar el módulo encargado de su gestión y realizar las llamadas correspondientes desde nuestro programa.

Obtención e instalación de MyODBC (Windows)

En la siguiente página de MySQL podemos encontrar el último enlace al driver ODBC estable para acceder a MySQL.

http://www.mysql.com/products/

Una vez tenemos el fichero de instalación *.exe, hacer doble clic para ejecutar el programa y se mostrará la siguiente pantalla:

Figura 5.2.1. Instalación de ODBC Windows.

A partir de aquí, tan solo debemos pulsar el botón Siguiente, si todo funciona correctamente, aparecerá la siguiente pantalla:

Page 119: php_y_mysql

Figura 5.2.2. Instalación de ODBC Windows.

La connexión ODBC está lista para ser utilizada. Para comprobarlo se puede acceder al panel de control de los controladores ODBC instalados. En la siguiente tabla se muestra donde realizar estas comprobaciones dependiendo del sistema operativo utilizado.

Sistema Ubicación de los controladores ODBC

Windows 95/98 Inicio / Configuración / panel de control / Controladores ODBC.

Windows 2000 Prof/Serv y XP

Inicio / Configuración / panel de control / Herramientas administrativas / Orígenes de datos (ODBC).

Page 120: php_y_mysql

Figura 5.2.3. Administrador de controladores ODBC.

Debemos seleccionar la pestaña de DSN de usuario, y crear uno nuevo. Lo primero que se solicita es el controlador para establacer un origen de los datos.

Figura 5.2.4.Nuevo DSN de usuario.

Data Source Name especifica el nombre que queremos dar al ODBC, en Server se indica el nombre del servidor de bases de datos (generalmente localhost). En el campo Database podemos selecionar la base de datos a la que queremos establacer la conexión. Los

Page 121: php_y_mysql

campos User y Password en principio no se deben modificar, a no ser que en la instalación se hayan modificado.

Figura 5.2.5. Parámetros del nuevo DSN.

Pulsar el botón Test y si la conexión es correcta, se abrirá una ventana como la siguiente:

Figura 5.2.6. Conexión correcta.

Una vez terminada la creación del nuevo DSN de usuario, utilizando el controlador ODBC para MySQL, aparecerá la siguiente pantalla:

Page 122: php_y_mysql

Figura 5.2.7. Administrador de orígenes de datos ODBC.

Hay que tener especial cuidado con la seguridad de las bases de datos, si tenemos un servidor en el que se puede ejecutar un administrador de bases de datos, o un usuario puede subir uno de ellos, probablemente conozca los usuarios por defecto que se instalan. Con el usuario por defecto 'root' podrá: ver, modificar o borrar todas nuestras bases de datos. Por lo que cada base de datos debería tener un usuario y contraseña diferente, estos datos se deberían cambiar en la definición del DSN.

Obtención e instalación de MyODBC (Linux)

En la siguiente página de MySQL podemos encontrar el último enlace al driver ODBC estable para acceder a MySQL. Acceder al apartado Linux, seleccionar la plataforma que nos interesa (debian) y bajar el fichero MYODBC-n.nn.n_pc_linux_i386.tar.gz

http://www.mysql.com/products/

Si descomprimimos el paquete que hemos bajado, deberíamos encontrar un fichero llamado README, en el que se detallan los pasos que debemos seguir para la instalación del driver ODBC bajo linux. Pero en realidad nos recomienda que realicemos otro tipo de instalación o que busquemos más información en la página oficial.

De la misma forma que hicimos para la instalación de Apache, Mysql y Php, para el driver ODBC y unixODBC utilizaremos el gestor de paquetes synaptic. Seleccionaremos los siguientes paquetes:

libmyodbc. php4-odbc. unixodbc. unixodbc-bin. unixodbc-dev.

Page 123: php_y_mysql

Figura 5.2.8 Instalación de UNIXODBC.

Con la herramienta gráfica de administración unixODBC, podemos acceder a las bases de datos utilizando una interface estándar de acceso. Muchas distribuciones Linux (RedHat, Suse, United Linux y plataformas como Solaris, AIX, HP/UX ), incorporan esta herramienta.

Con este paquete viene una utilidad llamada ODBCConfig, muy parecida a la de Windows con la que podremos crear el DSN. Se encuentra en el directorio /usr/bin y se debe ejecutar como root, el comando es "ODBCConfig".

Page 124: php_y_mysql

Figura 5.2.9. Administrador de controladors UnixODBC Al igual que en Windows tan solo tenemos que añadir un DSN de usuario y rellenar los datos que se solicitan.

Figura 5.2.10 Nuevo DSN de usuario con UnixODBC.

Page 125: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Instalación y actualización de PhpMyAdmin

Si se quiere actualizar la versión de PhpMyAdmin, recordad realizar una copia del fichero 'config.inc.php o config.inc.php3 ' que se encuentra en el directorio donde esta instalado phpMyAdmin.

Podemos buscar la última actualización en: http://www.phpmyadmin.net/

En función del sistema operativo con el que trabajemos, deberemos descargar un fichero ZIP o TGZ. Una vez descargado, debemos descomprimir el fichero en la carpeta 'phpMyAdmin' (aunque después podremos renombrarla).

Si no lo tenemos ya instalado, debemos descomprimir el fichero creando la carpeta 'phpmyadmin', en el directorio del servidor web que tengamos. En el caso de Internet Information Server (Microsoft) el directorio por defecto es: 'C:\Inetpub\wwwroot', y en el caso de 'Apache', generalmente '...\Apache\http\' o '/var/www/html'.

Recordad que debemos dar permisos de ejecución al directorio donde hemos descomprimido phpMyAdmin, puesto que el motor de esta herramienta esta compuesto por ficheros del tipo *.php.

Fichero de configuración. ( config.inc.php )

Este fichero contiene la configuración de phpMyAdmin, variables que son utilizadas en las diferentes funciones de la herramienta (colores, usuarios, contraseñas, nombres de los servidores...).

A continuación detallaremos la función de algunas de estas definiciones de variables, y en concreto las relacionadas con la configuración del servidor.

$cfg['PmaAbsoluteUri'] = 'http://localhost/pma/';

Este parámetro determina, la localización de la aplicación PhpMyAdmin, en principio el sistema lo autodetecta, pero si fallara podriamos colocar la localización. Además, cabe recordar que 'pma' es el nombre de la carpeta relativa al PhpMyAdmin (se renombró la carpeta).

$cfg['Servers'][$i]['host'] = 'localhost';

En este parametro se define quien será el [identificativo de host], por defecto será 'localhost' ya que PhpMyAdmin actua siempre desde el propio servidor de bases de datos.

$cfg['Servers'][$i]['port'] = ' ';

Indica el puerto de acceso a MySQL, si no ponemos nada el puerto por defecto es el 3306, definido por defecto por MySQL.

Page 126: php_y_mysql

$cfg['Servers'][$i]['connect_type'] = 'tcp'; Definine el tipo de protocolo utilizado en la conexión, por defecto se utiliza 'TCP'.

$cfg['Servers'][$i]['auth_type'] = 'config';

Con este parametro definimos el método de autenticación que utilizarán los usuarios para acceder a phpMyAdmin. Si utilizamos el método 'config', tendremos que establecer los parámetros de usuario en este fichero, en los apartados 'user' y 'password' . Este es el método más utilizado, pero no el más recomendable por razones de seguridad.

Si utilizamos el método ' http', se solicitará para la autenticación del usuario, el usuario y la contraseña desde una pantalla del propio sistema, se consultarán los permisos que tiene el usuario a partir de los previlegios definidos en el propio servidor de MySQL. En la siguiente figura se puede observar la interface de identificación de usuario. Si se entra como 'root' en phpMyAdmin, hay un apartado de 'Privilegios', donde se definen los usuarios y los previlegios que tienen sobre las bases de datos.

Figura 5.3.1. Autenticación PhpMyAdmin.

El sistema de seguridad y privilegios son implementados por el servidor MySQL, no por phpMyAdmin.

$cfg['Servers'][$i]['user'] = 'root';

Indica el nombre del usuario con el que se accederá desde phpMyAdmin sobre el servidor MySQL. Es muy importante recordar que hay un usuario por defecto llamado 'root' y sin contraseña. Este parámetro, por lo tanto solo tiene sentido si el método de autenticación es 'config'.

Nunca se debe permitir que se acceda a una base de datos con el usuario 'root', debemos crear otros usuarios con sus permisos correspondientes. ( Opción 'Privilegios' de PHPMyAdmin ).

$cfg['Servers'][$i]['password'] = '';

Esta claro que este parámetro establace la contraseña, por defecto, la contraseña de 'root', esta vacia.

Al igual que el parámetro anterior, sólo tiene sentido si el método de autenticación es 'config'.

Page 127: php_y_mysql

$cfg['Servers'][$i]['only_db'] = '';

En esta variable se establace la base de datos a la que se accede, o puede tratarse de un array de bases de datos que se podrán visualizar desde PhpMyAdmin. Si se deja vacia esta variable se verán todas las bases de datos. Existen muchas más variables, que establecen filtros, caminos,etc. En caso de querer profundizar en la configuración de PhpMyAdmin, sería recomendable consultar la información asociada a la herramienta.

Page 128: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Herramientas para administrar una BD.En este módulo se pretende conocer herramientas para la administración de bases de datos, como ejemplo se creará una base de datos sobre la que trabajaremos en módulos posteriores, veremos tres:

PhpMyadmin MySQL Control Center MySQL Administrator

PhpMyAdmin Se trata de una herramienta de gestión exclusiva de MySQL creada inicialmente por Tobias Ratschiller con PHP y continuada por muchos colaboradores. Consiste en un conjunto de scripts PHP para administrar las bases de datos de MySQL bajo un entorno web. Esta particularidad de funcionar bajo entorno web permite administrar bases de datos en remoto, simplemente necesitamos una conexión a Internet y un navegador. En muchísimas empresas en las que se da servicio web, se ofrece PhpMyadmin como herramienta de administración de nuestras bases de datos. Con cualquier navegador podemos acceder directamente a http://localhost/pma/ (donde pma es el directorio virtual donde hemos instalado PhpMyadmin) para ver la pantalla principal de administración. En el caso de querer actualizar la herramienta a una versión más moderna o que se quiera instalar de nuevo, en el punto anterior se explican los pasos a seguir. En la pantalla inicial de PhpMyAdmin, se puede observar que aparece en la parte inferior ( texto en rojo) información de que en el fichero de configuración, existen parámetros por defecto (usuario: root y sin contraseña). Esta información intenta avisarnos de que podemos tener en peligro la seguridad del sistema, ya que cualquiera podría entrar. Es muy recomendable que los usuarios se identifiquen con su usuario y contraseña, para ello debemos modificar el paramentro correspondiente (ver en el punto anterior). Deberemos modificar la contraseña del usuario 'root' y resulta muy recomendable crear otro usuario con los mismos previlegios que root.

Pantalla principal de PhpMyAdmin

Page 129: php_y_mysql

Figura 5.4.1. Pantalla principal de phpMyAdmin.

En la parte central y a la derecha, vemos que podemos seleccionar el idioma, ver documentación y llamar a la función phpinfo( ) para obtener información del sistema y su configuración. En el centro aparecen las operaciones relacionadas con las bases de datos MySQL. Estadísticas de acceso, entorno de variables, información de procesos, privilegios y detalles de las bases de datos. En la parte superior izquerda aparece un desplegable donde podemos seleccionar la base de datos que queremos utilizar. En la parte inferior izquierda podemos abrir una nueva ventana de consulta, donde utilizando instrucciones SQL podemos atacar la base de datos. Existen problemas a la hora de exportar una base de datos de una plataforma a otra (linux - windows), aunque hemos detectado que alguna versión, o alguna otra herramienta, mejor dicho, ya resuelve el problema, es preferible escribir siempre los nombres en minúsculas, de esta manera, no tendremos problemas para que nuestra base de datos sea portable entre plataformas.

Crear una base de datos (academia).Hacer clic sobre el campo crear base de datos y teclear el nombre que tendrá la base de datos (en nuestro caso academia). Hay que tener en cuenta que es sensible a la letras mayúsculas y minúsculas, por lo que a la hora de utilizar la base de datos desde PHP tendremos que escribir su nombre como se creó.

Page 130: php_y_mysql

Figura 5.4.2. Crear una nueva base de datos.

Después de pulsar el botón Crear, se pide el nombre de la primera tabla y el numero de campos que tendrá.

Figura 5.4.3. Crear una tabla de datos.

Podemos ver los tipos de variables que soporta Mysql desde el siguiente enlace tipos de variable. Modificar los tipos de campos, como se muestra en la siguiente tabla.

Tabla: alumnos

Campo Tipo Null Defecto Otros

dni varchar(8) No 0 clave primaria

nombre varchar(30) No null

apellidos varchar(30) No null

telefono varchar(30) Sí null

poblacion tinyint(1) No null La tabla de la base de datos quedaría:

Page 131: php_y_mysql

Figura 5.4.4. Tabla de alumnos.

Crear las otras dos tablas siguiendo las siguientes instrucciones.

Tabla: cursos

Campo Tipo Null Defecto Otros

codigo int(11) No autoincrement clave primaria

titulo varchar(30) No null

n_plazas tinyint(4) No 0

precio int(11) No 0

lugar_realizacion varchar(30) No null

Tabla: matriculas

Campo Tipo Null Defecto Otros

dni varchar(8) No clave primaria

codigo int(11) No clave primaria

Otras operaciones con PhpMyAdmin. Una vez seleccionada la base de datos ejemplo (academia) podemos ver las operaciones que podemos ejecutar sobre ella. A la izquierda se muestra la base de datos en uso y las tablas que la componen. A la derecha se muestran cada una de las tablas con sus características (número de registros, tipo de tabla, tamaño) y operaciones asociadas a cada una de ellas. Las operaciones que podemos realizar:

Page 132: php_y_mysql

Examinar: permite ver y actualizar los registros de la tabla.

Seleccionar: permite hacer una selección de registros a visualizar.

Insertar: permite insertar datos en la tabla seleccionada.

Propiedades: muestra información de llos campos de la tabla.

Eliminar: permite eliminar la tabla, la estructura y los datos.

Vaciar: borra los datos y deja la estructura.

Exportar tablas de una BD.Una de las pestañas superiores 'Exportar' permite hacer copias de seguridad de la BD o intercambiar datos con otros sistemas, el resultado se almacena en un fichero que se puede enviar a otra maquina. Existen varios formatos para realizar la exportación (SQL, Latex, CSV, XML) pero el más común es SQL que crea un fichero con extensión SQL que incorpora junto a las sentencias SQL necesarias, el contenido y la extructura de las tablas seleccionadas. Lo primero que debemos seleccionar son las tablas a exportar y el formato deseado. Si hemos seleccionado el formato SQL, a la derecha dispondremos de dos recuadros: 'Estructura' y 'Datos'. Desde el recuadro de estructura podemos modificar las características de los campos de las tablas y en el recuadro de datos decidimos si se crean las sentencias necesarias para exportar los datos. En el apartado estructura existe la opción 'añadir drop table', que añade al fichero .sql las instrucciones necesarias para borrar las tablas que se exportan antes de ejecutar las senténcias de inserción. Para poder guardar el fichero generado debemos seleccionar la opción 'enviar', donde podremos escribir el nombre del fichero resultante o permitir que la herramienta asigne el nombre de la base de datos. Cuando pulsemos el botón continuar, aparecerá un cuadro de diálogo que nos permitirá selecionar la ubicación de dicho fichero.

Importar tablas de una BD.Seleccionar la pestaña SQL, y pulsar el botón Browse, buscar y seleccionar el fichero creado con la opción exportar.

Page 133: php_y_mysql

Figura 5.4.7. Exportar tablas.

Después de pulsar el botón continuar se ejecutará el fichero de ordenes SQL e informará que la consulta se ejecutó con éxito. Este sistema es ideal para hacer copias de seguridad de las bases de datos, es aconsejable hacer las exportaciones con ficheros '*.sql'. Para practicar estos conceptos podemos exportar la base de datos academia, crear una nueva base de datos con un nombre nuevo, y recuperar la estructura y los datos de la anterior.

MySQL Control Center La misma empresa de MySQL lanzó una aplicación cliente de administración para el servidor de bases de datos MySQL, que podemos descargar de la web de MySQL. Incorpora opciones adicionales a PhpMyAdmin. Hay versiones para Windows y Linux. La filosofía de la herramienta en totalmente diferente: mientras que MySQLCC es una aplicación que se ejecuta en la maquina cliente, PhpMyAdmin reside en el servidor, por lo que solo tiene sentido para los administradores de los servidores. No son excluyentes y muy recomendable tener ambos accesibles. El problema es que MySQL Control Center en estos momentos ha quedado obsoleto y no sigue desarrollándose. Se ha sustituido por el conjunto de programas MySQL Administrator y MySQL Query Browser.

MySQL Administrator MySQL Administrador es el nuevo software de administración de servidores de Bases de Datos de MySQL que ha creado MySQL AB. Se trata de un software multiplataforma, que por el momento se encuentra disponible para Linux y Microsoft Windows y que cuenta con un entorno gráfico de usuario muy intuitivo.Este nuevo producto suple las carencias que tiene MySQL Control Center en el área de

Page 134: php_y_mysql

Administración de servidores. La descarga del programa se hace desde la página web de MySQL, en "http://dev.mysql.com/downloads/administrator". Tan solo tenemos que descomprimir el fichero en un directorio y ejecutar el comando "mysql-administrator".

Figura 5.4.8. Mysql Administrator

MySQL Administrador es una herramienta que permite realizar tareas administrativas sobre servidores de MySQL incluyendo:

la configuración de las opciones de inicio de los servidores. inicio y detención de servidores. monitorización de conexiones al servidor. administración de usuarios. monitorización del estado del servidor, incluyendo estadísticas de uso. visualización de los logs de servidor. gestión de copias de seguridad y recuperaciones. visualización de catálogos de datos.

Page 135: php_y_mysql

Figura 5.4.9. Mysql Administrator

También en la página de MySQL existen una serie de FAQ's que ayudan en la instalación, en caso de dudas, aunque la misma es bastante simple. Recordad que esta aplicación no es necesaria para el seguimiento de curso

Page 136: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Lenguaje SQL.En este módulo se pretende dar a conocer las operaciones básicas que se pueden hacer con SQL y que tienen una aplicación directa con la creación de aplicaciones web.

SQL: lenguaje estructurado de consultaA finales de los años setenta, IBM creó para su producto DB2 un lenguaje llamado SQL (Structured Query Language). Empresas de la competencia crearon paralelamente otros SQL a medida de sus necesidades. Pero fue cerca de los años ochenta cuando el comité ANSI definió un estándard para SQL. SQL es un lenguaje estándard de comunicación con bases de datos. Un lenguaje normalizado que nos permite trabajar con cualquier tipo de lenguaje en combinación de cualquier tipo de bases de datos.

Que sea estándard no significa que las instrucciones de manipulación de distintas bases de datos sean idénticas, es más, existen determinadas operaciones que solo funcionan con determinadas bases de datos.

Componentes de SQL

El lenguaje SQL está distribuido en cuatro grandes bloques, que se combinan para crear, actualizar y manipular las bases de datos, estos bloques son:

Comandos. Cláusulas. Operadores. Funciones.

Comandos Hay dos tipos de comandos en SQL:

Las DDL, que permiten crear y definir nuevas bases de datos, campos e índices.

Las DML, que permiten generar consultas para ordenar, filtrar y extraer información de la base de datos.

Figura 5.5.1. SQL. Comandos DDL

Comandos DDL Descripción

CREATE Crear nuevas tablas, campos e índices.

ALTER Modificación de tablas añadiendo campos o modificando la definición de los campos.

DROP Instrucción para eliminar tablas, campos e índices.

Comandos DML Descripción

SELECT Consulta de registros de la base de datos que cumplen un criterio determinado.

INSERT Insertar registros a la base de datos.

Page 137: php_y_mysql

Figura 5.5.2. SQL. Comandos DML

UPDATE Instrucción que modifica los valores de los campos y registros especificados en los criterios.

DELETE Eliminar registros de una tabla de la base de datos.

Cláusulas

Las cláusulas son condiciones de modificación, utilizadas para definir los datos que se desean seleccionar o manipular.

Figura 5.5.3. SQL. Cláusulas

Cláusula Descripción

FROM Utilizada para especificar la tabla de la que se seleccionarán los registros.

WHERE Cláusula para detallar las condiciones que deben reunir los registros resultantes.

GROUP BY Utilizado para separar registros seleccionados en grupos específicos.

HAVING Utilizada para expresar la condición que ha de cumplir cada grupo.

ORDER BY Utilizada para ordenar los registros selecionados de acuerdo a una ordenación específica.

Operadores

Figura 5.5.4. SQL . Operadores lógicos

Operador lógico Descripción

AND Evalúa dos condiciones y devuelve el valor cierto, si ambas condiciones son ciertas.

OR Evalúa dos condiciones y devuelve el valor cierto, si alguna de las dos condiciones es cierta.

NOT Negación lógico. Devuelve el valor contrario a la expresión.

Operadores de comparación Descripción

< [...] menor que [...]

> [...] mayor que [...]

<> [...] diferente a [...]

<= [...] menor o igual que [...]

>= [...] mayor o igual que [...]

= [...] igual que [...]

Page 138: php_y_mysql

Figura 5.5.5. SQL. Operadores de comparación

BETWEEN Especifica un intérvalo de valores

LIKE Compara un modelo

IN Operadores para especificar registros de una tabla

Consultas

Antes de comenzar a realizar algunas prácticas como ejemplo de las operaciones que hemos visto, debemos insertar algunos datos en nuestras tablas de la base de datos academia. Podemos hacerlo de varias formas:

Directamente desde el servidor de bases de datos: abrimos una consola de 'root' y ejecutamos mysql, se abrirá una nueva línea de comandos donde podremos escribir sentencias (use database nombre,...). Con PhpMyadmin: lo hemos visto en el punto anterior, seleccionamos la base de datos, la tabla y pulsamos en la opción de insertar. Importando los datos: también lo hemos visto en el punto anterior, como podemos descargar el fichero academia.sql.

Selecionar la tabla alumnos y ver que resultado muetra la siguiente instrucción SQL:

SELECT * FROM alumnos

Sentencia SQL 1

El signo '*' quiere decir que seleccionaremos todos los campos que tenga la tabla, en este caso, alumnos. El comando SELECT puede llevar adjunto un parámetro [ ALL | DISTINCT | DISTINCT ROW ]. El valor por defecto es 'ALL', que permite el retorno de registros duplicados, mientras que con las otras dos opciones los registros duplicados se omiten.

Page 139: php_y_mysql

Figura 5.5.6. SQL. Creación de consulta1.

Si pulsamos el botón 'Continúe', se visualizarán todos los registros de la tabla alumnos.

Si pulsamos el botón Browse podremos guardar las instrucciones SQL de la ventana de texto en un fichero con estensión 'sql'.

Ahora para limitar la selección, filtraremós solo los alumnos que residen en la población de Sagunto:

SELECT * FROM alumnos WHERE poblacion="Sagunto"

Sentencia SQL 2

Si solo queremos extraer el nombre y el primer apellido de los alumnos que residen en Sagunto ordenados por apellidos, el código sería:

SELECT nombre, apellidos FROM alumnos WHERE poblacion="Sagunto" ORDER BY apellidos

Sentencia SQL 3

Page 140: php_y_mysql

Figura 5.5.7. Resultado sentencia SQL 3

Pero por regla general necesitamos datos que residen en varias tablas. Queremos obtener el nombre, los apellidos, el curso en que estan matriculados y su lugar de realización. Las tablas 'alumnos' y 'cursos' estan relacionadas mediante la tabla 'matrícula'.

SELECT alumnos.nombre, alumnos.apellidos, cursos.título, cursos.lugar_realización FROM alumnos, cursos, matrículas WHERE alumnos.dni = matrículas.dni and cursos.codigo=matrículas.codigo ORDER BY cursos.lugar_realización

Sentencia SQL 4

Se podría establacer los vinculos entre tablas utilizando la palabra reservada 'JOIN', pero deberemos asegurarnos que la versión de PHP de que disponemos las interpreta correctamente, algunas versiones dan problemas y si no somos nuestros propios administradores es muy posible que no tengamos la posibilidad de actualizar la versión correspondiente.

SELECT alumnos.nombre, alumnos.apellidos, cursos.título, cursos.lugar_realización FROM alumnos, cursos JOIN matrículas WHERE alumnos.dni=matrículas.dni and cursos.codigo=matrículas.codigo ORDER BY cursos.lugar_realización

Sentencia SQL 5

El resultado de esta consulta es:

Figura 5.5.8. Resultado sentencia SQL 5

Page 141: php_y_mysql

Crear una tabla

Crearemos una nueva tabla para almacenar datos del seguimiento del alumno en cada curso (horas de asitencia, realizado los ejercicios y aptitud). Para ello utilizaremos la sentencia CREATE TABLE seguida del nombre de la tabla. Entre paréntesis encontraremos las características de los campos (dni, código, horas_asist, ejercicios, apto ); seguidamente se define el índice principal (dni+código).

CREATE TABLE `notas` ( `dni` VARCHAR(8) NOT NULL, `codigo` INT(11) NOT NULL, `horas_asis` SMALLINT(3) NOT NULL, `ejercicios` VARCHAR(2) NOT NULL, `optitud` VARCHAR(7) NOT NULL, INDEX (`dni`, `codigo`) )

Sentencia SQL 6

El parámetro 'NOT NULL', hace que este campo no pueda ser nulo cuando se realiza una inserción en la tabla.

Inserción de datos en una tabla La sentencia para insertar registros en una tabla es la siguiente:

INSERT [INTO] nombre_tabla [(campo1,campo2...)] VALUES (valor1,valor2...), .....

Insertar un nuevo registro a la tabla 'alumnos', con los datos siguientes.

INSERT INTO `alumnos` (`dni`, `nombre`, `apellidos`, `teléfono`, `población`) VALUES ('66666666', 'Juan', 'Pérez García', '674832939', 'Castellón')

Sentencia SQL 7

Figura 5.5.9. Resultado sentencia SQL 7

Page 142: php_y_mysql

Modificación de estructura de la tabla

Para modificar la estructura de una tabla se utiliza la sentencia ALTER TABLE. La sintaxis es pareceda a la de CREATE TABLE, pero con más opciones.

La sintaxis es: ALTER TABLE nombre_tabla seguida de alguna de las siguientes opciones:

Figura 5.5.10. Opciones de sentencia ALTER TABLE

Opciones disponibles Descripción

ADD [COLUM] campo tipo_datos [NOT NULL |NULL] [DEFAULT valor_defecto] [AUTO_INCREMENT]

Añade nueva columna a la tabla.

ADD PRIMARY KEY (nom_index_primario) Añade nueva clave primaria a la tabla.

ADD INDEX [ nom_index, .......] Añade nueva clave a la tabla

ALTER [COLUM] campo {SET DEFAULT | DROP DEFAULT } Introduce nuevo valor estándard.

CHANGE [COLUM] campo_viejo definición_campo

Cambia un elemento del campo y modifica el nombre de la columna.

MODIFY [COLUM] definición_camp Cambia la definición del campo, sin modificar el nombre del campo.

DROP [COLUM] Elimina una columna.

DROP [PRIMARY KEY] Elimina una clave primaria.

DROP INDEX [ nom_index,....] Elimina una clave.

RENAME AS nom_nova taula Renombra una tabla.

Añadir las columnas 'nivel_educativo' y 'dirección' a la tabla alumnos:

ALTER TABLE alumnos ADD COLUMN `dirección` varchar(40) NULL , ADD COLUMN `nivel_educativo` varchar(10) NULL

Sentencia SQL 8

Modificar datos de una tabla La sintaxis es:

UPDATE tabla SET campo1=valor1 , [campo2=valor2] ... [WHERE condición]

UPDATE alumnos SET teléfono= '666123456' WHERE nombre='Andrea' and apellidos='Diaz-Alejo Leon'

Sentencia SQL 9

Page 143: php_y_mysql

Figurar 4.4.13. Resultado de la sentencia SQL 9

Borrar datos de la tabla La sintaxis es:

DELETE FROM nombre_tabla [WHERE condición]

Tener en cuanta que si borramos datos de una tabla no se podrán recuperar. Si no utilizamos la cláusula WHERE, se borrarán todos los registros de la tabla.

Borrar tablas La sintaxis es:

DROP TABLE [IF EXISTS] nombre_de_la_tabla

Si utilizamos esta sentencia en un programa, debemos usar la cláusula IF EXIST, ya que si la tabla no existe obtendriamos un error de ejecución.

Hay que tener en cuenta que el poder ejecutar estas sentencias en un servidor dependerá de los permisos que tenga el usuario con el que nos conectamos al servidor de bases de datos. Es muy posible que no dispongamos de todos los permisos.

Page 144: php_y_mysql

Módulo 5 Programación en PHP y Bases de datos

Conexión de PHP y MySQL.En este último punto conseguiremos realizar una conexión sencilla con la base de datos academia desde el código PHP. Se introducirán las funciones PHP nativas para acceder a las bases de datos a un nivel elemental.

El protocolo para acceder a una base de datos no cambia de como lo hacemos en otros lenguajes de programación:

Abrir la base de datos. Lanzar la sentencia SQL al servidor de base de datos. Recoger el resultado de la consulta. Cerrar la conexión de la base de datos.

Sentencias MySQL.

En la siguiente tabla se pueden ver algunas de las sentencias más utilizadas para acceder a una base de datos MySQL. Hay dos columnas, una para sentencias nativas de MySQL y otra equivalente para el acceso a bases de datos utilizando ODBC.

PHP / MySQL PHP / ODBC mysql_affect_rows ($conex) Devuelve la cantidad de registros afectados en la última sentencia de actualización o eliminación. mysql_close ($conex) odbc_close(...)Cierra la conexión con el servidor MySQL. mysql_connect ( $host, $usuario, $contraseña) odbc_connect(...)

Abre una conexión con el servidor MySQL.

mysql_query ($db, $sql, $conex) odbc_do($conex, $sql) odbc_exec($conex, $sql)

Envia una sentencia SQL ($sql) al servidor de base de datos ($db) con la conexión ($conex). mysql_error ($conex) Devuelve un mensaje de texto con el error producido. mysql_fetch_array ($resul, $tipo) Devuelve el resultado de la consulta realizada dentro de un array. En $tipo se pueden definir tres constantes: MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH. mysql_fecth_row ( $resul, $num_fila) odb_fecth_row (...)Avanza a la siguiente fila activa del resultado de la sentencia SQL generada. El parámetro $num_fila es opcional, y si se pasa, se accederá a la fila especificada en este parámetro. mysql_field_name ($resul, $index) odbc_fiel_name(...)Devuelve el nombre del campo al que apunta la variable index.

Page 145: php_y_mysql

mysql_num_fields ($resul) odbc_num_fields(...)Informa de la cantidad de campos que se han devuelto en el resultado. mysql_num_rows ($resul) odbc_num_rows(...)Devuelve el número de filas que ha devuelto la sentencia SQL. mysql_pconnect ($host, $usuario, $contraseña) odbc_pconnect($dsn,$usu,$con)

Abre una conexión persistente contra el servidor MySQL. mysql_query ($sql, $conex) Envia una instrucción SQL contra la conexión. mysql_select_db ($base_de_datos, $connex) Selecciona una de les bases de datos para establecer una conexión. mysql_result ($resul,$fila,$columna) odbc_result_all (&resul,$fila,$columna)Devuelve el contenido parcial de una sentencia SQL correspondiente al objeto de la fila y columna seleccionadas por el usuario. A diferencia de mysql_fetch_array, sólo devuelve un valor. mysql_free_result ($resul) odbc_free_result($resul)Libera el espacio donde se ha almacenado el resultado de la sentencia SQL.

Otras funciones PHP sobre MySQL.

mysql_change_user ($usuario, $contraseña) Modifica el usuario actual por otro nuevo usuario. mysql_create_db ($base_de_datos) Crea una nueva base de datos sobre el sistema. mysql_drop_db ($base_de_datos) Elimina una base de datos y las tablas que la componen. mysql_inser_id ($resultado) Devuelve el valor generado al insertar un registro que contiene un valor del tipo 'Auto increment' en alguno de sus campos. mysql_get_host_info( ) Devuelve información del estado de la conexión y del servidor. mysql_get_proto_info( ) Devuelve información relacionada con el protocolo utlizado en la conexión.

Visualizaremos los nombres de todos los alumnos de la academia. Primero estableceremos la

Page 146: php_y_mysql

conexión con el servidor de BD, seleccionaremos la BD de trabajo y ejecutaremos la SQL. El resultado se almacenará en una variable de memoria de tipo array.

Se puede copiar el código siguiente o descargar el siguiente fichero practica51.php.

<!doctype html public "-//W3C//DTD HTML 4.0 //EN"> <html>

<head> <?php /*-------------------------------------------------- * Módulo: 5 Práctica: 5.1. Fichero: practica51.php * Autor: Fecha: * Descripción: Conexión MySQL con funciones nativas * Pre condi.: Servidor MySQL, BD academia * Post cond.: --------------------------------------------------*/ ?> <title>Práctica 5.1</title> </head> <body> <?php /* Abrir la conexión con el servidor(servidor, usuario, contraseña */ $conn=mysql_connect("localhost","root","");

/* Identificamos la base de datos a utilizar */ $err_db=mysql_select_db("academia");

/* Escribimos la sentencia SQL */ $sql="select nombre from alumnos" ;

/* Se ejecuta y si se obtienen resultados se almacenan en $resul */ if ( ! $resul=mysql_query($sql)) { echo "No se ha podido realizar la consulta"; echo mysql_error(); exit; }

echo "Conexión al Servidor MySQL. BD:academia tabla: alumnos <br>" ; echo "La consulta ejecutada es: <b> $sql <b> <br>"; echo "El resultado es: <br> ";

/* Recorremos el array */ while ($arr_resul= mysql_fetch_array($resul)){ print ($arr_resul[0]."<br>"); }

/* Liberamos espacio ocupado con el resultado de la consulta */ mysql_free_result($resul);

// Cerramos la conexión con el servidor de BD mysql_close(); ?> </body> </html>

Listado 5.5.1. Código del fichero practica51.php

Page 147: php_y_mysql

En la figura siguiente podemos ver el resultado de la ejecución del códigoPHP:

Figura 5.5.1. Resultado de la'ejecución del fichero practica51.php

Como se puede ver, acceder a la información de una base de datos y mostrarla en pantalla es muy sencillo. En el siguiente tema se profundizará más sobre este tema.

Las sentencias nativas de PHP para acceder a MySQL las podemos encontar ampliadas en el apartado dedicado de la página oficial de PHP.

Si hacemos la misma operación que el ejemplo anterior pero utilizando el driver ODBC a una base de datos access. Debemos tener instalado MS-Access y creado un DSN a la base de datos, por ejemplo con el nombre dsn_academia.

<!doctype html public "-//W3C//DTD HTML 4.0 //EN"> <html> <head> <?php /*-------------------------------------------------- * Módulo: 4 Práctica: 5.2. Fichero: practica52.php * Autor: Fecha: * Descripción: Conexión a una base de datos Access por ODBC * Pre condi.: ODBC DSN dsn_academia * Post cond.: --------------------------------------------------*/ ?> <title>Práctica 5.2</title> </head> <body> <?php /* Abrir la conexión con el servidor(servidor, usuario, contraseña */$conn=odbc_connect("dsn_academia","root",""); /* Identificamos la base de datos a utilizar */ $sql="select nombre from alumnos" ; /* Si se obtienen resultados se almacenan en $resul */ if ( ! $resul=odbc_exec($conn,$sql)) { echo "No se ha podido realizar la consulta";

Page 148: php_y_mysql

echo odbc_error($conn); exit; }

echo "Conexión al Servidor MySQL. BD:academia tabla: alumnos <br>" ; echo "La consulta ejecutada es: <b> $sql <b> <br>"; echo "El resultado es: <br> ";

/* Recorremos el array */ while ($rc = odbc_fetch_into($resul,$arr_resul)){ print($arr_resul[0]."<br>"); } /* Liberamos espacio ocupado con el resultado de la consulta */ odbc_free_result($resul); // Cerramos la conexión con el servidor de BD odbc_close($conn); ?> </body> </html>

Listado 5.5.2. Código del fichero practica52.php

Observar que los cambios entre practica51.php y practica52.php son mínimos, sólo afectan a las sentencias que acceden a los orígenes de la base de datos.

En el caso de querer trabajar con el ODBC de Oracle, mSQL u otros motores de bases de datos, se puede consultar el apartado correspondiente del manual de PHP para obtener información de las sentencias concretas que se deben utilizar en cada caso.

Page 149: php_y_mysql

Tipos de variables en MySQL

Tipo Descripción Rango

tinyint entero muy pequeño -128 ... 127

smallint entero pequeño -32768 ... 32767 sin signo 0 ... 65535

mediumint entero mediano -8388608 a 8388607 sin signo 0 ... 16777215

int entero -2147683648 a 2147683648 sin signo 0 ... 4294967295

bigint entero largo -2 E63 a 2 E63 sin signo 0 ... 2 E64

float coma flotante simple precisión ± 1.175494351 E-38 (mínim) ± 3.402823466 E+38 (màxim)

double coma flotante doble precisión ± 2.2250738585072014 E-308 ± 1.7976931348623157 E+308

decimal coma flotante, representado como cadena

char(M) cadena caracteres longitud fija Acepta entre 1 y 255 caracteres, la longitud máxima la determina M, que es obligatorio.

varchar(M) cadena caracteres longitud variableAcepta entre 1 y 255 caracteres, la longitud máxima la determina M, que es obligatorio.

tinyblob blob (objecto binario grande) muy pequeño 255 bytes

blob blob estándard 65 quilobytes

mediumblob blob mediano 16 megabytes

longblob blob grande 4 gigabytes

tinytext cadena texto muy pequeña 255 bytes

text cadena texto pequeña 65 quilobytes

mediutext cadena texto mediana 16 megabytes

longtext cadena texto grande 4 gigabytes

enum enumeración de elementos 64 K elementos

set conjunto de elementos 64 elementos

date fecha con formato: AAAA-MM-DD 1000-01-01 a 9999-12-31

time hora con formato: hh:mm:ss -838:59:59 a 838:59:59

Page 150: php_y_mysql

datetime fecha y hora

timestamp intérvalo de tiempos de... 19700101000000 hasta cualquier fecha del año 2037

year año con formato AAAA de 1091 a 2155

Page 151: php_y_mysql

Tal y como se indica en la descripción de esta función, hay que tener presente que las cookies deben enviarse antes de mandar cualquier otra cabecera (esta es una restricción de las cookies, no de PHP). Esto requiere que sitúe las llamadas a esta función antes de cualquier etiqueta <html> o <head>.

El siguiente ejemplo pretende ilustrar su definición. Cópialo, guárdalo como practica61.php y ejécutalo en el navegador.

<?php /*--------------------------------------------------------------- * Módulo: 6 Práctica: 1 Fichero: practica61.php * Descripción: Creación de cookies * Pre condi.: Cookies activadas en el navegador * Post cond.: ----------------------------------------------------------------*/

// Momento de expiración de la cookie // que será dentro de un año a partir de la hora // actual que devuelve la función 'time()'

$expira = 365*24*3600;

// Creamos la cookie

setcookie("prueba","este es el contenido",time()+$expira);

echo "<h2>\"Cookie\" creada </h2><br<"; echo "Comprueba que la cookie ha sido creada";

?>

Como complemento al script propuesto, implementamos ahora otro que acceda a la cookie.

Cópialo, guárdalo como practica61_b.php y ejécutalo en el navegador.

<?php /*--------------------------------------------------------------- * Módulo: 6 Práctica: 1 Fichero: practica61_b.php * Descripción: Acceso a cookies * Pre condi.: Cookie "prueba" creada * Post cond.: ----------------------------------------------------------------*/

// Recuperamos el nombre de usuario de 2 formas

// 1) mediante el array '_COOKIE'

echo "Hola ".$_COOKIE["prueba"]." <br><br>";

// 2) utilizando la variable del mismo nombre directamente.

// NO FUNCIONARÁ POR EL PROBLEMA DE USO DE VARIBLES GLOBALES.

echo "Hola $prueba <br><br>"; ?>

Page 152: php_y_mysql

Módulo 6 Programación en PHP y Bases de datos

Cookies y Sesiones

La sesión en PHP aparece como tal, a partir de la versión 4. En este apartado, vamos a estudiarla, y veremos su utilidad y aplicación en el contexto de una web.

En primer lugar, veremos todos los aspectos teóricos que se deben conocer, para pasar finalmente a elaborar un ejemplo que exponga el funcionamiento de las sesiones.

¿Qué es una sesión?

Existen casos de aplicaciones web en las que, dadas sus características, se hace necesario disponer de la posibilidad de mantener cierta información a lo largo del proceso de navegación entre las páginas que la integran.

Ejemplos de esto podrían ser tanto la banca on-line, en la que cada usuario dispone de un área de navegación personalizada, como el típico "carrito de la compra", en el que el usuario selecciona y acumula una serie de artículos en el proceso de navegación entre una serie de páginas-catálogo. En estos casos es necesario relacionar las páginas que forman parte de esa área de navegación dependiente de una información común.

Visto que las comunicaciones que se establecen a través del protocolo HTTP son independientes las unas de las otras, lo cual cierra la posibilidad de establecer cualquier tipo de comunicación entre una serie de páginas, las sesiones vienen a cubrir este tipo de requerimiento, ofreciendo un mecanismo para el mantenimiento ubícuo de esa información compartida, al margen del funcionamiento de este tipo de protocolo.

¿Cómo implementa PHP las sesiones?

Una sesión, a groso modo, no es más que un conjunto de variables (que pueden ser concebidas como variables "globales") que PHP gestiona de manera transparante al usuario.

Una sesión comienza cuando un usuario entra en la aplicación web y termina cuando la abandona. Durante ese espacio de tiempo se pueden definir y manipular una serie de variables pertenecientes a la sesión que permite mantener cualquier tipo de información común para todas la páginas.

Para conseguir mantener una serie de información común entre la ejecución de los distintos scripts PHP que generan las páginas de la aplicación web, será necesario que el gestor de sesiones guarde dicha información en un fichero. Como trabajamos en un entorno cliente-servidor es posible que dicho fichero se encuentre en cualquiera de las dos partes.

Cada sesión que se inicia debe diferenciarse y ser independente del resto (ya que una página puede ser accedida al mismo tiempo por diversos usuarios), por lo que PHP asigna un identificador por cada sesión que se inicie, siendo este identificador una secuencia alfanumérica generada automáticamente lo suficientemente grande para garantizar la seguridad de la aplicación.

El identificador de sesión es necesario que sea reenviado al servidor cada vez que se realice una petición de una página, ya que de esta manera el gestor de sesiones podrá localizar la información correspondiente con la sesión. Esto se puede hacer implícitamente o explícitamente, dependiendo del mecanismo empleado.

Page 153: php_y_mysql

Si el identificador de sesión se almacena mediante "cookies" en el cliente, cuando se realice una petición al servidor el propio navegador será el encargado de introducir automáticamente el identificador de sesión como información dentro de la petición al servidor.

Problema: el usuario podría tenerlas desactivadas,

En el caso de no emplear cookies, nos obligaría a tener que pasar la información "manualmente", o mediante el query_string (en etiquetas <A>) o mediante un campo de tipo "hidden" (si venimos de un formulario).

PHP, por defecto, utiliza un sistema mixto de almacenaje de la información relacionada con una sesión. El identificador se almacena en el cliente utilizando cookies. El resto de información se guarda en un fichero dentro del servidor cuyo nombre es el identificador de sesión precedido del prefijo sess_.

¿Cómo se gestionan las sesiones desde código?

La gestión de sesiones se realiza de manera sencilla a través de un juego de funciones.

bool session_start(): crea una nueva sesión diferenciando 2 casos:

si es la 1ª solicitud de sesión:

se genera un identificador aleatorio. se crea un fichero en el servidor cuyo nombre es el identificador precedido del prefijo sess_. se envía una cookie al cliente con el identificador. .

en sucesivas solicitudes, se utiliza la información ya dispuesta.

bool session_destroy(): elimina los datos de sesion.

se destruye el fichero en el servidor. se conserva la cookie para futuras sesiones.

bool session_register(string nombre [, string nombre]): crea una serie de variables globales registradas como variables de sesión.

se guardan en el fichero de sesión correspondiente. comunes y operativas en todos los scripts implicados en la sesión.

bool session_unregister(string nombre [, string nombre]): las variables de sesión pasan a ser variables normales y se limpia el contenido del fichero.

bool session_is_registered(string nombre): se comprueba la existencia de una variable de sesión asociada a “nombre”.

Page 154: php_y_mysql

session_unset(): se “vacía” el contenido de las variables de sesión.

string session_name([string nombre]): tiene 2 comportamientos:

si se invoca sin parámetro devuelve el nombre de la variable interna que contiene el identificador de sesión (por defecto se asigna el valor de la directiva session.name de "php.ini"). si existe parámetro, se cambia el contenido de dicha variable, pero será necesario hacerlo antes del comienzo de la sesión en cada script para prolongar su efecto.

string session_save_path([string path]): devuelve el camino al directorio donde se ubican los ficheros asociados a la sesión.

es modificable, introduciendo una nueva ruta. para prolongar su efecto, es necesario incluir esta función en cada script que haga uso de las sesiones.

¿Cómo iniciar y prolongar una sesión?

En todas las páginas que se desee que formen parte de la aplicación web, se debe ejecutar la acción de comenzar (o continuar) una sesión. Para ello, deberán utilizarse algunas de las funciones vistas. Pero ¿cómo consigue continuar una sesión?

Para cada una de las páginas, el intérprete de PHP comprueba si existe la sesión. En caso afirmativo, se retoma, sino, se crea una nueva (generando un nuevo identificador).

Existen 3 maneras de iniciar/prolongar una sesión:

invocando a la función session_start()

<?php session_start(); echo "He inicializado la sesión"; ?>

a través de de la función session_register() (creación de variables).

<?php // Creamos la variable de sesión 'contador' session_register('contador'); // La página enlaza consigo misma y muestra el identificador de sesión (variable interna $SID) // y el valor del contador actualizado

Page 155: php_y_mysql

echo '<a href="'.$PHP_SELF.'?'.$SID.'">Contador vale: '.++$contador.'</a>'; ?>

activando la directiva session.auto_start en el "php.ini".

Observación: Si no existiera, recordemos nuevamente que hay que crear una carpeta “tmp” e indicar en php.ini el path hasta ella en session.save_path.

Para poder continuar una sesión iniciada, cada vez que comienza una sesión se consulta si el script ha recibido un identificador de sesión o no. En caso afirmativo, se continua con la sesión que coincide con dicho identificador. En el otro caso , se crea una nueva sesión. Por lo tanto, es necesario comunicar el identificador de sesión a las distintas páginas que forman la aplicación web. Para ello, tenemos dos alternativas:

Si usamos cookies (activando la directiva session.use_cookies del fichero php.ini) y además el navegador del cliente las acepta, no tenemos que realizar ninguna acción adicional. Si no usamos cookies o no las acepta el cliente, deberemos enlazar todas la páginas pasando el identificador en todos los enlaces a otras páginas y en todos los formularios que sean procesados en la aplicación.

En los enlaces a otras páginas dentro del query_string, deberemos incluir la variable que contiene el identificador, tenemos dos posibilidades:

1. <A href="pagina.php?<? echo SID ?>">enlace </A> 2. <A href="pagina.php?<? echo sesion_name(), '=', sesion_id() ?>">enlace </A>

En los formularios será necesario incluir un campo oculto cuyo nombre será sesion_name() y su valor sesion_id(). <input type="hidden" name="<? echo sesion_name() ?>" value ="<? echo sesion_id() ?>">

Ejemplo de funcionamiento

En el siguiente ejemplo vamos a exponer la dinámica de trabajo con sesiones a partir de un esquema de navegación de páginas determinado. El ejemplo consta de 3 páginas: la primera de ellas, cuyo código mostramos a continuación, es un formulario cuya recepción de datos se tramita en la misma página, generando las pertinentes variables de sesión.

Copia el siguiente código y guárdalo como practica62.php.

<?php

// Con la función session_start(), iniciamos la sesión session_start();

?>

<!-------------------------------------------------------- * Módulo: 6 Práctica: 2 Fichero: practica62.php

Page 156: php_y_mysql

* Descripción: Formulario entrada de datos + creación variables sesión. * Pre condi.: * Post cond.: ----------------------------------------------------------->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Ejemplo Sesiones</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head>

<body>

<h2><u>Ejemplo Sesiones - M&oacute;dulo 6</u> </h2> <br>

<form name="form1" method="post" action="<? echo $PHP_SELF; ?>"> <table width="200" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="110">DNI: </td> <td><input name="dni" type="text" id="codi5" size="8" maxlength="8"></td> </tr> <tr> <td>Nombre</td> <td><input name="nombre" type="text" id="any4" size="15" maxlength="15"></td> </tr> <tr> <td>Apellidos:</td> <td><input name="apellidos" type="text" id="etapa4" size="20" maxlength="20"></td> </tr> </table> <br> <input type="submit" name="enviar" value="Enviar"> </form>

</body> </html>

<?php

echo "<script language='javascript'> document.body.style.backgroundColor='green'; </script>";

// Recogemos los valores enviados por el // formulario con la ayuda del array _POST

$dni = $_POST['dni']; $nombre = $_POST['nombre']; $apellidos = $_POST['apellidos'];

// Mostramos los datos recibidos

echo "<h2>Pasando valores de variables de sesión<br>\n"; echo "Fichero actual: ".$_SERVER['PHP_SELF']."</h2><br>\n";

echo "<table>"; echo "<tr><td> <b>Var. sesión 'dni':</b> </td><td>".$dni."</td></tr>\n"; echo "<tr><td> <b>Var. sesión 'nombre':</b> </td><td>".$nombre."</td></tr>\n"; echo "<tr><td> <b>Var. sesión 'apellidos':</b> </td><td>".$apellidos."</td></tr>\n"; echo "</table>";

Page 157: php_y_mysql

// Generamos la variables de sesión

session_register("dni"); session_register("nombre"); session_register("apellidos"); // Preparamos el enlace a la página siguiente pasándole // mediante el 'query_string' el nombre de la // variable de sesión más el identificador de sesión

echo "<br><br><a href=\"practica62_b.php?".session_name()."=".session_id();

echo "\">>> Continuar <<</a>";

echo "<br><br><a href=\"practica62_b.php?".SID;

echo "\">>> Continuar <<</a>";

?>

A continuación, pasamos a ver la página que utilizará las variables de sesión creadas anteriormente. Esta página se encarga de visualizar los datos de sesión.

Observa que en las páginas siguientes utilizamos el array _SESSION para mostrar el valor de las variables de sesión (es tan solo una opción alternativa a haber utilizado el nombre de cada variable directamente).

Copia el siguiente código y guárdalo como practica62_b.php

<? session_start(); // continuamos con la sesión

Page 158: php_y_mysql

?> <html> <head> <title>Ejemplo Sesiones</title> </head> <body>

<?php /*--------------------------------------------------------------- * Módulo: 6 Práctica: 2 Fichero: practica62_b.php * Descripción: Paso de variables de sesión (2) * Pre condi.: Datos de entrada generados en 'practica62.php' * Post cond.: ----------------------------------------------------------------*/

// Código Javascript para cambio de color de fondo

echo "<script language='javascript'> document.body.style.backgroundColor='red'; </script>";

echo "<h2>Pasando valores de variables de sesi&oacute;n<br>\n"; echo "Fichero actual: ".$_SERVER['PHP_SELF']."</h2><br>\n";

// Si la primera variable de sesión está definida...

if (session_is_registered("dni")){

// Mostramos los valores de sesión que han llegado echo "<table>"; echo "<tr><td> <b>Var. sesión 'dni':</b> </td><td>".$_SESSION['dni']."</td></tr>\n"; echo "<tr><td> <b>Var. sesión 'nombre':</b> </td><td>".$_SESSION['nombre']."</td></tr>\n"; echo "<tr><td> <b>Var. sesión 'apellidos':</b> </td><td>".$_SESSION['apellidos']."</td></tr>\n"; echo "</table>"; }else{

// Si la primera variable de sesión no está definida... echo "Variables de sesión inexistentes \n"; }

echo "<br><br><a href=\"practica62_c.php?".session_name()."=".session_id(); echo "\">>> Continuar <<</a>";

?>

</body> </html>

Page 159: php_y_mysql

Por último , tenemos una página implicada en el esquema de navegación actual y que utilizará de nuevo las variables de sesión creadas anteriormente (fíjate que el código de esta página es prácticamente igual el de la anterior, por lo que puede ser útil recurrir al clásico "Copiar+Pegar")

Cópialo y guárdalo como practica62_c.php

<?// continuamos con la sesión

session_start();

?> <html> <head> <title>Ejemplo Sesiones</title> </head> <body>

<?php /*----------------------------------------------------------------- * Módulo: 6 Práctica: 2 Fichero: practica62_c.php * Descripción: Paso de variables de sesión (3) * Pre condi.: Datos de sesión sumistrados por 'practica62_b.php' * Post cond.: ------------------------------------------------------------------*/

// continuamos con la sesión

session_start();

// Código Javascript para cambio de color de fondo

echo "<script language='javascript'> document.body.style.backgroundColor='purple'; </script>";

echo "<h2>Pasando valores de variables de sesión<br>\n"; echo "Fichero actual: ".$_SERVER['PHP_SELF']."</h2><br>\n";

// Si la primera variable de sesión está definida...

if (session_is_registered("dni")){

// Mostramos los valores de sesión que han llegado

Page 160: php_y_mysql

echo "<table>"; echo "<tr><td> <b>Var. sesión 'dni':</b> </td><td>".$_SESSION['dni']."</td></tr>\n"; echo "<tr><td> <b>Var. sesión 'nombre':</b> </td><td>".$_SESSION['nombre']."</td></tr>\n"; echo "<tr><td> <b>Var. sesión 'apellidos':</b> </td><td>".$_SESSION['apellidos']."</td></tr>\n"; echo "</table>"; }else{

// Si la primera variable de sesión no está definida... echo "Variables de sesión inexistentes \n"; }

?>

</body> </html>

Ejemplo de funcionamiento II

En este segundo ejemplo vamos a ver las directrices para crear un sistema de autenticación de usuario para un sitio web y restringir el acceso a las zonas que se consideren privadas. El sistema consta de tres páginas, una para realizar la entrada introduciendo usuario y contraseña, una segunda para realizar la comprobación de los datos y una tercera que controlará durante la navegación. Además de las páginas privadas y una última para cerrar la sesión de una forma segura.La primera página a la que llamaremos login.html es un formulario que solicita el usuario y la contraseña, una vez se pulse el botón de envio, se enviarán los datos por método POST a otra página llamada comprobacion.php.

En la página comprobacion.php se realizará una conexión con la base de datos y se comprobarán en la tabla usuarios que existe un usuario con ese nombre y clave. Una vez realizada la comprobación de que hay resultados se inicia una nueva sesión con session_start(); y a continuación con sessión_register() se le pasa el valor autentificado que será el nombre de dicha sesión, y que es una variable global.

Copia el siguiente código y guárdalo como comprobacion.php.

Page 161: php_y_mysql

<?php

// Conexión con la base de datos

$conec= mysql_connect("servidor","usuario","password");

mysql_select_db("base_datos",$conec);

$sql = "SELECT * FROM usuarios WHERE nom=';

$sql .=$_POST['usuario'];

$sql .="and clave ='";

$sql .=$_POST['clave'];

$sql .= "'"

// echo $sql // (para comprobar la sql).

$resultado = mysql_query($sql,$conec);

if (mysql_num_rows($resultado)!=0)

{

session_start();

session_register("autentificado");

$_SESSION['autentificado'] = "OK";

header ("Location: zona.php");

}

else {

header ("Location: login.html");

}

mysql_free_result($resultado);

mysql_close($conec);

?>

Si el usuario y contraseña existen se redirigirá con header a la página privada donde se quiere enviar al usuario. Por lo contrario, si ese usuario no existiera en el sistema, simplemente se le enviará a la página de entrada. En todas la páginas privadas de la web, deberían contener un fichero que compruebe si hay una sesión activa para que pueda ser visializada. Para ello crearemos una página .php que se llamará seguridad.php. Se recoge el valor y si es diferente a OK, entonces se considerará que esa entrada no es

Page 162: php_y_mysql

válida pues no se ha iniciado la sesión y se le envía a la página de entrada.

<? session_start(); // continuamos con la sesión if ($_SESSION["autentificado"] != "OK") { //no existe header("Location: login.html"); exit(); } ?>

Por último, la página de salida, a la que llamaremos salir.php en la que se destruye la sesión.

<?// continuamos con la sesión

session_start();

session_destroy();

?>

<html>

<head><title>SALIR</title></head>

<body>

Gracias por su visita <br><br>

< a href="login.html">Entrar de nuevo en la zona privada</a>

</body>

</html>

Todas las páginas que componen la zona privada deben incluir el archivo seguridad.php. include (seguridad.php) y deben terminar con una opción salir que enlace con la página salir.php para finalizar de forma segura la sesión iniciada. En el caso de que el usuario no exista, se debería dar un mensaje de error, pero esto se pedirá en el ejercicio de este módulo.

Page 163: php_y_mysql

Módulo 6 Programación en PHP y Bases de datos Directivas de sesión en el fichero "php.ini"

En php.ini existe una sección para con una serie de directivas relativas a la gestión de las sesiones que nos permiten hacer ciertos ajustes sobre su comportamiento.

Las siguientes serían las más relevantes:

session.save_handler: define el gestor de sesiones: activado por defecto a files. posibilidad de definir otro gestión --> user

session.save_path: especifica el parámetro que recibe el gestor para el almacenamiento y recuperación de los datos de sesión . session.use_cookies: fijada a 1 significa que el uso de cookies estará disponible. session.use_cookies_ lifetime: tiempo de validez de la cookie que contiene el identificador de sesión. Si está fijada a 0, la cookie se mantiene hasta que se cierre el navegador. session.name:indica el nombre de la variable que contiene el identificador de sesión. Se utiliza como nombre o como parámetro enviado por la página que invocó a la actual. session.auto_start: fijada a uno inicializa la sesión automáticamente en cualquier script PHP ejecutado en el servidor. ...

Page 164: php_y_mysql

Módulo 6 Programación en PHP y Bases de datos Funciones para la gestión de sesiones

bool session_start(): crea una nueva sesión diferenciando 2 casos:

si es la 1ª solicitud de sesión:

se genera un identificador aleatorio. se crea un fichero en el servidor cuyo nombre es el identificador precedido del prefijo sess_. se envía una cookie al cliente con el identificador. .

en sucesivas solicitudes, se utiliza la información ya dispuesta.

bool session_destroy(): elimina los datos de sesion.

se destruye el fichero en el servidor. se conserva la cookie para futuras sesiones.

bool session_register(string nombre [, string nombre]): crea una serie de variables globales registradas como variables de sesión.

se guardan en el fichero de sesión correspondiente. comunes y operativas en todos los scripts implicados en la sesión.

bool session_unregister(string nombre [, string nombre]): las variables de sesión pasan a ser variables normales y se limpia el contenido del fichero.

bool session_is_registered(string nombre): se comprueba la existencia de una variable de sesión asociada a “nombre”.

session_unset(): se “vacía” el contenido de las variables de sesión.

string session_name([string nombre]): tiene 2 comportamientos:

si se invoca sin parámetro devuelve el nombre de la variable interna que contiene el identificador de sesión (por defecto se asigna el valor de la directiva session.name de "php.ini"). si existe parámetro, se cambia el contenido de dicha variable, pero será necesario hacerlo antes del comienzo de la sesión en cada script para prolongar su efecto.

string session_save_path([string path]): devuelve el camino al directorio donde se ubican los ficheros asociados a la sesión.

Page 165: php_y_mysql

es modificable, introduciendo una nueva ruta. para prolongar su efecto, es necesario incluir esta función en cada script que haga uso de las sesiones.