php

70
PHP Instructor: Juan Carlos Pedral Valencia E-mail: [email protected]

Upload: m-thali-vr

Post on 10-Aug-2015

22 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Php

PHP

Instructor: Juan Carlos Pedral Valencia

E-mail: [email protected]

Page 2: Php

PHP ¿Qué es PHP? PHP (acrónimo de PHP: Hypertext Preprocessor) es un lenguaje de script de servidor (server-side), contiene una gran cantidad de comandos y funciones nativas de Java, C y Perl, además de algunas de funciones propias, que cuenta con muchas ventajas técnicas y logísticas para implementarlo:

• Al ejecutarse del lado del servidor, el usuario no requiere de ningún tipo de software especial.

• Es multiplataforma, por lo que puede ser instalado en servidores Unix/Linux, Mac OS X y Windows (9x/NT/2000/XP/VISTA/2003/2008).

• Al manejar una sintaxis estandarizada, los programas que uno desarrolle para un servidor pueden correr transparentemente en otro, sin cambiar una sola línea de código.

• Es muy amigable con los usuarios novatos, ya que su sintaxis contiene elementos estándares en otros lenguajes de programación.

• Es muy rápida su ejecución, además de poderse conectar con la mayoría de las bases de datos importantes, como Oracle, Access, Informix, PostgreSQL, MS SQOL, MySQL y Mini SQL, SQL Lite tanto de forma nativa como por ODBC.

• Es software libre. Algunas de las ventajas que se pueden son:

• Soporte para diferenciar versiones (sólo Unix). • Reconocimiento de diversos servidores, además de Apache. • Soporte para sesiones incluido en el engine. • Interfase con servidores FTP. • Manipulación y creación de XML, archivos PDF y Shockwave/Flash. • Invocación de objetos Java. • Módulos estáticos y dinámicos para Apache. • Librerías CGI.

Pero posiblemente su principal característica es el motor Zend, un componente que no sólo hace que la ejecución sea más rápida, sino que también evita que pueda ser visto el código original mediante técnicas de hacking. Cabe aclarar que Zend es una serie de componentes, algunos gratuitos y otros no, entre los que se destaca el engine; otros componentes son un debugger y un compilador, aunque últimos son tecnología propietaria.

Page 3: Php

Instalación Para este documento, se utilizara la aplicación XAMPP que se puede obtener en http://www.apachefriends.org. La instalación es muy sencilla, solamente se requiere seguir los pasos que se indican en el asistente. XAMPP es una aplicación que instala: Apache, MySQL, PHP + PEAR, Perl, mod_php, mod_perl, mod_ssl, OpenSSL, phpMyAdmin, Webalizer, Mercury Mail Transport System for Win32 and NetWare Systems v3.32, Ming, JpGraph, FileZilla FTP Server, mcrypt, eAccelerator, SQLite, and WEB-DAV + mod_auth_mysql. Una vez instalada la aplicación XAMPP, se verifica que este funcionando utilizando un navegador de Internet y colocando la siguiente dirección:

http://localhost Módulos para Windows en PHP.INI Estos son algunos de los módulos que se pueden habilitar para Windows.

Nombre Descripción php_calendar.dll Funciones de conversión de calendario php_crypt.dll Funciones de criptografía php_dbase.dll Funciones para DBase php_dbm.dll Emulación GDBM con la librería Berkeley DB2 php_lepro.dll Acceso SÓLO LECTURA a bases de datos .lepro php_gd.dll Funciones de librería GD para manipular imágenes php_imap4r2.dll Funciones de IMAP 4 php_ldap.dll Funciones de LDAP php_msql1.dll Cliente de mSQL 1 php_msql2.dll Cliente de mSQL 2 php_mssql.dll Cliente de MSSQL client (requiere las librerías de MSSQL DB) php_mysql.dll Funciones de MySQL php_oci73.dll Funciones de Oracle php_zlib.dll Funciones de ZLib Cada una de estas opciones tiene un punto y coma (;) que indican que está desactivado, para activarlo sólo se debe eliminar y reiniciar el servidor Web para que tomen efecto los cambios.

Page 4: Php

Generalidades del lenguaje Como cualquier lenguaje, debemos conocer su estructura y funcionamiento, deteniéndonos un poco en a teoría antes de pasar a la práctica. Script phpinfo Para saber los detalles de nuestra instalación y de paso conocer las variables de operación de nuestro servidor, podemos utilizar el script phpinfo. Todo lo que tenemos que hacer es teclear desde cualquier editor de texto estas líneas: <?php phpinfo(); ?> Acto seguido lo salvamos con un nombre cualquiera, como por ejemplo phpinfo.php y lo colocamos en el directorio de documentos raíz de Apache; en el navegador tecleamos la dirección http://localhost/phpinfo.php, con lo que nos deberá presentar una enorme cantidad de variables, eso asegura que nuestro servidor funciona con PHP. Si nos presenta las líneas de código, quiere decir que lo salvamos con una extensión diferente a .PHP, si el servidor nos responde que el archivo no se encuentra o nos marca un error, puede ser por alguna de las siguientes causas:

• Salvamos el archivo con otra extensión. • Tecleamos mal el nombre del archivo. • El PHPINFO.PHP no se encuentra en la carpeta raíz de Apache. • Las líneas ScriptAlias y Action en httpd.conf no son iguales o PHP4 no se

encuentra en la carpeta que fue declarada. • Las líneas AddType son incorrectas.

Si no manda errores pero tampoco presenta nada, se deberá revisar la documentación de PHP y Apache para saber que sucede.

Page 5: Php

Sintaxis básica Lo primero que se debe ver es la forma de declarar un script PHP. Ejemplo 1. Forma básica, sin declarar "PHP" al inicio, conocida como SHORT TAG, misma que se activa en el PHP.INI con la etiqueta short_open_tag = On. <? echo ("formato básico de PHP\n"); ?> Ejemplo 2. Forma básica, declarando "PHP" al inicio. <?php echo("Se puede hacer lo mismo para XML\n"); ?> Ejemplo 3. Declaración del script como si fuera JScript. <script language="php"> echo ("Imprime este texto y dale atributos como encabezados y fuentes"); </script> Ejemplo 4. Declaración del script con el formato ASP, inhabilitadas por defecto en PHP.INI (asp_tags = Off). <% echo ("Las etiquetas tipo ASP se comenzaron a utilizarse desde la versión 3.0.4 de PHP"); Sugerencia: La función print es equivalente a echo, se pueden utilizar indistintamente. Las etiquetas cortas se pueden habilitar utilizando la opción short_open_tag = On dentro de PHP.INI. Cuando ponemos al final los caracteres \n indicamos que es un retorno de línea, tanto para formatear correctamente el HTML como para grabar archivos en texto plano.

Page 6: Php

Las funciones se separan mediante punto y coma (;), al final del comando es opcional colocarla, ya que el cierre no hace necesaria esta acción. Por ejemplo: <? echo ("Este es el mismo ejemplo que el anterior\n"); echo ("Pero con una línea extra\n"); ?> <?php echo ("Este produce el mismo efecto que arriba\n"); echo ("Pero sin el punto y coma al final de aquí\n") ?> Dentro de un print o echo se pueden incluir etiquetas de HTML, como <p>, <h1>, pero existe el inconveniente que, en casos como los formularios, se deben utilizar comillas para definir valores, como es este caso, que es código de hipertexto normal: <INPUT TYPE="text" NAME="email" SIZE="20" MAXLENGTH="30"> Pero dentro de un print, estas comillas generarían un error al dar por terminada la instrucción, por lo que se debe utilizar una contradiagonal (\) como escape, quedando como sigue: print "<INPUT TYPE=\"text\" NAME=\"email\" SIZE=\"20\" MAXLENGTH=\"30\">"; Ejercicios Hacer dos documentos que contengan al menos dos encabezados y dos párrafos de texto utilizando la función echo para imprimir los contenidos. Los documentos deberán tener ligas que los conecten.

Jorge
Nota adhesiva
Aqui me quede
Page 7: Php

Variables Las variables son contenedores de datos a los que se les asigna un valor y con los que se realiza una operación o función. Se declaran mediante un signo de dinero ($) y pueden contener una cadena de caracteres, valores núméricos y guiones bajos; son sensibles a las mayúsculas y minúsculas. <?php $var = "Ejemplo de una variable"; print $var; ?> En este sencillo ejemplo vemos que le asignamos un valor y luego le indicamos que lo presente en pantalla, pero conviene comparar su sintaxis con el siguiente ejemplo. <?php $var1 = 2; $var2 = 4; $sum = $var1 + $var2; print "El resultado de $var1 + $var2 es $sum"; ?> La diferencia es que los números no son declarados con comillas, para que se puedan realizar operaciones matemáticas. Otra característica de las variables en PHP es que no es necesario declararlas antes de utilizarse, son tomadas "al vuelo". Variables de PHP dentro de HTML Es común que en formularios o documentos HTML sea necesario publicar el contenido de las variables, para lo cual tenemos dos opciones. Caso 1. El código de HTML dentro de PHP. <?php print "<INPUT TYPE=\"text\" NAME=\"usuario\" SIZE=\"20\" MAXLENGTH=\"30\" VALUE=\"$nombre_usuario\"> "; ?> En este caso tenemos el campo de un formulario llamado dentro de un script de PHP, donde su contenido es el resultado de la variable $nombre_usuario.

Page 8: Php

Caso2 Variables de PHP dentro del código HTML. <INPUT TYPE="text" NAME="usuario" SIZE="20" MAXLENGTH="30" VALUE="<?php print "$nombre_usuario"; ?>"> En el segundo caso vemos como la variable es exclusivamente el único campo con llamada de PHP, integrado dentro del HTML. No se puede decir que alguna de ambas formas sea incorrecta, ya que mucho depende de las preferencias del programador, aunque la segunda es más eficiente al diferenciar el código HTML del PHP, facilitando eventualmente su modificación y comprensión. Tipos de datos (data types) Este concepto es importante de entender, ya que al momento de realizar funciones u operaciones, esto determina como se interpreta un dato que estemos utilizando. Principalmente encontramos los siguientes tipos:

• Cadenas (Strings) • Arreglos (Arrays) • Integrales (Integers) • Números de punto flotante (Floating Point Numbers) • Objetos (Objects)

A efectos de darle claridad a los ejercicios del presente, sólo se verán las cadenas de texto y los integrales en este apartado, los arreglos se verán más adelante. Cadenas de texto (Strings) Básicamente es una serie de caracteres, que pueden ser números, letras, código ASCII y otras variables. Están delimitadas por comillas, sencillas o dobles, que indican cuando comienzan y cuando terminan, como se aprecia a continuación. Comillas dobles. <?php print "texto de pueba"; ?> Comillas sencillas. <?php print ’texto de pueba’; ?>

Page 9: Php

A simple vista, parece que son lo mismo, pero como veremos, es algo engañoso. Supongamos que ahora tenemos estos dos ejemplos: <?php $cadena = "Prueba de"; print "$cadena texto<br>"; print ’$cadena texto’; ?> Lo que nos presenta lo siguiente: Prueba de texto $cadena texto Esto es debido a que las comillas sencillas indican que su contenido debe leerse literalmente, mientras que las dobles permiten ejecutar operaciones. Integrales (Integers) Estos son números, tanto positivos como negativos y el cero y se deben declarar sin comillas para que se consideren como tales, en caso contrario se manejarán como cadenas de texto. <?php $num1 = "1"; // Es una cadena $num2 = 1; // Es un número $num3 = 0; // Es un número ?> Operadores matemáticos y lógicos Presentamos los comandos y operadores de PHP, tomados directamente del manual de PHP. Operadores Aritméticos

Ejemplo Nombre Resultado $a + $b Adición Suma de $a y$b. $a - $b Substracción Diferencia entre $a y$b. $a * $b Multiplicación Producto de $a and $b. $a / $b División Cociente de $a entre $b.

$a % $b Módulo Resto de $a dividido entre $b.

Page 10: Php

