Está en la página 1de 59

Programacin con PHP Curso bsico

Instructor

Luis Carlos Aguirre Mora guica@secso.net

1. Introduccin ..............................................................................................................................................................6 1.1. Instalacin de nuestras herramientas..........................................................................................................7 1.2. Instalacin de la base de datos: MySQL...................................................................................7 1.3. Instalacin del servidor Web: Apache.......................................................................................8 1.4. Instalacin de PHP..............................................................................................................................10 2. El lenguaje PHP ......................................................................................................................................................12 2.1. Extensin de los archivos ................................................................................................................................12 2.2. Delimitadores ...................................................................................................................................................12 2.3. Fin de lnea .......................................................................................................................................................13 2.4. Comentarios .....................................................................................................................................................13 2.5. Variables...........................................................................................................................................................14 2.5.1. Declaracin y uso .......................................................................................................................................14 2.5.2. Tipos de variables.......................................................................................................................................14 2.5.3. mbito........................................................................................................................................................15 2.5.4. Referencias .................................................................................................................................................15 2.5.5. Acceso indirecto .........................................................................................................................................16 2.6. Tipos de datos ..................................................................................................................................................16 2.6.1. Enteros (int, integer)...................................................................................................................................16 2.6.2. Nmeros en punto flotante (float, double, real) .........................................................................................16 2.6.3. Arrays (array).............................................................................................................................................17 2.6.4. Cadenas de texto (string)............................................................................................................................18 2.6.5. Objetos (object) ..........................................................................................................................................19 2.7. Constantes ........................................................................................................................................................19 2.8. Maysculas y minsculas................................................................................................................................20 2.9. Operadores.......................................................................................................................................................20 2.9.1. Operadores aritmticos ...............................................................................................................................20 2.9.2. Auto-incremento y auto-decremento ..........................................................................................................20 2.9.3. Operadores de bits ......................................................................................................................................21 2.9.4. Operadores lgicos .....................................................................................................................................21 2.9.5. Asignacin, igualdad e identidad................................................................................................................21 2.9.6. Comparaciones ...........................................................................................................................................22 2.9.7. Operadores de cadenas de texto..................................................................................................................22 2.9.8. Atajos en la asignacin ...............................................................................................................................23 2.9.9. Precedencia y asociatividad de operandos..................................................................................................23 2.10. Estructuras de control...................................................................................................................................24 2.10.1. if ... elseif ... else .......................................................................................................................................24 2.10.2. while y do .. while.....................................................................................................................................25 2.10.3. break y continue .......................................................................................................................................26 2.10.4. for .............................................................................................................................................................27 2.10.5. foreach......................................................................................................................................................28 2.10.6. switch........................................................................................................................................................29 2.11. Evaluaciones a Cierto o Falso.......................................................................................................................30 2.12. Funciones........................................................................................................................................................31 2.12.1. Paso de parmetros por referencia ............................................................................................................32 2.12.2. Devolucin de variables por referencia ....................................................................................................32

2.13. include y require ............................................................................................................................................33 3. Programando en PHP .............................................................................................................................................34 3.1. Formas..............................................................................................................................................................34 3.1.1. Valores sencillos.........................................................................................................................................34 3.1.2. Valores mltiples........................................................................................................................................34 3.2. Manipulacin de strings y arrays...................................................................................................................35 3.2.1. Comparaciones ...........................................................................................................................................35 3.2.2. Subcadenas .................................................................................................................................................35 3.2.3. Imprimir y formatear cadenas.....................................................................................................................36 3.2.4. Escapar caracteres ......................................................................................................................................37 3.2.5. Extraer campos ...........................................................................................................................................38 3.2.6. Recorrer un array ........................................................................................................................................39 3.2.7. Ordenar un array.........................................................................................................................................40 3.2.8. Otras funciones tiles .................................................................................................................................40 3.2.7. Ms informacin.........................................................................................................................................40 3.3. Acceso a Bases de Datos ..................................................................................................................................41 3.3.1. Abrir y cerrar una conexin........................................................................................................................41 3.3.2. Elegir una BD .............................................................................................................................................42 3.3.3. Interrogar a la BD.......................................................................................................................................42 3.3.4. Extraer informacin del resultado del query...............................................................................................43 3.4. A trabajar.........................................................................................................................................................44 4. Proyectos de PHP con bases de datos .....................................................................................................................47 5. Caractersticas y funciones adicionales ..................................................................................................................57 5.1. Mdulos disponibles ........................................................................................................................................57 6. Bibliografa ..............................................................................................................................................................59

QU OBJETIVOS ESPERA LOGRAR AL TRMINO DE ESTE MDULO?

QU

COMPROMISOS

ASUME

PARA

QUE

LOS

OBJETIVOS

ANTERIORES SE CUMPLAN?

OBJETIVO GENERAL:

Al finalizar el modulo, el participante ser capaz de crear pginas Web que interacten con una base de datos. Esto implica insertar, modificar y consultar informacin almacenada en un gestor de base de datos a travs de pginas Web. Obteniendo conocimiento y habilidades necesarias que le permitirn construir, disear, publicar y realizar un sitio Web dinmico.

TEMARIO

1. Conceptos Generales Introduccin a PHP, Apache y mySQL. Instalacin de apache, PHP y mySQL.

2. Programacin fundamental Sintaxis de PHP. Qu es un script PHP. Variables, operadores y sentencias de control. Crear funciones propias en y utilizar arreglos. Funciones include() y require().

3. Librera estndar de PHP Acceder a archivos externos. Utilizar vectores y funciones de tiempo y fecha. Tratamiento de formularios. Expresiones regulares.

4. Trabajando con Bases de Datos Funciones de acceso a mySQL. Trabajando con una base de datos

1. Introduccin

Seguramente si usted ha estado en contacto con el mundo de la informtica habr escuchado el concepto open source software. Este movimiento ha ganado importancia a tal grado que compaas como Oracle, Informix y otras mas estn tomando ventaja de los productos generados como software open source. Y que decir del sistema operativo en bogue: Linux. Si contamos con un sistema masivamente complejo de RDBMS (sistema administrador de bases de datos relacionales) es tan bueno, tanto como si sabemos que hacer con l. Nosotros solo daremos una introduccin al mundo de las bases de datos. Tan profundo como para realizar un sitio Web sustentado en informacin dinmica. Y si hemos de aprender ha hacer eso, que mejor que lograrlo de una manera en la que nuestro trabajo pueda ser implantado en cualquier equipo, tanto en servidores con Microsoft Windows en cualquiera de sus sabores y colores hasta equipos mas sofisticados con sistemas operativos Unix tambin en cualquiera de sus modelos. Una encuesta de Netcraft (www.netcraft.com) muestra que el uso de PHP creci de 7,500 sitios en junio de 1998 a 410,000 en marzo de 1999. Por su parte MySQL fue premiada como la base de datos (libre) del ao en el Webcon de 1998. MySQL es una base de datos pequea y compacta ideal para aplicaciones pequeas y medianas. Con soporte para el estndar SQL, corre en un sin numero de plataformas con un rendimiento a la altura de las mejores bases de datos comerciales. PHP es un lenguaje para generacin de scripts que han de ser colocados en un servidor de Web para ser funcionales. PHP permite colocar cdigo de programacin incrustado en pginas HTML. Cuando el servidor de Web encuentra elementos de PHP en una pagina HTML que ha sido solicitada por un navegador, enva los elementos HTML intactos, pero el script PHP es ejecutado y los resultados de la ejecucin del script son anexados al envo en lugar del cdigo PHP original. La combinacin de PHP/MySQL es gratuita (sin restriccin alguna sobre licencias) y es independiente de la plataforma. Sin embargo PHP tambin soporta otras plataformas de base de datos incluidos Informix, Oracle, Sybase, Solid, PostgreSQL, y claro cualquier otra que sea capaz de operar va ODBC. PHP tiene muchas otras cualidades, entre otras, permitir la autenticacin de usuarios, el uso de XML, la creacin dinmica de imgenes, creacin dinmica de archivos PDF y muchas mas. Es adems fcilmente extensible, pequeo y sencillo. Una maravilla desde el punto de vista de algunos desarrolladores. Finalmente cabe mencionar que para ambos proyectos, PHP y MySQL existe una gran cantidad de informacin y documentacin disponible en la Web. Errores y problemas en ambos productos son solucionados con una rapidez considerable y nuevas caractersticas se implementan da con da.

1.1.

Instalacin de nuestras herramientas.

Realmente no necesitamos preocuparnos por el proceso de instalacin la mayor parte de las veces dejaremos esta labor a nuestro proveedor de acceso a Internet, quien se encarga de hospedar nuestro sitio Web. Sin embargo es adecuado conocer el proceso involucrado, sobretodo si deseamos realizar una instalacin de estos productos en nuestra computadora personal para aprender a utilizarlos. 1.2. Instalacin de la base de datos: MySQL Comencemos por obtener el software que necesitamos para trabajar. Comencemos por la base de datos. El sitio Web oficial de MySQL se encuentra en www.mysql.com. Ser sencillo para usted ingresar a la seccin etiquetada downloads para descargar el software que requerimos. Tomemos una versin estable, en este momento MySQL 4.0 es una buena opcin. Aunque podramos experimentar con cualquier plataforma, lo ms factible es que usted al igual que yo tenga a su alcance una computadora con Microsoft Windows para comenzar a trabajar, as que seleccionemos la versin Windows 95/98/NT/2000/XP/2003 y tomemos un descanso mientras los 22.7 Mb del software se transfieren a nuestro equipo. Siendo MySQL un software de uso tan difundido, es de entenderse que exista mas de un nodo en Internet desde el cual podamos obtenerla, cuando el Web se lo pregunte elija el ms cercano a usted. Claro recuerde que la cercana fsica no significa necesariamente una mayor rapidez de transferencia por la red. Si todo va bien tendrs en tu equipo un archivo llamado mysql4.0.16-win.zip o alguno similar con una numeracin distinta, segn la versin descargada. Descompacta el archivo y ejecuta setup.exe Sigue las indicaciones en pantalla. Para nuestros fines la instalacin bsica de MySQL es suficiente, as que selecciona la opcin instalacin tpica para evitar detalles y complicaciones. Para obtener mayor informacin de las diferentes opciones de instalacin consulta la documentacin de MySQL en el sitio Web www.mysql.com. En este momento es buena idea reiniciar la computadora para que la instalacin sea concluida satisfactoriamente. Localiza el archivo winmysqladmin.exe en el subdirectorio bin bajo el directorio donde realizaste la instalacin del producto. Por ejemplo C:\mysql\bin\winmysqladmin.exe Ejecuta el archivo. La primera ocasin que lo ejecutes te solicitara crear tu clave de administrador. Proporciona el que desees y procura no olvidarlo. Si todo va bien en este momento veras sobre la barra de inicio de Windows un icono como esto:

Un semforo con la luz verde, que nos indica podemos continuar con nuestra labor. Estamos a la mitad del camino, ya contamos un sistema gestor de base de datos, ahora requerimos instalar PHP. 1.3. Instalacin del servidor Web: Apache Como comentamos en la introduccin, PHP es un lenguaje que permite incrustar cdigo de programacin en hojas de Web. A fin de poder operar PHP debe trabajar de la mano del servidor donde se hospedan las hojas Web. As que para poder elaborar scripts PHP y probarlos requerimos o bien contar con acceso a un servidor Web que contratemos con un proveedor de servicios o bien instalar uno propio. Si bien para publicar nuestro sitio Web oficial requeriremos de contratar un espacio con un proveedor de servicios de Internet, por el momento podemos instalar uno en nuestra computadora. Sigamos tomando ventaja del software open source y ahora descarguemos un servidor de Web o servidor de http. El elegido es el servidor Web Apache. Apache es el servidor de Web mas utilizado en Internet, estadsticas del sitio Web de Netscraft colocan a Apache con un 66% de sitios en la red. Ingresemos al sitio oficial de Apache en www.apache.org y localicemos el enlace a Httpd server Apache 2.0.47 Para nuestros fines cualquiera de las versiones disponibles resulta de utilidad. Sin embargo es buena idea tomar la versin mas reciente disponible. Descarguemos el archivo con el servidor compatible con Windows, el archivo apache_2.0.47-win32-x86-no_ssl.msi con aproximadamente 5.80 Mb de tamao. Una vez descargado el archivo, doble clic en el para comenzar con el proceso de instalacin. Aceptemos la licencia y proporciona los siguientes datos en la ventana de configuracin: Dominio: localdomain Nombre del Servidor: localhost Correo del administrador: <escribe aqu tu correo electrnico> Apache es un software que por si mismo requerira una explicacin aparte. Dado que sale del alcance de este modulo, simplemente confa en la configuracin que te propongo.

