You are on page 1of 53

1.

- SESION: FUNDAMENTOS DEL LENGUAJE DE PHP


Introduccion
PHP es un potente lenguaje, y su intrprete, bien como mdulo del servidor web o bien como binario CGI, puede acceder a ficheros, ejecutar comandos o abrir conexiones de red desde el servidor. PHP est diseado especficamente para ser un lenguaje ms seguro para escribir aplicaciones CGI que Perl or C

Definicin de PHP

Es un lenguaje de programacin diseado originalmente para la creacin de pginas web dinmicas (lenguaje de alto rendimiento), es usado generalmente en la creacin de contenidos para sitios web. La interpretacin y ejecucin de los scripts PHP se hacen en el servidor, el cliente (un navegador que pide una pgina web) slo recibe el resultado de la ejecucin y jams ve el cdigo PHP. Permite la conexin a todo tipo de servidores de base de datos como MySQL, Postgres, Oracle, ODBC, DB2, Microsoft SQL Server, Firebird y SQLite.

Historia de PHP

Creado en 1994 por Rasus Lerdorf, la primera encarnacin de php era un conjunto simple de ficheros binarios CGI (Common Gateway Interface) escritos en el lenguaje de programacin c. Dos programadores Israeles del Technion, Zeev Suraski y Andi Gutmans, reescribieron el Analizador sintctico (parser en ingls) en el ao 1997 y crearon la base del PHP3, cambiando el nombre del lenguaje a la forma actual. Inmediatamente comenzaron experimentaciones pblicas de PHP3 y fue publicado oficialmente en junio del 1998. Para 1999, Suraski y Gutmans reescribieron el cdigo de PHP, produciendo lo que hoy se conoce como Motor Zend. Tambin fundaron Zend Technologies en Ramat Gan, Israel. PHP 4 En mayo de 2000 PHP 4 fue lanzado bajo el poder del motor Zend Engine 1.0. El da 13 de julio de 2007 se anunci la suspensin del soporte y desarrollo de la versin 4 de PHP. [3] PHP 5
IMPLEMENTACIN PHP

Instalar Apache + PHP + MySQL en Windows 7


Tecnologa:

Apache

JHOSUE PEDRO CUEVA MAMANI

PHP