Y este es un ejemplo muy sencillo, dividido en dos partes, por un lado vamos a hacer un formulario para que nos pregunte ciertas cantidades, llamado suma.html: <html> <head> <title>Formulario de una suma</title> <body> <FORM ACTION="suma.php" METHOD="POST"> <p> Primer n&uacute;mero a sumar:</P> <INPUT TYPE="text" NAME=" primnum" SIZE="20" MAXLENGTH="30"> <p> <INPUT TYPE="text" NAME="segnum" SIZE="20" MAXLENGTH="30"> <p> <input name="Enviar" value="Enviar" type="submit"> </form> </body> </html> Y este es el script que ejecuta la suma, llamado "suma.php": <html> <head> <title>Resultado de la suma</title> <body> <h1 align=center> <? $a = $primnum; $b = $segnum; Function Sum () { global $a, $b; $b = $a + $b; } Sum (); echo "el resultado es: $b"; ?> </h1> </body> </html> Al llamar a la forma, se nos solicitan unas cantidades, al llenar los campos y mandar los datos, nos presenta el resultado al centro de documento. El operador soporta números negativos, aunque si ponemos otros símbolos como suma, multiplicación o división, e incluso texto, lo ignora y sólo coloca la única cantidad válida. Si colocamos dos cadenas de texto en vez de números, el resultado es cero.

Page 11: Php

Operadores de Asignación El operador básico de asignación es =.A primera vista podrías pensar que es el operador de comparación "igual que". Pero no. Realmente significa que el operando de la izquierda toma el valor de la expresión a la derecha, (esto es, "toma el valor de"). El valor de una expresión de asignación es el propio valor asignado, ejemplo: <?php $a = ($b = 6) + 8; // ahora $a es igual a14, y$b vale 6 print "La variable a es igual a $a <br /> "; print "La variable b es igual a $b "; ?> Operador concatenante Este es un operador que permite adjuntar o "concatenar" dos cadenas de texto, variables y hasta el resultado de las funciones. <?php $nombre = "Desconocido"; $saludo = "Bienvenido, ".$nombre; print $saludo; ?> También es posible adjuntar nuevo contenido a una variable que se haya declarado previamente. <?php $saludo = "Bienvenido, amigo"; $saludo .= " al sitio del futuro"; print $saludo; ?> Sin embargo, recuerden que no pueden sustituir el contenido de una variable, sólo ampliarlo.

Page 12: Php

Operadores de Comparación

Ejemplo Nombre Resultado $a == $b Igualdad Cierto si $a es igual a $b

$a === $b Identidad Cierto si $a es igual a $b y si son del mismo tipo $a != $b Desigualdad Cierto si $a no es igual a $b $a < $b Menor que Cierto si $a es estrictamente menor que $b $a > $b Mayor que Cierto si $a es estrictamente mayor que $b

$a <= $b Menor o igual que Cierto si $a es menor o igual que $b $a >= $b Mayor o igual que Cierto si $a es mayor o igual que $b

Un ejemplo es: <?php // Declaro algunas variables $a = 2; $b = 4; $c = 8; if (($a * $b) == $c) { print "La suma de a y b es igual a c"; } ?> Operadores de incremento/decremento

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 ydespués decrementa $a en uno

Operadores Lógicos

Ejemplo Nombre Resultado $a and $b Y Cierto si tanto $a como $b son ciertos $a or $b O Cierto si $a o $b son ciertos $a xor $b O exclusiva Cierto si $a es cierto o $b es cierto, pero no ambos a la vez

!$a Negación Cierto si $a no es cierto $a && $b Y Cierto si tanto $a como $b son ciertos $a || $b O Cierto si $a o $b son ciertos

Page 13: Php

Funciones Una función es básicamente un código que realiza una función especí.ca, no se puede concebir un lenguaje de programación sin funciones y PHP no es la excepción. Debido a que tenemos dos tipos de funciones generales, explicaremos cada una por separado. Funciones preconstruidas Estas son aquellas que no tenemos que definir, ya que vienen preconstruidas en el lenguaje y sólo es necesario invocarlas, se puede consultar una lista completa por orden alfabético en http://www.php.net/quickref.php; donde encontramos, por ejem-plo: - Función print print presenta en el monitor una salida HTML desde un script de PHP, ya sea texto plano o una variable que tenga asignada un valor. <?php print "Primera prueba <br />\n"; print ("Segunda prueba con la variable $var <br />\n"); ?> - Función include() include() es muy utilizada para insertar en el código un archivo y presentar el texto que contenga o ejecutar otras funciones. <?php include ("menu.html"); ?> - Función header() header() es una función muy técnica, que generalmente se utiliza para enviar información a los encabezados del navegador, como pueden ser inicio de sesiones o cookies, pero el uso más común es el de redireccionar a un usuario a otra página, ya sea local o en otro servidor. <?php header( "Location:http://www.misitio.com/"); exit; ?>

Page 14: Php

Funciones definidas por el usuario - Estructura básica de una función Independientemente que tenemos una enorme cantidad de funciones a nuestra disposición, es necesario que podamos crear las nuestras, que a su vez utilizan otras. Para esto debemos utilizar la función function () (aunque parezca pleonasmo). <?php function hola() { print "Hola gente"; } hola(); ?> Al desglosarlo, encontramos que iniciamos declarando function, con lo que PHP sabe que comenzará una función nueva; a continuación tenemos su nombre, en este caso es hola(), indicando que estos nombres pueden contener números, letras y guiones bajos, no pueden comenzar con números y son sensibles a las mayúsculas; le sigue un paréntesis donde opcionalmente se pueden colocar los argumentos que maneje; entre llaves se escriben las acciones que debe realizar, en este caso declaramos un print a efectos del ejemplo. Al cerrar la función le indicamos a PHP que es lo que queremos hacer, pero eso no lo ejecuta de forma automática, por lo que es necesario llamar la función por su nombre para que se active, como se aprecia en la última línea del script. - Regresando valores de una función En el ejemplo anterior vimos que podemos regresar el contenido de una función, pero si deseamos regresar un valor, podemos hacer lo siguiente: <?php function hola() { return "Hola gente"; } $var = hola(); print $var; print hola(); ?> En este caso no estamos regresando una cadena de texto, sino un valor al que podemos asignar a un arreglo, a otra función o simplemente presentarlo en el monitor, gracias a la declaración return.

Page 15: Php

Argumentos de una función Para darle más flexibilidad, podemos utilizar argumentos que nos permiten personalizar y utilizar variables de otras funciones. <?php function hola($nombre) { return "Hola $nombre"; } ?> En este otro ejemplo permitimos que pasemos una variable para incluirla en la función, podemos incluir todas las que queramos, separándolas con una coma y luego ejecutarla, utilizando los valores directamente o desde otra función. <?php function hola($nombre, $saludo) { return "$saludo $nombre"; } print hola("Lagartija", "Hola"); ?> Sugerencia: Recuerde que los argumentos declaran las variables que se utilizan dentro de la función, si un argumento no es declarado, puede resultar en una ejecución incompleta o la terminación abrupta del proceso. Ámbito de las variables Este concepto, denominado en inglés variable scope hace referencia a la extensión del uso de las variables, es decir, en donde se pueden utilizar variables y donde no. En PHP se les define como globales, es decir, existen dentro de un script principal o desde un include(), pero curiosamente no se pueden definir dentro de una función de forma directa. Igualmente, si su valor fue modificado dentro de una función no es actualizado dentro del script principal. Para solventar esto, tenemos varias opciones. * La variable como argumento de la función Este es el ejemplo que ya hemos visto y es el más común. <?php function hola($nombre, $saludo) { return "$saludo $nombre"; } ?>

Page 16: Php

Como ya habíamos mencionado, fuera de la función el valor de la variable no cambia, como podemos ver a continuación. <?php $x =1; function suma($x) { $y++; print $y; } suma($x); print $x; ?> Al ejecutar el script, vemos como cambian los valores resultantes. * Usar la variable como una referencia En la teoría, dos variables, una global en el script y otra local en la función, pueden apuntar al mismo valor resultante, como apreciamos en este ejemplo, muy similar al anterior. <?php $x = 1; function suma(&$y) { $y++; } suma($x); print $x; ?> En este ejemplo, vemos como el valor de x se incrementa en 1. El ampersand (&) le indica a PHP que esa variable es una referencia. * Declarar una variable como GLOBAL en la función o llamarla desde un arreglo Tener una variable global en una función es casi lo mismo que tenerla como una referencia, pero con la diferencia que no se tiene que declarar otra variable, sino que se llaman igual; pueden tener todas las variables globales que necesiten, separándolas con una coma. <?php $x = 1; function suma() { global $x; $x++; } suma(); print $x; ?>

Page 17: Php

Otra forma es crear un arreglo asociativo de las variables globales para llamarlas desde una función con el comando $GLOBALS["variable"] . <?php $x =1; function suma() { $GLOBALS["x"]++; } suma(); print $x; ?> Estructuras de control Esta es la espina medular de cualquier lenguaje de programación, ya que permite que un sistema reaccione de acuerdo a las situaciones e información que se presente, ya que de lo contrario sólo podría trabajar de forma secuencial, lineal, de un principio a un fin establecido. Al ser estas estructuras comunes a todos los lenguajes de programación modernos, encontraremos numerosas similitudes. En PHP tenemos básicamente las Condicionantes y las Iteraciones. Condicionantes Conocidas también como Conditional Statements, son la forma más común de estructuras de control, en que se evalúan si una o más condiciones son verdaderas o falsas, para que en base a eso se ejecuten ciertas acciones. - Declaración if Es el mecanismo más simple, donde se evalúa una condición para ver si es cierta. <?php $x=1; if ($x == 1) print ’$x es igual a 1’; ?> En condicionantes en que tengamos que utilizar más de una declaración en la estructura de control, se utiliza la siguiente forma. <?php $x=1; if ($x == 1) { print ’$x es igual a 1’; $x++; print ’Y ahora $x es igual a 2’; } ?>

Page 18: Php

También se pueden ejecutar una serie de if sin que se afecte su ejecución. <?php if ($x == 1) print ’$x es igual a 1’; if ($x == 1) print ’$x es igual a 1’; if ($x == 1) { print ’$x es igual a 1’; } if ($x == 1) { print ’$x es igual a 1’; } ?> O bien se pueden anidar para que se ejecuten a la vez más de una condicionante. <?php $x=1; if ($x == 1 OR $x == 2) print ’$x es igual a 1 (o tal vez 2)’; ?> - Declaración else A diferencia de if, esta estructura se ejecuta cuando al evaluar la declaración, su resultado es falso. <?php $x=1; if ($x == 2) { print ’$x es igual a 2’; } else { print ’$x es igual a 1’; } ?> En esta situación, sólo existen dos opciones para el resultado del proceso.

Page 19: Php

- Declaración else if Al utilizar esta estructura, es posible tener una serie muy extensa de escenarios en que no necesariamente un argumento es falso o verdadero, sino que pueden tener múltiples condiciones. Al comenzar su ejecución, esta continúa hasta que determina que alguna condición se cumple, con lo que se detiene y termina. Sugerencia: En ocasiones no es tan conveniente usar esta estructura, recomendando entonces switch, que será comentado más adelante. <?php $x=1; if ($x == 2) { print ’$x es igual a 2’; } else if ($x == 1) { print ’$x es igual a 1’; } else { print ’$x no es igual a 2 ó 1’; } ?> En el caso que no queramos que se presente nada en el monitor cuando no se cumpla ninguna condición, podemos dejar fuera el else. <?php $x=0; if ($x == 2) { print ’$x es igual a 2’; } else if ($x == 1) { print ’$x es igual a 1’; } ?> - Declaración Switch Este es muy similar al conjunto "if/else/else if" pero cuenta con algunas características propias. En resumen, esta estructura ejecuta una serie de instrucciones de acuerdo a una condición dada. <?php $var = "si"; switch ($var) { case "si":

print ’$var es igual a si’; break;

case "no": print ’$var es igual a no’; break;

} ?>

Page 20: Php