Una vez completa la pantalla mostrada clic en el botn seguir y cuando el proceso de instalacin te lo pregunte elige la instalacin tpica. Ello es suficiente para nuestras necesidades. Concluida la instalacin, revisemos nuestra barra de inicio en Windows. Un nuevo icono confirma que el proceso es exitoso y podemos continuar

Para confirmar abre un navegador en tu computador y conecta la siguiente direccin: http://localhost/ La siguiente pgina aparecer y nos invita a continuar el proceso

1.4. Instalacin de PHP Instalar el gestor de base de datos MySQL fue relativamente sencillo al igual que el servidor de Web, veamos ahora el proceso a seguir para contar con PHP. Tambin parte de la familia open source PHP puede ser descargado del sitio Web www.php.net. Descargaremos de ah en particular de la seccin Windows el paquete php-4.3.3Win32.zip, aproximadamente 6.1Mb sern transferidos a nuestra computadora Toma el paquete u descompactalo en una carpeta de tu computador. Te recomiendo coloques el flder en el mismo sitio donde has estado instalando el resto de los paquetes. En mi equipo tengo en este momento las carpetas: C:\mysql C:\Apache2 C:\php

10

Te recomiendo descmpactar php en la unidad c en un flder llamado php. Si decides utilizar una ruta distinta, recuerda cambiar C:\php por el directorio por ti utilizado en todos los pasos mencionados a continuacin como parte del proceso de instalacin. El archivo install.txt ubicado en el c:\php explica el proceso de instalacin a detalle. Sin embargo comentaremos a continuacin los pasos a seguir. En el directorio php c:\windows\system se encuentra el archivo php4ts.dll cpialo en el directorio

Luego renombra el archivo php.ini-dist como php.ini y cpialo en el directorio c:\windows Hecho lo anterior solo nos resta conectar nuestra instalacin de PHP con la instalacin del servidor Web Apache, de forma tal que nuestro servidor Web pueda reconocer y ejecutar las instrucciones que se le darn empleando el lenguaje PHP. Ser necesario que aadamos las siguientes lneas en el archivo httpd.conf que se encuentra en el flder c:\Apache2\conf
LoadModule php4_module D:/php/sapi/php4apache2.dll # AddModule mod_php4.c AddType application/x-httpd-php .php

Para que los cambios tomen efecto, ser necesario detener nuestro servidor de Web y ejecutarlo nuevamente. En tu men de inicio encontraras bajo la opcin de programas, las herramientas detener y ejecutar para Apache http Server. Hasta aqu hemos terminado con la configuracin de nuestro ambiente de trabajo. Podemos tomar un pequeo receso. Como para cualquier otro software la mayora de las veces no requerimos ser expertos en la instalacin de los productos para poderlos utilizar adecuadamente. Recapitulando: En este momento tenemos operando en nuestra computadora un gestor de base de datos (MySQL), un servidor de Web (Apache) y un lenguaje de programacin para Web (PHP). Ahora, pongamos eso a trabajar!

11

2. El lenguaje PHP
PHP toma caractersticas de lenguajes como C, C++ y Java, y algunas tambin de Perl. A continuacin analizaremos en detalle estas diferencias al tiempo que vamos introduciendo las bases de la programacin en PHP.

2.1. Extensin de los archivos


La primera caracterstica de PHP viene a la hora de dar nombre a los archivos que contienen el cdigo del programa. La extensin es importante ya que el servidor HTTP (en nuestro caso, Apache) decide si debe pasrselo al procesador de PHP o no en funcin de esta extensin. Las extensiones que indican al servidor HTTP que el archivo contiene cdigo PHP que debe ser procesado son: .php3 Indica cdigo PHP 3.x. .php4 Indica cdigo PHP 4.x. .php Indica cdigo PHP. Preferiremos esta extensin por ser ms genrica. .phtml Actualmente en desuso.

Aunque haya extensiones diferentes para PHP 3 y 4, no tienen efecto en el intrprete que las procesar IGUAL. En general, PHP 4 es compatible con 3, salvo unas pocas excepciones. Este curso se centra en PHP 4, as que no analizaremos estos casos de incompatibilidad con las versiones anteriores.

2.2. Delimitadores
En PHP disponemos de cuatro opciones para delimitar el cdigo: <? echo 'Primer mtodo de delimitar cdigo PHP'; ?> <?php echo 'Segundo mtodo, el ms usado'; ?> <script language="php"> echo 'Algunos editores (como el FrontPage) Slo entienden este mtodo'; </script> <% echo 'Mtodo de compatibilidad con ASP'; %> Los mtodos primero y cuarto no siempre estarn disponibles, ya que se pueden activar o desactivar al compilar el intrprete de PHP. En general, preferiremos usar el segundo mtodo. As nuestros programas se vern con una estructura como esta: <html> <body> <?php if ( Hour(time)>20 || Hour(time)<4) { ?> Buenas noches.

12

<?php } else { ?> Buenos das. <?php }?> </body> </html> O tambin as, utilizando la funcin echo para imprimir cadenas de texto: <html> <body> <?php if ( Hour(time)>20 || Hour(time)<4) { echo Buenas noches.; } else { echo Buenos das.; } ?> </body> </html> Tambin es factible imprimir de forma rpida con <%=$var%>, al igual que en ASP.

2.3. Fin de lnea


PHP ignora cualquier carcter de espaciado presente en el cdigo, incluyendo espacios, tabuladores y saltos de lnea (salvo si se encuentran dentro de una cadena de texto). El fin de sentencia se marca con un carcter de punto y coma. Por ejemplo, los dos trozos de cdigo siguientes son equivalentes: print( date("M d, Y H:i:s", time()) ); print ( date( "M d, Y H:i:s", time() ) ) ;

2.4. Comentarios
En PHP hay tres formas de introducir comentarios en el cdigo: /* Comentarios estilo C. * Pueden extenderse durante varias lneas. */ // Comentarios estilo C++. Cubren hasta el final de la lnea. # Comentarios estilo Bash/Perl. Cubren hasta el fin de lnea. Hay que hacer notar que los comentarios de una lnea cubren hasta final de lnea O HASTA EL FIN DEL BLOQUE PHP ( ?>)

13

2.5. Variables
Las variables son una parte fundamental de todo lenguaje de programacin. En ellas se almacenan valores con los que se puede operar, se pueden comparar entre s y se puede hacer variar el flujo del programa en funcin de su valor. Vamos a ver cmo trabajar con variables en PHP.

2.5.1. Declaracin y uso


Al contrario que en la mayora de lenguajes de programacin, en PHP NO hace falta declarar las variables antes de usarlas: tras la primera aparicin en el cdigo quedan declaradas; en PHP todas las variables llevan delante el signo del dlar $. Ej. : $var_1 = 123; $var_2 = hola; $var_3 = $var_1 * 2;

2.5.2. Tipos de variables


Las variables en PHP estn dbilmente tipadas. Una variable se asocia a un contenido, del tipo que sea, estando el tipo indicado en el contenido, no en la variable en s. Visto de otra forma, una misma variable se puede reutilizar asignndole a lo largo del tiempo datos de distinto tipo. Por ejemplo: $mi_variable $mi_variable $mi_variable $mi_variable = = = = Inicializamos como una 3; // 3.14 * $mi_variable; // new MiClase(); // cadena de texto; Ahora es un entero. Ahora un float. Ahora un objeto.

A pesar de esto, el tipo es importante en algunos casos (para efectuar operaciones o llamadas a funciones.) En estos casos, PHP se encarga de realizar las transformaciones necesarias de forma automtica. $mivar = 123; echo $mivar; En el ejemplo anterior, PHP convierte el valor entero 123 a la cadena de texto 123 antes de pasrselo a la funcin echo. $mivar = 3; $mivar = 2 + $mivar; En este caso $mivar comienza almacenando la cadena 3. En la segunda lnea, y para realizar la suma, se convierte al entero 3, se realiza la suma y se asigna a $mivar el entero 5. Tambin se puede forzar la conversin a un tipo especfico, por ejemplo: $mivar = (string)123;

14

Y se puede cambiar el tipo de una variable con: $mivar = 12; settype($mivar, "double");

2.5.3. mbito
El mbito de una variable hace referencia a dnde est disponible esa variable y dnde no, y depende del contexto en el que haya sido definida la variable: En el cuerpo de un archivo, las variables son GLOBALES al archivo y a cualquier cdigo que se haya incluido con los comandos include o require (explicados ms adelante.) En una funcin, son LOCALES a esa funcin y no pueden ser accedidas desde fuera. Dentro de una clase, slo pueden ser accedidas a travs del operador -> sobre el nombre del objeto (las clases se explicarn con detalle ms tarde.)

Aunque todos estos conceptos (includes, funciones, clases) los presentaremos ms tarde, introduciremos ya una posible fuente de errores: Los programadores acostumbrados a C deben llevar cuidado con las variables globales, ya que no se comportan como en C. Por ejemplo, considrese el cdigo siguiente: $mivar = 3; function mifuncion() { echo $mivar; } En C, la funcin mifuncion() imprimira '3'. En cambio en PHP no imprimira nada (si no da un error) ya que la variable $mivar de mifuncion es una variable DISTINTA a la global y local a esta funcin. Para acceder a las variables globales desde una funcin, hay que utilizar la palabra reservada global: $mivar = 3; function mifuncion() { global $mivar; echo $mivar; }

2.5.4. Referencias
En PHP se puede definir alias para las variables, es decir, tener dos (o ms) nombres distintos para un mismo dato. Se puede ver de forma similar a tener dos punteros en C haciendo referencia a la misma zona de memoria. Para definir una referencia utilizamos el carcter & delante de la variable referenciada: $alias = &$variable As podremos acceder al mismo dato por $alias o $variable. Las modificaciones hechas sobre una u otra repercuten en el mismo dato. Debe quedar claro que la referencia no significa

15

que $alias apunta a $variable, si no que tanto $alias como $variable apuntan a un mismo contenido en memoria. Se puede eliminar una referencia con la funcin unset(): $a = 1; $b = &$a; unset ($a); // Pero $b sigue valiendo 1 Las referencias tambin se pueden usar para pasar o devolver parmetros por referencia en las funciones, como se ver ms tarde.

2.5.5. Acceso indirecto


En PHP podemos acceder al contenido de una variable cuyo nombre tenemos almacenado en otra variable, de esta forma: $a = 123; $b = a; echo $$b; // 123

2.6. Tipos de datos


PHP soporta los siguientes tipos de datos bsicos:

2.6.1. Enteros (int, integer)


Nmeros enteros en notacin decimal, octal (un 0 inicial indica que el valor est representado en octal) o hexadecimal (un 0x indica que es hexadecimal.) Ejemplos: $var1 $var2 $var3 $var4 = = = = 1234; -1234; 0123; 0x12; // // // // Nmero en decimal El mismo nmero, negativo El 83 decimal, expresado en octal Valor hexadecimal del 18

El tamao, representacin interna y valores mximos dependen de la plataforma, aunque lo normal son 32 bits con signo (+- 2 billones.)

2.6.2. Nmeros en punto flotante (float, double, real)


Los nmeros en punto flotante admiten decimales y su rango de valores es mayor que el de los enteros, a costa de cierta prdida de precisin en los dgitos menos significativos del nmero. Se permiten las dos notaciones tpicas: $var1 = 1.234; $var2 = 1.2e3; // Nmero con decimales // Notacin cientfica, 1.2 * 10^3

Internamente se representan mediante 64 bits en formato IEEE (hasta 1.8e308 con una precisin de 14 dgitos decimales.)

16

2.6.3. Arrays (array)


Los arrays representan vectores unidimensionales o multidimensionales. Se definen y acceden como en C, mediante el nombre de la variable que los contiene e indicando el ndice (que comienza en el 0) entre corchetes. Los elementos de un mismo array pueden ser de tipos distintos, p. Ej. : $MiArray[0] = 1; $MiArray[1] = hola!!; $MiArray[2] = 5; echo $MiArray[1]; Como se ve en el ejemplo, no hace falta definir la dimensin del array antes de usarlo, ni, por lo tanto, tampoco redimensionarlo a la hora de aadir ms elementos. Si al definir un array omitimos el ndice (pero NO los corchetes, estaramos sobrescribiendo la variable!), el elemento se asigna a la siguiente posicin del array sin definir. Siguiendo con el ejemplo anterior: $MiArray[] = 8 // $MiArray[3] = 8