La idea de este tutorial es configurar un servidor WAMP, es decir: Windows + Apache + MySQL + PHP para poder desarrollar aplicaciones Web basadas en PHP como lenguaje de programacin, que integre el uso de bases de datos en MySQL teniendo como servidor Web al poderoso Apache. Todo esto usando Windows 7. Como referencia, el uso tradicional de un servidor Web que integre Apache, PHP y MySQL es en Linux y es a lo que se le llama comnmente un servidor LAMP (Linux + Apache + MySQL + PHP). Este tutorial tambin puede servirte si usas Windows Vista o Windows XP Profesional. Slo recuerda instalar y cambiar la configuracin de las aplicaciones teniendo privilegios de Administrador. No he probado que tal se comporten estas aplicaciones en las versiones Home de Windows. Bajar las aplicaciones necesarias Partiremos que ya tienes Windows 7 instalado. Slo lo he probado en la versin Profesional y Ultimate de este Sistema Operativo y en las similares de Windows Vista, as como en Windows XP Profesional (con SP.2 o SP3). Lo siguiente es bajar Apache (http://httpd.apache.org/download.cgi), del cual he usado la versin 2.2.16. PHP lo obtenemos del sitio http://www.php.net/downloads.php He usado la versin PHP 5.2.14 (zip package). Finalmente MySQL lo obtenemos de http://www.mysql.com/downloads/mysql/ (para este tutorial he usado la versin 5.1 (mysql-5.1.49-win32.msi). Instalando Apache Para instalar Apache, basta con ejecutar el instalador. Slo recuerda que debes ejecutarlo con privilegios de administrador. Para una referencia ms detallada de las opciones de instalacin que recomiendo, puedes checar este tutorial paso a paso: http://josmx.com/instalando-apache-en-windows. Instalando PHP

JHOSUE PEDRO CUEVA MAMANI

Para instalar PHP primero descomprimimos el zip que hemos descargado. Lo descomprimimos en una carpeta que tendr por nombre PHP. Copiamos el archivo php.ini-recommended a otro archivo cuyo nombre ser php.ini. Este archivo lo dejaremos en la carpeta PHP. Ahora movemos esta carpeta PHP al directorio raz en C:\. Para integrar PHP en el servidor Web Apache hacemos lo siguiente: 1. Creamos un archivo de texto que lleve por nombre httpd-php.conf dentro de la carpeta C:\Apache2.2\conf\extra. Recuerda que hemos instalado Apache en la carpeta C:\Apache2.2. el contenido de este archivo de texto debe ser el siguiente:
#load the php main library to avoid dll hell Loadfile "C:\php\php5ts.dll" #load the sapi so that apache can use php LoadModule php5_module "C:\php\php5apache2_2.dll" #set the php.ini location so that you don't have to waste time guessing where it is PHPIniDir "C:\php" #Hook the php file extensions AddHandler application/x-httpd-php .php AddHandler application/x-httpd-php-source .phps

2. Le agregamos el siguiente texto al archivo C:\Apache2.2\conf\httpd.conf, esto al final de la seccin # Supplemental configuration :
# PHP settings Include conf/extra/httpd-php.conf

JHOSUE PEDRO CUEVA MAMANI

Modificamos la lnea "DirectoryIndex index.html" agregando "index.php" antes de "index.html".


DirectoryIndex index.php index.html

Guardamos este archivo y abrimos el archivo C:\php\php.ini. Habilitamos el soporte para MySQL. Para ello en la seccin "Paths and Directories" modificamos la entrada "extension_dir" para que quede como:
extension_dir = "C:\PHP\ext"

En la seccin "Windows Extensions" quitamos el comentario a las extensiones php_mysql.dll y php_mysqli.dll. Adicionalmente podemos habilitar otras extensiones,

JHOSUE PEDRO CUEVA MAMANI

pero eso ya depende de lo que necesitemos.


extension=php_mysql.dll extension=php_mysqli.dll

Guardamos este archive y reiniciamos el servidor Apache, ya sea mediante lnea de comando (recuerda que siempre hay que ejecutar esos comandos como administrador) o mediante la herramienta Apache Service Monitor.

Puedes ver que esta es una descripcin concreta de como integrar PPH en Apache. Para una descripcin ms detallada puedes ver el artculo http://josmx.com/instalarPHP-en-Windows-Vista Instalando MySQL Ya que hemos bajado el instalador de MySQL, simplemente lo ejecutamos con privilegios de Administrador. Siempre recomiendo personalizar la instalacin. En este caso las figuras que presento a continuacin resumen la forma que recomiendo para personalizar la instalacin tomando en cuenta que usaremos MySQL en una computadora para desarrollar o probar aplicaciones. Solo destacar que recomiendo instalar MySQL en la carpeta C:\MySQL. Esto tanto la aplicacin como los archivos de datos. Igual al terminar de instalar MySQL el instalador nos pedir que lo configuremos. Aqu slo recomiendo que modifiquemos las opciones de seguridad y le asignemos una contrasea para el acceso al usuario root, que es el administrador de MySQL.

JHOSUE PEDRO CUEVA MAMANI

JHOSUE PEDRO CUEVA MAMANI

JHOSUE PEDRO CUEVA MAMANI

JHOSUE PEDRO CUEVA MAMANI

JHOSUE PEDRO CUEVA MAMANI

JHOSUE PEDRO CUEVA MAMANI

10

JHOSUE PEDRO CUEVA MAMANI

11

JHOSUE PEDRO CUEVA MAMANI

12

JHOSUE PEDRO CUEVA MAMANI

13

Las aplicaciones de PHP ya podrn accesar a las bases de datos que creemos. Simplemente basta con poner como servidor localhost o 127.0.0.1 y los datos del usuario que tendr acceso a las bases de datos, ya sea mediante el usuario root o con algn otro que podamos crear con sus respectivas contrasea y permisos correspondientes.
SERVIDOR WEB APACHE Una alternativa importante y clara al servidor web IIS, incluido con Windows 2000 Server, es el servidor web Apache; este servidor web es actualmente el ms implantado entre los distintos servidores que ofertan servicios web en Internet. Adems Apache, servidor originalmente pensado para el entorno Linux, dispone de versin para el entorno Windows, que ser la que utilicemos en este curso. Una de las principales motivaciones para utilizar el servidor web Apache es su condicin de aplicacin libre y descargable de forma gratuita de la web. Hemos optado por utilizar la versin Apache 1.3.33 de este servidor, pese a que actualmente podemos descargar de la web la 2.0, la versin que instalaremos incluir de forma automtica junto con el servidor web, el mdulo para el acceso a pginas seguras va SSL, lo cual simplificar la instalacin y configuracin de este mdulo en el servidor Apache. No es que dicho mdulo no pudiera ser instalado a posteriori, pero con el paquete que utilizaremos el proceso ser transparente para el alumno, y de ah la eleccin. Posteriormente instalaremos en nuestro servidor Apache el mdulo correspondiente que permite la autenticacin LDAP (protocolo ligero de acceso al directorio), para que los usuarios del Active Directory de nuestro Windows 2000 Server puedan ser utilizados para el acceso a las carpetas privadas de nuestro Apache, evitando as la duplicacin de los usuarios y grupos de Active Directory en el entorno de Apache e integrando en lo que a la gestin de usuarios se refiere, Apache y Active Directory. SINTAXIS Y ESTRUCTURA DE PHP Sintaxis: PHP nos permite embeber sus fragmentos de cdigo dentro de la pgina HTML, es decir, es posible incluir lenguaje PHP en un cdigo HTML. Es por tanto necesario especificar cules son las

JHOSUE PEDRO CUEVA MAMANI

14

partes constitutivas del cdigo PHP. Esto se consigue delimitando nuestro cdigo por etiquetas. Como vimos en la unidad anterior, el modo de funcionamiento de una pgina PHP es el siguiente: el servidor va a reconocer la extensin correspondiente a la pgina PHP ( php, php3, php4, phtml,...) y antes de enviarla al navegador va a encargarse de interpretar y ejecutar todo aquello que se encuentre entre las etiquetas correspondientes al lenguaje PHP. El resto, lo enviara sin ms, ya que asumir que se trata de cdigo HTML absolutamente comprensible por el navegador. Hay cuatro conjuntos de etiquetas que delimitan el cdigo PHP: <?php y ?> <? y ?> <% y %> <script language="php"> y </script> De estos cuatro tipos de etiquetas, slo dos, <?php. . .?> y <script language="php">. . .</script>, estn siempre disponibles. El resto pueden ser configuradas en el fichero php.ini para ser o no aceptadas por el intrprete. Estructura PHP: Si abres un archivo PHP vers que tiene cierto parecido a un archivo HTML. Esto es debido a que el cdigo PHP se incrusta dentro del cdigo HTML. nicamente ser necesario introducir un par de marcas para establecer el principio del cdigo y el final. Veamos un ejemplo: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Documento sin t&iacute;tulo</title> </head> <body> <table> <tr> <td> <?php echo "Hola mundo!"; ?> </td> </tr> </table> </body> </html> Este cdigo podra pegarse en un archivo PHP, guardarse en un servidor que soporte PHP y ejecutarse. El resultado que nos dara al requerirse sera una pgina web con una tabla en la que se podra leer Hola mundo! (la instruccin echo escribe texto en pantalla). Sin embargo, aunque se trate de un archivo PHP puedes ver que se parece muchsimo a un HTML. Slo que en el momento de agregar cdigo de programacin hemos aadido dos etiquetas (una de apertura y otra de cierre) para indicar que lo que se encuentra entre ellas es cdigo PHP y debe ser ejecutado. Estas etiquetas son <?php y ?>, aunque tambin es posible encontrar su forma abreviada <? y ?> por lo que el cdigo anterior se podra sustituir por: <? echo "Hola mundo!"; ?>

JHOSUE PEDRO CUEVA MAMANI

15

MOSTRAR LA INFORMACIN ECHO Esta instruccin PHP da salida a lo que haya escrito a continuacin. Realmente echo() no es una funcin (es una sentencia o instruccin del lenguaje) de modo que no se requiere el uso de los parntesis. PRINT print ( string $arg )int Muestra el parmetro arg. print no es realmente una funcin (es un constructor de lenguaje) por lo tanto no es necesario usar parntesis para indicar su lista de argumentos. PRINTF La funcin printf () emite una cadena con formato. Los arg1, arg2, + + parmetros se insertan en porcentaje (%) signos en la cadena principal. Esta funcin se activa "paso a paso". En el signo% en primer lugar, arg1 se inserta, en el signo% en segundo lugar, arg2 se inserta. printf(format,arg1,arg2,arg++)

USO DE VARIABLES LOCALES Una de las cosas que ms difcil se hace de dominar es el mbito donde definimos las cosas en Flash. En Flash, algunas cosas son definidas solo dentro de una lnea de tiempo, mientras que otras son definidas para toda la pelcula. Incluso podemos definir variables que nicamente actuen dentro de una funcin. Cuando declaramos correctamente una variable dentro de una funcin, la variable es lo que conocemos como una variable local. Este tipo de variables no persisten despus de que la funcin sea llamada. Por ejemplo, esta funcin declara e incializa una variable llamada Mensaje. La variable es definida dentro de la funcin testAmbito, por lo que si intentamos hacer un trace() para mostrar el valor de la variable, fuera de la funcin, el resultado ser indefinido: function testAmbito() { var Mensaje = "Hola"; } testAmbito(); trace(Mensaje); En una aplicacin grande, el uso de variables locales ayuda para prevenir posibles conflictos entre variables con el mismo nombre. Est claro que podemos nombrar las variables con nombres diferentes pero no suele ser lo habitual recordar el nombre de todas las variables que ya hemos declarado. Otra posible razn para usar variables locales es para una mejor gestin de memoria de la aplicacin. Cuando utilizamos variables locales, liberamos memoria cuando stas desaparecen. Los parmetros de una funcin tambin son tratados como variables locales. Tienen su mbito dentro de la funcin y no fuera. function testAmbito(Mensaje) { trace(Mensaje); } testAmbito("Hola"); // Muestra: Hola trace(Mensaje); // Muestra: indefinido En el siguiente ejemplo declaramos una variable local, que al estar definida fuera de la funcin tiene

JHOSUE PEDRO CUEVA MAMANI

16

como mbito la lnea de tiempo donde est definida. function testAmbito() { trace(Mensaje); } var Mensaje = "Hola"; testAmbito(); // Muestra: Hola Al definir una variable como local dentro de una lnea de tiempo, significa que sta puede ser llamada desde dentro de la misma lnea de tiempo con su nombre o fuera de su lnea de tiempo especificando el path (o trayectoria) para llegar a ella. Por ejemplo: this._parent.Mensaje = "Hola" Otra forma de declarar variables o funciones de forma global y que sern accesibles en toda la pelcula. Por ejemplo: _global.calculoArea = function(a, b) { var nArea = a * b; trace (nArea); };

ALCANCE DE LAS VARIABLES Variables estticas Normalmente las variables declaradas dentro de una funcin nacen (se inicializan) cuando la funcin es llamada, y se borran (mueren) cuando se sale de la funcin. Observa el siguiente ejemplo: <?php Function Contador () { $a = 0; echo $a; $a++; //aumentamos en uno el valor de a } ?> Cada vez que llamamos a esta funcin (tpico contador) se asigna a $a el valor 0 y se vuelca a pantalla "0". La sentencia $a++, que a continuacin incrementa la variable, no servira de nada, ya que en cuanto la funcin termina la variable $a desaparece, y si volvemos a llamar la funcin, $a se inicializa de nuevo con valor "0". Para hacer una funcin til para contar, la variable $a debe declararse como esttica. Una variable esttica existe slo en el mbito local de la funcin, pero no pierde su valor cuando la ejecucin del programa abandona este mbito: <?php Function Contador () { static $a = 0; echo $a; $a++; //aumentamos en uno el valor de a } ?> Ahora, cada vez que llamamos a la funcin Contador(), se volcar en pantalla el valor de $a y se incrementar, conservando este ltimo valor para la prxima vez que sea llamada, es decir, sin inicializar la variable cada vez. Por supuesto que las variables estticas solo conservan su valor actualizado durante

JHOSUE PEDRO CUEVA MAMANI

17

la lectura de la pgina. Si salimos de la pgina y volvemos a entrar, partimos del valor inicial. OPERADORES ARITMTICOS Los operadores aritmticos son los ms simples y son: $a + $b -> sumar $a - $b -> restar $a * $b -> multiplicar $a / $b -> dividir $a % $b -> resto Fijmonos un momento en los ltimas dos: El resultado de la divisin no se aproxima al entero que est ms cerca sino que da todo el nmero. El nmero de los caracteres despus del punto se define en el archivo php3.ini en la lnea: precisin = 14 Por lo tanto, saldrn slo 14 nmeros despus de la coma, siempre que los haya, como en el ejemplo: $a = 12; $b = 5; $c = $a / $b; echo $c; el resultado es 2.4 y se visualizar precisamente como 2.4, no como 2.40000000000000. Por lo tanto, los 14 decimales se visualizan slo si existen y no indiscriminadamente como ceros intiles. el resto se da por s solo, sin el resultado de la divisin misma. Si en el ejemplo anterior hubiramos utilizado "%" en vez de "/", el resultado habra sido "2".

TIPOS DE DATOS

A la hora de programar tendremos que hacer uso de multitud de datos, estos datos no sern ms que informacin ya descodificada y concreta.
Por ejemplo 2 es un dato porque es informacin, est descodificada (conocemos si significado) y es concreta ya que tiene sentido por s sola. PHP dispone distintos tipos de estos datos que es necesario conocer para poder programar con garantas. Ninguno de ellos es difcil de asimilar, aunque unos son ms simples que otros. Tambin hay que decir que si asignamos una variable a un tipo de dato, sta adquirir en su denominacin la del tipo de dato. Por ejemplo, si asignamos a una variable un dato booleano sta se llamar variable de tipo booleano. Booleanos: Es el tipo de dato ms simple que existe, ya que solo puede tener dos valores posibles que se conocen como true o false. El primer valor significa verdadero, y el segundo falso. Para hacer una variable de este tipo tan solo hay que escribir su nombre y asignarle o true o false; ya que

JHOSUE PEDRO CUEVA MAMANI

18

stos son los dos nicos datos booleanos que existen. <?php $guapo = true; $simpatico = false; ?> Cabe decir tambin que el valor false equivale al nmero 0; mientras que el valor true a cualquier otro nmero. No obstante, se suele utilizar el nmero 1 para true. Enteros: Como en matemticas, este tipo de dato se refiere a nmeros enteros; es decir, a nmeros que no son decimales, sin que poseen unidades enteras. Tambin se incluye el cero y los nmeros negativos. <?php $cero = 0; $ocho = 8; $ocho = -3; ?> Decimales: Los decimales tambin son un tipo de datos en PHP, son similares a los enteros pero con la particulariedad de soportar decimales. Estos decimales hay que separarlos del nmero entero por un punto, y no por una coma como estamos acostumbrados en matemticas. <?php $mi_nota = 7.5; $tu_nota = 8.67; $mi_negativo = -2.32; ?> Cadenas: Este tipo de dato, las cadenas, es uno de los ms importantes ya que es un tipo de dato que se tiene que utilizar muy a menudo en programacin PHP. Una cadena es una sucesin de caracteres. Estos pueden ser letras, nmeros, signos de puntuacin... Para escribir cadenas es necesario ponerlas entre comillas, con la posibilidad que sean comillas simples o dobles. Vemos un ejemplo: <?php $mi_cadena = 'hola, mundo.'; ?> CONSTANTES PHP ofrece un largo nmero de constantes predefinidas a cualquier script en ejecuccin. Muchas de estas constantes, sin embargo, son creadas por diferentes extensiones, y slo estarn presentes si dichas extensiones estn disponibles, bien por carga dinmica o porque han sido compiladas. Hay ocho constantes predefinidas que cambian dependiendo de donde son usadas. Por ejemplo el valor de __LINE__ depende en la lnea que se use en el script. Estas constantes especiales son sensibles a maysculas y son las siguientes:

Varias constantes PHP "mgicas"


Nombre Descripcin

JHOSUE PEDRO CUEVA MAMANI

19

Varias constantes PHP "mgicas"


Nombre __LINE__ Descripcin Lnea actual en el fichero. Ruta completa y nombre del fichero. Si se usa dentro de un include, devolver el nombre del fichero del include. Desde PHP 4.0.2, __FILE__ siempre contiene la ruta absoluta con symlinks resueltos, en otras versiones contena la ruta relativa segn las circunstancias. Directorio del fichero. Si se utiliza dentro de un include, devolver el directorio del fichero includo. Esta constante es igual que dirname(__FILE__). El nombre del directorio no lleva la barra inicial a no ser que est en el directorio root. (Fue aadida en PHP 5.3.0) Nombre de la funcin. (Aadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve el nombre de la funcin donde fue declarada (sensible a maysculas). En PHP 4 su valor siempre es en minsculas. Nombre de la clase. (Aadida en PHP 4.3.0) Desde PHP 5 esta constante devuelve el nombre de la clase donde fue declarada (sensible a maysculas). En PHP 4 su valor siempre es en minsculas. El nombre de la clase incluye el namespace declarado en (p.e.j. Foo\Bar). Tenga en cuenta que a partir de PHP 5.4 __CLASS__ tambin funciona con traits. Cuando es usado en un mtodo trait, __CLASS__ es el nombre de la clase del trait que est siendo utilizado. El nombre del trait. (Aadido en PHP 5.4.0) A partir de PHP 5.4 esta constante devuelve el trait que fu declarado (sensible a maysculas y minsculas). El nombre del trait incluye el namespace si alguno fu declarado en (p.e.j. Foo\Bar). Nombre del mtodo de la clase. (Aadida en PHP 5.0.0.) Nombre del mtodo devuelto donde fue declarada. (Sensible a maysculas).

__FILE__

__DIR__

__FUNCTION__

__CLASS__

__TRAIT__

__METHOD__

Nombre del espacio de nombres actual (sensible a maysculas). Esta constante se __NAMESPACE__ define en tiempo de compilacin (Aadida en PHP 5.3.0) El nombre del namespace actual (sensible a maysculas).

VARIABLES ESTTICAS Y GLOBALES Variables globales Veremos ahora una herramienta muy particular, que no es conveniente utilizar ms que como excepcin. La declaracin de una variable como global, le permite a una funcin acceder a una variable que est definida en el programa principal. Un comercio realiza descuentos con la siguiente regla: Si la compra no alcanza los $100, no se realiza ningn descuento. Si la compra est entre $100 y $499,99, se descuenta un 10%.

JHOSUE PEDRO CUEVA MAMANI

20

Si la compra supera los $500, se descuenta un 15%. Dado el monto bruto de una compra, indicar cunto debe pagar el cliente. Hacer la funcin descuento, utilizando el siguiente cdigo. Las variables estticas Cuando se llama a una funcin, normalmente se desea un buen comienzo limpio, sin "sobras" de la llamada anterior. Y eso es lo que hay por defecto en PHP. Sin embargo, no puede haber excepciones en las que desea que los datos que deben conservarse y que usted puede hacer que el uso de: NI una variable global que se comparte con el principal script PHP y mantenido a lo largo de su recorrido O una variable esttica que se mantiene por la funcin, mientras se ejecuta un script, pero no se comparte con el cdigo principal. El uso tpico de una variable esttica es en lo que llamamos un iterador - una funcin que los pasos a travs de una serie de resultados, lo que genera el valor siguiente en la secuencia cada vez que se llama. Aqu est un ejemplo de cdigo: <?php $walrus = 77; function nextmeal () { static $walrus = 0; $munch = array("fish","seagull","penguin","ice"); $walrus++; $walrus %= count($munch); return $munch[$walrus]; } for ($k=0; $k<10; $k++) { print "What's for dinner - ".nextmeal()."?<br />"; } print $walrus; # Just to show you this is a different walrus! ?> Y aqu estn los resultados: What's for dinner - seagull? What's for dinner - penguin? What's for dinner - ice? What's for dinner - fish? What's for dinner - seagull? What's for dinner - penguin? What's for dinner - ice? What's for dinner - fish? What's for dinner - seagull? What's for dinner - penguin?

2.- SESION: FORMULARIOS DE HTML


Etiqueta form Dentro de la etiqueta <form> se encuentra el formulario. Los usuarios interaccionan con los formularios a travs de las llamados controles. Action: Especifica el URL del script CGI que debe tratar los datos recopilados por el formulario.
Este es el enlace entre el formulario y el script CGI.

Method: Determina el mtodo a utilizar para acceder al URL determinado en el campo ACTION.

JHOSUE PEDRO CUEVA MAMANI

21

Existen dos mtodos, GET (el defecto) y POST (basados en los mtodos HTTP). En los casos generales, se usar GET cuando tengamos formularios muy simples, y POST cuando los formularios tengan muchos campos, ya que GET podra no ser capaz de pasar todos los datos al servidor.

Enctype: Especifica el tipo de datos utilizado para codificar los pares nombre/valor durante el
transporte. Por defecto es igual a application/x-www-form-urlencoded y no se suele especificar.

Name: Le asigna un nombre al elemento que luego puede ser usado en scripts o en hojas de estilo.

Elementos de entrada Entrada textual


Existen tres tipos de entrada textual que pueden recolectar informacin como nombres, comentarios, opiniones, etc.

Entrada de lnea
Este control recolecta informacin textual en una sola lnea, lo que significa que el usuario no podr utilizar la tecla "enter" para ir a la siguiente lnea (en la mayora de los formularios, la tecla "enter" presionada en uno de estos campos, enva el formulario que lo contiene). Este control es insertado en documentos HTML usando el tag HTML input con el valor "text" en su atributo "type". El valor inicial, mostrado cuando la pgina se carga, puede ser definido usando el atributo "value". Cdigo <formmethod="post" action="agente.php"> Ingresa un texto: <input name="ingresatexto" type="text" value="Por favor, ingresa aqu" /> </form> Vista Ingresa un texto:
Por favor, ingresa

El valos pasado al agente procesador ser el texto ingresado por el usiario, es decir, el contenido de la caja de texto.

Entradas de password
Este control acta exactamente como el de entrada de lnea con la excepcin de que "esconde" los caracteres ingresados mostrndolos como puntos o asteriscos para evitar que los usuarios ven su contenido. Es definido utilizando el valor "pass" en el atributo "type", y su valor inicial puede ser definido usando el atributo "value". Es comnmente usado para el ingreso de contraseas. Cdigo <form method="post" action="agente.php"> Ingresatucontrasea: <input name="contrasena" type="password" value="123456" /> </form> Vista Ingresa tu contrasea: El valor pasado al agente procesador ser el texto ingresado por el usuario, es decir, el contenido de la caja de texto.

Entrada de multi-lnea
Este control permite a los usuarios ingresar texto en una o ms lneas. se inserta utilizando el tag HTML textarea y puede ser usado para recolectar reportes, comentarios, cartas, etc. En este tag, el contenido ser el texto inicial. Cdigo <formmethod="post" action="agente.php">

JHOSUE PEDRO CUEVA MAMANI

22

Ingresa tus comentarios:<br /><textareaname="comentarios" rows="2" cols="30">...Tus comentarios aqu...</textarea> </form> Vista Ingresa tus comentarios:
...Tus comentarios aqu...

Nota que los tributos "rows" y "cols" establecen las dimensiones de la caja de texto y son requeridos por algunos DTDs. El valor pasado al agente procesador ser el texto ingresado, es decir, el contenido de la caja de texto.

Opciones
Casillas de verificacin: Una casilla de verificacin es una opcin simple que puede tomar uno de dos valores: "marcado" "no marcado" ("checked" "unchecked"). Las casillas de verificacin pueden ser agrupadas visualmente formando listas de opciones, pero cada una de ellas es tratada individualmente. Este control es insertado mediante el tag HTML input con el valor "checkbox" en su atributo "type". Inicialmente, la casilla aparece sin marcar a menos que lo especifique de otra forma usando el atributo booleano (verdadero o false) "checked". Recuerda, que para lograr un cdigo correcto en XHTML necesitas definir al atributo booleano con sus nombres como valores (por ejemplo, checked="checked").Cdigo <form method="post" action="agente.php"> Seleccionatusintereses:<br /> <input name="cbipeliculas" type="checkbox" />Pelculas<br /> <input name="cbilibros" type="checkbox" checked="checked" />Libros<br /> <input name="cbiinternet" type="checkbox" />Internet </form> Vista Selecciona tus intereses: Pelculas Libros Internet Botones de radio: Los botones radio trabajan de la misma forma que las casillas de verificacin con una pequea diferencia: los botones radio que comparte el mismo nombre conforman un grupo de opciones donde el usuario no puede seleccionar ms de una a la vez. Esto significa que cuando un usuario elige una opcin, las dems son automticamente deseleccionadas. El valor inicial para el grupo depende del navegador (la mayoria muestra todos los controles sin marcar). Esto puede ser cambiado usando el atributo booleano "checked". <form method="post" action="agente.php"> Seleccionatuactividadfavorita:<br /> <input name="intereses" type="radio" value="rbipeliculas" />Pelculas<br /> <input name="intereses" type="radio" value="rbilibros" />Libros<br /> <input name="intereses" type="radio" value="rbiinternet" checked="checked" />Internet </form>

JHOSUE PEDRO CUEVA MAMANI

23

Vista Selecciona tu actividad favorita: Pelculas Libros Internet Para botones radio el valor pasado al agente procesador es el contenido del atributo "value" de la opcin seleccionada, lo que significa que una lista con muchos botones radio solo pasar un valor. Listas: Estas listas pueden ser construidas utilizando tres elementos: el elemento HTML select (contenedor principal), el elemento HTML option (opcin simple) y el elemento HTML optgroup (grupo de opciones). El ltimo elemento es el nico prescindible para construir este tipo de listas. Los controles de lista pueden ser usadas para recolectar informacin al igual que los botones radio (slo una opcin) o como casillas de verificacin (mltiples opciones), dependiendo de la presencia del atributo booleano "multiple". Como en los controles anteriores, el valor inicial de los elementos HTML option puede ser establecido a "seleccionado" usando el atributo booleano "selected". Cdigo <formmethod="post" action="agente.php"> Elije solo una opcin, como en los botones radio: <selectname="entradalista"> <optgrouplabel="Entradas textuales"> <option>Entrada de lnea</option> <optionselected="selected">Entrada de contrasea</option> <option>Entrada multi-lnea</option> </optgroup> <optgrouplabel="Opciones"> <option>Casillas de verificacin</option> <option>Botones radio</option> <option>Listas</option> </optgroup> </select> <br /> Elije tantas opciones como quieras, como con casillas de verificacin (manteniendo presionada la tecla "Ctrl"):<br /> <selectname="entradalista[]" multiple="multiple"> <optgrouplabel="Entradas textuales"> <option>Entrada de lnea</option> <option>Entrada de contrasea</option> <option>Entrada multi-lnea</option> </optgroup> <optgrouplabel="Opciones"> <optionselected="selected">Casillas de verificacin</option> <option>Botones radio</option> <option>Listas</option> </optgroup> </select> </form> Vista Elije solo una opcin, como en los botones radio: Elije tantas opciones como quieras, como con casillas de verificacin (manteniendo presionada la tecla
Entrada de contrasea

JHOSUE PEDRO CUEVA MAMANI

24

"Ctrl"):
Entrada de lnea

Para la primera lista sin el atributo "multiple", el valor pasado al agente procesador ser la opcin seleccionada, pero para el segundo ejemplo el valor pasado ser un arreglo (array) con los valores de las opciones seleccionadas. Es por esto que, para listas con el atributo "multiple" presente, debes agregar los corchetes("[]") al final del nombre del tag HTML select. El valor individual pasado en ambos casos es el contenido del atributo "value" si el mismo est presente, y el contenido del elemento si no (de las opciones seleccionadas).

Botones

Un botn es un dispositivo primordialmente diseado para realizar una accin con el formulario que lo contenga. Existen dos tipos bsicos de botones: para enviar el formulario y para reestablecerlo (devuelve todos los campos a sus valores iniciales). Existe slo un tipo ms de botn que no posee una accin predefinida (la misma debe ser especificada con un lenguage del lado cliente). Botones de envi Este tipo de botones enva automticamente el formulario en que se encuentra cuando es presionado. Es insertado utilizando el tag HTML input con el valor "submit" en su atributo "type".
<form method="post" action="agente.php"> <input type="submit" value="Enviaresteformulario" /> </form>
Enviar este formulario

Botones de restablecimiento: Este tipo de botones reestablecen los controles en un formulario a sus valores iniciales cuando es presionado. Son insertados con el tag HTML input con el valor "reset" en su atributo "type".
<form method="post" action="agente.php"> <input type="text" name="texto1" value="Valor pordefecto" /><br /> <input type="checkbox" name="reglas" checked="checked" />Aceptolasrelgas<br /> <input type="reset" value="Reestablecertodos los campos a su valor predeterminado" /> </form>
Valor por defe

Acepto las relgas


Reestablecer todos los campos a su valor predeterminado

Botones de imagen Los botones de imagen funcionan exactamente como los botones de envo con la nica diferencia que los de imagen son representados visualmente con la imagen JHOSUE PEDRO CUEVA MAMANI

25

especificada en el atributo "src". Otra particularidad es stos envan adems las coordenadas donde ha ocurrido el click cuando el formulario fue enviado, tomadas desde la esquina superior izquierda del botn (por ejemplo, para un botn de imagen llamado "boton1"las coordenadas sern enviadas en la forma "boton1.x" y "boton1.y"). <form method="post" action="agente.php"> <input type="image" src="/img/p/tutorials/forms/3/submit.png"> </form>

Botones de contenido
Los botones de contenido pueden ser usados como botones de envo o reestablecimiento, o bien pueden no tener ninguna accin preestablecida (dependiendo del valor de su atributo "type"). Pero su caractersticas es que permite a los autores inserta contenido dentro de los mismos. Esto significa que una porcin de cdigo HTML puede ser mostrado dentro del botn (vnculos, prrafos, texto en negrita, imgenes, etc.).

<form method="post" action="agente.php"> <button type="button"> El <b>tag HTML button</b><br /> permite contenido. </button> </form> El tag HTML button permite contenido.

Entrada de archivos La entrada de archivos puede ser utilizada para subir archivos al servidor. Este control muestra una caja de texto donde el usuario debe especificar la ruta del archivo (que ser adjuntado localmente por el navegador) que ser enviado al servidor. De este modo los autores pueden pedir a los visitantes que enven archivos de sus computadoras a travs de la pgina. El control habitualmente muestra un botn para elegir el archivo visualmente. Nota que para los formularios con subida de archivos debes especificar el valor "multipart/form-data" en el atributo "enctype" del tag HTML form, de otro modo, el archivo no ser enviado. <form method="post" action="agente.php" enctype="multipart/form-data"> Ingresa el archivo: <input name="imagen" type="file" /> </form>

JHOSUE PEDRO CUEVA MAMANI

26

Etiquetando elementos Las etiquetas de los elementos pueden hacer que tu pgina lozca mejor y sea ms funcional en agentes de usuario visuales (cuando un visitante hace click en la etiqueta, el enfoque pasa automticamente al control asociado), pero stas sin duda harn una gran diferencia para personas con discapacidades o con navegadores no visuales. Una etiqueta establece una relacin entre un control y una porcin de texto (que se supone, establece un "ttulo" para el control). Las etiquetas pueden insertarse con el elemento HTML label y son asociados a los controles mediante el atributo "for", que debe coincidir con el valor del atributo "id" en el control.
<form method="post" action="agente.php"> <label for="idnombre">Nombre:</label> <input type="text" id="idnombre" name="nombre" /><br /> <label for="idapellido">Apellido:</label> <input type="text" id="idapellido" name="apellido" /><br /><br /> Gnero:<br /><input type="radio" id="idmasculino" name="genero" /><label for="idmasculino">Masculino</label><br /> <input type="radio" id="idfemenino" name="genero" /><label for="idfemenino">Femenino</label> </form>

Nombre: Apellido: Gnero: Masculino Femenino ENVI Y RECEPCIN DE DATOS El lenguaje PHP nos proporciona una manera sencilla de manejar formularios, Permitindonos de esta manera procesar la informacin que el usuario ha introducido. Al disear un formulario debemos indicar la pgina PHP que procesar el formulario, as Como en mtodo por el que se le pasar la informacin a la pgina.
<html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de procesado de formularios</H1> Introduzca su nombre: <FORM ACTION="procesa.php" METHOD="GET"> <INPUT TYPE="text" NAME="nombre"><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html>

JHOSUE PEDRO CUEVA MAMANI

27

3.-SESION: SENTENCIAS DE CONTROL I


Estructuras condicionales
Todo script PHP est construido en base a una serie de sentencias. Una sentencia puede ser una asignacin, una llamada de funcin, un ciclo, una sentencia condicional o incluso una sentencia que no hace nada (una sentencia vaca). Las sentencias generalmente finalizan con un punto y coma. Adicionalmente, las sentencias pueden agruparse en un conjunto de sentencias, encapsulndolas entre corchetes. Un grupo de sentencias es una sentencia por s misma tambin.

if
El constructor if es una de las caractersticas ms importantes de muchos lenguajes, incluido PHP. Permite la ejecucin condicional de fragmentos de cdigo. PHP dispone de una estructura if que es similar a la de C:
if (expr) sentencia

Como se describe en la seccin sobre expresiones, la expresin es evaluada a su valor booleano. Si la expresin se evala como TRUE, PHP ejecutar la sentencia y si se evala como FALSE la ignorar. Ms informacin sobre qu valores evalan como FALSE se puede encontrar en la seccin 'Convirtiendo a booleano'. El siguiente ejemplo mostrara a es mayor que b si $a es mayor que $b:
<?php if ($a > $b) { echo "a es mayor que b"; } ?>

A menudo se desea tener ms de una sentencia para ser ejecutada condicionalmente. Por supuesto, no hay necesidad de envolver cada sentencia con una clusula if. En cambio, se pueden agrupar varias sentencias en un grupo de sentencias. Por ejemplo, este cdigo mostrara a es mayor que b si $a es mayor que $b y entonces asignara el valor de $a a $b:
<?php if ($a > $b) { echo "a es mayor que b"; $b = $a; } ?>

Las sentencias if pueden anidarse dentro de otra sentencias if infinitamente, lo cual provee completa flexibilidad para la ejecucin condicional de diferentes partes del programa.

JHOSUE PEDRO CUEVA MAMANI

28

else
Con frecuencia se desea ejecutar una sentencia si una determinada condicin se cumple y una sentencia diferente si la condicin no se cumple. Esto es para lo que sirve else. El else extiende una sentencia if para ejecutar una sentencia en caso que la expresin en la sentencia if se evale como FALSE. Por ejemplo, el siguiente cdigo deber mostrar a es mayor que b si $a es mayor que $b y a NO es mayor que b en el caso contrario:
<?php if ($a > $b) { echo "a es mayor que b"; } else { echo "a NO es mayor que b"; } ?>

La sentencia else slo es ejecutada si la expresin if es evaluada como FALSE y si hay algunas expresiones elseif - slo se ejecuta si tambin todas son evaluadas como FALSE.

elseif/else if
elseif, como su nombre lo sugiere, es una combinacin de if y else. Del mismo modo que else, extiende una sentencia if para ejecutar una sentencia diferente en caso que la expresin if original se evale como FALSE. Sin embargo, a diferencia de else, esa expresin alternativa slo se ejecutar si la expresin condicional del elseif se evala como TRUE. Por ejemplo, el siguiente cdigo debe mostrar a es mayor que b, a es igual que b o a es menor que b:
<?php if ($a > $b) { echo "a es mayor que b"; } elseif ($a == $b) { echo "a es igual que b"; } else { echo "a es menor que b"; } ?>

Puede haber varios elseif dentro de la misma sentencia if. La primera expresin elseif (si hay alguna) que se evale como TRUE sera ejecutada. En PHP tambin se puede escribir 'else if' (en dos palabras) y el comportamiento sera idntico al de 'elseif' (en una sola palabra). El significado sintctico es ligeramente diferente (si se est familiarizado con C, este es el mismo comportamiento) pero la conclusin es que ambos resultaran tener exactamente el mismo comportamiento. La sentencia elseif es ejecutada solamente si la expresin if precedente y cualquiera de las expresiones elseif precedentes son evaluadas como FALSE, y la expresin elseif JHOSUE PEDRO CUEVA MAMANI

29

actual se evala como TRUE. Nota: Tenga en cuenta que elseif y else if sern considerados exactamente iguales slamente cuando se utilizan corchetes como en el ejemplo anterior. Al utilizar los dos puntos para definir las condiciones if/elseif, no debe separarse else if en dos palabras o PHP fallar con un error del interprete.
<?php /* Mtodo incorrecto: */ if($a > $b): echo $a." es mayor que ".$b; else if($a == $b): // No compilar echo "La lnea anterior provoca un error del interprete."; endif;

/* Mtodo correcto: */ if($a > $b): echo $a." es mayor que ".$b; elseif($a == $b): // Tenga en cuenta la combinacin de las palabras. echo $a." igual ".$b; else: echo $a." no es ni mayor que ni igual a ".$b; endif; ?>

switch
La sentencia switch es similar a una serie de sentencias IF en la misma expresin. En muchas ocasiones, es posible que se quiera comparar la misma variable (o expresin) con muchos valores diferentes, y ejecutar una parte de cdigo distinta dependiendo de a que valor es igual. Para esto es exactamente la expresin switch. Nota: Cabe sealar que a diferencia de algunos otros lenguajes, la sentencia continue se aplica a switch y acta de manera similar a break. Si se tiene un switch dentro de un bucle y se desea continuar a la siguiente iteracin de del ciclo exterior, se utiliza continue 2. Nota: Tener en cuenta que switch/case hace comparaciones flexibles. Los dos ejemplos siguientes son dos formas diferentes de escribir lo mismo, uno con una serie de sentencias if y elseif, y el otro usando la sentencia switch: Ejemplo de Estructura switch
<?php if ($i == 0) { echo "i es igual a 0"; } elseif ($i == 1) {

JHOSUE PEDRO CUEVA MAMANI

30

echo "i es igual a 1"; } elseif ($i == 2) { echo "i es igual a 2"; } switch ($i) { case 0: echo "i es igual a 0"; break; case 1: echo "i es igual a 1"; break; case 2: echo "i es igual a 2"; break; } ?>

4.- SESION: SENTENCIAS DE CONTROL II


Estructuras repetitivas

while
Los bucles while son el tipo ms sencillo de bucle en PHP. Se comportan igual que su contrapartida en C. La forma bsica de una sentencia while es:
while (expr) sentencia

El significado de una sentencia while es simple. Le dice a PHP que ejecute las sentencias anidadas, tanto como la expresin while se evale como TRUE. El valor de la expresin es verificado cada vez al inicio del bucle, por lo que incluso si este valor cambia durante la ejecucin de las sentencias anidadas, la ejecucin no se detendr hasta el final de la iteracin (cada vez que PHP ejecuta las sentencias contenidas en el bucle es una iteracin). A veces, si la expresin while se evala como FALSE desde el principio, las sentencias anidadas no se ejecutarn ni siquiera una vez. Al igual que con la sentencia if, se pueden agrupar varias instrucciones dentro del mismo bucle while rodeando un grupo de sentencias con corchetes, o utilizando la sintaxis alternativa:
while (expr): sentencias ... endwhile;

Los siguientes ejemplos son idnticos y ambos presentan los nmeros del 1 al 10:
<?php /* ejemplo 1 */

JHOSUE PEDRO CUEVA MAMANI

31

$i = 1; while ($i <= 10) { echo $i++; /* el valor presentado sera $i antes del incremento (post-incremento) */ } /* ejemplo 2 */ $i = 1; while ($i <= 10): echo $i; $i++; endwhile; ?>

do-while
Los bucles do-while son muy similares a los bucles while, excepto que la expresin verdadera es verificada al final de cada iteracin en lugar que al principio. La diferencia principal con los bucles while es que est garantizado que corra la primera iteracin de un bucle do-while (la expresin verdadera slo es verificada al final de la iteracin), mientras que no necesariamente va a correr con un bucle while regular (la expresin verdadera es verificada al principio de cada iteracin, si se evala como FALSE justo desde el comienzo, la ejecucin del bucle terminara inmediatamente). Hay una sola sintaxis para bucles do-while:
<?php $i = 0; do { echo $i; } while ($i > 0); ?>

El bucle de arriba se ejecutara exactamente una sola vez, ya que despus de la primera iteracin, cuando la expresin verdadera es verificada, se evala como FALSE ($i no es mayor que 0) y termina la ejecucin del bucle. Los usuarios avanzados de C pueden estar familiarizados con un uso distinto del bucle do-while, para permitir parar la ejecucin en medio de los bloques de cdigo, mediante el encapsulado con do-while (0), y utilizando la sentencia break. El siguiente fragmento de cdigo demuestra esto:
<?php do { if ($i < 5) { echo "i no es lo suficientemente grande"; break; } $i *= $factor; if ($i < $minimum_limit) { break;

JHOSUE PEDRO CUEVA MAMANI

32

} echo "i est bien"; /* procesar i */ } while (0); ?>

for
Los bucles for son los ciclos ms complejos en PHP. Se comportan como sus contrapartes en C. La sintaxis de un bucle for es:
for (expr1; expr2; expr3) sentencia

La primera expresin (expr1) es evaluada (ejecutada) una vez incondicionalmente al comienzo del bucle. En el comienzo de cada iteracin, la expr2 es evaluada, Si es TRUE, el bucle contina y las sentencias anidadas son ejecutadas. Si se evala como FALSE, termina la ejecucin del bucle. Al final de cada iteracin, la expr3 es evaluada (ejecutada). Cada una de las expresiones puede estar vaca o contener mltiples expresiones separadas por comas. En la expr2, todas las expresiones separadas por una coma son evaluadas pero el resultado se toma de la ltima parte. Que la expr2 est vaca significa que el bucle deber ser corrido indefinidamente (PHP implcitamente lo considera como TRUE, como en C). Esto puede no ser tan intil como se pudiera pensar, ya que muchas veces se quiere terminar el bucle usando una sentencia condicional break en lugar de utilizar la expresin verdadera del for. Considere los siguientes ejemplos. Todos ellos muestran los nmeros del 1 al 10:
<?php /* ejemplo 1 */ for ($i = 1; $i <= 10; $i++) { echo $i; } /* ejemplo 2 */ for ($i = 1; ; $i++) { if ($i > 10) { break; } echo $i; } /* ejemplo 3 */

JHOSUE PEDRO CUEVA MAMANI

33

$i = 1; for (; ; ) { if ($i > 10) { break; } echo $i; $i++; } /* ejemplo 4 */ for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++); ?>

Por supuesto, el primer ejemplo parece ser el mejor (o quizs el cuarto), pero se puede encontrar que la posibilidad de usar expresiones vacas en los bucles for resulta til en muchas ocasiones. PHP tambin soporta la sintaxis alternativa de los dos puntos para bucles for.
for (expr1; expr2; expr3): sentencia ... endfor;

Es una cosa comn a muchos usuarios iterar por medio de arrays como en el ejemplo de abajo.
<?php /* * Este es un array con algunos datos que se desean modificar * cuando se corra por el bucle for. */ $people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) ); for($i = 0; $i < sizeof($people); ++$i) { $people[$i]['salt'] = rand(000000, 999999); } ?>