Como apreciamos, comparamos una cadena de texto o una condición para ejecutar una o varias sentencias; para esto definimos con case el texto a comparar y, separado con dos puntos, los procesos que se deben ejecutar en caso afirmativo. Atención: Cuando la condición se cumple e inicia la ejecución, todas las declaraciones son ejecutadas, incluyendo las de otras condiciones, por lo que se debe detener la ejecución con break al término de cada una. Al igual que else, podemos utilizar la declaración default para que se ejecute en caso que ninguna de las condiciones se cumpla. <?php $var = "si"; switch ($var) { case "talvez":

print ’$var es igual a yes’; break;

case "no":

print ’$var es igual a no’; break;

default:

print ’<p>Texto alterno porque ninguna de las condiciones anteriores se cumplió.</p>’;

} ?> Similar a break existe exit, que se utiliza cuando tenemos que dar por terminado el programa de forma abrupta, equivalente a un "error fatal", por consiguiente, cualquier línea posterior de la función, aún fuera del switch, no se ejecuta. <?php $var = "si"; switch ($var) { case "si":

print ’$var es igual a si’; exit;

case "no": print ’$var es igual a no’; break;

} print "<p>Este párrafo no se imprime dado que el programa termina antes de poderlo leer.</p>"; ?>

Page 21: Php

A diferencia de break, exit se puede utilizar dentro y fuera de las estructuras de control. - Iteraciones Llamados generalmente control loops, es el mecanismo más utilizado para realizar procesos repetitivos, como leer varios registros de una base de datos, mandar correos a través de una lista o leer los contenidos de un arreglo. Atención: Este es un proceso potencialmente peligroso, ya que si no se define correctamente el final del ciclo, es posible que el servidor se encuentre en un proceso que no tiene fin, lo que puede consumir todos sus recursos y hasta detener su operación completamente. - While loop Esta es la forma más simple de Iteraciones. <?php $x=1; while ($x <=10) { print "$x<br />"; $x++; } ?> Como resultado, vemos que se lista del 1 al 10,ya que inicialmente asignamos un valor de 1 a "x" y posteriormente le incrementamos de uno en uno hasta que llegue al 10. En este caso, la condición es verificada antes de iniciar el loop, por lo que en caso de no ser verdadera, esta no se ejecuta. - Do... while loop En estos casos, la condición es verificada después de haberse realizado la primera iteración. <?php $x=11; do { print "$x<br />"; $x++; } while ($x <=10); ?>

Page 22: Php

- For loop Esta es uno de las formas de iteración más compleja, cuya sintaxis es muy cercana a C, donde se evalúa la condición al momento de iniciar su ejecución. <?php for($x=1; $x<=10; $x++) { print "$x<br />"; } ?> Arreglos Este es un concepto muy importante, aunque un poco confuso de entender. Los arreglos o arrays son un grupo de datos relacionados, que se ordenan en un formato similar a las tablas. En PHP, un arreglo se declara mediante la función array, cada componente es un elemento del arreglo o array element, el cual tiene un valor (que es la información en sí) y es identificado por:

a) Un entero único no negativo, denominado arreglo escalar o; b) por una cadena de caracteres, llamado arreglo asociativo.

Se reconocen dos tipos de arreglos en PHP, los unidimensionales y los multidimensionales, diferenciándose en que los segundos pueden contener otros arreglos dentro de si mismos, una característica poco común entre los lenguajes de programación. Arreglos Unidimensionales Inicia declarándose con array, asignándosele a un nombre que contiene los valores que le componen. <?php $patos=array("hugo", "paco", "luis"); ?> En este caso, la variable patos anida los datos del arreglo, aunque para extraerlos es necesario llamarlos específicamente, ya que si mandamos un print nos manda como resultado la palabra Array. <?php $patos=array("hugo", "paco", "luis"); print "$patos"; ?>

Page 23: Php

En vez de esto, concatenamos el nombre de la variable al identificador, como apreciamos a continuación. <?php $patos=array("hugo", "paco", "luis"); print "$patos[0]<br />"; print "$patos[1]<br />"; print "$patos[2]<br />"; ?> Como nos damos cuenta, los identificadores no necesariamente tenemos que declararlos, en estos casos se asigna automáticamente un entero comenzando en cero (0), aunque podemos asignarle a alguno un valor dado y el identificador inmediato será el siguiente número consecutivo. <?php $patos=array(2 =>"hugo", "paco", "luis"); print "$patos[2]<br />"; print "$patos[3]<br />"; print "$patos[4]<br />"; ?> Los anteriores son arreglos escalares, pero podemos definirlo como asociativo. <?php $patos=array("pato1" => "hugo", "pato2" => "paco", "pato3" => "luis"); print "$patos[pato1]<br />"; print "$patos[pato2]<br />"; print "$patos[pato3]<br />"; ?> Atención: No olvidemos declarar una llave a cada elemento cuando utilicemos un arreglo asociativo, puesto que sería imposible llamar su contenido. Si por otro lado, si deseamos darle elementos a un arreglo vacío, lo podemos hacer así: <?php $patos=array(); $patos[] ="hugo"; $patos[] ="paco"; $patos[] ="luis"; print "$patos[2]<br />"; ?>

Page 24: Php

Y en el caso que tengamos un arreglo con contenido: <?php $patos=array("hugo", "paco", "luis"); $patos[] ="donald"; $patos[] ="daisy"; print "$patos[3]<br />"; print "$patos[4]<br />"; ?> Iteraciones en arreglos A través de todos los ejemplos anteriores hemos utilizado el clásico print para extraer los valores de un arreglo, pero con un conjunto muy grande, esta operación no es funcional, para lo cual se utiliza la iteración foreach. <?php $patos = array(); $patos[]="hugo"; $patos[]="paco"; $patos[]="luis"; $patos[]="donald"; $patos[]="daisy"; foreach($patos as $key => $value) { print "key: $value<br />"; } ?> Esta es una iteración especial, diseñada expresamente para moverse a través de los elementos de un arreglo. Un equivalente del ejemplo anterior es: <?php $patos=array("hugo", "paco", "luis", "donald", "daisy"); foreach($patos as $key => $value) { print "$value<br />"; } ?> Como se aprecia, al ejecutar el script podemos extraerla llave o identificador y presentarlo sin necesidad de declararlo expresamente, aunque se puede dejar fuera si así lo deseamos.

Page 25: Php

<?php $patos=array("hugo", "paco", "luis", "donald", "daisy"); foreach($patos as $value) { if($value == "hugo") { print strtoupper($value); } } ?> Sugerencia: La función strtoupper toma una cadena de caracteres y los convierte a mayúsculas. Arreglos multidimensionales Estos se definen de forma muy similar a los unidimensionales, pero dentro de los cuales se definen otros arreglos. <?php $disney=array ( array ( "nombre" => "Paco",

"animal" => "pato", "color" => "blanco" ),

array ( "nombre" => "Dale", "animal" => "ardilla", "color" => "café" ), array ( "nombre" => "Pluto", "animal" => "perro",

"color" => "amarillo" ), array ( "nombre" => "Goofy",

"animal" => "desconocido", "color" => "negro" ),

); ?>

Page 26: Php

Lo anterior define el contenido, si deseamos presentar sus registros lo hacemos similar a los unidimensionales. <?php $disney=array ( array ( "nombre" => "Paco", "animal" => "pato", "color" => "blanco" ), array ( "nombre" => "Dale", "animal" => "ardilla", "color" => "café" ), array ( "nombre" => "Pluto", "animal" => "perro", "color" => "amarillo" ), array ( "nombre" => "Goofy", "animal" => "desconocido", "color" => "negro" ), ); print $disney[2]["nombre"]; print ("<br />"); print $disney[3]["color"]; ?> Y para manejarlo mediante un foreach: <?php $disney=array ( array ( "nombre" => "Paco", "animal" => "pato", "color" => "blanco" ), array ( "nombre" => "Dale", "animal" => "ardilla", "color" => "café" ), array ( "nombre" => "Pluto", "animal" => "perro", "color" => "amarillo" ), array ( "nombre" => "Goofy", "animal" => "desconocido", "color" => "negro" ), ); Foreach ($disney[2] as $key => $value) { print "$value<br />"; } ?>

Page 27: Php

Funciones de los arreglos Además de extraer los valores, tenemos otras funciones útiles para los arreglos. A continuación explicamos algunas de las más comunes. - Función in_array() Busca dentro del contenido de un arreglo una cadena de caracteres, es sensible a mayúsculas/minúsculas. <?php $patos=array("hugo", "paco", "luis", "donald", "daisy"); if (in_array("donald", $patos)) {

print "El tio gruñón está en el arreglo"; } ?> - Función count() Contabiliza la cantidad de elementos en un arreglo. <?php $patos=array("hugo", "paco", "luis", "donald", "daisy"); $num = count($patos); print $num; ?> - Función sort() Ordena de forma ascendente los elementos de un arreglo, basados en su valor, no en su llave. <?php $patos=array("hugo", "paco", "luis", "donald", "daisy"); sort($patos); for($i=0;$i<count($patos);$i++) { print "$patos[$i]<br />"; } ?>

Page 28: Php

- Función print_r() Presenta todos los elementos de un arreglo y su contenido, lo que facilita visualizar su contenido y poder buscar un error o un elemento dado. <?php $patos=array("hugo", "paco", "luis", "donald", "daisy"); print_r($patos); ?> El parser include () Una de las grandes ventajas de los lenguajes de script de servidor es la posibilidad de insertar contenido proveniente de otros documentos en el momento que una página se despliega en el navegador, lo que ahorra mucho tiempo de administración, evita que los documentos consuman espacio por información repetitiva y acelera el despliegue, ya que estos archivos se guardan en el cache el navegador. Poniéndolo de forma más sencilla, supongamos que tenemos un pié de página con el siguiente texto, dentro de un archivo llamado footer.txt: Todos los derechos reservados, UAM Azcapotzalco &reg; 2009 Tradicionalmente este párrafo sería muy sencillo de mantener y actualizar si nuestro sitio constara de unas cuantas páginas, digamos unas15 ó 20,pero si se trata de unas 50, se empieza a volver una tarea algo demandante, en el momento en que tenemos que actualizar unos 100 ó 200 documentos para Web, la cosa es de locos, de ahí la importancia de poder administrar el contenido de forma centralizada. En los casos de menús, encabezados o pies de página, es recomendable utilizar este tipo de función, que PHP manipula mediante la función include(), como la que vemos a continuación: <?php include("footer.txt");?> Los tipos de archivo que se pueden llamar son TXT, HTML, PHP y casi cualquier otro que maneje texto, incluso es factible que contengan tablas y javascript, aunque es importante mencionar que los documentos no deben contener etiquetas que entren en conflicto con el documento principal, como pueden ser <body>, <title> o <head>. Un ejemplo de una página con un include es el siguiente, al que llamaremos principal.php:

Page 29: Php

<html> <head> <title> Nueva página de PHP</title> </head> <body> <h1>Titulo del documento</h1> <p>Algo de contenido para que el documento pinte algo en el navegador</p> <?php include("footer.txt"); ?> </body> </html> Eso es todo, podemos copiar y pegar el código en un documento y salvarlo con extensión PHP para que el servidor lo procese. Obviamos la situación que include("footer.txt") hace referencia a un documento que se encuentra en la misma carpeta que el que lo llama, en caso de estar en otro directorio le debemos poner la ruta completa, como por ejemplo include("includes/footer.txt") si está en una carpeta llamada "includes" o include("/footer.txt") si se encuentra en la carpeta raíz del servidor. Los archivos include pueden contener código HTML, sin importar la extensión que tengan, como veremos en esta modificación al footer.txt: <h5><div align="center"> Todos los derechos reservados, UAM Azcapotzalco &reg; 2009 </div></h5> Como apreciamos, podemos incorporar incluso código de páginas de estilo; esto se hace extensivo a javascript y hasta Flash. Si deseamos insertar un script de PHP, puede ser así: <?php $anio = date("Y"); ?> <h5><div align="center"> Todos los derechos reservados, UAM Azcapotzalco &reg; <?php print "$anio"; ?> </div></h5>