Los arrays de PHP admiten tambin cadenas como ndices, de forma simultnea a los enteros. Un mismo array puede funcionar a la vez de forma indexada (como un vector) o de forma asociativa (como una tabla hash): $MiArray[nombre] = Homer; echo $MiArray[3]; echo $MiArray[nombre]; // 8 // Homer

Para definir un array multidimensional, simplemente indicamos ms ndices: $MiOtroArray[1][2][pepe][0] = 4 dimensiones!!!; Tambin podemos definir arrays utilizando los constructores del lenguaje array() o list(), as: $OtroArrayMas = array( 1, hola, 5); Donde los valores se asignan por orden a los ndices 0, 1 y 2, o de esta otra forma, donde indicamos explcitamente el ndice: $YOtroArray = array( 0 => 1, 1 => hola, 2 => 5, 3 => 8, nombre => Homer );

17

Se pueden definir arrays multidimensionales mediante composicin de varias llamadas anidadas al constructor array().

2.6.4. Cadenas de texto (string)


Las cadenas en PHP se pueden definir de tres formas: Si se delimitan entre comillas dobles (), se expandir cualquier variable que haya dentro de la cadena. Adems, se pueden incluir ciertas secuencias de escape, al igual que en C: Secuencia \n \r \t \\ \$ \" \[0-7]{1,3} Significado Nueva lnea (LF 0x0A en ASCII) Retorno de carro (CR 0x0D en ASCII) Tabulacin horizontal (HT 0x09 en ASCII) Barra invertida Smbolo del dlar Dobles comillas Un carcter determinado en notacin octal

\x[0-9A-Fa-f]{1,2} El carcter indicado en hexadecimal Si se delimitan entre comillas simples (), las variables no se expanden y adems las nicas secuencias de escape que se reconocen son \\ y \' (barra invertida y comillas simples.) Debido a estas limitaciones, este segundo mtodo es bastante ms rpido que el primero a la hora de manipular o imprimir cadenas, ya que el anlisis y proceso al que son sometidas las es menor. Utilizando la sintaxis here doc de Perl, cuya estructura es: $cadena = <<<DELIMITADOR texto texto texto ... texto DELIMITADOR Despus del operador <<< especificamos un delimitador que marcar el final del texto. Debemos llevar cuidado al elegir este delimitador, ya si aparece en algn lugar del texto, podramos acabar con un resultado incorrecto. Tras la lnea con el <<< y el delimitador, escribimos la cadena de texto, que puede expandirse por tantas lneas como queramos. Las variables dentro del texto se expanden y no hace falta escapar las comillas. Para finalizar la cadena, debe aparecer una lnea que contenga nicamente el delimitador. Por ejemplo: $cadena = <<<FINCAD Esto es un ejemplo de cadena como here doc. La variable \$a vale $a. Ahora vamos a finalizar la cadena: FINCAD

18

Para concatenar cadenas se utiliza el operador . : $cad = A esta cadena ; $cad = $cad . le vamos a aadir ms texto.; Se puede acceder a cada carcter de la cadena de forma independiente utilizando notacin de arrays indexados sobre la cadena: $cad2 = El tercer carcter de \$cad es $cad[2].; Por ltimo, sealar que aunque como ya hemos dicho en una cadena delimitada por dobles comillas se expanden las variables, con construcciones complejas (arrays multidimensionales, objetos...) la expansin NO siempre funciona bien. Para evitar problemas, podemos concatenar la cadena con el valor de la variable o encerrar la variable entre llaves: echo Esto no ir bien $a[1][3]; echo As no hay problemas {$a[1][3]}; echo Concatenar es otra alternativa . $cosa->valor;

2.6.5. Objetos (object)


Pese a no ser un Lenguaje Orientado a Objetos puro, PHP soporta clases y objetos, aunque con ciertas carencias respecto a otros lenguajes. Las clases y objetos en PHP se definen y usan de forma similar a C++ o Java. Se estudiarn con profundidad en la segunda parte de este curso.

2.7. Constantes
En PHP podemos definir constantes utilizando la funcin define(), cuya declaracin es: int define(string nombre, mixed valor [, int noMayusculas]) Donde nombre es el nombre que le queremos dar a la constante, valor su valor, y el campo opcional noMayusculas indica si est a 1 que podemos acceder a la variable independientemente con maysculas o minsculas, mientras que si est a 0 (valor por defecto) slo podremos acceder a ella de la misma forma como la hayamos definido. Las constantes en PHP se diferencian de las variables en que: no llevan el smbolo del dlar delante. puede accederse a ellas desde cualquier parte del cdigo donde han sido definidas, sin restricciones de mbito como en las variables. no pueden ser redefinidas o borradas una vez definidas. slo pueden contener valores escalares, no vectores. Un ejemplo de declaracin y uso de constantes en PHP sera: define(SALUDO, Hola, mundo!); echo La constante SALUDO vale . SALUDO;

19

2.8. Maysculas y minsculas


Esta puede ser una causa de problemas. En PHP tenemos un comportamiento mixto: En las variables, las maysculas y minsculas IMPORTAN. As, la variable $MiVar es distinta de $mivar. En los nombres de funciones y palabras reservadas, las maysculas NO IMPORTAN. La funcin PRINT() hace referencia a print().

Para evitar errores y confusiones, siempre escribiremos los nombres de funciones del sistema en minscula, y las funciones propias siempre tal y como se escribieran en la declaracin.

2.9. Operadores
Vamos a ver los distintos operadores disponibles en PHP, clasificados por tipos:

2.9.1. Operadores aritmticos


Disponemos de los clsicos operadores aritmticos: Operacin Nombre $a + $b $a - $b $a * $b $a / $b $a % $b Suma Resta Divisin Mdulo Resultado Suma de $a y $b. Diferencia entre $a y $b. Cociente de $a y $b. Resto de la operacin $a / $b.

Multiplicacin Producto de $a y $b.

2.9.2. Auto-incremento y auto-decremento


PHP tambin dispone de los tpicos operadores de auto-incremento y decremento de C: Operacin Nombre ++$a $a++ --$a $a-Pre-incremento Post-incremento Resultado Incrementa $a en 1, y devuelve $a (ya incrementado) Devuelve $a (sin incrementa en 1. incrementar), y despus lo

Pre-decremento Decrementa $a en 1, y despus lo devuelve. Post-decremento Devuelve $a, y despus lo incrementa en 1.

Por si alguien no est familiarizado con el funcionamiento de estos operadores, he aqu un ejemplo para clarificarlo: $a = 1; $b = $a++; $a = 1; $b = ++$a;

// $b = $a; $a = $a + 1; -> $b vale 1, $a 2.

// $a = $a + 1; $b = $a; -> $a vale 2, y $b 2.

20

2.9.3. Operadores de bits


Veamos ahora los operadores BIT a BIT de que dispone PHP: Operacin Nombre $a & $b $a | $b $a ^ $b ~ $a $a << $b $a >> $b Y O O Exclusivo No Desp. Izq. Resultado Se ponen a 1 los bits que estn a 1 en $a y $b. Se ponen a 1 los bits que estn a 1 en $a o $b. Se ponen a 1 los bits que estn a 1 en $a o $b, pero no en ambos. Se invierten los bits (se cambian 1 por 0 y viceversa.) Desplaza $b posiciones a la izquierda todos los bits de $a.

Desp. Drch. Desplaza $b posiciones a la derecha todos los bits de $a.

2.9.4. Operadores lgicos


Los operadores lgicos realizan operaciones dependiendo del valor booleano de los operandos. Operacin Nombre $a and $b Y $a or $b $a xor $b ! $a $a && $b $a || $b O No Y O Resultado Cierto si $a y $b son ciertos. Cierto si $a o $b es cierto. Cierto si $a es falso. Cierto si $a y $b son ciertos. Cierto si $a o $b es cierto.

O Exclusivo. Cierto si $a o $b es cierto, pero no ambos.

La razn de que haya dos operadores distintos para las operaciones Y y O lgicas es que tienen distinta precedencia (ver punto 2.8.9.)

2.9.5. Asignacin, igualdad e identidad


En PHP hay tres operadores distintos para asignar y comparar valores entre variables: Operacin Nombre $a = $b $a == $b Asignacin Igualdad Resultado Asigna el valor de una variable o expresin del segundo trmino a la variable del primer trmino. Compara si el valor de los dos operandos es el mismo. Compara si el valor es el mismo y, adems, el tipo coincide.

$a === $b Identidad Ejemplo: $var1 = 1; $var2 = 1; $var3 = 1; ($var1 == $var2) ($var1 == $var3) ($var1 === $var2) ($var1 === $var3)

// Asignacin // // // // Cierto, son iguales Son iguales (tras la conversin) Cierto, son idnticas FALSO, el tipo no coincide

21

Se debe tener mucho cuidado con esto, ya que puede llevar a errores de este tipo: $var1 = 1; $var2 = 2; if( $var1 = $var2 ) { echo iguales; } else { echo distintas; } En PHP como = es el operador de ASIGNACIN y no el de IGUALDAD, lo que estamos haciendo es asignar el valor de $var2 a $var1. Tras esto $var1 vale 2, que como es distinto de 1 se evaluar a CIERTO.

2.9.6. Comparaciones
Devuelven cierto o falso segn el resultado de comparar los dos operandos. Operacin Nombre $a != $b No igual Resultado Cierto si el valor de $a no es igual al de $b. Cierto si $a no es igual a $b, o si no tienen el mismo tipo. Cierto si $a es estrictamente menor que $b. Cierto si $a es estrictamente mayor que $b.

$a !== $b No idntico $a < $b $a > $b $a <= $b $a >= $b Menor que Mayor que

Menor o igual que Cierto si $a es menor o igual que $b. Mayor o igual que Cierto si $a es mayor o igual que $b.

Para expresar la desigualdad, en PHP se utilizan != y !==. Tambin se puede englobar aqu el operador condicional ?:, que funciona como en C y otros lenguajes: (expr1) ? (expr2) : (expr3); Esta expresin devuelve expr2 si expr1 se evala a cierto, o expr3 si expr1 se evala a falso. Por ejemplo: $cad = $a > $b ? a es mayor que b : a no es mayor que b;

2.9.7. Operadores de cadenas de texto.


Para operar con cadenas slo disponemos de un operador: la concatenacin de cadenas representada por el punto .. Ej. : $a = 1; $b = 2; $c = El resultado de . $a . + . $b . es . $a + b;

22

Que dejara en $c la cadena El resultado de 1 + 2 es 3. Antes de cada concatenacin se realizarn las conversiones de tipo que fueran necesarias (en el ejemplo, los enteros se convierten a cadenas.)

2.9.8. Atajos en la asignacin


Al igual que en C, C++ y Java, en PHP disponemos de una serie de atajos para, en una sola operacin, operar sobre una variable y asignarle a esa misma variable el resultado. Las operaciones susceptibles de ser usadas en estos atajos son: + - * / % & ^ . >> y << resultando en los nuevos signos de operacin-asignacin: += -= *= /= %= &= ^= .= >>= y <<= Ejemplos de uso: $var1 += 3; // $var1 = $var1 + 3; $var2 /= 2; // $var2 = $var2 / 2; $var3 >>= 1; // $var3 = $var3 >> 1;

2.9.9. Precedencia y asociatividad de operandos


La precedencia de los operandos resuelve el orden en el que se evala una expresin mltiple que no ha sido delimitada con parntesis. Por ejemplo, 1 + 5 * 3 en PHP dara como resultado 1 + (5 * 3) = 16 y no (1 + 5) * 3 = 18 ya que el producto tiene mayor precedencia que la suma. La tabla muestra la asociatividad de los operandos en PHP, y est ordenada en orden decreciente de precedencia (el ms prioritario primero): Asociatividad Operandos izquierda izquierda izquierda izquierda derecha izquierda izquierda izquierda izquierda izquierda izquierda izquierda no-asociativo , or xor and print = += -= *= /= .= %= &= |= ^= ~= <<= >>= ?: || && | ^ & == != === !==