El problema radica en la segunda expresin del for. Este cdigo puede ser lento porque tiene que calcular el tamao del array en cada iteracin. Dado que el tamao nunca cambia, se pueden optimizar fcilmente usando una variable intermedia para almacenar el tamao y usarla en el bucle en lugar del sizeof. El siguiente ejemplo ilustra esto:
<?php $people = Array( Array('name' => 'Kalle', 'salt' => 856412), Array('name' => 'Pierre', 'salt' => 215863) ); for($i = 0, $size = sizeof($people); $i < $size; ++$i)

JHOSUE PEDRO CUEVA MAMANI

34

{ $people[$i]['salt'] = rand(000000, 999999); } ?>

foreach
El constructor foreach proporcina un modo sencillo de iterar sobre arrays. foreach funciona slo sobre arrays y objetos, y emitir un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada. Existen dos sintaxis:
foreach (expresin_array as $valor) sentencias foreach (expresin_array as $clave => $valor) sentencias

La primera forma recorre el array dado por expresin_array. En cada iteracin, el valor del elemento actual se asigna a $valor y el puntero interno del array avanza una posicin (as en la prxima iteracin se estar observando el siguiente elemento). La segunda forma adems asigna la clave del elemento actual a la variable $clave en cada iteracin. Tambin es posible personalizar la iteracin de objetos. Nota: Cuando foreach inicia su ejecucin, el puntero interno del array se pone automticamente en el primer elemento del array. Esto significa que no es necesario llamar la funcin reset() antes de un bucle foreach. Ya que foreach depende el puntero de array interno, cambiar ste dentro del bucle puede conducir a un comportamiento inesperado.