Page 30: Php

- requiere () Otra opción, que guarda ciertas similitudes con include(), es requiere(), que también inserta el contenido de un archivo externo, sin embargo tiene algunas particularidades:

• Sólo puede ser llamado una vez, mientras que include() puede ser invocado diversas ocasiones.

• Siempre lee el contenido del archivo, aunque no exista o no encuentra la función solicitada, por lo que no genera mensajes de error.

• NO es una función propiamente de PHP, sino una construcción del lenguaje (heredada de C), por lo que no puede ser llamado sin que exista una condición o función, a diferencia de include().

Su sintaxis, como lo podemos suponer, es: <?php requiere("archivo.txt");?> Se utiliza frecuentemente para llamar clases dentro de scripts con programación orientada a objetos. Obteniendo la fecha y hora del sistema Fecha del sistema Una función que puede ser útil es incluir la fecha del sistema en los documentos Web, para lo cual basta el siguiente comando: <?php $dia = date("Y-m-d"); /* Declaramos una variable */ PRINT "<center>Hoy es $dia.</center>"; ?> Algunas variaciones de date son:

• date("Y-m-d") • date("d-m-y") • date("dd-mm-yy")

Page 31: Php

Donde: a "am" o "pm" A "AM" o "PM" d día del mes, dos dígitos con cero a la izquierda D día de la semana, en texto, con tres letras, en inglés F mes, en texto, en inglés j día del mes sin cero inicial; del "1" al "31" l(’L’ minúscula) día de la semana, en texto, completo, en inglés L regresa "1" ó "0", dependiendo si elaño es bisiesto o no m mes; del "01" al "12" n mes sin cero inicial; del "1" al "12" M mes, en texto, 3 letras, en inglés w día de la semana, en número, del "0" (domingo) al "6" (sábado) Y año, cuatro dígitos y año, dos dígitos Hora del sistema Por otro lado, la hora del sistema se obtiene así: <?php /* Esto define el idioma local, por defecto es el inglés */ /* Muy útil cuando presentamos los días de la semana o los meses. */ setlocale ("LC_TIME", "es_ES"); print(strftime("%c\n")); print "<br />"; /* Este pinta la hora del servidor donde corre el script */ print(strftime("%H:%M:%S\n")); print "<br>"; /* Vean este segundo ejemplo, donde se cambia el formato de la hora */ print(strftime("%I:%M:%S\n")); ?> Otra forma, pero utilizando otros parámetros de date, sería: <?php setlocale ("LC_TIME", "es_ES"); print (date(’l, F dS, Y (g:i A T)’)); ?>

Page 32: Php

Ejercicios Utilizando el ejercicio del apartado anterior, hacer que presente la fecha y hora dinámicamente. Comentarios en los scripts Los comentarios son básicamente anotaciones que el programador hace respecto a las funciones de los scripts. Esta costumbre es muy recomendable, principalmente para facilitar el entendimiento de un script y reducir el tiempo de edición del mismo. <?php echo "Ejemplos de comentarios"; // Comentario tipo c++ de una línea, no requiere cerrarse /* Comentarios multilínea En este caso pueden ser múltiples líneas siempre requiere cerrarse */ echo "Ultimo ejemplo de comentarios"; # Comentario tipo shell, no necesita cerrarse ?>

Page 33: Php

Utilización práctica A efectos de ofrecer una dinámica, proporcionamos una serie de scripts muy utilizados en la vida cotidiana y que pueden integrarse casi inmediatamente a un sitio web en producción. Manejo de formularios Captura de información Una de las rutinas más utilizadas es recabar información a través de formularios, cuyo contenido es enviado por PHP a diferentes destinos. Una muestra es la siguiente, donde comenzamos por crear un formulario: <!--Nombre del archivo: formulario.html --> <html> <head> <title>Solicita m&aacute;s informaci&oacute;n</title> <body> <p align="center">&iquest;Quieres m&aacute;s informaci&oacute;n? </p> <TABLE WIDTH = "400"><tr><TD align = "right"> <FORM ACTION="emailme.php" METHOD="post"> <p> Nombre completo:<br /> <INPUT TYPE="text" NAME="nombre" SIZE="20" MAXLENGTH="30"> <p> Correo electr&oacute;nico:<br /> <INPUT TYPE="text" NAME="email" SIZE="20" MAXLENGTH="30"> <p> Sistema operativo:<br /> <SELECT NAME="preferencia"> <OPTION value = "">Selecciona tu favorito <OPTION value = "Windows">Windows <OPTION value = "Linux">Linux <OPTION value = "Solaris">Solaris <OPTION value = "MacOS">MacOS </SELECT> <p> <INPUT TYPE="submit" VALUE="Enviar"> </form> </td></tr></TABLE></center>

Page 34: Php

</body> </html> Este archivo lo salvamos como formulario.html, vigilando que se encuentre abajo del document root de Apache. Hasta este punto tenemos un formulario común y corriente, en cuyo parámetro ACTION se declara un archivo llamado emailme.php que veremos a continuación. En este caso, ambos archivos se encuentran en la misma carpeta, pero en caso de tener todos los scripts en una carpeta independiente, debemos declarar la ruta completa. El script emailme.php sería como sigue: <!--Nombre del archivo: emailme.php --> <html> <head> <title>Confirmaci&oacute;n</title> <body> <?php /* Obtiene la informaci&oacute;n de formulario. */ PRINT "<center>"; PRINT "Muchas gracias, $nombre."; PRINT "<br /><br />"; PRINT "Agradecemos tu participaci&oacute;n.<br /><br />"; PRINT "Te enviaremos informaci&oacute;n a $email, sobre $preferencia."; PRINT "</center>"; ?> </body> </html> Ejercicios Copiar y ejecutar ambos archivos, personalizando su contenido en el sitio Web de su computadora y manejando al menos cinco variables.

Page 35: Php

Envío de información por email Lo que estamos haciendo es que, al momento de ejecutar emailme.php, se presentará una pantalla de agradecimiento al usuario y una copia de la información, pero ¿a dónde fue mandada? Si vemos con detenimiento el script, todo lo que le indicamos es que imprima en pantalla las variables, pero no hace nada más, de hecho, la información que le suministramos acaba en el limbo, por lo que debemos mandarlo a cuentas de correo para su procesamiento posterior mediante la función MAIL(). Sintaxis de MAIL(): mail(Para, Asunto, Mensaje, add_headers); donde

• Para es a quien se le va a mandar el correo. • Asunto es el asunto. • Mensaje es el contenido del mensaje • add_headers(opcional) permite modificar el contenido de los encabezados.

Con lo anterior, modificamos el archivo emailme.php. <!--Nombre del archivo: emailme2.php --> <html> <head> <title>Confirmaci&oacute;n</title> <body> <?php /* esto manda una respuesta autom&aacute;tica al correo del usuario */ mail("$email", "Informaci&oacute;n que solicitaste", "$nombre\n Gracias por participar!\n Ya tomamos nota que estuviste en nuestro sitio \n Visita frecuentemente http://www.misitio.com, \n pronto comenzaremos a mandarte informaci&oacute;n sobre $preferencia!"); /* esto manda una respuesta autom&aacute;tica al administrador del servicio */ mail("[email protected]", "Solicitud de información.", "$nombre solicit&oacute; informaci&oacute;n.\n Su direcci&oacute;n de correo es $email. \n

Page 36: Php

su preferencia es $preferencia."); /* Podemos adicionar cuantos destinatarios necesitemos */ /* Presenta la informaci&oacute;n de formulario. */ PRINT "<center>"; PRINT "Muchas gracias, $nombre."; PRINT "<br /><br />"; PRINT "Agradecemos tu participaci&oacute;n.<br /><br />"; PRINT "Te enviaremos informaci&oacute;n a $email, sobre $preferencia."; PRINT "</center>"; ?> </body> </html> Si revisamos nuestra cuenta de correo a donde mandamos tanto el agradecimiento como el aviso al webmaster, veremos que han llegado, sin embargo nos encontramos que el remitente dice Nobody <[email protected]> o Apache <[email protected]> en todos los casos, esto es debido a que PHP envía directamente los mensajes y el servidor de correos lo toma de parte del usuario que hace el envío, en este caso, el servidor de Web; para arreglarlo podemos hacer uso de los add_headers, como mostramos a continuación: <!--Nombre del archivo: emailme3.php --> <html> <head> <title>Confirmaci&oacute;n</title> <body> <?php /* esto manda una respuesta autom&aacute;tica al correo del usuario */ mail("$email", "Informaci&oacute;n que solicitaste", "$nombre\n Gracias por participar!\n Ya tomamos nota que estuviste en nuestro sitio \n Visita frecuentemente http://www.misitio.com, \n pronto comenzaremos a mandarte informaci&oacute;n sobre $preferencia!", "From: [email protected]");

Page 37: Php

/* esto manda una respuesta autom&aacute;tica al administrador del servicio. */ /* personalizamos el env&iacute;o para que veamos autom&aacute;ticamente */ /* la cuenta de correo del interesado. */ mail("[email protected]", "Solicitud de informaci&oacute;n.", "$nombre solicit&oacute; informaci&oacute;n.\n Su direcci&oacute;n de correo es $email. \n su preferencia es $preferencia.","From: $email"); /* Podemos adicionar cuantos destinatarios necesitemos */ /* Presenta la informaci&oacute;n de formulario. */ PRINT "<center>"; PRINT "Muchas gracias, $nombre."; PRINT "<br /><br />"; PRINT "Agradecemos tu participaci&oacute;n.<br /><br />"; PRINT "Te enviaremos informaci&oacute;n a $email, sobre $preferencia."; PRINT "</center>"; ?> </body> </html> Con el siguiente envío encontramos que las cuentas del correo han sido personalizadas, de manera que el usuario recibe un mensaje del webmaster y éste, a su vez, encuentra a primera vista la cuenta del correo del interesado. Sugerencia: MAIL() sólo funciona teniendo el servicio SENDMAIL, Qmail o similar, instalado y funcionando en el servidor. La mayoría de las veces así es, pero es mejor consultarlo con el ISP. Ejercicios Modificar el archivo formulario.php de acuerdo al emailme que se haya diseñado y probar su funcionamiento.

Page 38: Php

Control de cadenas de texto Cuando utilizamos formularios, es posible que el usuario nos mande el texto de forma no apropiada, pero podemos controlar estas cadenas de texto mediante algunas funciones. La primera es quitar los espacios en blanco, antes y después del texto, en un campo del formulario, que lo hacemos con la función trim (): <?php // Nombre del archivo: trim.php $nombre = " Tu nombre va aqu&iacute; "; $recorte1 = trim($nombre); print "$recorte1"; ?> Si deseamos eliminar el espacio en blanco al inicio de la cadena de texto, utilizamos ltrim (). <?php // Nombre del archivo: ltrim.php $mail = " [email protected]"; $recorte2 = ltrim($mail); print "$recorte2"; ?> Similar es la función chop (), que elimina los espacios sobrantes al final de la cadena de texto. <?php // Nombre del archivo: chop.php $mail = "[email protected] "; $recorte3 = chop($mail); print "$recorte3"; ?> Cuando necesitemos eliminar los espacios en blanco de una cadena, no tenemos una función específica, pero podemos utilizar str_replace (), el cual sustituye un texto o caracter determinado por otro. <?php // Nombre del archivo: replace1.php $mail = "algo @ tudominio. com "; $recorte4 = str_replace(" ", "", "$mail"); print "$recorte4"; ?>

Page 39: Php

La estructura de str_replace()es: str_replace(texto_buscar, texto_reempalzo, cadena_donde_buscar) Otra opción más en este último caso es reemplazar un texto por otro. <?php // Nombre del archivo: replace2.php $mail = "nombrearrobatudominio.com "; $recorte5 = str_replace("arroba", "@", "$mail"); print "$recorte5"; ?> Validación de datos de los formularios Como siempre que tenemos formularios, corremos el riesgo de que nos manden campos vacíos o con información errónea, para no tener que validar a mano la información, podemos utilizar algunas funciones que están disponibles desde PHP3. El primero es is_numeric (), que valida si una cadena es de texto o númerica. Sólo regresa un valor true cuando es numérico o false en caso contrario. <?php // Nombre del archivo: numeric.php $edad = "35 a&ntilde;os"; if (!is_numeric($edad)){

echo "Tu edad contiene letras, s&oacute;lo necesitamos n&uacute;meros.\n"; exit;

} else { print "Tu edad es $edad";

} ?>