23

Asociatividad Operandos no-asociativo izquierda izquierda izquierda derecha derecha no-asociativo < <= > >= << >> +-. */% ! ~ ++ -- (int) (double) (string) (array) (object) @ [ new

2.10. Estructuras de control


Las estructuras de control permiten alterar el flujo del programa y as ejecutar unas partes u otras del cdigo segn ciertas condiciones. PHP dispone de todas las estructuras clsicas de los lenguajes de alto nivel, con la sintaxis de C, C++ o Java, y adems algunas otras estructuras ms tpicas de lenguajes interpretados como Perl o Bash. En todos los casos, las estructuras de control contienen una expresin cuya evaluacin a cierto o falso determinar el flujo a seguir dentro de la estructura. Estas expresiones pueden ser una variable, una funcin (el valor que devuelve), una constante, o cualquier combinacin de stas con los operadores vistos en el punto anterior.

2.10.1. if ... elseif ... else


El condicional if es la estructura de control ms bsica de todas. En su forma ms simple, su sintaxis es esta: if (expresin) { comandos } resto Su funcionamiento es idntico al de la mayora de los lenguajes, salvando las diferencias sintcticas: Si expresin se evala a cierto, se ejecutan los comandos y despus se sigue ejecutando el resto del programa. Si se evala a falso, no se ejecutan los comandos y contina con el resto. Las llaves { y } no son necesarias (ni en el if ni en ninguna otra sentencia de control) si slo hay un comando que ejecutar tras la condicin, slo hay que ponerlas para agrupar si hay ms de un comando. A pesar de este carcter optativo es aconsejable acostumbrarse a ponerlas siempre, aunque slo haya un comando que ejecutar, ya que si al continuar el desarrollo se decide aadir un segundo comando (o varios) tras la condicin es fcil olvidarse de aadir las llaves y el resultado sera incorrecto. A una sentencia if le podemos aadir cdigo que se ejecute cuando la condicin no se verifica mediante la sentencia else: if (expresin) { comandos_cierto } else { comandos_falso }

24

Si expresin se evala a cierto, se ejecutan comandos_cierto. Si se evala a falso, se ejecuta comandos_falso. En ambos casos luego se ejecuta el resto de comandos que sigan a la instruccin if. Por ltimo, podemos encadenar varias condiciones con la sentencia elseif, de esta forma: if (expresion1) { comandos1 } elseif (expresion2) { comandos2 } elseif (expresion3) { comandos3 } ... elseif (expresionN) { comandosN } else { comandosElse } El flujo del cdigo comienza evaluando expresin1. Si es cierta, ejecuta comandos1. Si no, evala expresin2. Si es cierta, ejecuta expresin2. Si no, evala expresin3... y contina as hasta que alguna de las condiciones de un endif se verifique. Si no se verifica ninguna, se ejecuta comandosElse (este ltimo else es optativo.) En cualquier caso, despus se contina con el flujo normal del programa.

2.10.2. while y do .. while


Las estructuras de control while y do .. while representan ciclos que se ejecutan mientras se verifique una determinada condicin. La estructura de un bucle while es esta: while (expresin) { comandos } Y el resultado es que se estar ejecutando toda la serie de sentencias especificada en comandos mientras que expresin se evale a cierto. Llegados a este punto hay que hacer notar dos detalles: Si la primera vez que el flujo del programa llega a la sentencia while, condicin se evala a falso, comandos no se ejecuta. Si expresin se evala a cierto y dentro de comandos no se modifica el valor de alguna de las variables contenidas en expresin, el cdigo entrar en un bucle infinito (a no ser que algn proceso externo sea el encargado de variar el valor de expresin.)

La estructura do .. while puede ser vista como una variante de while en la que la comprobacin de la condicin se realiza al final de cada iteracin del bucle en lugar de al principio. Con esto lo que se consigue es que al menos la iteracin se realice siempre una vez, aunque expresin se evale a falso. La estructura de do .. while es esta:

25

do { comandos } while (expresin);

2.10.3. break y continue


La sentencia break nos permite salir inmediatamente de una estructura de control while, for o switch. Por ejemplo, el siguiente bucle while finalizara en la iteracin $a = 5, pese a que la condicin del while es $a < 10: $a = 0; while ($a < 10) { if ($a == 5) { break; } $a++; } Despus del break podemos especificar un parmetro, el nmero de niveles de bucles anidados de los que queremos salir. Por defecto es uno (salir del bucle ms interno) : $a = 0; while ($a < 10) { $b = 0; while ($b < 5) { if ($b == 2) { break; // Equivale a break 1, sale del while b } } while ($b < 5) { if ($a == 3 && $b == 3) { break 2; // Saldra de los DOS bucles. } } } Por su parte, la sentencia continue lo que hace es saltarse el resto de la iteracin actual, y pasar directamente a la siguiente: $a = 0; while ($a < 5) { if ($a == 2) { continue; } echo \$a vale $a.; } En el ejemplo se saltara el echo de la iteracin $a = 2, y el resultado sera: $a $a $a $a vale vale vale vale 0 1 3 4

26

2.10.4. for
Los bucles for son los ms complejos de que dispone PHP. Su estructura es la misma que en C: for (expresin1; expresin2; expresin3) { comandos } Donde: expresin1 es la iniciacin del bucle. Generalmente da un valor inicial a una o varias variables (separadas por comas). Slo se ejecuta una vez, al principio, cuando el flujo del programa llega al bucle. expresin2 es la condicin. Mientras que expresin2 se evale a cierto, el bucle estar iterando. Se evala al inicio de cada iteracin, y si no se verifica la condicin la siguiente iteracin ya no se realiza y finaliza el bucle, continuando la ejecucin del programa con el resto del cdigo de despus del for. expresin3 es el paso de iteracin. Se ejecuta despus de cada iteracin, y generalmente modifica el valor de alguna variable (separadas por comas si hay ms de una).

Cualquiera de las tres expresiones puede estar vaca, aunque en este caso tendremos que llevar cuidado de realizar su funcin en el cuerpo del bucle. Ejemplos: $factorial5 = 1; for ($i = 2; $i <= 5; $i++ ) { $factorial5 *= $i; } El bucle anterior calcula la factorial de 5 (5!). En expresin1 podemos inicializar varias variables separndolas con comas, con lo que el cdigo se podra rescribir as: for ($factorial5 = 1, $i = 2; $i <= 5; $i++ ) { $factorial5 *= $i; } Por ltimo, en expresin3 tambin podemos operar sobre varias variables separndolas con comas, con lo que podramos encerrar todo el cdigo del bucle en la lnea for de esta forma: for ($factorial5=1, $i=2; $i<=5; $factorial5*=$i, $i++); En general no se debe complicar tanto un bucle for porque como se ve se pierde bastante en la claridad del cdigo. Esto es un ejemplo tanto de la potencia de los bucles for, como de un mal uso (abuso) de ellos. Los cuatro ejemplos siguientes tienen el mismo resultado: muestran los nmeros del 0 al 10.

27

/* ejemplo 1 */ for ($i = 1; $i <= 10; $i++) { print $i; } /* ejemplo 2 */ for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } /* ejemplo 3 */ $i = 1; for (;;) { if ($i > 10) { break; } print $i; $i++; } /* ejemplo 4 */ for ($i = 1; $i <= 10; print $i, $i++) ; De nuevo, algunos de estos ejemplos (en especial el ltimo) no lo son de buenas costumbres de programacin, pero s de la potencia y flexibilidad del bucle for.

2.10.5. foreach
El bucle foreach es nuevo en PHP 4, y representa una estructura de control tpica de lenguajes interpretados como Perl y Bash, en la que a una variable se le van asignando todos los valores de una lista. Su sintaxis es esta: foreach (array as $variable) { comandos } En cada iteracin del bucle, se coloca en $variable un elemento de array, comenzando por el primero y siguiendo un orden ascendente. Por ejemplo: $a = array (1, 2, 3, 17); foreach ($a as $v) { print "Valor actual de \$a: $v.\n"; } El resultado sera:

28

Valor Valor Valor Valor

actual actual actual actual

de de de de

$a: $a: $a: $a:

1 2 3 17

2.10.6. switch
Su sintaxis es: switch (variable) { case valor1: comandos1 case valor2: comandos2 ... case valorN: comandosN default: comandosDefault } El flujo procede linealmente de arriba a abajo, comparando con cada valor de los case, y ejecutando el cdigo asociado si se cumple la condicin. En caso de que no se cumpla ninguna, se ejecuta el cdigo asociado a la clusula default. El comportamiento sera similar a tener un if por cada case, uno detrs del otro. Cuando se termina de ejecutar el cdigo de un case, si no se finaliza el switch explcitamente con un break, se contina ejecutando el cdigo del siguiente case aunque no se cumpla la condicin, hasta que se llegue al final del bloque switch o se finalice este con un break. Por ejemplo: switch ($i) { case 1: echo Cdigo del 1; case 2: echo Cdigo del 2; case 3: echo Cdigo del 3; break; case 4: echo Cdigo del 4; } Si $i vale 1, se imprimirn las tres primeras cadenas; Si vale 2, la segunda y la tercera; Si vale 3, slo la tercera; Y si vale 4, slo la ltima. Otro ejemplo del funcionamiento del switch, ahora con una clusula default: switch ($i) { case 0: case 1:

29

case 2: case 3: echo i es menor que 4, pero no negativa; break; case 4: echo i vale 4; break; default: echo i mayor que 4 o negativa; break; }

2.11. Evaluaciones a Cierto o Falso


La forma de realizar las comprobaciones booleanas sobre una variable (evaluar su valor a cierto o falso) en PHP puede resultar confusa a los programadores acostumbrados a trabajar con lenguajes fuertemente tipados, ya que antes de realizar la comprobacin PHP puede convertir el tipo de la variable. En PHP se puede evaluar de esta forma cualquier variable, contenga un valor del tipo que contenga, lo que lleva a varios tipos de conversin: Para los valores numricos, 0 es FALSO, cualquier otro valor CIERTO. $x = 1; if( $x ) $x = 0; if( $x ) // // // // $x se evala a cierto $x definida como el entero 0 se evala a falso

Para cadenas de texto, una cadena vaca equivale a FALSO, una cadena no vaca a CIERTO. $x = "hello"; if( $x ) $x = ""; if( $x ) // // // // asignamos una cadena a $x se evala a cierto cadena vaca evala a falso

NOTA: $x = 0 es la nica excepcin, ya que primero se convierte la cadena 0 al decimal 0, que como ya hemos visto se evala a FALSO. Para arrays: un array vaco se evala a FALSO, mientras que si tiene algn elemento lo hace a CIERTO. $x = array(); // $x es un array vaco if( $x ) // se evala como falso $x = array( "a", "b", "c" ); if( $x ) // se evala a cierto Para objetos, el resultado de la evaluacin es FALSO si son objetos vacos (su clase no define ningn mtodo ni variable), y CIERTO en otro caso. Class Yod {} // clase vaca $x = new Yod(); if( $x ) // se evala a falso

30

Class Yod { // clase no vaca var $x = 1; } $x = new Yod(); if( $x ) // se evala a cierto PHP tiene definidas dos constantes para los valores CIERTO y FALSO, respectivamente TRUE y FALSE. Estn definidas de esta forma: TRUE es el valor entero decimal 1. FALSE es la cadena vaca.

Es indiferente si se escriben en maysculas o minsculas, es decir, true, True y tRuE hacen referencia a la misma constante TRUE. Para evitar confusiones, escribiremos estas constantes siempre en maysculas. Como regla general a utilizar al principio hasta que nos acostumbremos al funcionamiento de PHP, podemos tener en mente esta regla que funciona el 99% de las veces: el valor 0 y la cadena vaca se evalan a FALSO, cualquier otra cosa a CIERTO.

2.12. Funciones
Con una funcin podemos agrupar bajo un nombre una serie de comandos que se repiten a menudo a lo largo del cdigo, y en vez de repetir este cdigo varias veces lo sustituimos por una simple llamada a la funcin. La sintaxis de la declaracin de una funcin en PHP es: function nombre ($arg_1, $arg_2, ..., $arg_n) { comandos return $salida; } Los parmetros se pasan por valor, es decir, se crea en $arg_1 ... $arg_n copias locales de las variables, y se trabaja sobre estas copias locales, de forma que al salir de la funcin los valores originales no han sido modificados. El comando return es opcional, y sirve para que la funcin devuelva un valor de salida. Es el equivalente a asignar un valor al nombre de la funcin en ASP. Puede aparecer varias veces en el cdigo de la funcin, y siempre implica la final de la ejecucin de la funcin. En el cuerpo de la funcin puede haber cualquier combinacin de instrucciones vlidas en PHP, incluso otras definiciones de funciones y / o clases. Por ejemplo: function factorial ($valor) { if ($valor < 0) { return 1; // Error } if ($valor == 0 ) { return 1; } if ($valor == 1 || $valor == 2) { return $valor;

31

} $ret = 1; for ($i = 2; $i <= $valor; $i++) { $ret *= $i; } return $ret; } $factorial5 = factorial(5); En PHP 3 era necesario definir las funciones antes de usarlas, como en el ejemplo de arriba. Esta restriccin se ha eliminado en PHP 4, donde ya se puede utilizar una funcin antes de su declaracin. PHP no soporta sobrecarga de funciones (tener varias funciones con el mismo nombre y distintos argumentos), ni tampoco se puede eliminar o modificar una funcin previamente definida. Lo que si se puede hacer es dar valores por defecto a algunos de los parmetros que reciba la funcin (comenzando siempre por la derecha) y hacerlos as optativos: function enlace($url = www.php.net) { echo <a href= . $url . >Pulsa aqu</a>; }

2.12.1. Paso de parmetros por referencia


Los parmetros de las funciones se pueden pasar por referencia, de forma que si que se pueda modificar su valor dentro de la funcin. Esto se consigue utilizando el smbolo & en la definicin de la funcin: function MiFuncion(&$var) { $var++; } $a = 5; MiFuncion($a); // Aqu $a == 6

2.12.2. Devolucin de variables por referencia


PHP tambin nos permite devolver variables por referencia. Esto puede ser til, por ejemplo, cuando tenemos una funcin que busca un valor dentro de una coleccin de variables, y queremos que devuelva la variable entera (porque es una estructura que contiene ms datos que vamos a necesitar.) En este caso, hay que utilizar el & tanto en la definicin de la funcin como en la llamada a sta: function &buscar_cliente($nombre) { // ... buscamos ... return $registro; } $cliente = &buscar_cliente(Juan); echo $cliente->dni;

32

2.13. include y require


La clusula require(archivo); se sustituye en el cdigo antes de que este se ejecute por el contenido de archivo, que puede ser un archivo local o una URL, igual que funciona el #include de C o ASP. Esta sustitucin se realiza una sola vez, mientras se est preprocesando el contenido del archivo .php y antes de ejecutarlo. La clusula include(archivo); tambin se sustituye por el contenido de archivo, pero en lugar de realizarse una nica vez durante el preproceso del archivo, se realiza durante la ejecucin, cada vez que el flujo del programa llega a esa lnea. La utilidad de ambas clusulas es la misma: imagnese unas lneas de cdigo que se vayan a necesitar en varios archivos (por ejemplo, una funcin que valide ciertos datos, o que muestre la cabecera y pie de las pginas). En lugar de copiar ese cdigo en todos los archivos que lo necesiten, se pone en un archivo que es incluido por el resto. Entontes, por qu tener dos funciones distintas para hacer lo mismo? Principalmente por dos motivos: Optimizacin de los accesos a disco: Imagnese un cdigo en el que dependiendo de una serie de condiciones, se deba incluir o no otros archivos. Con require se cargaran TODOS los archivos SIEMPRE. Con include, nicamente aquellos que se vayan a utilizar. Flexibilidad. Con include podemos acceder a archivos cuyo nombre tenemos en una variable que podemos ir cambiando en tiempo de ejecucin, mientras que con require siempre se accede al mismo archivo.

Tambin existen las funciones include_once y require_once, que nos aseguran que un determinado archivo slo ser procesado una vez, en caso de que en sucesivos includes vuelva a aparecer.

33

3. Programando en PHP
En esta segunda parte del curso, una vez ya tenemos una idea general de cmo se programa en PHP, vamos a estudiar con ms detalle algunas de las funciones de PHP que probablemente tendremos que usar con mayor frecuencia.

3.1. Formas
Trabajar en PHP con formas es muy fcil, ya que el propio lenguaje se encarga de crear automticamente las variables necesarias para almacenar los datos del <form> en la pgina que los recibe. Vamos a ver algunos ejemplos:

3.1.1. Valores sencillos


Para los campos de un formulario en los que nicamente se puede elegir o introducir un valor (como campos de texto, desplegables y radio buttons) PHP crea en el archivo de destino tantas variables como campos haya en el formulario, con los nombres que se les haya dado en ste. Por ejemplo, si tenemos este formulario: <form action="accion.php" method="POST"> Su nombre: <input type=text name=nombre><br> Su edad: <input type=text name=edad><br> <input type=submit> </form> En el script de destino accion.php, accederamos a los valores enviados en el form as: Hola <?=$nombre?>. Tiene <?=$edad?> aos.

3.1.2. Valores mltiples


Para los campos de selecciones mltiples PHP tambin se encarga de almacenar los valores marcados por el usuario en una variable con el nombre del campo, pero en este caso tendremos que llevar cuidado de dar a las variables nombres de arrays, ya que si no slo tendremos acceso al primer valor seleccionado. Por ejemplo este formulario estara mal: <form action="accion.php" method="POST"> <select multiple name=menu> <option>Tortilla <option>Paella <option>Fabada <option>Lentejas </select><input type=submit></form> Deberamos haberlo escrito as: <form action="accion.php" method="POST"> <select multiple name=menu[]> <option>Tortilla <option>Paella <option>Fabada <option>Lentejas </select><input type=submit></form>

34

Y podemos ver el resultado con este cdigo: <?php echo "Su eleccin:<br>"; foreach($menu as $plato) { echo "$plato<br>\n"; } ?>

3.2. Manipulacin de strings y arrays


Durante la generacin de contenido para pginas Web vamos a estar continuamente trabajando con cadenas de texto: modificndolas, aadindoles el valor de algn clculo interno o algn acceso a una base de datos... Vamos a ver algunas de las funciones ms tiles para manipular strings y arrays.

3.2.1. Comparaciones
Para comparar cadenas ya hemos visto que podemos utilizar los operadores == y ===, aunque tambin disponemos de la funcin strcmp() con el mismo funcionamiento que en C: int strcmp (string str1, string str2) La funcin devuelve 0 si ambas cadenas son iguales, un nmero menor que cero si $a es menor que $b, y mayor que cero si $a es mayor que $b. Adems, siempre que la cadena contenga algn carcter binario deberemos utilizar esta funcin en lugar del operador ==. Por ejemplo: if (strcmp($a, $b) == 0) { echo iguales; } La funcin strcmp tiene en cuenta maysculas y minsculas. Si queremos comparar sin tenerlas en cuenta, usaremos strcasecmp: int strcasecmp (string str1, string str2)

3.2.2. Subcadenas
Otra operacin que podramos necesitar es obtener una subcadena de otra dada. Esto se consigue con: string substr (string cadena, int inicio [, int tamao]) Si inicio es positivo, devuelve la subcadena que empieza en esa posicin. Si es negativo, la subcadena que empieza en esa posicin contando desde el final. Si se indica el tamao, se devuelve una subcadena de hasta ese nmero de caracteres. Si el tamao es negativo, se elimina ese nmero de caracteres de la subcadena devuelta:

35

$str $str $str $str

= = = =

substr('abcdef', substr('abcdef', substr('abcdef', substr('abcdef',

2, 3); -2); -2, 1); 1, -2);

// // // //

cde ef e bcd

En ocasiones puede que no sepamos la posicin exacta en la cadena de lo que andamos buscando, pero si una serie de caracteres de referencia que marcarn su inicio. Entonces podremos usar estas funciones: int strpos (string cadena, string referencia [, int inicio]) int strrpos (string cadena, char referencia) string strstr (string cadena, string referencia) La primera funcin devuelve el ndice de la primera ocurrencia de la cadena referencia en cadena a partir de la posicin inicio. La segunda funcin es similar pero aqu referencia es un carcter en lugar de una cadena (si se pasa una cadena slo se usar el primer carcter), y se busca desde el final de la cadena. Por ltimo, la tercera funcin devuelve la subcadena de cadena que comienza en la primera ocurrencia de referencia. $i = strpos('cadena de prueba', 'de'); // $i = 2 $i = strpos('cadena de prueba', 'de', 5); // $i = 7 $s = strrpos('cadena de prueba', 'de'); // $i = 7 $s = strstr('cadena de prueba', 'de'); // $s = dena de prueba

3.2.3. Imprimir y formatear cadenas


Se puede formatear e imprimir una cadena con la funcin printf(), al igual que en C: int printf (string formato [, mixed args...]) Aqu, formato es una cadena que puede contener cualquier carcter excepto %, que se imprimirn tal cual, y secuencias de formato que comienzan por % y controlan cmo se mostrarn los argumentos. Estas secuencias de formato se componen de: 1. Un carcter opcional que se utilizar para rellenar y ajustar el tamao del campo. Por ejemplo, un espacio para caracteres o un cero para nmeros. Por defecto se usa el espacio. 2. Un indicador opcional para especificar si se alinear a la izquierda (-). Por defecto se alinea a la derecha. 3. El nmero mnimo de caracteres que ocupar el campo tras la conversin. Tambin es opcional. 4. Un indicador opcional de precisin, formado por un punto seguido del nmero de dgitos decimales que se debern mostrar con los nmeros en punto flotante. No tiene efecto con otros tipos de datos. 5. Un indicador de tipo que especifica cmo se deber tratar el dato. Los tipos disponibles son:

36

% b c d f o s x X Ejemplos:

El carcter de tanto por ciento. El argumento se trata como entero y se muestra en binario. Se trata como entero, y se muestra el carcter ASCII. Se trata como entero y se muestra el nmero en decimal. Se trata como double, y se muestra como punto flotante. Se trata como entero y se muestra en octal. El argumento se trata y se muestra como una cadena. Se trata como entero y se muestra en hexadecimal (con las letras en minsculas). Se trata como entero y se muestra en hexadecimal (con las letras en maysculas).

printf(%02d/%02d/%04d, $dia, $mes, $ao); $pago1 = 68.75; $pago2 = 54.35; $pago = $pago1 + $pago2; // echo $pago mostrar "123.1" // Mostrar al menos un dgito entero y exactamente dos // decimales, rellenando con ceros printf ("%01.2f", $pago); Tambin podemos almacenar el resultado del formateo en una cadena en lugar de imprimirlo con la funcin sprintf(): string sprintf (string formato [, mixed args...]) El formato es el mismo que con printf: $fecha = sprintf(%02d/%02d/%04d, $dia, $mes, $ao); Estas dos funciones son muy tiles a la hora de dar un formato especfico a unos datos, pero se debe de huir de ellas cuando este formato no sea importante o simplemente no se est realizando ningn formateo, ya que es mucho ms rpido imprimir con echo o concatenar cadenas con el operador ..

3.2.4. Escapar caracteres


PHP tiene varias funciones para escapar con barras invertidas algunos caracteres que bajo ciertas circunstancias pueden dar problemas. Por ejemplo, en SQL tendremos que escapar los apstrofes en las restricciones de un WHERE, pero si por ejemplo estas restricciones las hemos obtenido por parte del usuario (en un form), no sabemos a priori si habr algn carcter que escapar ni dnde. Con la funcin addslashes() podemos manejar este tipo de situaciones, ya que se encarga de aadir las barras invertidas que haga falta: $busca = DAlton; // Habr que escapar el apstrofe $sql = SELECT * FROM usuarios WHERE apellido = \ . addslashes($busca) . \;

37

Otro caso en el que escapar caracteres es MUY importante es a la hora de realizar llamadas al sistema. En PHP podemos ejecutar cualquier comando en el servidor con la funcin system(): string system (string comando [, int valor_salida]) Por ejemplo, podramos tener una pgina en la que en un form se pida el nombre de un usuario de nuestro sistema, y que devuelva la informacin de finger sobre ese usuario. Si lo hiciramos simplemente as: echo system(finger $usuario); y en $usuario tenemos la entrada del form sin ms, tendramos un grave agujero de seguridad, ya que si en el form por ejemplo nos hubieran puesto pepe ; apachectl stop y PHP se estuviera ejecutando como root cualquiera nos podra detener Apache. Para evitar esto habra que aplicar esta funcin sobre los datos que recibamos del form: string escapeshellcmd (string comando) que se encarga de escapar con barras los caracteres que se podran usar en el shell de UNIX para ejecutar un programa sin nuestro permiso (en concreto, #&;'\"|*?~<>^()[]{}$\\\x0A\xFF). Adems de por razones de seguridad, tambin necesitaremos a veces cambiar unos caracteres por otros para formatear correctamente un texto en HTML. Esto lo hace la funcin htmlspecialchars(): $valor = a>b; echo <input type=hidden name=var value= . htmlspecialchars($valor) . >; // <input type=hidden name=var value=a&gt;b> Podemos tambin convertir todos los caracteres de fin de lnea de una cadena a <br> con: string nl2br (string cadena)

3.2.5. Extraer campos


Podemos dividir una cadena formateada en campos divididos por un delimitador en un array de cadenas con esos campos usando la funcin explode(): array explode (string delimitador, string cadena [, int lmite]) Si se especifica un lmite, se extraer hasta ese nmero de campos y en el ltimo estar el resto de la cadena. Por ejemplo, en UNIX se utiliza bastante el carcter de dos puntos para separar campos en una cadena, por ejemplo en el archivo /etc/passwd. Podemos utilizar esta funcin para obtener el valor de cada campo. $cadena = campo1:campo2:campo3;

38

$campos = explode(:, $cadena); La operacin inversa, por la que a partir de un array de campos y un separador se junta todo en una sola cadena, es implode(): string implode (string delimitador, array campos) Para volver a la cadena original del ejemplo anterior, usaramos: $cadena = implode(:, $campos); En caso de que delimitador no siempre sea el mismo carcter, tendremos que recurrir a split, cuyo funcionamiento es similar al de explode pero utiliza expresiones regulares para dividir los campos: array split (string delimitador, string cadena [, int lmite]) Por ejemplo, para obtener los campos de una fecha donde el da, mes y ao puedan estar separados por espacios, barras, guiones o puntos, tendramos que utilizar split as: $fecha = "12/4 2000"; $campos = split ('[ /.-]', $fecha);

3.2.6. Recorrer un array


Todos los arrays de PHP disponen de un puntero que seala al elemento actual, puntero que sirve para recorrer el array secuencialmente con las funciones current(), next(), prev(), reset() y end(), que devuelven el elemento actual, siguiente, anterior, inicial o final del array, y a la vez actualizan el puntero a esa posicin. Tambin disponemos de las funciones key(), que devuelve el ndice (numrico o asociativo) del elemento actual; y each(), que devuelve un array con el ndice del elemento actual en las posiciones 0 y key, y su valor (lo mismo que devolvera current) en las posiciones 1 y value, y actualiza el puntero actual al siguiente (lo que hara next). Por ejemplo: $arr = array(1,'cosa',1.57,'gato'=>'raton','perro'=>'gato'); current($arr); next($arr); current($arr); prev($arr); end($arr); current($arr); key($arr); reset($arr); each($arr); each($arr); each($arr); // // // // // // // // // // // 1 cosa cosa 1 gato gato perro 1 array(0,1) array(1,'foo') array(2,1.57)

39

Este puntero al elemento actual del que estamos hablando tambin se utiliza en los bucles foreach y se actualiza en cada iteracin.

3.2.7. Ordenar un array


En PHP tenemos varias funciones para ordenar un array: sort(): rsort(): ksort(): rksort(): Ordena Ordena Ordena Ordena el array por contenido en orden ascendente. por contenido en orden descendente. por el ndice en orden ascendente. por el ndice en orden descendente.

3.2.8. Otras funciones tiles


Una operacin til puede ser eliminar los espacios que haya al principio o final de una cadena, por ejemplo si vamos a pasar el texto que ha escrito un usuario en un form a un query en SQL. Esto lo conseguimos con trim: string trim (string cadena) Esta funcin elimina espacios del principio y final de la cadena. Tambin se puede usar ltrim y rtrim, que los eliminan slo del inicio y slo del final, respectivamente. Podemos convertir una cadena a maysculas con: string strtoupper (string cadena) Y a minsculas con: string strtolower (string cadena) Tambin puede ser til convertir a maysculas tan slo el primer carcter de la cadena, por ejemplo si estamos construyendo frases. Esto se consigue con: string ucfirst (string cadena)

3.2.7. Ms informacin
Para ms informacin sobre todas las funciones de strings y arrays disponibles en PHP, ver las pginas de manual: Funciones de strings http://www.php.net/manual/ref.strings.php Funciones de arrays http://www.php.net/manual/ref.array.php

40

3.3. Acceso a Bases de Datos


PHP dispone de varias funciones para acceder a Bases de Datos, pero son propias de cada una de estas Bases de Datos, es decir, no hay una funcin conectar genrica, si no una para conectar a MySQL, otra para conectar a Informix, etc. Para evitar confusiones entre las funciones de unas BD y otras, el nombre de todas estas funciones sigue este patrn: <nombreBD>_<nombreFUNCION> de forma que tenemos una funcin mysql_connect, una funcin ifx_connect... Todas las funciones con el mismo nombre de funcin pero para distintas BD comparten la misma funcionalidad y parmetros. Lo nico que tendremos que comprobar es que una determinada funcin est disponible para la BD que vamos a atacar, ya que dependiendo de la BD y de su grado de integracin con PHP tendremos ms o menos funciones. Vamos a explicar las funciones ms importantes, con ejemplos en MySQL ya que es la BD que mejor integrada est en PHP. Se puede obtener una lista completa de todas las opciones en el manual de PHP: http://www.php.net/manual/ref.mysql.php o en las pginas de funciones de las otras BD.

3.3.1. Abrir y cerrar una conexin


Para conectar a una BD tenemos la funcin mysql_connect con la siguiente definicin: int mysql_connect ([string servidor [:puerto] [:/camino/al/socket] [, string usuario [, string contrasea]]]) Todos los parmetros son opcionales. Si no se indican, se utiliza localhost como servidor por defecto, el nombre del usuario que est ejecutando PHP como usuario, y la cadena vaca como contrasea. La funcin devuelve un identificador de la conexin que necesitaremos ms tarde para hacer referencia a este enlace en concreto con la BD, o un error si algo ha ido mal. La conexin con la BD se cierra automticamente al finalizar la ejecucin del archivo actual. Tambin se puede cerrar explcitamente con mysql_close: int mysql_close ([int identificador]) Esta funcin cierra la conexin indicada por el identificador o la ltima conexin que se haya abierto si se omite, y devuelve TRUE o FALSE segn si la operacin ha finalizado con xito o no. Por ejemplo, as nos conectaramos a la BD MySQL en el servidor Linux: $link = mysql_connect ("www.mmlabx.ua.es", "nobody", ""); if (!$link) { die ("No se pudo conectar"); } print ("Conexin realizada"); mysql_close ($link);

41

Con algunas BD tambin se pueden usar enlaces persistentes que no se cerrarn automticamente al acabar la ejecucin del archivo, si no que permanecern abiertos y se podrn utilizar desde los siguientes archivos .php que se ejecuten. Estos enlaces se abren y cierran con mysql_pconnect y mysql_pclose. Su definicin es idntica a la de connect y close: int mysql_pconnect ([string servidor [:puerto][:/camino/al/socket] [, string usuario [, string contrasea]]]) int mysql_pclose ([int identificador])

3.3.2. Elegir una BD


Para elegir la base de datos con la que queremos trabajar de entre todas las disponibles se utiliza la funcin mysql_select_db: int mysql_select_db (string nombre_bd [, int identificador]) Aqu, nombre_bd especifica el nombre de la BD a la que queremos acceder, y el campo opcional identificador es el nmero de identificacin de enlace devuelto por mysql_connect. Si se omite este ltimo campo, se utiliza el ltimo enlace abierto, y si no existiera, se trata de crear uno con mysql_connect (sin parmetros). La funcin devuelve TRUE o FALSE, segn si todo ha ido bien o no. Para elegir la BD prueba utilizada en el sistema de gestin de asignaturas en nuestro servidor Linux, utilizaramos: if (!mysql_select_db("prueba", $link)) { die (No existe la BD); }

3.3.3. Interrogar a la BD
Para hacer querys a una BD se utiliza mysql_query: int mysql_query (string query [, int identificador]) En query va la sentencia en SQL que queremos ejecutar. Al igual que con mysql_select_db, si se omite el identificador se usa el ltimo o se trata de crear. Esta funcin devuelve FALSE si ha habido un error, o un valor no negativo (TRUE) que identifica el resultado y que ms tarde deber ser tratado para extraer la informacin necesaria. Para obtener la informacin de las asignaturas en la BD de ejemplo: $query = "SELECT codigo, nombre, descripcion, creditos, tipo FROM asignatura"; $asignaturas = mysql_query($query, $link); if (!$asignaturas) { die (Error en el query); }

42

Tambin podemos utilizar esta otra funcin, en la que adems del query indicamos la BD a la que queremos interrogar: int mysql_db_query (string nombre_bd, string query [, int identificador]) Cuando hayamos acabado con el resultado, podemos liberar memoria con: int mysql_free_result (int result) aunque realmente no es necesario ya que el recolector de basura de PHP se encargar de liberarla al acabar la ejecucin del archivo actual.

3.3.4. Extraer informacin del resultado del query


Si la ltima operacin fue un INSERT, UPDATE o DELETE (operaciones que modifican algn registro), se puede utilizar esta funcin para ver el nmero de filas afectadas: int mysql_affected_rows ([int identificador]) Para obtener el nmero de filas en el resultado de un query, tenemos: int mysql_num_rows (int resultado) Donde resultado es el valor devuelto por mysql_query. Para obtener toda una fila del resultado: array mysql_fetch_row (int resultado) Cada llamada sucesiva a esta funcin devuelve un array con la siguiente fila del resultado, hasta que no queden filas y devuelva FALSE. Las columnas estn indexadas por orden en el array, comenzando la primera en la posicin 0. Para este mismo fin tambin disponemos de otra funcin, que es una extensin de la anterior: array mysql_fetch_array(int resultado [, int tipo_resultado]) Esta funcin es capaz de indexar el array de forma numrica o asociativa por el nombre de las columnas. El parmetro tipo_resultado puede valer MYSQL_ASSOC, MYSQL_NUM, o MYSQL_BOTH para indicar el tipo de indexado que queremos (por defecto, ambos). Hay que destacar que, a pesar de la funcionalidad extendida sobre mysq_fetch_row, esta funcin NO es significativamente ms lenta que la anterior. Continuando con el ejemplo anterior, podemos obtener los resultados del query as: while ($fila = mysql_fetch_array($asignaturas)) { echo $fila[codigo] . . $fila[nombre] . \n; }

43

Otra funcin que podemos mysq_fetch_object:

utilizar

para

obtener

los

resultados

de

un

query

es

object mysql_fetch_object (int result) que en lugar de almacenar el resultado en un array, lo almacena en un objeto cuyas propiedades (variables) coinciden con los nombres de las columnas: while ($fila = mysql_fetch_object($asignaturas)) { echo $fila->codigo . . $fila->nombre . \n; } Si queremos saber el tamao de los mysql_fetch_array, object o row, tenemos: campos de la ltima fila devuelta por

array mysql_fetch_lengths (int resultado) Esta funcin devuelve un array con tantos campos como columnas el ltimo resultado, con los tamaos de estas columnas. Por ltimo, podemos saltar directamente a una fila del resultado, o rebobinar una vez hemos llegado al final, con la funcin mysql_data_seek. Las filas comienzan en el 0. int mysql_data_seek (int resultado, int numero_fila)

3.4. A trabajar
Veamos un ejemplo, construyendo una base de datos y alimentndola con informacin a travs de una pagina Web.

3.4.1. Crear una base de datos


Ahora estamos listos para conectarnos a mySQL. Una forma sencilla de conocer que opciones estn disponibles en PHP y que hacen en tu servidor es usando la funcin phpinfo(). Crea un script con lo siguiente

<html> <body> <?php phpinfo(); ?> </body> </html>

44

Salva y ve este script a travs de tu servidor de Web. Observaras una pgina con informacin til e interesante. Esa informacin dice todo acerca de tu servidor, el ambiente interno de las variables del servidor de Web, las opciones que son compiladas y mucho ms. Si MySQL esta ah, entonces estas listo para continuar. Antes que puedas obtener datos de MySQL, tienes que poner datos en ella. No hay una manera fcil de hacer esta etapa. La mayora de los scripts de PHP viene con un archivo conocido como core dump que contiene todos los datos requeridos para crear y almacenar una base de datos MySQL. La insercin y salida de este proceso esta realmente fuera del objetivo de este texto, as que lo haremos sin explicar a detalle el proceso. Consulta informacin respecto al lenguaje SQL y sistemas de gestin de bases de datos en las fuentes necesarias. MySQL utiliza su propia tabla de usuarios. En la instalacin, un usuario default (root) es automticamente creado sin password. Es el administrador de la base de datos, podran adicionarse nuevos usuarios con varios permisos, pero se podra escribir un artculo entero sobre eso, as que trabajaremos como usuario root. Para ingresar a la base de datos, se requiere algn trabajo en la consola de DOS. Se tendr que utilizar una ventana DOS y ubicarnos en la ruta del directorio MySQL/bin La primera cosa que necesitamos, es crear una base de datos, desde la lnea de comando, teclear:
mysqladmin -u root create mydb

Esto crea la base de datos llamada "mydb". El comando dice a MySQL que estamos haciendo esto como usuario root. Ahora adicionaremos datos utilizando un ejemplo clsico, una base de datos de empleados. Vamos a necesitar un archivo core dump que mencionamos anteriormente. Si estas interesado en profundizar en el tema revisa el manual que viene con MySQL o revisa la liga http://www.turbolift.com/mysql/ . Copia y pega el siguiente texto en un archivo y gurdalo en el directorio c:\mysql\bin. (nombra al archivo mydb.dump.) CREATE TABLE employees ( id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT, first varchar(20), last varchar(20), address varchar(255), position varchar(50), PRIMARY KEY (id), UNIQUE id (id));INSERT INTO employees VALUES (1,'Bob','Smith','128 Here St, Cityname','Marketing Manager'); INSERT INTO employees VALUES (2,'John','Roberts','45 There St , Townville','Telephonist'); INSERT INTO employees VALUES (3,'Brad','Johnson','1/34 Nowhere Blvd, Snowston','Doorman'); Ahora insertaramos en la base de datos mydb, Desde la lnea de comandos tecleamos:
mysql -u root mydb < mydb.dump

45

Podras tener algunos errores ejecutando esto. Si los tienes revisa y busca alguna lnea que haya sido escrita de forma incorrecta.

3.4.2 Colocando juntas todas las piezas


Ahora que tenemos los datos en la base de datos. Vamos a hacer algunas cosas con ellos. Copia y pega las siguientes lneas de texto y salva el archivo en un documento dentro del servidor de Web con la extensin .php

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); printf("First Name: %s<br>\n", mysql_result($result,0,"first")); printf("Last Name: %s<br>\n", mysql_result($result,0,"last")); printf("Address: %s<br>\n", mysql_result($result,0,"address")); printf("Position: %s<br>\n", mysql_result($result,0,"position")); ?> </body> </html> Explicaremos que sucede aqu. La funcin mysql_connect() abre una conexin al servidor MySQL en el host especificado (en este caso es el host local) accesandolo con el nombre del usuario (root). Si necesitas especificar un password, puedes adicionarlo tambin. El resultado de la conexin es almacenada en la variable $db. Mysql_select_db() le dice a PHP que las consultas que estamos haciendo van contra la base de datos mydb. Podramos crear mltiples conexiones a las bases de datos en diferentes servidores. Pero por ahora, dejaremos esto as. La siguiente, mysql_query() hace todo el trabajo duro. Usando el identificador de la conexin a la base de datos, este enva una lnea de SQL al servidor MySQL para ser procesada. Los resultados que son retornados son almacenados en la variable $result. Finalmente, mysql_result() es usado para desplegar los valores de los campos de nuestra consulta. Usando $result, nos vamos a la primera lnea, la cual esta numerada como 0 y desplegamos el valor de los campos especificados. La sintaxis de print puede ser vista como las utilizadas en C o Perl. En cada una de las lneas de encima, los % indican que la variable en la segunda mitad de la expresin (por ejemplo, mysql_resutl($result,0,"position")) pueden ser manejados como una cadena e imprimirlos. Para ms informacin sobre print, puedes ver la documentacin de PHP. http://www.php3.net/manual/function.printf.php3 Hasta aqu hemos compilado, instalado y configurado exitosamente MySQL y PHP; adems hemos ejecutado un script simple para recuperar informacin.

46

4. Proyectos de PHP con bases de datos


Vamos a continuar con la escritura de programas con PHP y MySQL. Comencemos por desplegar en una pgina Web la base de datos que creamos en la unidad anterior, pero ahora anexemos nuevos elementos de diseo en HTML. Primero realicemos una bsqueda en la base de datos utilizando el siguiente cdigo: <html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); echo "<table border=1>\n"; echo "<tr><td>Name</td><td>Position</tr>\n"; while ($myrow = mysql_fetch_row($result)) { echo "<tr>"; echo "<td>$myrow[1] $myrow[2]</td>"; echo "<td>$myrow[3]</td>"; echo "</tr>"; } echo "</table>\n"; ?> </body> </html> Probablemente notaras que se han introducido algunas nuevas caractersticas en el cdigo anterior. En principio la instruccin while(). La instruccin while construye un ciclo, indica que en tanto existan nuevos renglones de datos disponibles (los cuales son ledos de la base de datos mediante la instruccin mysql_fetch_row()), se almacena el rengln actual en la variable $myrow. Luego se ejecutan las instrucciones encerradas entre las llaves. Observa el cdigo cuidadosamente y seguramente el sentido quedara claro. Un pequeo problema con mysql_fetch_row() es que retorna un arreglo que soporta solo referencias numricas a campos individuales. As que el primer campo es referido como 0, el segundo como 1 y as sucesivamente. En consultas complejas esto puede ser algunas veces un problema. Ahora examinemos el ciclo con ms detalle. Las primeras lneas las puedes reconocer del ejemplo de la primera unidad. En el ciclo while, tomamos una lnea del resultado y la asignamos al arreglo $myrow. Entonces imprimimos el contenido del arreglo en la pantalla con la funcin printf. Despus este ciclo inicia de nuevo y otra lnea es asignada a $myrow. Esto sucede hasta que obtiene todas las lneas disponibles. Pero si la consulta no retorna datos, no tenemos manera de que el usuario lo conozca.

47

4.1. Mantener informado al usuario


Observe el siguiente script:

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); if ($myrow = mysql_fetch_array($result)) { echo "<table border=1>\n"; echo "<tr><td>Name</td><td>Position</td></tr>\n"; do { printf("<tr><td>%s %s</td><td>%s</tr>\n", $myrow["first"], $myrow["last"], $myrow["address"]); } while ($myrow = mysql_fetch_array($result)); echo "</table>\n"; } else { echo "Sorry, no records were found!"; } ?> </body> </html> Hay un nmero de nuevos desarrollos introducidos aqu pero no son tan simples. Primero, existe la funcin mysql_fetch_array(). Es exactamente lo mismo que mysql_fetch_row() con una pequea excepcin: Usando esta funcin, podemos referirnos a los campos por sus nombre (como $myrow["first"]) en lugar de sus nmeros. Esto podra ahorrarnos algunos dolores de cabeza. Tambin introducimos un ciclo do/while y una sentencia if-else. Si la sentencia if-else dice que si podemos asignar una celda a $myrow, entonces que continue; en otro caso salta a la seccin del else y hacer lo que hay ah. El ciclo do/while es una variacin del while() que utilizamos antes. Necesitamos hacer el do/while aqu por una buena razn: Con la sentencia inicial if, nosotros asignamos el primer rengln retornado de la consulta a la variable $myrow. Si en este punto ejecutamos una sentencia regular while (como while($myrow = mysql_fetch_row($result)), Tenemos que sacar forzosamente el primer registro fuera de la variable y reemplazndola con el segundo registro. Pero el ciclo do/while nos deja probar la condicin despus de que el cdigo ha sido corrido ya una vez. As que no hay oportunidad de que nos saltemos algn rengln. Finalmente, si no hay registros retornados en la consulta, las sentencias contenidas en la porcin, else{} sern ejecutadas. Para ver esta porcin en accin, cambia la sentencia SQL a : SELECT * FROM employees WHERE id=6 o alguna otra cosa que no retorne registros. Ahora vamos a extender este ciclo y el cdigo if-else para hacer una pgina ms elegante.

48

4.2. Desplegado de informacin


Vamos a tomar el poder de un ciclo que aprendimos y usamos antes para crear un ejemplo mas practico. Pero antes de que procedamos aqu, usted debe saber trabajar con las formas HTML, el QUERY_STRING y los mtodos GET y POST. Vamos a trabajar con la informacin del QUERY_STRING. Como usted debe saber, hay tres maneras de conseguir la informacin en la cadena de consulta. Lo primero es utilizar el mtodo del GET en una forma. Lo segundo es el tipo de informacin dentro del URL en tu Navegador. Escribe una etiqueta como esta en un archivo HTML: <a href="http://my_machine/mypage.php3?id=1"> Vamos a utilizar esta tcnica ahora. Primero consultaremos nuestra base de datos otra vez y enumeraremos los nombres de los empleados. Observe el script siguiente. Mucho de esto se vera muy familiar ahora. <html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM employees",$db); if ($myrow = mysql_fetch_array($result)) { do { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PHP_SELF, $myrow["id"], $myrow["first"], $myrow["last"]); } while ($myrow = mysql_fetch_array($result)); } else { echo "Sorry, no records were found!"; } ?> </body> </html> Todas las cosas son lo mismo excepto la funcin printf, as que observaremos esto con algn detalle. Primero observa que cada marca, va precedida por un backslash. El backslash dice a PHP que no debe desplegar el carcter que le sigue, ms bien lo trata como parte del cdigo. Tambin nota el uso de la variable $PHP_SELF. Esta variable, almacena el nombre y la locacin del script, se pasa con cada paginacin del PHP. Usando $PHP_SELF, podemos asegurar que esto suceder al igual si el archivo es movido a otro subdirectorio o al igual a otra maquina. Como se ha mencionado estas ligas podran recargar la pgina. La segunda vez, sin embargo, informacin extra es adicionada a la cadena de consulta.

49

PHP cuando ve una cadena del tipo nombre = valor en el URL de la pagina, crea automticamente una variable con el nombre y valor que indica la cadena. Este desarrollo nos permite probar si es la primera o segunda vez que lo enva la pagina. Todo lo que tenemos que hacer es pregunta al PHP si la variable, en este caso, $id existe. Una vez que conocemos la respuesta a la pregunta, podemos desplegar un grupo diferente de informacin la segunda vez. He aqu el ejemplo de ello: <html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); // display individual record if ($id) { $result = mysql_query("SELECT * FROM employees WHERE id=$id",$db); $myrow = mysql_fetch_array($result); printf("First name: %s\n<br>", $myrow["first"]); printf("Last name: %s\n<br>", $myrow["last"]); printf("Address: %s\n<br>", $myrow["address"]); printf("Position: %s\n<br>", $myrow["position"]); } else { // show employee list $result = mysql_query("SELECT * FROM employees",$db); if ($myrow = mysql_fetch_array($result)) { // display list if there are records to display do { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PHP_SELF, $myrow["id"], $myrow["first"], $myrow["last"]); } while ($myrow = mysql_fetch_array($result)); } else { // no records to display echo "Sorry, no records were found!"; } } ?> </body> </html> Este cdigo se esta complicando, as que es buena idea comenzar a hacer comentarios para seguirle la pista a lo que esta sucediendo. Puede utilizar // para hacer un comentario sencillo de una sola lnea o utilizar /* y */ para iniciar y finalizar respectivamente un bloque largo de comentario. Aqu tenemos por fin, un verdadero primer y til script de PHP/MySQL. Ahora vamos a observar como vamos conectar formas HTML para enviar informacin a la base de datos.

4. 3. Insercin de datos en la base desde una pagina Web


Hemos obtenido datos de la base de datos sin mucha dificultad. Pero enviar datos es otra historia. Primero vamos a crear una pgina con una forma HTML simple.

50

<html> <body> <form method="post" action="<?php echo $PHP_SELF?>"> First name:<input type="Text" name="first"><br> Last name:<input type="Text" name="last"><br> Address:<input type="Text" name="address"><br> Position:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="Enter information"> </form> </body> </html> Note que usamos $PHP_SELF otra vez. Como comentamos en la unidad numero 1, se puede utilizar el PHP en cualquier parte dentro de un cdigo HTML. Notara tambin que cada elemento de la forma concuerda con el nombre del campo en la base de datos. Esto no es obligatorio, pero es una buena idea. Tambin nota que he dado al botn Submit un atributo nombre. Esto permitir mas adelante buscar la existencia de una variable $submit. De esta manera cuando la pgina es llamada por segunda vez podremos conocer que ya se ha utilizado la forma HTML. Tenemos que mencionar que no es necesario tener una pgina que se recargue as misma. Pueden crearse dos, tres o las pginas que se requieran. Pero el construir una pagina auto referenciada ayuda a mantener todas las cosas compactas. Vamos a aadir algn cdigo para revisar la entrada a la forma. Leamos el valor del las variables de la forma y coloqumoslas en la pantalla, utilizando $HTTP_POST_VARS. <html> <body> <?php if ($submit) { // process form while (list($name, $value) = each($HTTP_POST_VARS)) { echo "$name = $value<br>\n"; } } else{ // display form ?> <form method="post" action="<?php echo $PHP_SELF?>"> First name:<input type="Text" name="first"><br> Last name:<input type="Text" name="last"><br> Address:<input type="Text" name="address"><br> Position:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } ?> </body> </html>

51

Ahora que se observa bien, vamos a tomar la informacin de la forma y vamos a ponerla en la base de datos. <html> <body> <?php if ($submit) { // process form $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); $sql = "INSERT INTO employees (first,last,address,position) VALUES ('$first','$last','$address','$position')"; $result = mysql_query($sql); echo "Thank you! Information entered.\n"; } else{ // display form ?> <form method="post" action="<?php echo $PHP_SELF?>"> First name:<input type="Text" name="first"><br> Last name:<input type="Text" name="last"><br> Address:<input type="Text" name="address"><br> Position:<input type="Text" name="position"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } // end if ?> </body> </html> Hemos introducido datos en la base de datos. Pero aun estamos lejos de la perfeccin. Que pasa si alguien deja un campo en blanco o introduce texto cuando debi de introducir un nmero? Que pasa si hay un error donde sea? Vamos ahora a solucionar eso.

4.4. Actualizar datos va una pagina Web.


A travs de este texto, hemos cargado las declaraciones de SQL en la variable ($sql) antes de lanzar la consulta a la base de datos con mysql_query(). Esto es til para revisar si alguna parte de la sentencia SQL causa un error, ya que siempre podremos desplegar el SQL a la pantalla y examinar los errores. Ya conocemos como obtener datos de la base de datos. Ahora vamos a intentar modificar los registros que estn en la base de datos. Editar datos combina dos elementos que ya hemos visto: desplegar datos en la pantalla y enviar datos a la base de datos va una forma de entrada. Sin embargo editar es hacer algo diferente a que mostremos los datos apropiados en la forma. Primeramente, recuperemos el cdigo de la unidad 1 para desplegar los nombres de los empleados en nuestra pgina. Pero esta vez completos y llenemos nuestra forma con la informacin de los empleados:

52

<html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); if ($id) { // query the DB $sql = "SELECT * FROM employees WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); ?> <form method="post" action="<?php echo $PHP_SELF?>"> <input type=hidden name="id" value="<?php echo $myrow["id"] ?>"> First name:<input type="Text" name="first" value="<?php echo $myrow["first"] ?>"><br> Last name:<input type="Text" name="last" value="<?php echo $myrow["last"] ?>"><br> Address:<input type="Text" name="address" value="<?php echo $myrow["address"] ?>"><br> Position: <input type="Text" name="position" value="<?php echo $myrow["position"] ?>"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } else { // display list of employees $result = mysql_query("SELECT * FROM employees",$db); while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PHP_SELF, $myrow["id"], $myrow["first"], $myrow["last"]); } } ?> </body> </html> Solo desplegamos la informacin del campo en el atributo value de cada elemento, lo cual fue mas o menos fcil. Construyamos un poco ms. Adicionaremos la habilidad de enviar el cdigo editado de vuelta a la base de datos. De nuevo vamos a utilizar el botn submit para probar si necesitemos procesar la entrada de la forma. Note que las sentencias SQL que utilizamos son un poco diferentes.

<html> <body> <?php $db = mysql_connect("localhost", "root");

53

mysql_select_db("mydb",$db); if ($id) { if ($submit) { $sql = "UPDATE employees SET first='$first',last='$last',address='$address',position='$position' WHERE id=$id"; $result = mysql_query($sql); echo "Thank you! Information updated.\n"; } else { // query the DB $sql = "SELECT * FROM employees WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); ?> <form method="post" action="<?php echo $PHP_SELF?>"> <input type=hidden name="id" value="<?php echo $myrow["id"] ?>"> First name: <input type="Text" name="first" value="<?php echo $myrow["first"] ?>"><br> Last name: <input type="Text" name="last" value="<?php echo $myrow["last"] ?>"><br> Address: <input type="Text" name="address" value="<?php echo $myrow["address"] ?>"><br> Position: <input type="Text" name="position" value="<?php echo $myrow["position"] ?>"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } } else { // display list of employees $result = mysql_query("SELECT * FROM employees",$db); while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PHP_SELF, $myrow["id"], $myrow["first"], $myrow["last"]); } } ?> </body> </html>

Y esto es todo. Hemos manejado diferentes combinaciones de caractersticas en varios scripts. Obsrvese como hemos utilizado un if() dentro de otro if() para revisar condiciones mltiples. Es hora de poner todo junto en un script.

54

4.5. Colocar todo junto


Finalizamos esta leccin poniendo todo en una pgina sencilla donde podemos aumentar, editar y remover entradas de la base de datos. Es una extensin de lo que hemos visto hasta ahora y haremos un buen repaso. Demos un vistazo. <html> <body> <?php $db = mysql_connect("localhost", "root"); mysql_select_db("mydb",$db); if ($submit) { // here if no ID then adding else we're editing if ($id) { $sql = "UPDATE employees SET first='$first',last='$last',address='$address',position='$position' WHERE id=$id"; } else { $sql = "INSERT INTO employees (first,last,address,position) VALUES ('$first','$last','$address','$position')"; } // run SQL against the DB $result = mysql_query($sql); echo "Record updated/edited!<p>"; } elseif ($delete) { // delete a record $sql = "DELETE FROM employees WHERE id=$id"; $result = mysql_query($sql); echo "$sql Record deleted!<p>"; } else { // this part happens if we don't press submit if (!$id) { // print the list if there is not editing $result = mysql_query("SELECT * FROM employees",$db); while ($myrow = mysql_fetch_array($result)) { printf("<a href=\"%s?id=%s\">%s %s</a> \n", $PHP_SELF, $myrow["id"], $myrow["first"], $myrow["last"]); printf("<a href=\"%s?id=%s&delete=yes\">(DELETE)</a><br>", $PHP_SELF, $myrow["id"]); } } ?> <P> <a href="<?php echo $PHP_SELF?>">ADD A RECORD</a> <P> <form method="post" action="<?php echo $PHP_SELF?>"> <?php if ($id) { // editing so select a record

55

$sql = "SELECT * FROM employees WHERE id=$id"; $result = mysql_query($sql); $myrow = mysql_fetch_array($result); $id = $myrow["id"]; $first = $myrow["first"]; $last = $myrow["last"]; $address = $myrow["address"]; $position = $myrow["position"]; // print the id for editing ?> <input type=hidden name="id" value="<?php echo $id ?>"> <?php } ?> First name:<input type="Text" name="first" value="<?php echo $first ?>"><br> Last name:<input type="Text" name="last" value="<?php echo $last ?>"><br> Address:<input type="Text" name="address" value="<?php echo $address ?>"><br> Position:<input type="Text" name="position" value="<?php echo $position ?>"><br> <input type="Submit" name="submit" value="Enter information"> </form> <?php } ?> </body> </html>

Se ve complejo, pero realmente no lo es. El script esta dividido en tres partes. La primera condicin if() checa para ver que el botn de Submit ha sido presionado y si es as, checa que la variable $id exista. Si no entonces adiciona un registro. En otro caso , edita un registro. Despus revisamos si la variable $delete existe. Si existe borramos el registro. Nota que con la primera sentencia if() revisamos para una variable que llega va un POST y en este la variable que podra ser parte de un GET. Finalmente, tomamos la accin default que despliega la lista de empleados y la forma. De nuevo revisamos la existencia de la variable $id. Si existe, consultamos a la base de datos para desplegar los registros relevantes. En otro caso, desplegamos una forma en blanco. Hemos puesto todo lo aprendido y lo pusimos en un script. Usamos ciclos while() y sentencias if() y hemos corrido la gama de sentencias bsicas de SQL como SELECT, INSERT, UPDATE y DELETE. Y hemos observado como podemos pasar informacin de una pgina a otra usando URLs y formas de entrada.

56

5. Caractersticas y funciones adicionales


Muchas caractersticas avanzadas de PHP, que en muchos casos en ASP vienen en paquetes a parte por los que hay que pagar ms, se nos han quedado en el tintero. Algunos de estas caractersticas podran no venir en la instalacin por defecto de PHP, ser opcionales a la hora de compilar o incluso necesitar de paquetes a parte, por lo que podran no estar disponibles en un sistema concreto.

5.1. Mdulos disponibles


Los siguientes mdulos y funciones estn disponibles en la mayora de instalaciones de PHP, y casi todos son gratuitos (algunos pueden depender de alguna librera propietaria): Ejecucin de programas http://www.php.net/manual/ref.exec.php Funciones matemticas http://www.php.net/manual/ref.math.php http://www.php.net/manual/ref.bc.php Manipulacin de fechas/calendarios http://www.php.net/manual/ref.datetime.php http://www.php.net/manual/ref.calendar.php http://www.php.net/manual/ref.mcal.php Manipulacin de imgenes http://www.php.net/manual/ref.image.php Expresiones regulares http://www.mmlinux.net/manual-php/ref.pcre.html http://www.mmlinux.net/manual-php/ref.regex.html Semforos y memoria compartida http://www.php.net/manual/ref.sem.php Manipulacin de objetos COM en Windows http://www.php.net/manual/ref.com.php Manipulacin de XML http://www.php.net/manual/ref.domxml.php http://www.php.net/manual/ref.xml.php Funciones cliente CORBA http://www.php.net/manual/ref.satellite.php Cifrado http://www.php.net/manual/ref.mcrypt.php Compresin de datos http://www.php.net/manual/ref.zlib.php Acceso a servidores FTP

57

http://www.php.net/manual/ref.ftp.php Envo de correo http://www.php.net/manual/ref.mail.php Acceso a servidores de correo IMAP, POP3 y NNTP http://www.php.net/manual/ref.imap.php Acceso a servidores ICAP http://www.php.net/manual/ref.icap.php Acceso a servidores LDAP http://www.php.net/manual/ref.ldap.php Manejo de traducciones a diversos idiomas con GNU gettext http://www.php.net/manual/ref.gettext.php Generacin online de documentos PDF http://www.php.net/manual/ref.pdf.php Generacin de documentos Shockwave Flash http://www.php.net/manual/ref.swf.php Pago con tarjetas de crdito http://www.php.net/manual/ref.cybercash.php http://www.php.net/manual/ref.pfpro.php Correccin ortogrfica http://www.php.net/manual/ref.aspell.php http://www.php.net/manual/ref.pspell.php

58

6. Bibliografa
PHP: Hypertext Preprocessor Pgina principal del PHP. http://www.php.net PHP Annotated Manual Manual del PHP con correcciones y anotaciones de los usuarios. http://www.php.net/manual/ Zend / Where PHP meets eBusiness Empresa de los creadores del motor del intrprete PHP (Zend). Contiene informacin, cdigo y programas (un optimizador de consultas, y los futuros depurador y compilador.) http://www.zend.com Switching to PHP: What's the Language Difference? Artculo que describe las diferencias entre PHP y otros lenguajes (principalmente Perl, JavaScript y ASP.) http://www.zend.com/zend/art/langdiff.php PHP Conference material site Pgina con transparencias (en html) para diversas conferencias y cursos de PHP. http://conf.php.net

59

También podría gustarte