Para poder modificar directamente los elementos del array dentro de bucle, se ha de anteponer & a $valor. En este caso el valor ser asignado por referencia.
<?php $array = array(1, 2, 3, 4); foreach ($array as &$valor) { $valor = $valor * 2; } // $array ahora es array(2, 4, 6, 8) unset($valor); // rompe la referencia con el ltimo elemento ?>

Referenciar $valor slo es posible si el array iterado puede ser referenciado (es decir, si es una variable). El siguiente cdigo no funcionar:

JHOSUE PEDRO CUEVA MAMANI

35

<?php foreach (array(1, 2, 3, 4) as &$valor) { $valor = $valor * 2; } ?>

Advertencia La referencia del $valor y el ltimo elemento del array permanecen an despus del bucle foreach. Se recomienda destruirlos con unset(). Nota: foreach no soporta la capacidad de suprimir mensajes de error usando '@'. Se puede haber notado que las siguientes construcciones son funcionalmente idnticas:
<?php $array = array("uno", "dos", "tres"); reset($array); while (list(, $valor) = each($array)) { echo "Valor: $valor<br />\n"; } foreach ($array as $valor) { echo "Valor: $valor<br />\n"; } ?>

Las siguientes construcciones tambin son funcionalmente idnticas:


<?php $array = array("uno", "dos", "tres"); reset($array); while (list($clave, $valor) = each($array)) { echo "Clave: $clave; Valor: $valor<br />\n"; } foreach ($array as $clave => $valor) { echo "Clave: $clave; Valor: $valor<br />\n"; } ?>