Page 40: Php

Se han reportado errores cuando se valida con cadenas originadas desde formularios, aunque sean realmente numéricas, por lo que se puede utilizar en conjunción con trim (). <?php // Nombre del archivo: numerictrim.php $telefono = " (55)55232358 "; $espacios = trim ($telefono); if (!is_numeric($espacios)){

echo "Tu tel&eacute;fono contiene letras, s&oacute;lo necesitamos n&uacute;meros.\n"; exit;

} else { Print "Tu tel&eacute;fono es $telefono";

} ?> El siguiente tipo de validación es evitar que nos manden campos en blanco (difiere de str_replace () porque el otro los elimina), para lo cual utilizamos ereg () (evaluate regular expression), que verifica una cadena de caracteres que definimos, en este caso en particular, para buscar espacios en blanco: <?php // Nombre del archivo: ereg1.php if ($bandera) { if (ereg(".", $nombre) == 1) {

echo "Tu nombre: $nombre"; } else {

print ("Error: Requerimos tu nombre para continuar."); } } else { ?> <form action="<?php print "$PHP_SELF"; ?>" method="POST"> <p> Nombre completo:<br /> <INPUT TYPE="text" NAME="nombre" SIZE="20" MAXLENGTH="30"><br /> <INPUT TYPE="hidden" NAME="bandera" value="1"><br /> <INPUT TYPE="submit" value="Enviar"><br /> </p> </form> <?php } ?>

Page 41: Php

Explicando la función, existen tres argumentos para ereg, el primero es la cadena de caracteres que debe buscar, entre comillas, al colocarle un punto le estamos diciendo "algún carácter"; el siguiente argumento es donde va a realizar la búsqueda, en este caso es en la variable "nombre"; existe un tercer argumento, opcional, para colocar un arreglo. El valor 0 indica falso y 1, verdadero. Por lo tanto, la línea if (ereg(".", $nombre) == 1) dice "si en el campo nombre encuentras algo, entonces es verdadero". Acto seguido, imprime en pantalla el nombre, en caso contrario, imprime la solicitud para que mandemos nuestro nombre (o algo). Otra forma, que permite validar en una sola línea varios campos para ver si tienen contenido, es con la siguiente expresión: <?php if (!$campo1 || !$campo2 || !$campo3 || !$campo4) { print("<p>Debes llenar los campos!</p>"); } ?> Este proceso define la validación, sin embargo el mensaje de error es el mismo para todos. En caso que se desee mandar un mensaje específico para cada campo, deberá repetirse el procedimiento para cada uno de estos. Para validar un correo electrónico con ereg(), podemos utilizar los argumentos siguientes:

• "\@", Debe incluir @ • "^\@", No puede empezar con @ • "\@.*.\.", Debe tener caractéresentre @ y . • "\....*", Debe tener al menos dos caracteres después de . • "", No se permiten espacios en blanco. • "<"">", No se permiten brackets de etiquetas.

Page 42: Php

En una forma muy depurada, la función que valida tanto los espacios en blanco como la existencia de arroba (@) y al menos dos strings después de símbolo, es el siguiente: <?php // Nombre del archivo: ereg2.php if ($bandera) { if (!eregi("^([a-z0-9]+)([._-]([a-z0-9]+))*[@]([a-z0-9]+)([._-]([a-z0-9]+))*[.] ([a-z0-9]){2}([a-z0-9])?$", $email) ) { print "<p>Debes escribir un email v&aacute;lido!</p>"; } else { print "<p>Tu cuenta de correo es: $email</p>"; } else { print " <form action=\"$PHP_SELF\" method=\"POST\"> <p> Cuenta de correo:<br /> <INPUT TYPE=\"text\" NAME=\"email\" SIZE=\"20\" MAXLENGTH=\"90\"><br /> <INPUT TYPE=\"hidden\" NAME=\"bandera\" value=\"1\"><br /> <INPUT TYPE=\"submit\" value=\"Enviar\"><br /> </form> "; } ?> Importante: Para mejorar su presentación, la condicionante de eregi se ve en dos líneas, sin embargo debe ser continua, sin espacios en blanco o saltos de línea, para que funcione correctamente. Esta función se basa en las llamadas "expresiones regulares", donde se valida si existen ciertos elementos y el orden en que aparecen. La diferencia entre ereg y eregi es que la primera es sensible a mayúsculas y minúsculas, mientras que la segunda no las distingue.

Page 43: Php

Trasladando estas validaciones a nuestro script emailme.php, tendríamos el siguiente código: <!--Nombre del archivo: emailme4.php --> <html> <head> <title>Confirmaci&oacute;n</title> <body> <?php /* Primero validamos que nuestros campos principales est&eacute;n llenos */ if (!$nombre || !$email || !$preferencia) { print ("<h1>Falt&oacute; de poner un dato requerido, favor de regresar a la pantalla anterior para llenar los campos faltantes.</h1>"); } /* Ahora verificamos que la cuenta de correo est&eacute; correcta */ else if (!eregi("^([a-z0-9]+)([._-]([a-z0-9]+))*[@]([a-z0-9]+)([._-]([a-z0-9]+))*[.]([a-z0-9]){2}([a-z0-9])?$", $email)) { print ("<h1>La cuenta de correo tiene caracteres incorrectos, espacios o falta el arroba, favor de regresar a la pantalla anterior para corregirlo.</h1>"); } /* Si lo anterior es correcto, ejecutamos el env&iacute;o de informaci&oacute;n */ else { /* esto manda una respuesta autom&aacute;tica al correo del usuario */ mail("$email", "Informaci&oacute;n que solicitaste", "$nombre\n Gracias por participar!\n Ya tomamos nota que estuviste en nuestro sitio \n Visita frecuentemente http://www.misitio.com, \n pronto comenzaremos a mandarte informaci&oacute;n sobre $preferencia!",

Page 44: Php

"From: [email protected]"); /* Esto manda una respuesta autom&aacute;tica al administrador del servicio. */ /* Personalizamos el env&iacute;o para que veamos autom&aacute;ticamente la cuenta de correo del interesado. */ mail("[email protected]", "Solicitud de informaci&oacute;n.", "$nombre solicit&oacute; informaci&oacute;n.\n Su direcci&oacute;n de correo es $email. \n su preferencia es $preferencia.","From: $email"); /* Podemos adicionar cuantos destinatarios necesitemos */ /* Presenta la informaci&oacute;n de formulario. */ PRINT "<center>"; PRINT "Muchas gracias, $nombre."; PRINT "<br /><br />"; PRINT "Agradecemos tu participaci&oacute;n.<br /><br />"; PRINT "Te enviaremos informaci&oacute;n a $email, sobre $preferencia."; PRINT "</center>"; } ?> </body> </html> Envío de archivos al servidor Otra de las funciones relacionadas con los formularios es la relacionada con el envío de archivos (tanto de texto como binarios) a una carpeta remota. Existen algunas condiciones para que esto pueda realizarse:

• Se requiere de un navegador que cumpla la norma RFC-1867, como es Netscape 3.0 o posterior, Internet Explorer 4 o posterior, Mozilla1.0 u Opera, por mencionar los más comunes.

• Que la opción de "upload files" esté habilitada en el PHP.INI (file_uploads = On). • Que el archivo preferentemente no rebase los 2 MB que el límite del archivo,

aunque esto se puede cambiar en el PHP.INI (upload_max_filesize = 2M). • Que el límite de memoria sea del doble del archivo que se envío (en caso que sea

muy grande), o no será posible moverlo a la carpeta de destino.

Page 45: Php

Internamente, el procedimiento se centra en enviar un archivo vía POST, esto lo deposita en una carpeta temporal, de donde se toma para colocarse en la carpeta definitiva (en caso contrario, el documento es eliminado de forma automática posteriormente). Para comenzar podemos analizar un primer ejemplo: <FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000"> Enviar este archivo: <INPUT NAME="userfile" TYPE="file"> <INPUT TYPE="submit" VALUE="Enviar"> </form> Antes de publicarlo, analicémoslo un momento:

• ENCTYPE="multipart/form-data" define el tipo de información que viajará mediante el formulario.

• ACTION="_URL_" especifica la página que procesará la petición. • INPUT TYPE="hidden" name="MAX_FILE_SIZE" es la variable que utilizamos para

determinar el tamaño máximo (en bytes) del archivo que se envía. Algunos usuarios han comentado que esta variable es REQUERIDA en Linux para que trabaje el script.

• INPUT NAME="userfile" TYPE="file" es posiblemente uno de los puntos más delicados, ya que al definir el tipo como archivo, de forma automática crea el botón que nos permite navegar en nuestro disco duro para elegir el archivo que deseamos mandar.

Las variables que manda el navegador (aunque depende cuales soporta el browser) son: $HTTP_POST_FILES[’userfile’][’name’] El nombre original del fichero en la máquina cliente. $HTTP_POST_FILES[’userfile’][’type’] El tipo mime del fichero(si el navegador lo proporciona). Un ejemplo podría ser "image/gif". $HTTP_POST_FILES[’userfile’][’size’] El tamaño en bytes del fichero recibido. $HTTP_POST_FILES[’userfile’][’tmp_name’] El nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

Page 46: Php

Importante: A partir de PHP 4.1.0 se utiliza la variable corta $_FILES. PHP3 no soporta $HTTP_POST_FILES. La variable global $HTTP_POST_FILES crea una arreglo con todos los valores del archivo que se envía para poderlo procesar posteriormente. Una vez que ya se tiene el archivo en el servidor, es necesario validarlo y luego cambiarlo a la carpeta de destino (recordemos que se encuentra en una carpeta temporal), para esto utilizamos respectivamente:

• is_uploaded_file() verifica que el archivo ha sido enviado. • move_uploaded_file() cambia de lugar el archivo.

El ejemplo con copy sería: <?php // Nombre del archivo: upload1.php // En PHP 4.1.0 o posterior debemos usar $_FILES en vez de $HTTP_POST_FILES. if (is_uploaded_file($_FILES[’userfile’][’tmp_name’])) { copy($_FILES[’userfile’][’tmp_name’], "/carpeta/donde/mover/el/archivo"); } else { echo "Este es un posible ataque por upload. Filename: " . $_FILES[’userfile’][’name’]; } ?> El ejemplo con move_uploaded_file es: <?php // Nombre del archivo: upload2.php // En PHP 4.1.0 o posterior debemos usar $_FILES en vez de $HTTP_POST_FILES. if (is_uploaded_file($_FILES[’userfile’][’tmp_name’])) { move_uploaded_file($_FILES[’userfile’][’tmp_name’], "/carpeta/donde/mover/el/archivo"); } else { echo "Este es un posible ataque por upload. Filename: " . $_FILES[’userfile’][’name’]; } ?>

Page 47: Php

La alerta respecto a "ataque por upload" se debe a que en ciertas versiones de PHP se descubrió una vulnerabilidad en la función de upload, por lo que es conveniente, aunque no tengamos ese bug, poner un candado en el script. Algunos usuarios han reportado errores con la función copy, pero que trabaja correctamente con move_uploaded_file. En caso de que el archivo ya exista, el nuevo sobreescribe al original. Un ejercicio completo es: <?php // Nombre del archivo: upload3.php // Comentarios referentes al script: [email protected] // Este ejemplo se prob&oacute; originalmente con Win2KPro, Apache 1.3x, PHP 4.x // sin embargo, en Linux trabaja bien con una configuraci&oacute;n similar // Especificamos esta l&iacute;nea donde defino // el path de destino, de acuerdo a cada sistema. // para unix = /var/www/html/uploads/ // para windows = c:\\inetpub\\wwwroot\\uploads\\ // La carpeta de destino debe tener permisos 757 en Unix // Y de lectura y escritura en Windows if ($act) { if (is_uploaded_file($_FILES[’userfile’][’tmp_name’])) { $filename = $_FILES[’userfile’][’tmp_name’]; print "<p>$filename fue cargado exitosamente</p>"; $realname = $_FILES[’userfile’][’name’]; print "<p>El nombre real es $realname</p>"; print "<p>Copiando los archivos al directorio</p>"; copy($_FILES[’userfile’][’tmp_name’], "/var/www/html/uploads/".$realname); } else { echo "<p>Posible ataque mediante upload ".$_FILES[’userfile’][’name’]."."; } } ?>

Page 48: Php

<form ENCTYPE="multipart/form-data" method="POST" action="<?php print("$PHP_SELF"); ?>?act=upload"> Archivo: <INPUT TYPE="FILE" NAME="userfile" SIZE="35"> <input type="hidden" name="MAX_FILE_SIZE" value="1000"> <input type="submit" value="Enviar" name="B1"> </form> <p>Pulsar s&oacute;lo una vez y esperar la confirmaci&oacute;n</p> <p><a href="<?php print("$PHP_SELF"); ?>">Reiniciar el formulario</a></p> <html> <body> Estos son los errores definidos para la acción de upload, mismos que se presentan automáticamente en caso de fallar el proceso: #define UPLOAD_ERROR_A 1 /* El archivo excede el tamaño de upload_max_filesize */ #define UPLOAD_ERROR_B 2 /* El archivo excede el tamaño de MAX_FILE_SIZE */ #define UPLOAD_ERROR_C 3 /* Parcialmente enviado */ #define UPLOAD_ERROR_D 4 /* No fue enviado */ #define UPLOAD_ERROR_E 5 /* Tamaño del archivo enviado 0 bytes */ Manejo de ficheros Detalles de los ficheros Una característica interesante de PHP es su capacidad para manipular archivos de texto en un servidor, incluso escribir en ellos para actualizarlos en tiempo real. La primera función que podemos explotar es readfile(), que como su nombre indica, despliega el contenido de un archivo de texto en el monitor, Para iniciar estos ejercicios, escribimos lo siguiente. "Este ’tel&eacute;fono’ tiene demasiados problemas como para ser considerado seriamente como un medio de comunicaci&oacute;n. El artefacto no tiene valor para nosotros." --Memo interno de la Western Union, 1876.

Page 49: Php

Salvamos este archivo con el nombre "random.txt" y luego ejecutamos el siguiente programa: <?php // Nombre del programa: fichero1.php // lectura de un archivo $bytes = readfile("random.txt"); // tama&ntilde;o del archivo print "<br />El archivo es de $bytes bytes de tama&ntilde;o."; ?> Esto despliega lo siguiente: "Este ’teléfono’ tiene demasiados problemas como para ser considerado seriamente como un medio de comunicación. El artefacto no tiene valor para nosotros." --Memo interno de la Western Union, 1876. El tamaño del fichero es de 199 bytes de tamaño. Primeramente nos percatamos que pierde el formato, ya que el navegador lo interpreta directamente y al no encontrar etiquetas HTML, lo presenta como una sola línea. Por otro lado, partimos del principio que el archivo existe, pero ¿y si no estamos seguros?, para poder verificarlo tenemos la función file_exists(), que nos mandará un mensaje personalizado en caso de no encontrarlo, como vemos a continuación: <?php // Nombre del programa: fichero2.php // Definimos el nombre del archivo $archivo="random.txt"; if (file_exists($archivo)) { // lectura de un archivo print "<pre>"; $bytes = readfile($archivo); print "</pre>"; // tamaño del archivo print "<br />El archivo es de $bytes bytes de tama&ntilde;o."; } else { print("No encuentro el archivo"); } ?>

Page 50: Php

Como resultado, vemos que el documento presenta los saltos de línea originales, además de la posibilidad de verificar su existencia y presentar un error personalizado. Y si queremos utilizar más funciones, podemos hacer esto: <?php // Nombre del programa: fichero3.php // Definimos el nombre del archivo $archivo = "random.txt"; // Verificamos que se encuentra if (file_exists($archivo)) { // Se define un arreglo para el contenido $contenido = file($archivo); // Determinamos el n&uacute;mero de l&iacute;neas $longitud = sizeof($contenido); print "<b>El archivo $archivo contiene $longitud l&iacute;nea(s)</b><p>"; // Desplegamos cada l&iacute;nea del arreglo con un loop for($counter=0; $counter<$longitud; $counter++) { echo "$contenido[$counter]<br />"; } } else { print("No encuentro el archivo"); } ?> Otros comandos para verificar los datos del archivo son los siguientes, aunque les recomendamos ver el manual de PHP para que vean la lista completa:

• is_dir(), verifica si es un directorio. • is_executable(), verifica si es ejecutable. • is_link(), verifica si es un link virtual. • is_readable(), verifica los permisos de lectura. • is_writeable(), verifica los permisos de escritura. • filegroup(), regresa el grupo al que pertenece. • fileowner(), regresa el nombre del propietario del archivo. • fileperms(), regresa los permisos. • filesize(), regresa el tamaño del archivo. • filetype(), regresa el tipo de archivo.

Page 51: Php

No contentos con este manejo básico, podemos también hacer editar el documento, para lo cual requerimos de una serie de funciones que veremos a continuación. Edición de los ficheros fopen() es la primera función en la lista, que abre un archivo y lo prepara para editarlo o simplemente leerlo. Su sintaxis es: fopen(archivo, modo)

• archivo es el nombre del documento que abrimos. • modo es el tipo de ejecución que haremos. • El modo tiene las siguientes opciones:

o ’r’ - Abre para sólo lectura; sitúa el apuntador del fichero al comienzo del mismo.

o ’r+’ – Abre para lectura y escritura; sitúa el apuntador del fichero al comienzo del fichero.

o ’w’ - Abre para sólo escritura; sitúa el apuntador del fichero al comienzo del fichero y trunca el fichero con longitud cero. Si el fichero no existe, trata de crearlo.

o ’w+’ - Abre el fichero para lectura y escritura; sitúa el apuntador del fichero al comienzo del fichero y trunca el fichero con longitud cero. Si el fichero no existe, trata de crearlo.

o ’a’ - Abre sólo para escribir (añadir); sitúa el apuntador del fichero al final del mismo. Si el fichero no existe, trata de crearlo.

o ’a+’ - Abre para lectura y escritura (añadiendo); sitúa el apuntador del fichero al final del mismo. Si el fichero no existe, trata de crearlo.

Generalmente, las carpetas donde se crean estos archivos deben tener los permisos 757 para que pueda escribir en ellas el usuario de Apache ("apache" o "nobody", dependiendo de la configuración del servidor); sin embargo, los archivos resultantes generalmente sólo tienen permisos de escritura del propietario de la carpeta, mismos que son asignados automáticamente. Los archivos pueden ser abiertos de las siguientes formas:

• Localmente: fopen("/home/directorio/archivo.txt", "r") • Web: fopen("http://www.servidor.com/", "r") • FTP: fopen("ftp://user:[email protected]/", "w")

Page 52: Php

fclose() es la segunda función en orden de importancia y de hecho es recomendado que siempre que se abra un archivo, se cierre. Esto se fundamenta en que el servidor mantiene abierto el archivo, lo que ocupa recursos y abre la posibilidad a que alguien no autorizado lo pueda leer. Su sintaxis es: fclose(fopen(archivo, modo)); fread() lee un archivo en modo binario (depende del modo declarado en fopen), sube el contenido al cache de la máquina del cliente. Su sintaxis es: fread (fopen(archivo, modo), filesize (archivo));

• fopen abre el archivo. • filesize define el tamaño en bytes. • Archivo es el nombre del archivo abierto, lo que crea el arreglo de longitud. Un

ejemplo más claro y con variables, basándonos en el primero, es <?php // Nombre del programa: fichero4.php // Abrimos y leemos el archivo $archivo = "random.txt"; $fd = fopen ($archivo, "r"); $contenido = fread ($fd, filesize ($archivo)); fclose ($fd); // Lo presentamos en pantalla print "<pre>"; print "$contenido"; print "</pre>"; ?> Finalmente, tenemos fputs(), que escribe los archivos en modo binario. Su sintaxis es: fputs(fopen(archivo, modo),"contenido nuevo") Donde:

• fopenabre el archivo. • contenido nuevo es el texto que se escribe (depende del modo declarado en

fopen).

Page 53: Php

Otro ejemplo, que sustituye el contenido del documento, es: <?php // Nombre del programa: fichero5.php $archivo = "random.txt"; if ($textonuevo) { // Abrimos y actualizamos el archivo $fd = fopen ($archivo, "w"); fputs($fd,$textonuevo); fclose ($fd); } ?> <form action="<?php print ("$PHP_SELF"); ?>" method="POST"> <p><strong>Editar texto</strong></p> <textarea name="textonuevo" rows="6" cols="30"></textarea><br /> <input value="Actualizar" type="submit"><input value="Borrar" type="submit"> </form> <?php // Abrimos y leemos el archivo $fd = fopen ($archivo, "r"); $contenido = fread ($fd, filesize ($archivo)); fclose ($fd); // Lo presentamos en pantalla print "<pre>"; print "$contenido"; print "</pre>"; ?>

Page 54: Php

Por otro lado, si deseamos editar el contenido del original, pero no sustituirlo en su totalidad, podemos usar esta variación: <?php // Nombre del programa: fichero6.php $archivo = "random.txt"; if ($textonuevo) { // Abrimos y actualizamos el archivo $fd = fopen ($archivo, "w"); fputs($fd,$textonuevo); fclose ($fd); } // Abrimos y leemos el archivo $fd = fopen ($archivo, "r"); $contenido = fread ($fd, filesize ($archivo)); fclose ($fd); ?> <form action="<?php print ("$PHP_SELF"); ?>" method="POST"> <p><strong>Editar texto del archivo <?php print "$archivo"; ?></strong></p> <textarea name="textonuevo" rows="6" cols="30"><?php print "$contenido"; ?></textarea <input value="Actualizar" type="submit"><input value="Borrar" type="submit"> </form> En otro ejercicio, pensando en la posibilidad de tener un listado de nombres, parecido al anterior: <?php // Nombre del programa: fichero7.php if ($nuevoregistro) { // Abrimos y actualizamos el archivo $archivo = "listado.txt"; $fd = fopen ($archivo, "a"); fputs($fd,$nuevoregistro."\n"); fclose ($fd); } ?>

Page 55: Php