Algunos ejemplos ms para demostrar su uso:


<?php /* Ejemplo 1 de foreach: slo el valor */ $a = array(1, 2, 3, 17); foreach ($a as $v) { echo "Valor actual de \$a: $v.\n"; } /* Ejemplo 2 de foreach: valor (con su notacin de acceso manual impreso con fines ilustrativos) */ $a = array(1, 2, 3, 17);

JHOSUE PEDRO CUEVA MAMANI

36

$i = 0; /* slo para efectos ilustrativos */ foreach ($a as $v) { echo "\$a[$i] => $v.\n"; $i++; } /* Ejemplo 3 de foreach: clave y valor */ $a = array( "uno" => 1, "dos" => 2, "tres" => 3, "diecisiete" => 17 ); foreach ($a as $k => $v) { echo "\$a[$k] => $v.\n"; } /* Ejemplo 4 de foreach: arrays multidimensionales */ $a = array(); $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach ($a as $v1) { foreach ($v1 as $v2) { echo "$v2\n"; } } /* Ejemplo 5 de foreach: arrays dinmicos */ foreach (array(1, 2, 3, 4, 5) as $v) { echo "$v\n"; } ?>

5.- SESION: USO DE SESIONES PHP


El uso de sesiones nos proporciona una forma fcil de guardar datos del usuario sin tener que recurrir a mysql o archivos de texto plano, claro est, de forma temporal. Con sesiones se puede realizar: Saber si un usuario a ingresado en el a travs de login. Cambio de Hoja de estilos CSS por parte del usuario. Cualquier cosa que requiera una variable temporal en relacin a la visita del usuario.