<form action="<?php print ("$PHP_SELF"); ?>" method="POST"> <p><strong>Nuevo registro</strong></p> <input type="text" name="nuevoregistro" size="20"><br /> 55 <input value="Enviar" type="submit"><input value="Borrar" type="submit"> </form> <?php if (file_exists($archivo)) { // Abrimos y leemos el archivo $fd = fopen ($archivo, "r"); $contenido = fread ($fd, filesize ($archivo)); fclose ($fd); // Lo presentamos en pantalla print "<p>Listado actual</p>"; print "<pre>"; print "$contenido"; print "</pre>"; } else {print "<p>No encontr&eacute; el archivo.</p>";} ?> Autenticación de usuarios Script básico de autenticación Una función muy útil es la capacidad de restringir el acceso de usuarios a ciertas partes de nuestra página Web. Esto se puede hacer mediante muchas formas, como javascript, CGI y similares, siendo compartida por PHP, aunque en este úl-timo caso, podemos hacerlo mediante la autenticación básica del servidor HTTP. Exponiéndolo claramente, la autenticación en HTTP se basa en un proceso de pregunta/respuesta, en que el usuario debe responder correctamente para poder seguir adelante a una sección protegida del servidor; en caso de no estar autorizado el servidor manda un error 401 (unauthorized user). Para proseguir, tanto el nombre como el password deben ser correctos. Un script de PHP puede imitar este procedimiento (eso nos evita tener privilegios de root para determinarlo) al mandar los headers (encabezados) apropiados al servidor para forzar el cuadro de diálogo. Un encabezado es código residente en navegador del usuario, contiene información que es leída por el servidor al momento de conectarse.

Page 56: Php

Existen tres variables globales que guardan la información del usuario: $PHP_AUTH_USER $PHP_AUTH_PW $PHP_AUTH_TYPE Importante: Esta validación sólo está disponible si se instaló PHP como módulo de Apache, si se utilizó la instalación de CGI, la validación estará disponible sólo para HTTP. Importante: La variable $PHP_AUTH_TYPE, a pesar de existir desde PHP3, no tiene una función bien definida, por lo que sólo se utilizan las primeras dos. Veámoslo con calma. Cuando entramos a una página con el header $PHP_AUTH_USER, PHP busca si existe algún valor, cualquiera y al no haber ninguno, despliega el cuadro de diálogo solicitando el nombre y la contraseña. Un ejemplo de esto es el siguiente. <?php // Nombre del programa: autentico1.php // Verificaci&oacute;n si $PHP_AUTH_USER contiene info if (!$PHP_AUTH_USER) { // Y si est&aacute; vacio, presenta el cuadro de di&aacute;logo header(’WWW-Authenticate: Basic realm="P&aacute;gina privada"’); header(’HTTP/1.0 401 Unauthorized’); echo ’Authorization Required.’; exit; } // Si no est&aacute; vacio, despliega los valores else { echo " <p>Utilizaste el nombre de usuario: $PHP_AUTH_USER<br /> Tu password fue: $PHP_AUTH_PW<br /> El tipo de autorizaci&oacute;n es: $PHP_AUTH_TYPE</p> "; } ?>

Page 57: Php

En ciertos tutoriales, se pueden ver ejemplos similares al anterior, pero donde la primera validación es if (!isset($PHP_AUTH_USER)), sin embargo, encontramos que esta forma permite el acceso a la página si se pulsa el botón "Aceptar" con ambos campos vacíos, debido a que un archivo de texto no puede identificar campos nulos. Se recomienda usar if (!$PHP_AUTH_USER). En términos generales, si no hay valores al utilizar el script anterior, nos mandará un error por usuario no autorizado. Notemos que no tiene mucha utilidad y a que el usuario y password no son validados en ningún momento. Lo que sigue es poder validar la información. Ejercicios Copiar y ejecutar este ejercicio en un documento llamado "autentico1.php". Validando un nombre de usuario y un password En primera instancia, validaremos uniusuario y contraseña únicos, útil para administradores de un servicio pero con limitaciones para facilitar acceso a un usuario. El script será muy similar al anterior. <?php // Nombre del programa: autentico2.php if (!$PHP_AUTH_USER) { // Y si est&aacute; vacio, presenta el cuadro de di&aacute;logo header(’WWW-Authenticate: Basic realm="Pagina privada"’); header(’HTTP/1.0 401 Unauthorized’); echo ’Authorization Required.’; exit; } else if (isset($PHP_AUTH_USER)) { if (($PHP_AUTH_USER != "admin") || ($PHP_AUTH_PW != "abc123")) { header(’WWW-Authenticate: Basic realm="Pagina privada"’); header(’HTTP/1.0 401 Unauthorized’); echo ’Autorizaci&oacute;n requerida. Lo sentimos.’; exit; } else { echo "<p>Est&aacute;s autorizado</p>"; }} ?>

Page 58: Php

Si hacen la prueba de colocar el nombre de usuario incorrecto o el password, mandará el mensaje de error. También se darán cuenta que si después de haber accedido a esa página correctamente una vez, mientras dure su sesión del navegador se mantendrá y no les pedirá nuevamente la identificación sino hasta que cierren el browser y lo vuelvan a intentar. Ejercicios Copiar este ejercicio en "autentico2.php". Verificar su funcionamiento con diferentes nombres de usuario y passwords. Validando varios usuarios y passwords en una tabla plana Si tenemos una página privada pero necesitamos que otros usuarios tengan acceso, no es conveniente compartir nuestra clave personal. Para evitar esto podemos definir una lista (a la que sólo nosotros debemos tener acceso) en un documento de texto, donde separamos los usuarios y passwords con dos puntos: crowley:aaaaaa nano:bbbbbb bilo:cccccc linus:dddddd bill:eeeeee Este archivo lo salvamos como "users.txt". Estos valores deben ser leídos por el script antes que se carguen las variables $PHP_AUTH_USER y $PHP_AUTH_PW, para lo cual crearemos otra llamada $file_contents, como la siguiente. $filename = "/ruta/a/users.txt"; $fp = fopen($filename, "r"); $file_contents = fread($fp, filesize($filename)); fclose($fp); Sin embargo, al leer este archivo, todo lo que se obtiene es una lista con los datos y retornos manuales, por lo que entonces debemos utilizar la función explode() para separar los valores. explode() separa los valores y los manipula como arreglos(arrays) al designar un carácter de separación. Por lo tanto, debemos poner cada pareja de username/password como un arreglo, definiendo el retorno de carro como el separador. Para esto, utilizaremos la variable $file_contents como un arreglo llamado $linea: $linea = explode("\n", $file_contents); Con esto, ya tenemos a cada pareja como un arreglo, llamado $linea(0), $linea(1), $linea(2), etc. Dense cuenta de que el conteo comienza con cero, que es una herencia de C, comentada anteriormente.

Page 59: Php

Ahora, para leer cada uno y poder utilizar el explode, manejamos un loop: // loop para $linea mientras contenga informaci&oacute;n while($i <= sizeof($linea)) { // usamos explode para obtener username y password $data_pair = explode(":", $linea[$i]); // busca que concuerden los datos // si concuerdan, asigna el valor de 1 a la variable $auth // e interrumpe el loop if (($data_pair[0] == "$PHP_AUTH_USER") && ($data_pair[1] == "$PHP_AUTH_PW")) { $auth = 1; break; // si no se interrumpe, asigna el valor 0 a $auth } else { $auth = 0; } // incrementamos aqu&iacute; para que continue el loop $i++; } Importante: Se ha documentado que algunos usuarios han tenido problema para definir en diferentes scripts el cero como valor de nulidad. No es algo frecuente pero puede llegar a pasar. Y hagamos algo con la variable $auth. Si el valor es 1, entonces se le concede el acceso, si el valor es 0, volvemos a presentar la pantalla. if ($auth == "1") { echo "Autorizado. Eres bienvenido."; exit; } else { header(’WWW-Authenticate: Basic realm="Pagina privada"’); header(’HTTP/1.0 401 Unauthorized’); echo ’Authorization Required.’; exit; }

Page 60: Php

Ahora pegamos todo este código en un sólo archivo, de manera que lo veamos funcionar. <?php // Nombre del programa: autentico3.php if (!$PHP_AUTH_USER) { // Y si est&aacute; vacio, presenta el cuadro de di&aacute;logo header(’WWW-Authenticate: Basic realm="Pagina privada"’); header(’HTTP/1.0 401 Unauthorized’); echo ’Authorization Required.’; exit; } else if (isset($PHP_AUTH_USER)) { // abrimos el archivo de los usuarios $filename = "users.txt"; $fp = fopen($filename, "r"); $file_contents = fread($fp, filesize($filename)); fclose($fp); // convertimos cada pareja de valores en un arreglo $linea = explode("\n", $file_contents); // Mientras $i es <= al tama&ntilde;o de $linea, // usamos explode en cada arreglo $i = 0; while($i <= sizeof($linea)) { $data_pair = explode(":", $linea[$i]); if (($data_pair[0] == "$PHP_AUTH_USER") && ($data_pair[1] == "$PHP_AUTH_PW")) { $auth = 1; break; } else { $auth = 0; } $i++; } if ($auth == "1") { echo "<p>Autorizado. Bienvenido.</p>"; exit; } else { header(’WWW-Authenticate: Basic realm="Pagina privada"’); header(’HTTP/1.0 401 Unauthorized’);

Page 61: Php

echo ’Autorizaci&oacute;n requerida.’; exit; }} ?> Ejercicios Copiar este ejercicio en "autentico3.php". Verificar su funcionamiento con los diferentes nombres de usuario y passwords. Utilización de cookies. Si deseamos seguir los movimientos de los usuarios de nuestro sitio Web, poderlos identificar y personalizar los documentos que se despliegan, necesitamos distribuir cookies a sus navegadores. Una cookie es un código que el servidor envía al browser para obtener información sobre el usuario, dicha información es leída antes que se despliegue el contenido de la página. Las galletas pueden hacer una serie de cosas, como identificar al usuario, llevar el control de un carrito de compras y hasta obtener una estadística de las veces y el tiempo que un usuario está en un sitio web. Su discusión está fuera del alcance de este manual, por lo que sólo nos enfocaremos a definir algunas rutinas básicas para su utilización. Importante: Las galletas han sido desde hace mucho tiempo un elemento muy polémico, porque si bien son utilizadas en un sin número de sitios web, también se les ha satanizado por ser, potencialmente, un hueco de seguridad y un atentado a la privacia de los usuarios de Internet. Actualmente casi todos los sitios importantes las utilizan para presentar información personalizada y vigilar el desempeño de las páginas. La primera regla que debemos tener presente cuando utilicemos cookies, siempre se deben mandar al navegador antes que el resto del contenido de la página Web, es decir, antes de <HTML> o <head>. En caso contrario, se presentarán errores en el header(). Cualquier cookie enviada desde el cliente, automáticamente se convertirá en una variable de PHP. Sugerencia: Es frecuente que los cambios relativos a la personalización de una página no tomen efecto sino hasta la siguiente vez que se inicie la sesión. La función que utilizamos es setcookie(), su sintaxis es: setcookie (nombre, valor, expiración, ruta, dominio, segura)

Page 62: Php

Todos los parámetros excepto nombre son opcionales, aunque siempre se recomienda utilizarlos todos y de forma racional. Si sólo se especifica el parámetro nombre, la cookie con ese nombre se vaciará en el navegador del cliente. Veamos un ejemplo rápido. <?php // Nombre del programa: cookie1.php // asigna una galleta si no est&aacute; habilitada if (!isset($id_kuki)) { srand((double)microtime()*1000000); $random = rand(); setcookie("id_kuki",$random,time()+14400,"/",".misitio.com",0); } ?> Importante: Recuerden cambiar ".misitio.com" por el dominio de la máquina donde están trabajando, o mejor, eliminar este parámetro. Traducido al castellano. El if valida la existencia de una galleta de acuerdo al ID; las siguientes dos líneas generan un identificador random para el usuario; entonces llegamos a la sección de la galleta donde:

• id_kuki es el nombre de la galleta. Puede definirse cualquier cosa. • $random es el identificador generado poco antes. • time()+14400 hace que la galleta expire a los 14400 segundos (cuatro horas)

después de la hora actual. Recuerden que este tiempo de expiración es en el cliente, no en el servidor.

• "/" es la ruta donde será valida, es decir, cualquier página después de la carpeta raíz.

• ".misitio.com" es el dominio donde será válida. • 0 indica que se puede trasmitir en cualquier conexión, si definimos 1 se transmitirá

sólo con una conexión segura HTTPS. Verificar que una galleta esté presente es muy sencillo, sólo es necesario que veamos las cookies que tiene almacenadas nuestro navegador. En Windows se encuentran en una carpeta llamada precisamente Cookies.

Page 63: Php