Las sesiones se crean de forma bastante sencilla: <?php session_start(); ?> A travs de esto crearemos una sesin. OJO: Para poder usar la variables de sesin creadas hay que colocar esto al principio de nuestro script en PHP antes de cualquier sentencia HTML o generar

JHOSUE PEDRO CUEVA MAMANI

37

un error. Para definir una variable de sesin (que se guarda de manera temporal, usaremos lo siguiente: <?php session_start() if (isset ($_SESSION["variable"] { echo "Usted ha introducido la variable $_SESSION["variable"] } else { //Remitente de datos (Index.php) <form action="capturador.php" method="POST"> <label for="variable">Introduzca la variable que quiere introducir a la sesin: </label> <input type="text" id="variable"> </form> ?> //Receptor de datos (capturador.php) <?php session_start(); $_POST["nombre"] = $_SESSION["variable"]; ?> <script type="text/javascript"> window.location="index.php"; </script> Con ese script lo que realizamos es lo siguiente: Colocamos un IF en el index y si no existe damos un formulario para crearla. En el capturador recibimos los datos y definimos variable de sesin. Con el cdigo javascript redireccionamos al index sin alterar el PHP.

Como ves es bastante sencillo, ahora solo nos falta borrar esa sesin: <?php session_start(); session_destroy(); header("Location: index.php"); ?> Podramos definir una variable de sesin para un estilo css, seleccionado mediante un form.

6.- SESION: FUNCIONES PREDEFINIDAS EN PHP

7.- SESIN: TABLAS O ARRAYS


Uso de arrays Un array en PHP es realmente un mapa ordenado. Un mapa es un tipo de datos que asocia valores con claves. Este tipo es optimizado para varios usos diferentes; puede ser usado como una matriz real, una lista (vector), una tabla asociativa (una implementacin de un mapa), diccionario, coleccin, pila, cola, y posiblemente ms. Ya que los valores de un array pueden ser otros arrays, rboles y tambin son posibles arrays multidimensionales.

JHOSUE PEDRO CUEVA MAMANI

38

Una explicacin sobre tales estructuras de datos est fuera del alcance de este manual, pero encontrar al menos un ejemplo de cada uno de ellos. Para ms informacin, consulte la extensa literatura que existe sobre este amplio tema. Sintaxis
Especificacin con array() Un array puede ser creado usando el constructor del lenguaje array(). ste toma un cierto nmero de parejas clave =>valor como argumentos.

array( clave =>valor, clave2 =>valor2, clave3 =>valor3, ... )


La coma despus del elemento del array es opcional y se puede omitir. Esto normalmente se hace para arrays de una sola lnea, esto es, es preferible array(1, 2) que array(1, 2, ). Por otra parte, para arrays multilnea, la coma final se usa comnmente, ya que permite la adicin sencilla de nuevos elementos al final. A partir de PHP 5.4 tambin se puede usar la sintaxis de array corta, que reemplaza array() con [].

<?php $array = array( "foo" => "bar", "bar" => "foo", ); // a partir de PHP 5.4 $array = [ "foo" => "bar", "bar" => "foo", ]; ?>

La clave puede ser un integer o un string. El valor puede ser de cualquier tipo. Adems, los siguientes moldeados de tipo en la claveproducir: Strings que contienen integers vlidos sern moldeados a el tipo integer. P.e.j. la clave "8" en realidad ser almacenada como 8. Por otro lado "08" no ser convertido, ya que no es un nmero integer decimal vlido. Floats tambin sern moldeados en integers, lo que significa que la parte fraccionaria se elimina. P.e.j. la clave 8.7 en realidad ser almacenada como 8. Bools son moldeados a integers, tambin, p.e.j. la clave true en realidad ser almacenada como 1 y la clave false como 0. Null ser moldeado a un string vaco, p.e.j. la clave null en realidad ser almacenada como "". Arrays y objects no pueden ser usados como claves. Si lo hace, dar lugar a una advertencia: Illegal offset type. Tipos de declaraciones

JHOSUE PEDRO CUEVA MAMANI

39

Una declaracin es una comprobacin de los caracteres siguientes o anteriores al punto de coincidencia actual que en realidad no consumen carcter alguno. Las declaraciones simples codificadas como \b, \B, \A, \Z, \z, ^ y $ estn descritas anteriormente. Las declaraciones ms complicadas estn codificadas como sub-patrones. Hay dos tipos: aqullas que buscan hacia delante desde punto actual de la cadena objetivo, y aqullas que buscan hacia atrs desde l. Un patrn declaracin es comparado de la forma habitual, excepto que no causa que la posicin actual de coincidencia cambie. Las declaraciones de bsqueda hacia delante comienzan con (?= para declaraciones positivas y con (?! para declaraciones negativas. Por ejemplo, \w+(?=;) coincide con una palabra seguida de un punto y coma, pero no incluye el punto y coma en la coincidencia, y foo(?!bar) coincide con cualquier incidencia de "foo" que no est seguida de "bar". Observe que el patrn aparentemente similar (?!foo)bar no encuentra una incidencia de "bar" que est precedida por algo distinto de "foo"; no encuentra ninguna incidencia de "bar" en absoluto, ya que la declaracin (?!foo) es siempre TRUE cuando los tres caracteres siguientes son "bar". Se necesita una declaracin de bsqueda hacia atrs para conseguir este efecto. Las declaraciones de bsqueda hacia atrs comienzan con (?<= para declaraciones positivas y con (?<! para declaraciones negativas. Por ejemplo, (?<!foo)bar encuentra una incidencia de "bar" que no est precedida por "foo". El contenido de una declaracin de bsqueda hacia atrs est restringido de tal manera que todas las cadenas que se comparen con ella deben tener una longitud fija. Sin embargo, si hay varias alternativas, no es necesario que tengan todas las mismas longitudes fijas. As, (?<=buey|burro) est permitido, pero (?<!toros?|vacas?) produce un error en tiempo de compilacin. Las ramas que se comparan con cadenas de diferente longitud estn permitidas slo en el nivel superior de una declaracin de bsqueda hacia atrs. Esto es una extensin comparado con Perl 5.005, la cual requiere que todas las ramas a comparar tengan la misma longitud de cadena. Una declaracin como (?<=ab(c|de)) no est permitida porque su rama del nivel superior puede coincidir con dos longitudes diferentes, pero es aceptable si se rescribe para usar dos ramas del nivel superior: (?<=abc|abde) La implementacin de las declaraciones de bsqueda hacia atrs es, para cada alternativa, retroceder temporalmente la posicin actual por el ancho fijo y despus intentar coincidir. Si no hay suficientes caracteres antes de la posicin actual, la comparacin est condenada a fallar. Las declaraciones de bsqueda hacia atrs junto con los sub-patrones de una sla aplicacin pueden ser particularmente tiles para comparaciones con los finales de las cadenas; se da un ejemplo al final de la seccin de sub-patrones de una sla aplicacin. Varias declaraciones (de cualquier tipo) pueden producirse en sucesin. Por ejemplo, (?<=\d{3})(?<!999)foo coincide con "foo" precedido de tres dgitos que no sean "999". Ntese que cada una de las declaraciones es aplicada en el mismo punto de la cadena objetivo. Primero, se verifica que los tres caracteres previos son todos dgitos, despus se verifica que esos mismos tres caracteres no sean "999". Este patrn no coincide con "foo" precedido de seis caracteres, los primeros de los cuales son dgitos y los tres ltimos de ellos no son "999". Por ejemplo, no coincide con "123abcfoo". Un patrn que hace eso es (?<=\d{3}...)(?<!999)foo Esta vez, la primera declaracin examina los seis caracteres precedentes, verificando que los tres primeros son dgitos, y despus, la segunda declaracin verifica que los tres caracteres anteriores no son "999". Las declaraciones pueden estar anidadas en cualquier combinacin. Por ejemplo, (?<=(?<!foo)bar)baz coincide con una incidencia de "baz" que est precedida por "bar", la cual a su vez no est precedida por "foo", mientras que (?<=\d{3}...(?<!999))foo es otro patrn que coincide con "foo" precedido por tres dgitos y otros tres caracteres cualesquiera que no sean "999". Los sub-patrones declarativos no son sub-patrones de captura, y no se pueden repetir, ya que no tiene sentido declarar la misma cosa varias veces. Si cualquier tipo de declaracin contiene subpatrones de captura dentro de ella, stos son contados con el propsito de numerar los subpatrones de captura en el patrn completo. Sin embargo, la captura de sub-cadenas se realiza slo

JHOSUE PEDRO CUEVA MAMANI

40

para declaraciones positivas, ya que no tiene sentido para declaraciones negativas. Las declaraciones cuentan para el mximo de 200 sub-patrones entre parntesis.

Tipos de arrays En una variable tenemos la posibilidad de almacerar una estructura de datos compleja; para ello podemos asignarle, en vez de un dato simple, otro ms complejo conocido como array. Estos arrays son datos capaces de albergar otros datos, y poder acceder a ellos a travs de un ndice. En primer lugar tenemos los arrays ms simples, los que solo pueden albergar datos simples y con un ndice numrico (ndice por defecto en PHP). En segundo lugar tenemos los arrays asociativos, cuyo ndice ya no es numrico, sin que tendr los valores que nosotros le demos. Por ltimo tenemos los arrays ms complejos, que se hacen llamar arrays multidimensionales. stos, a su vez, pueden ser asociativos o no serlo. Estos ltimos son los que nos dan la posibilidad realmente de almacerar una estructura compleja de datos en una sola variable.

Funciones til para el uso de arrays array_change_key_case Cambia todas las claves en un array array_chunk Divide un array en fragmentos array_combine Crea un nuevo array, usando una matriz para las claves y otra para sus valores

JHOSUE PEDRO CUEVA MAMANI

41

array_count_values Cuenta todos los valores de un array array_diff_assoc Calcula la diferencia entre arrays con un chequeo adicional de ndices array_diff_key Calcula la diferencia entre arrays usando las keys para la comparacin array_diff_uassoc Calcula la diferencia entre arrays con un chequeo adicional de ndices que se realiza por una funcin de devolucin de llamada suministrada por el usuario array_diff_ukey Calcula la diferencia entre arrays usando una funcin de devolucin de llamada en las keys para comparacin array_diff Calcula la diferencia entre arrays array_fill_keys Llena un array con valores, especificando las keys array_fill Llena un array con valores array_filter Filtra elementos de un array usando una funcin de devolucin de llamada array_flip Intercambia todas las keys con sus valores asociados en un array array_intersect_assoc Calcula la interseccin de arrays con un chequeo adicional de ndices array_intersect_key Calcula la interseccin de arrays usando las keys para la comparacin array_intersect_uassoc Calcula la interseccin de arrays con un chequeo adicional de ndices que se realiza por una funcin de devolucin de llamada array_intersect_ukey Calcula la interseccin de arrays usando una funcin de devolucin de llamada en las keys para la comparacin array_intersect Calcula la interseccin de arrays array_key_exists Verifica si el ndice o clave dada existe en el array array_keys Devuelve todas las claves de un array o un subconjunto de claves de un array array_map Aplica la llamada de retorno especificada a los elementos de los dados array_merge_recursive Une dos o ms arrays recursivamente array_merge Combina dos o ms arrays array_multisort Ordena mltiples arrays, o arrays multi-dimensionales array_pad Rellena un array a la longitud especificada con un valor array_pop Extrae el ltimo elemento del final del array array_product Calcula el producto de los valores en el array array_push Inserta uno o ms elementos al final de un array array_rand Selecciona una o ms entradas aleatorias de un array array_reduce Reduce iterativamente una matriz a un solo valor usando una funcin llamada de retorno array_replace_recursive Reemplaza los elementos de los arrays pasados al primer array de forma recursiva array_replace Remplaza los elementos de los arrays pasados en el primer array array_reverse Devuelve un array con los elementos en orden inverso array_search Busca un valor determinado en un array y devuelve la clave correspondiente en caso de xito array_shift Quita un elemento del principio del array array_slice Extrae una parte de un array array_splice Elimina una porcin del array y la reemplaza con algo array_sum Calcula la suma de los valores en un array array_udiff_assoc Computa la diferencia entre arrays con una comprobacin de indices adicional, compara la informacin mediante una funcin de llamada de retorno array_udiff_uassoc Computa la diferencia entre arrays con una verificacin de

JHOSUE PEDRO CUEVA MAMANI

42

ndices adicional, compara la informacin y los ndices mediante una funcin de llamada de retorno array_udiff Computa la diferencia entre arrays, usando una llamada de retorno para la comparacin de datos array_uintersect_assoc Computa la interseccin de arrays con una comprobacin de ndices adicional, compara la informacin mediante una funcin de llamada de retorno array_uintersect_uassoc Computa la interseccin de arrays con una comprobacin de ndices adicional, compara la informacin y los ndices mediante funciones de llamada de retorno array_uintersect Computa una interseccin de arrays, compara la informacin mediante una funcin de llamada de retorno array_unique Elimina valores duplicados de un array array_unshift Aadir al inicio de un array uno a ms elementos array_values Devuelve todos los valores de un array array_walk_recursive Aplicar una funcin de usuario recursivamente a cada miembro de un array array_walk Aplicar una funcin de usuario a cada miembro de un array array Crea un array arsort Ordena un array en orden inverso y mantiene la asociacin de ndices asort Ordena un array y mantiene la asociacin de ndices compact Crear un array que contiene variables y sus valores count Cuenta todos los elementos de un array o en un objecto current Devuelve el elemento actual en un array each Devolver el par clave/valor actual de un array y avanzar el cursor del array end Establece el puntero intero de un array a su ltimo elemento extract Importar variables a la tabla de smbolos actual desde un array in_array Comprueba si un valor existe en un array usando comparacin flexible key Obtiene una clave de un array krsort Ordena un array por clave en orden inverso ksort Ordena un array por clave list Asigna variables como si fuera un array natcasesort Ordenar un array usando un algoritmo de "orden natural" insensible a maysculas-minsculas natsort Ordena un array usando un algoritmo de "orden natural" next Avanza el puntero interno de un array pos Alias de current prev Rebobina el puntero interno del array range Crear un array que contiene un rango de elementos reset Establece el puntero interno de un array a su primer elemento rsort Ordena un array en orden inverso shuffle Mezcla un array sizeof Alias de count sort Ordena un array uasort Ordena un array con una funcin de comparacin definida por el usuario y mantiene la asociacin de ndices uksort Ordena un array segn sus claves usando una funcin de comparacin definida por el usuario usort Ordena un array segn sus valores usando una funcin de comparacin definida por el usuario

JHOSUE PEDRO CUEVA MAMANI

43

8.- SESION: FUNCIONES DEFINIDAS POR USUARIOS


PHP nos permite embeber sus fragmentos de cdigo dentro de la pgina HTML, es decir, es posible incluir lenguaje PHP en un cdigo HTML. Es por tanto necesario especificar cules son las partes constitutivas del cdigo PHP. Esto se consigue delimitando nuestro cdigo por etiquetas. Como vimos en la unidad anterior, el modo de funcionamiento de una pgina PHP es el siguiente: el servidor va a reconocer la extensin correspondiente a la pgina PHP ( php, php3, php4, phtml,...) y antes de enviarla al navegador va a encargarse de interpretar y ejecutar todo aquello que se encuentre entre las etiquetas correspondientes al lenguaje PHP. El resto, lo enviara sin ms, ya que asumir que se trata de cdigo HTML absolutamente comprensible por el navegador. Hay cuatro conjuntos de etiquetas que delimitan el cdigo PHP:

<?php y ?> <? y ?> <% y %> <script language="php"> y </script>

De estos cuatro tipos de etiquetas, slo dos, <?php. . .?> y <script language="php">. . .</script>, estn siempre disponibles. El resto pueden ser configuradas en el fichero php.ini para ser o no aceptadas por el intrprete. Los siguientes ejemplos muestran las distintas formas de embeber cdigo PHP en HTML:

Funciones con argumentos por valor y referencia

Cuando se declara una variable, el sistema operativo reserva un espacio de memoria en la memoria RAM. Cuando pasamos una variable a una funcin por valor, el sistema operativo reserva otro espacio de memoria distinto, de modo que los cambios que sufra la variable en la funcin no afectarn a la variable de fuera de la funcin, aunque tengan el mismo nombre, ya que son variables distintas con espacios de memoria distintos. Por el contrario, cuando pasamos una variable a una funcin por referencia, realmente no estamos pasando el valor de la variable, sino la posicin del espacio de memoria de esa variable (a esto se le llama puntero). De acuerdo a esto, los JHOSUE PEDRO CUEVA MAMANI

44

cambios que sufra la variable dentro de la funcin afectarn a la variable fuera de la funcin, aunque tengan distintos nombres, ya que es la misma variable. A todo esto se le denomina mbito de las Variables. En todos los ejemplos anteriores hemos pasado las variables por valor, ya que es el modo por defecto en PHP; si queremos pasar una variable por referencia, deberemos anteponer a la variable el signo del ampersand (&). Veamos un ejemplo de ambos sistemas de pasar variables a una funcin:
<?php function suma ($Num1, $Num2) { $Num1 = $Num1 + 2; return $Num1 + $Num2; } $Num1 = 4; $Num2 = 2; echo suma ($Num1, $Num2); //Imprime 8 echo $Num1; //Imprime 4 //Aunque a $Num1 lohemos incrementado en 2 en la funcin //Como el paso de la variable ha sido por valor, ese //Incremento no le ha afectado fuera de la funcin, //De modo que al imprimir $Num1 no ha imprimido 6, sino 4 echo suma (&$Num1, $Num2); //Imprime 8 echo $Num1; //Imprime 6 //En este segundo caso, hemos pasado $Num1 por referencia //De modo que al incrementar $Num1 + 2 en la funcin si //Ha afectado a $Num1 fuera de esta. ?>

Si queremos que un parmetro de una funcin se pase siempre por referencia, deberemos anteponer un ampersand (&) al nombre del parmetro en la definicin de la funcin.

Incluir archivos en php Include Un include es un elemento del lenguaje PHP que nos permite incluir una pgina entera dentro de otra. Por qu usar los includes? El uso de includes es excepcionalmente bueno para ahorrarte trabajo. Puedes hacer un header o un men generico y cargarlo con el include.

JHOSUE PEDRO CUEVA MAMANI

45

Uso: La utilizacin del include es muy simple:


<?php include("tuarchivo.htm"); ?>

Ejemplo: Vamos a usar tres archivos, que fusionaremos. Luego observaremos el codigo de salida. Archivo 1 : header.php : <html> <head> <title> Muestra de includes </title>
</head> <body>

Archivo 2: footer.php : </body> </html> Archivo 3: union.php : <?php include("header.php"); ?> <p> Hola, este es el contenido. </p> <?php include("footer.php"); ?> Y el resultado:
<html> <head> <title> Muestra de includes </title> </head> <body> <p> Hola, este es el contenido. </p> </body> </html>

Nota: Los archivos a inclur no tienen que ser obligatoriamente archivos PHP. Pueden ser de cualquier tipo Diferenciacin: PHP contiene otra funcin con caractersticas muy similares, que es la funcin require(). Las caractersticas y el modo de uso de include y de requiere son idnticas, salvo por una cosa: El mensaje de error generado si falta un documento: Con include, si el nombre de archivo no existe, recibirs una advertencia (warning) y el script seguir. Con requiere en cambio el script se detendr, pues se marcar un error fatal. Ejemplo: Include: <?php

JHOSUE PEDRO CUEVA MAMANI

46

include("noexiste.php"); echo ("Hola. El script sigui!"); ?> Y lo que obtendremos: Warning: include(noexiste.php) [function.include]: failed to open stream: No such file or directory in C:\tutorial\probando.php on line 2 Warning: include() [function.include]: Failed opening 'noexiste.php' for inclusion (include_path='.;C:\php5\pear') in C:\tutorial\probando.php on line 2 Hola. El script sigui!

Require
<?php require("noexiste.php"); echo ("Hola. El script sigui!"); ?>

Y aqui obtenemos:
Warning: require(noexiste.php) [function.require]: failed to open stream: No such file or directory in C:\tutorial\probando.php on line 2 Fatal error: require() [function.require]: Failed opening required 'noexiste.php' (include_path='.;C:\php5\pear') in C:\tutorial\probando.php on line 2

Vemos que con require no se ejecut la siguiente parte del script. Atencin: En php 3 y anteriores, las funciones include y require se diferenciaban por un asunto an mayor: Include poda ser usado condicionalmente, mientras que require se ejecutaba "a la fuerza". Un ejemplo:
<?php $gatito= "Lo odio"; if($gatito=="Lo amo"){ include("condicionado-asi-que-si-no-es-verdad-no-me-incluyo.php"); }else{ require("igual-me-voy-a-incluir-bwahahaha.php"); } ?>

9.- SESION: ENVIO DE EMAIL


Existen muchas formas de configurar la funcin mail () de php, a continuacin os mostramos una manera completa de poder enviar emails con html embebido. Lo cual nos dar la posibilidad de personalizar con estilos css e imgenes enlazadas los emails de respuesta automtica que obedecen a envo de formularios o suscripciones. Primero debemos saber que necesitamos dos archivos, uno html y otro php. En el primero se encontrar el formulario donde haremos la llamada al archivo php para ejecutar el script:

JHOSUE PEDRO CUEVA MAMANI

47

Archivo Html: <form action="mail.php" method="post" name="form" enctype="multipart/form-data"> <input type=text name="email"/>Caja de texto para introducir la variable email <input type="submit" name="Submit" value="Enviar" />Botn de enviar </form> Archivo Php que llamaremos mail.php: Configuramos las variables necesarias y las cabeceras del email ($remitente, $adireccin que ser el valor introducido en el campo de texto email del formulario y que luego utilizaremos en la funcin mail, &asunto del mensaje y las $headers o cabeceras).

<?php $adireccion=$email; $asunto ="Envo emails php "; $remitente="misitio@misitio.com"; $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; $headers .= "From: Mi sitio <$remitente>\r\n"; $headers .= "Reply-To: $remitente\r\n"; $headers .= "Return-path: $remitente\r\n"; $headers .= "Bcc: copiamensaje@misitio.com\r\n"; Esta cabecera enva una copia del mensaje a otra direccin.

Ahora configuramos la variable $contenidomail, donde si os fijis, est embebido todo el cdigo hml que utilizaremos para personalizar nuestro email. Contiene la misma estructura que una pgina html con sus estilos css. $contenidomail= ' <html> <head> <style type="text/css"> #encabezado { background-color:#FFFFFF; border:1px solid #999999; margin:10px; text-align:center; } #cuerpo { background-color: #F4F4F4; border:1px dotted #999999; font: Arial, Helvetica, sans-serif; color:#666666; font-size:10pt; width:600px; } </style> </head> <body> <div id="encabezado"> <a href="http://www.misitio.com" target="_blank"><img

JHOSUE PEDRO CUEVA MAMANI

48

src="http://www.misitio.com/imagenes/logo.gif"></a><br /> </div> <div id="cuerpo"> Cuerpo del mensaje </div> </body> </html> '; Ahora ejecutamos la funcin mail donde se encuentran todas las variables necesarias para el envo del email que configuramos anteriormente. mail ($adireccion, $asunto, $contenidomail,$headers); ?> Finalmente el cdigo html del archivo php en s. <html> <head> <title>Mensaje</title> </head> <body> Mensaje enviado con xito. </body> </html> Con este planteamiento conseguimos enviar un email introducido en el campo de texto de un formulario. Pero si queremos, por ejemplo, que el formulario con otros campos de texto nos lleguen a nuestro correo y se genere otro email de respuesta automtica debemos ejecutar una nueva funcin mail () con las variables para el segundo mensaje de una manera similar, includo en el mismo archivo php. Modificaremos la variable $adireccion=$email por $adireccion="micorreo@micorreo.com"; para el mensaje que queremos recibir. Funcin mail() Una de los problemas ms comunes en el desarrollo de un sistema web es el envo de correos, esto se puede hacer con la funcin mail() que permite enviar email de forma sencilla. La funcin mail() viene por defecto instalada en PHP y no necesita ninguna instalacin adicional.

Sintaxis para enviar Email

JHOSUE PEDRO CUEVA MAMANI

49

La funcin mail() de PHP tiene la sintaxis: mail($email, $subject, $mensaje, $headers); Donde se tiene: $email: Direccin de correo del destinatario. $subject: Subject de correo a enviar. $mensaje: es el cuerpo del mensaje. $headers: encabezados de correo.

Ahora bien acerca del parmetro $header, este es una cadena de texto opcional donde se pueden incluir las direcciones adicionales del email (To, CC, BCC, Reply-To), esta cadena tiene la siguiente forma: 1. 2. 3. 4. 5. From: remitente@dominio.com\r\n To: destino@dominio.com\r\n CC: copia@dominio.com\r\n BCC: copiaoculta@dominio.com\r\n Reply-To: repondera@dominio.com\r\n

Entonces con las definiciones bsicas ahora veamos un ejemplo de envo de correo. Creando el Formulario Primero tenemos que tener un formulario de HTML con los campos tpicos para un formulario de contacto. El formulario para nuestro ejemplo tendr los campos: nombres, empresa, email, telefono y comentarios. <h2>Enviar Email con PHP</h2> <form action="" method="post"> Nombres <input name="nombre" id="nombre" type="text" /><br /> Empresa <input name="empresa" id="empresa" type="text" /><br /> Email <input name="email" id="email" type="text" /><br /> Telfono <input name="telefono" id="telefono" type="text" /><br /> Mensaje <textarea name="mensaje" cols="30" rows="6"></textarea><br /> <button name="btsend" id="btsend" type="submit">Enviar</button> </form> Enviando Email con PHP El siguiente paso es crear un script PHP que reciba los datos del formulario, creamos la cadena de texto que deseamos enviar y finalmente hacemos el envo de email con la funcin mail(). $aviso = ""; if ($_POST['email'] != "") { // email de destino $email = "tuemail@tudominio.com"; // asunto del email $subject = "Contacto";

JHOSUE PEDRO CUEVA MAMANI

50

// Cuerpo del mensaje $mensaje = "---------------------------------- \n"; $mensaje.= " Contacto \n"; $mensaje.= "---------------------------------- \n"; $mensaje.= "NOMBRE: ".$_POST['nombre']."\n"; $mensaje.= "EMPRESA: ".$_POST['empresa']."\n"; $mensaje.= "EMAIL: $mensaje.= "FECHA: $mensaje.= "HORA: $mensaje.= "IP: ".$_POST['email']."\n"; ".date("d/m/Y")."\n"; ".date("h:i:s a")."\n"; $mensaje.= "TELEFONO: ".$_POST['telefono']."\n";

".$_SERVER['REMOTE_ADDR']."\n\n";

$mensaje.= "---------------------------------- \n\n"; $mensaje.= $_POST['mensaje']."\n\n"; $mensaje.= "---------------------------------- \n"; $mensaje.= "Enviado desde http://blog.unijimpe.net \n"; // headers del email $headers = "From: ".$_POST['email']."\r\n"; // Enviamos el mensaje if (mail($email, $subject, $mensaje, $headers)) { $aviso = "Su mensaje fue enviado."; } else { $aviso = "Error de envo."; } } Como se puede ver hemos creado los cuatro parmetros como variables: email de destino, asunto, cuerpo del mensaje y el header donde hemos colocado solo el remitente del mensaje. Podemos personalizar an ms este formulario agregando ms campos de acuerdo a nuestras necesidades. Hay que notar que estamos asumiendo que el usuario est llenando todos los datos del formulario. Para mejorar este script hara falta hacer una validacin de datos con Javascript antes de hacer el envo y tambin una validacin de datos con PHP.

Funcin error_log() Un log de errores, nos permitir controlar cuando se ha producido un error para corregirlo y evitar que se repita en el futuro. Para crear un log, abriremos el archivo en modo 'a' (escritura al final) y escribiremos el error indicando la fecha, para simplificar el trabajo lo podemos incluir todo en una funcin: <?php function error($numero,$texto){ $ddf = fopen('error.log','a'); fwrite($ddf,"[".date("r")."] Error $numero: $texto\r\n"); fclose($ddf); } ?>

JHOSUE PEDRO CUEVA MAMANI

51

Una vez declarada la funcin, tan solo tendremos que llamarla de la siguiente manera cuando se produzca un error para que se guarde en error.log: <?php // Si no existe la cookie sesion if(!isset($_COOKIE['sesion'])){ // Guardamos un error error('001','No existe la cookie de sesin'); } ?> De esta manera, cada vez que un usuario entra a esta pgina sin la cookie sesin, se almacena una nueva lnea en el fichero indicando: [fecha] Error 001: No existe la cookie de sesin Vamos a ver ahora como podemos mejorar esto de manera que adems de poder grabar los errores que nosotros definamos en nuestro sitio, nos almacene los errores producidos durante la ejecucin del script php. Esto lo conseguiremos indicando al interprete Zend que llame a la funcin error() cada vez que el cdigo PHP contenga un error con la funcin set_error_handler: <?php set_error_handler('error'); ?> Entonces, el cdigo completo nos queda de la siguiente manera: <?php function error($numero,$texto){ $ddf = fopen('error.log','a'); fwrite($ddf,"[".date("r")."] Error $numero:$texto\r\n"); fclose($ddf); } set_error_handler('error'); ?> Y de esta manera damos por finalizado nuestro script para generar un log de errores personales y de PHP. Clase PEAR Mail_mime

Un paquete para permitir la fcil creacin de complejos mensajes de correo electrnico de varias partes. Si usted busca una API sencilla para la creacin de dichos correos electrnicos, entonces la clase Mail_Mime probablemente ser suficiente. Cosa que usted puede utilizar Mail_mimePart, que le da un mejor control sobre la creacin de MIME.

Tabla de contenidos Mail_Mime () - crea una nueva instancia AddAttachment () - Archivo adjunto addHTMLImage () - agregar la imagen al mensaje get () - construir el mensaje cabeceras () - construir las lneas de cabecera setHTMLBody () - Juego de piezas HTML setTxtBody () - establece una parte de texto sin formato

JHOSUE PEDRO CUEVA MAMANI

52

encodeHeader () - codificar el valor de cabecera Mail_mimePart () - Constructor addsubpart () - Aumento de la parte sub a una parte MIME encode () - codificar un correo electrnico encodeToFile () - codificar un correo electrnico

JHOSUE PEDRO CUEVA MAMANI

53

You might also like