Si ya tenemos una galleta y suponemos que contiene información recuperable, la podemos utilizar en páginas subsecuentes con la variable global $HTTP_COOKIE_VARS. Retomando el ejemplo anterior, podemos extraer el identificador así: $id_kuki = $HTTP_COOKIE_VARS["id_kuki"]; print "$id_kuki"; Otro ejemplo, donde creamos una con un valor ingresado por el usuario: <?php // Nombre del programa: cookie2.php // Solicita un login en caso de no encontrar la cookie if (!isset($user_kuki)) { print "<p>Favor de ingresar tu nombre de usuario</p>"; print ("<form action=\"$PHP_SELF\" method=\"post\"> <input type=\"text\" name=\"user_kuki\" size=\"16\"><br /> <input value=\"Actualizar\" type=\"submit\"> <input value=\"Borrar\" type=\"submit\"> </form>"); } else if ($user_kuki) { setcookie("user_kuki",$user_kuki,time()+14400,"/"); $usuario = "$HTTP_COOKIE_VARS[user_kuki]"; print "<p>Bienvenido $usuario.</p>"; print "<p>En caso de no ver el nombre, <a href=\"$PHP_SELF\">pulsa aquí</a>.</p>"; } ?> Este script, por leerse a si mismo, puede que no presente la primera vez el nombre del usuario, pero sólo es necesario recargar la página para verlo. Si desean que las galletas expiren con botones de "logout", sólo tenemos que mandar una galleta vacía con el mismo nombre: Galleta original: setcookie("id_kuki",$random,time()+14400) Galleta que elimina la original: setcookie("id_kuki","",time()+14400)

Page 64: Php

O bien setcookie("id_kuki") Un ejemplo de esto, dividido en dos partes, sería una modificación donde tenemos a otro documento: <?php // Nombre del programa: cookie3.php // Solicita un login en caso de no encontrar la cookie if (!isset($user_kuki)) { print "<p>Favor de ingresar tu nombre de usuario</p>"; print ("<form action=\"$PHP_SELF\" method=\"post\"> <input type=\"text\" name=\"user_kuki\" size=\"16\"><br /> <input value=\"Actualizar\" type=\"submit\"> <input value=\"Borrar\" type=\"submit\"> </form>"); } else if ($user_kuki) { setcookie("user_kuki",$user_kuki,time()+14400,"/"); $usuario = "$HTTP_COOKIE_VARS[user_kuki]"; print "<p>Bienvenido $usuario.</p>"; print "<p>En caso de no ver el nombre, <a href=\"$PHP_SELF\">pulsa aquí</a>.</p>"; // Solicita la salida, que lo manda a un documento // que elimina la cookie y te regresa a este. print "<p><a href=\"cookie4.php\">Salir</a>.</p>"; } ?> A continuación, tenemos el archivo que elimina la galleta y nos regresa a la pantalla original. <?php // Nombre del programa: cookie4.php // Elimina la galleta y te regresa al documento de origen setcookie("user_kuki","",time()); print ("<html><head><meta http-equiv=\"Refresh\" content=\"0,URL=cookie3.php\"></head> ?> Un detalle que se pasa por alto, es que se puede tener una cookie que contenga múltiples elementos, como sería: <?php setcookie("user_kuki", "$random:$user_kuki", time()+14400,"/"); ?>

Page 65: Php

Los valores no numéricos de la galleta pueden ser mantenidos como nulos con "", los valores numéricos se pueden mantener como nulos con 0. Ejercicios generales Defina una galleta para su sitio y haga diferentes pruebas con las variables, viendo el resultado en su archivo "cookies.txt" del navegador. Manejo de imágenes Esta función requiere de tener ciertas librerías instaladas, principalmente gd y opcionalmente libjpeg, libpng y libtiff. En un sistema Linux (y otros Unix) ya las deben tener instaladas por defecto, en caso contrario lo pueden obtener en http://www.boutell.com/gd/. Para los usuarios de Windows, pueden descargar el php_gd.dll desde http://php.weblogs.com/easywindows/, aunque en PHP4 ya debe venir incluido. Importante: Anteriormente esta función soportaba el formato GIF, pero a partir de PHP 4 fue eliminado por un problema de licencias con UNISYS, por lo que sólo se reconocen los formatos PNG, JPEG y XBMP. Si planean utilizar fuentes TrueType en las imágenes, deberán bajar la librería FreeType de http://www.freetype.org. Un primer ejemplo, muy sencillo, es: <? // Nombre del programa: imagen1.php Header("Content-Type: image/png"); $im = ImageCreate(500, 75); $color1 = ImageColorAllocate($im, 255, 0, 0); ImageFill($im, 100, 100, $color1); ImagePNG($im); ImageDestroy($im); ?> Antes de ver la sintaxis, debemos contemplar dos limitaciones de estas funciones. Por un lado la instrucción debe ser definida antes de los headers del documento para que lo presente adecuadamente; por otro lado, al especificar Content-Type como una imagen, no es posible colocar código , dejando todo el documento sólo para la ma-nipulación de la imagen, aunque es totalmente valido llamar dicha imagen desde otro documento.

Page 66: Php

En el header definimos el tipo de imagen con "image/png" (en este caso es un PNG), pero podemos determinar que sea un jpg o xbmp con sólo cambiar el tipo. La creación de imágenes involucra cuatro pasos:

• Crear el handle para la imagen, en este caso con $im = ImageCreate(500, 75);, donde especificamos la generación de una imagen, con su tamaño. En este caso es de 500 px de largo por 75 px de alto.

• Definir los colores a utilizar, en $color1 = ImageColorAllocate($im, 255, 0, 0); declaramos en RGB el color rojo.

• Manipular la imagen, que puede ser ponerle texto, definir formas geométricas o hacerla transparente, en ImageFill($im, 100, 100, $color1); todo lo que hacemos es colocarla en ciertas coordenadas, tomando como referencia la esquina superior izquierda; los valores "100, 100" hacen referencia a las coordenadas "X" y "Y" respectivamente.

• Presentarla imagen resultante en el monitor mediante imagePNG($im);. Para las imágenes JPG la función es imageJPG y para XBMP es imageXBMP.

El comando ImageDestroy es importante utilizarlo, ya que eso libera los recursos utilizados para crear las imágenes. Si deseamos poner algo de texto en la imagen, utilizamos el siguiente código <? // Nombre del programa: imagen2.php Header("Content-Type: image/png"); $im = ImageCreate(500, 75); $color1 = ImageColorAllocate($im, 255, 0, 0); // Este color no lo hab&iacute;amos definido antes $color2 = ImageColorAllocate($im, 0, 0, 0); ImageFill($im, 0, 0, $color1); // Escribe un string en negro en las coordenadas 210 y 30 ImageString($im, 4, 210, 30, "Haz algo productivo", $color2); ImagePNG($im); ImageDestroy($im); ?>

Page 67: Php

Faltaría comentar lo referente al tamaño. PHP tiene definidos cinco tipos de fuentes indexadas, que se numeran del 1 al 5, en el caso del ejemplo, se está utilizando el "4". Si desean verse más imaginativos, pueden mandar a través de un formulario el string del texto para que se le presente al usuario según el texto que haya escrito, como se aprecia a continuación. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!--Nombre del archivo: stringimagen.html --> <html> <head> <title>Cadena de texto a una imagen</title> </head> <body> <h1>Ejemplo de una cadena de texto a una imagen</h1> <form action="imagen3.php" method="POST"> <p> Favor de poner tu nombre:</p> <INPUT TYPE="text" NAME=" nombre" SIZE="20" MAXLENGTH="60"> </p> <input name="Enviar" value="Enviar" type="submit"> </form> </body> </html> Este formulario recaba una cadena de texto, en este caso el nombre y lo envía al archivo que procesará la imagen. Favor de notar como, debido a que se tiene que pasar el encabezado para que reconozca una imagen exclusivamente, no se puede incluir el HTML, como se ha manejado en ejemplos anteriores. <?php // Nombre del programa: imagen3.php Header("Content-Type: image/png"); if ($nombre) { $cadena = "Bienvenido, ".$nombre; } else { $cadena = "Bienvenido, an&oacute;nimo"; } $im = ImageCreate(500, 75); $color1 = ImageColorAllocate($im, 255, 0, 0); // Este color no lo habíamos definido antes $color2 = ImageColorAllocate($im, 0, 0, 0); ImageFill($im, 0, 0, $color1); // Escribe un string en negro en las coordenadas 210 y 30 ImageString($im, 4, 210, 30, $cadena, $color2); ImagePNG($im);

Page 68: Php

ImageDestroy($im); ?> También podemos utilizar una imagen ya creada y colocarle texto, como sería el siguiente ejemplo, donde utilizamos la imagen gnome.png.

La primera parte es donde definimos el manejo de la imagen vía PHP. <?php // Nombre del programa: imagen4.php Header("Content-type: image/png"); $string=implode($argv," "); $im = imagecreatefrompng("gnome.png"); $orange = ImageColorAllocate($im, 220, 110, 60); $px = (imagesx($im)-7.5*strlen($string))/2; ImageString($im,3,$px,9,$string,$orange); ImagePNG($im); ImageDestroy($im); ?> Este archivo se llama desde otro documento, mediante la línea <img src="imagen3.php?texto">, donde el string "texto" se pasa a la imagen, lo que permite crear botones de menú. Sin embargo, cuando se realice este procedimiento se darán cuenta que la calidad de la imagen resultante es de una calidad inferior al original, debido principalmente a que la librería tiene que leer y reconvertirla, lo que redunda en un decremento de la misma. De forma más gráfica podemos verlo así: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!--Nombre del archivo: menuimagenes.php --> <html> <head> <title>Men&uacute; con im&aacute;genes</title> </head> <body> <h1>Ejemplo de un men&uacute; con im&aacute;genes</h1> <p>Este es ter&oacute;icamente un men&uacute; que no requiere m&aacute;s que de una imagen: <img src="imagen4.php?Inicio"> <img src="imagen4.php?Preguntas"> <img src="imagen4.php?Contacto">

Page 69: Php

<p>Sin embargo, ser&aacute; mejor que vean la imagen original, para que comparen la calidad: <img src="gnome.png" width="48" height="48"> </body> </html> Se recomienda checar el manual de PHP para ver todas las funciones que existen en el manejo de imágenes. Un último ejercicio, bastante interesante, es para crear una gráfica compleja mediante una serie de funciones, como se muestra a continuación: <?php // Nombre del programa: grafica1.php Header("Content-type: image/png"); $picWidth=360*2; $picHeight=200; $pic=ImageCreate($picWidth+1,$picHeight+1); $cWhite=ImageColorAllocate($pic,255,255,255); ImageFilledRectangle($pic,0,0,$picWidth+1,$picHeight+1,$cWhite); $cRed=ImageColorAllocate($pic,255,0,0); $cBlue=ImageColorAllocate($pic,0,0,255); $curX=0; $curY=$picHeight; for($pt=0;$pt<$picWidth;$pt++){ $newX=$curX+1; $newY=($picHeight/2)+(cos(deg2rad($newX))*($picHeight/2)); ImageLine($pic,$curX,$curY,$newX,$newY,$cRed); $curX=$newX; $curY=$newY; } $curX=0; $curY=$picHeight/2; for($pt=0;$pt<$picWidth;$pt++){ $newX=$curX+1; $newY=($picHeight/2)+(sin(deg2rad($newX))*($picHeight/2)); ImageLine($pic,$curX,$curY,$newX,$newY,$cBlue); $curX=$newX; $curY=$newY; } $cBlack=ImageColorAllocate($pic,0,0,0); ImageLine($pic,0,0,0,$picHeight,$cBlack); ImageLine($pic,0,$picHeight/2,$picWidth,$picHeight/2,$cBlack); ImagePNG($pic); ImageDestroy($pic); ?>

Page 70: Php

Bibliografía O'Reilly - Learning PHP 5 O'Reilly - PHP Cookbook - 2nd Ed O'Reilly - PHP Pocket Reference - 2nd Ed O'Reilly - Programming PHP - 2nd Ed http://mx2.php.net http://doc.php.net/ http://wiki.php.net/ http://www.desarrolloweb.com/manuales/12/ http://www.desarrolloweb.com/directorio/programacion/php/scripts_en_php/ http://www.programacion.com/php/ http://php.resourceindex.com/ http://www.hotscripts.com/category/php/scripts-programs/ http://www.scripts.com/php-scripts/ http://www.php-scripts.com/ http://foros.solocodigo.com/viewforum.php?f=36 http://phpclasses.nlared.com/