Está en la página 1de 56

GUA TERICA AL PHP 1. Introduccin al lenguaje Elementos introductorios de PHP y finalidad de esta gua 2.

Origen y tipologa del lenguaje Qu es el PHP, cmo funciona y a qu bases de datos pueden hacer preguntas 3. CGI y PHP: principales diferencias Diferencias y distintas utilizaciones entre el PHP y los CGI 4. Creacin de las pginas y sintaxis Panormica general sobre los elementos bsicos del PHP, as como la sintaxis de base Variables 5. Variables Introduccin a la posibilidad de utilizar las variables con PHP 6. Variables de Apache La serie de variables de las que hablaremos a continuacin estn generedas por Apache. Veremos cules. 7. Variables de ambiente Tambin con PHP, como con otros lenguajes, es posible especificar y utiizar las variables de ambiente 8. Variables PHP Para terminar, veremos las variables que PHP mismo pone a disposicin 9. Constantes PHP pone a disposicin tambin unas constantes, es decir, lo contrario de las variables Tipos de datos 10. Tipos de datos El PHP soporta distintos tipos de datos que el motor adquiere automticamente. 11. Integer Los Integers, o enteros, pueden tener distintos valores nmericos que se expresan mediante distintas anotaciones. 12. Floating point number Este tipo de datos son simplemente los nmeros en coma mvil 13. Strings Sobre las cadenas hay mucho que decir, ms que de los tipos de datos anteriores. Las analizaremos 14. Array

El PHP soporta tanto los array escalares como los array asociativos. 15. Objects En PHP se pueden utilizar tambin los objetos. Veremos, para empezar, un ejemplo. Operadores 16. Operadores Los operadores que se pueden utilizar con PHP son parecidos a los que se utilizan en los dems lenguajes de programacin 17. Aritmticos Los operadores aritmticos son los ms simples 18. Asignacin El operador de asignacin es el smbolo del signo igual (=) que da un valor a una variable 19. Otros operadores Los operadores que el PHP nos pone a disposicin son muchos, y veremos en esta pgina los ms importantes que no hemos tenido todava la oportunidad de ver Estructuras de control 20. Estructuras de control Permiten al programador establecer unas acciones que el programa tiene que hacer cuando se dan unas particulares condiciones (o cuando no se dan) 21. ELSE Else sirve para completar if: con if 22. ELSEIF Elseif permite especificar casualidades que "if" no ha establecido 23. WHILE La condicin "while" se porta de la misma forma que en C 24. FOR Tambin "for" se porta exactamente de la misma forma que en C o en Perl 25. SWITCH "Switch" permite sustituir una serie de "if" en la misma expresin Funciones 26. Las funciones que empiezan por A Abs, acos, array, asin, atan

27. Las funciones que empiezan por B Base64_decode, basename, bcadd, bccomp, bcdiv, bcmult, bcpow, bcsqrt, bcsub, bin2hex 28. Las funciones que empiezan por C Ceil, chdir, checkdate, chgrp, chmod, chmop, chown, chr, chunk_split, closedir, copy, cos, count, crypt, current 29. Las funciones que empiezan por D Debugger_off, date, debugger_on, dechex, decoct, define, defined, die, dirname, diskfreespace 30. Las funciones que empiezan por E Each, echo, ereg_replace, ereg, eregi_replacem eregi, error_log, escapeshellcmd, exec, exit, exp, explode 31. Las funciones que empiezan por F y G> Fclose, feof, file_exists, filegroup, filesize, filetype, flock, fopen, get_browser, get_cfg_var, get_current_user, get_meta_tags, getenv 32. Las funciones que empiezan por H, I, J, K y L Header, hexdec, implode, in_array, is_array, isset, join, key, link, list 33. Las funciones que empiezan por M, O, P y R Mail, max, mkdir, opendir, phpinfo, phpversion, popen, print, rand, range, rename, rmdir, round 34. Las funciones que empiezan por S, T y U Shuffle, sin, sizeof, sleep, split, sqrt, strcmp, system, tan, unset, usleep Las dems funciones 35. Introduccin a las dems funciones apache_lookup_uri, getallheaders, virtual, 36. Funciones relacionadas con Apache Apache_lookup_uri, getallheaders, virtual ... 37. Funciones relacionadas con la criptacin PHP ofrece una serie de funciones relacionadas con la criptacin y con la biblioteca mcrypt. 38. Funciones relacionadas con el protocolo FTP Una amplia biblioteca de funciones relacionadas con el protocolo FTP (FILE TRANSFER PROTOCOL), para la transferencia de un ordenador a otro en una red. 39. Funciones relacionadas con el networking Esta familia de funciones, que analizaremos por encima, est relacionada con el trabajo en la red y sobre todo con los protocolos, direcciones, etc. 40. Estndar POSIX

Estas funciones nos permiten establecer una interaccin completa con el sistema para mejorar la escritura de nuestros script. Funciones no built-in 41. Las exensiones Las funciones de las bibliotecas aadidas que se tienen que instalar en el sistema y se tienen que invocar de forma particular. 42. El porqu de las extensiones LLegados a este punto, habr alguien que se est pregutando el porqu de estas bibliotecas aadidas ... PHP y bases de datos 43. Introduccin a PHP y bases de datos Las funciones de las bibliotecas aadidas que tienen que ser instaladas e invocadas de forma particular. 44. Configuraciones antes de empezar En primer lugar, tenemos que estar seguros de que hemos instalado en el sistema la biblioteca PHP que permita la interaccin con la base de datos, instalando el paquete. 45. Funciones El anlisis de las funciones que pueden ser tiles para nuestros script. 46. Y ahora? Conclusiones sobre el tema funciones en los script PHP Cookie 47. Gestin de los Cookies Gestionar los cookies, pequeos archivos de texto que incluyen informaciones tiles y no peligrosas, para la gestin de las sesiones en el web. 48. Autenticar con PHP Con el PHP y la ayuda de su funcin "header" es posible programar sin la necesidad de utilizar el archivo .htaccess o las autorizaciones del servidor las pginas protegidas. La gua prctica PHP 15 lecciones redactadas por Alberto Mucignat para explicar con muchos ejemplos prcticos qu es y cmo funciona el lenguaje PHP.

Introduccin al lenguaje A lo mejor la mayora de vosotros ya hayan ledo el curso al PHP y, quizs, hayan empezado a poner en prctica los ejemplos que hemos propuesto. En esta gua no queremos volver a repetir lo que ya dijimos, sino que queremos slamente tratar el tema del lenguaje desde un punto de vista ms terico y menos prctico. Visto el xito, a partir de la versin 3, del PHP, es importante para los que quieran considerarse programadores web tener unos conocimientos ms profundos para saber crear aplicaciones con determinadas finalidades y tambin para dejar que su propia fantasa se desahogue. Orgenes y tipologa del lenguaje PHP es el acrnimo de "PHP: Hypertext Preprocessor", es decir, un "preprocesador del hipertexto" que se basa en una sintaxis parecida al C, al Java y al Perl, por supuesto con unos aadidos ms. Naci en 1994 como proyecto "personal" y la primera versin se utiliz pblicamente en 1995 con el nombre "Personal Home Page". El resto es historia. Como cada buen proyecto que llama la atencin de los usuarios y de los programadores, el lenguaje se ha desarrollado como proyecto open-source hasta el punto que, en 1996, ya se estaba utilizando en 15.000 sitios web. En el momento de la release 3 (a mediados de 1999) el nmero de servidores que utilizaban PHP se haba decuplicado. El PHP es un lenguaje de scripting server-side. Se trata de un lenguaje "embeeded" en las pginas que lo incluyen, por citar un ejemplo, el lenguaje Javascript. La principal diferencia es que el PHP lo ejecuta en el servidor en lugar de en el cliente directamente. Por lo tanto, no se necesitan compatibilidades particulares o estndar definidos por otros (como el ejemplo ms clsico del Javascript). El mecanismo de realizacin de los script, para los que los conocen, es parecido al lenguaje ASP. Por ejemplo, si en una pgina estuviera el cdigo: <html><body> <? phpinfo(); ?> </body></html> si invocis la pgina desde el browser, no veis la lnea del cdigo entre <? y ?> (las verdaderas etiquetas del PHP), sino el resultado que esta instruccin devuelve. En la prctica, el servidor HTTP, una vez que se le haya solicitado una pgina parecida, la reconoce (si ha sido configurado debidamente) y pone en marcha la parte "dinmica". Lo que llega a vuestro browser es la elaboracin de este cdigo y podis entender que se trata de una pgina escrita en lenguaje PHP slo por su extensin (tpicamente .php3). Las posibilidades del lenguaje PHP son excelentes, hasta el punto que es posible crear en PHP todas las aplicaciones que se podran crear con unos script CGI. La diferencia principal entre los dos es que el primero hace mucho ms simple la conexin y las preguntas con las bases de datos; el PHP3 soporta las siguientes bases de datos: Adabas D InterBase Solid dBase mSQL Sybase

Empress MySQL Velocis FilePro Oracle Unix dbm Informix PostgreSQL Al igual que con los CGI, con el PHP es posible utilizar los protocolos de red ms famosos como IMAP, SMTP, POP3 e incluso HTTP, o utilizar los socket (enchufes). CGI y PHP: principales diferencias Es sabido que los script CGI escritos en Perl y los script PHP se utilizan sobre todo para la realizacin de pginas dinmicas, dejando de lado por un momento el lenguaje ASP que, recordamos, es propietario y puede utilizarse (casi) slo en webserver NT con IIS. El PHP, sobre todo en estos ltimos tiempos, se est imponiendo como lenguaje principal de scripting para la realizacin de pginas dinmicas. En primer lugar porque es multiplataforma, es decir, es posible encontrar el motor PHP para las plataformas ms utilizadas. Pero el PHP, lentamente y inexorablmente, est superando por complejidad a los CGI y esto se puede justificar por varias cuestiones: PHP es un lenguaje embeeded (empotrado) en el cdigo HTML de las pginas y no necesita, por lo tanto, otros archivos para que se ponga en marcha; un script PHP, de hecho, no necesita ser instalado como ocurre con un script CGI. Los que han ledo alguna vez algn artculo en www.cgipoint.it, se habrn dado cuenta de que cada script tieneque cargarse en el servidor en determinados directorios, con permisos especiales, etc.. Con el PHP esto ya no pasa: adems de no necesitar un directorio cgi-bin, ya que el cdigo se introducee directamente en las pginas, una vez que la pgina se cargue el script est listo para el uso, siempre que se haya configurado correctamente; con el PHP ya no se necesitan configuraciones especiales del servidor de la red para que se habiliten directorios cgi-bin o la realizacin de unos archivos que tengan determinadas extensiones. Primero se dan instrucciones al servidor de la red, luego cada script (o mejor, cada pgina que tenga el cdigo del script) se puede poner en marcha en CADA directorio donde est. Fijaos en la comodidad de esta caracterstica del PHP. Por supuesto, estas son slo algunas de las caractersticas que permiten al PHP superar a los CGI, y pueden ser criticadas por los fanticos del "otro bando". Obviamente, los CGI tienen sus ventajas y elegir entre uno y otro lenguaje (o los dos a la vez) es algo personal. Si hablamos de "qu se puede hacer con PHP" se puede decir que, a partir de la versin 4, las posibilidades del PHP son prcticamente iguales a las de los CGI en Perl, pero no a las del mismo Perl. Creacin de las pginas y sintaxis de base Como vimos en el pequeo ejemplo anterior y como probablemente muchos de vosotros habr ledo en el resto del curso publicado anteriormente, la sintaxis del PHP se tiene que introducir entre las etiquetas:

<?php y ?> Sin embargo es posible itroducir el cdigo de otras formas: <? ?> /* short tags*/ <script language="php"> </script> /* default junto a <?php y ?> */ <% %> /* ASP-like tags */ Por ejemplo, es lo mismo escribir: <?echo ("Yo soy un script PHP\n"); ?> <?php echo ("Yo soy un script PHP\n"); ?> <script language="php"> echo ("Yo soy un script PHP\n"); </script> <% echo ("Yo soy un script PHP"); %> aunque para los ejemplos que citaremos, vamos a utilizar la sintaxis <? ?> Recordamos que las etiquetas aceptadas por default son <?php ?> y <script>. Para establecer las etiquetas cortas y los ASP-like tags se necesita modificar el archivo de configuracin de las primeras lneas, en las que es posible leer algo como: short_open_tag = On ; allow the <? tag. asp_tags = On ; allow ASP-style <% %> tags Adems es posible, como para todos los lenguajes de programacin, introducir los comentarios en el cdigo: el PHP soporta tres tipos de comentarios: /* */ -> como en el lenguaje C; // -> como en el lenguaje C++; # -> como en el scripting de shell y en el Perl. Para que el servidor ejecute el cdigo a enviar a los clientes es necesario adems dar a las pginas una determinada extensin y hacer que el servidor de la red sea capaz de interpretar estas pginas e invocar el motor para su interpretacin. En Apache, por ejemplo, es necesario cargar el mdulo que se refiere al PHP3 en el archivo de configuracin y definir una extensin apropiada para las pginas PHP. Para cargar el mdulo en el archivo httpd.conf la instruccin es:

LoadModule php3_module /usr/lib/apache/1.3/libphp3.so con la correcta localizacin de la biblioteca libphp3.so. En cuanto a la extensin ser necesario abrir el archivo srm.conf e introducir (o descomentar, en el caso de que haya un comentario delante) la instruccin: AddType application/x-httpd-php3 .php3 LLegados a este punto, despus de haber reiniciado Apache, podemos hacer las primeras pruebas. Ser suficiente con cargar las pginas con el cdigo php en la DocumentRoot del servidor y controlar que todo haya ido bien. Variables Como con todos los lenguajes de programacin, tambin con el PHP es posible utilizar las variables que se representan con el smbolo de dlar ($) seguido por el nombre de la variable. $variable = 1; $Variable = "sta es una variable"; Estas variables son diferentes no tanto por el valor que tienen como por sus nombres: realmente, en PHP las variables son case-sensitive. Elegir los nombres de las variables sirve sobre todo para entender y recordar el papel de una variable dentro del cdigo y, por lo tanto, a cada variable se le puede dar cualquier nombre. Alguna de ellas, sin embargo, son, por decirlo de alguna forma, "reservadas" y no pueden (mejor dicho, no tendran) que ser utilizados. Estas variables se pueden dividir en tres grupos: las variables de Apache (o del servidor), las variables de ambiente, y las variables PHP. Considerando que muchas de stas cambian de equipo a equipo y de servidor a servidor, intentemos hacer un recorrido panormico por todas ellas que, por otra parte, podis leer en una pgina del tipo: <html><body> <? phpinfo(); ?> </body></html> Adems, hay que recordar otras variables, y que algunas dependen directamente del PHP. Las dividimos en tres clases: Variables de Apache; Variables de ambiente; Variables PHP. Variables de Apache La serie de variables de las que hablaremos estn en Apache. Si utilizamos otros servidores, algunas de ellas sern, por supuesto, diferentes. Antes de analizarlas detalladamente, recordamos que es posible leer el valor de cada variable o con la funcin phpinfo() o con una simple. echo "NOMBRE_DE LA_VARIABLE";

Adems, los valores de ejemplo se han tomado o directamente de la documentacin del PHP, o del valor que tienen en el servidor que se ha utilizado para escribir estas pginas. GATEWAY_INTERFACE: la versin de los CGI especficos que ha utlizado el servidor, por ejemplo "CGI/1.1"; SERVER_NAME: el nombre del servidor, que en Apache se define como "ServerName" en httpd.conf, por ejemplo "myhost.com"; SERVER_SOFTWARE: el nombre del software utilizado por el servidor de la red, por ejemplo "Apache/1.3.9 (Unix) Debian/GNU PHP/3.0.15 mod_perl/1.21_03-dev"; SERVER_PROTOCOL: el nombre y la versin del protocolo con el que se ha solicitado la pgina, por ejemplo "HTTP/1.0"; REQUEST_METHOD: utilizado en el form, puede ser "GET", "POST", "HEAD", "PUT"; QUERY_STRING: si est, la cadena con la que se ha solicitado la pgina; DOCUMENT_ROOT: la DocumentRoot del servidor, como configurada httpd.conf, por ejemplo "/var/www"; HTTP_ACCEPT: el contenido del header Accept, por ejemplo "text/*, image/*, audio/*, application/*"; HTTP_ACCEPT_CHARSET: el charset aceptado, por ejemplo "iso-8859-1"; HTTP_ENCODING: el encoding de la solicitud, si est; por ejemplo, "gzip"; HTTP_ACCEPT_LANGUAGE: por ejemplo el lenguaje "in"; HTTP_CONNECTION: el contenido del header Connection, por ejemplo "Keep-alive"; HTTP_HOST: el nombre del husped, por ejemplo "localhost"; HTTP_REFERER: el nombre de la pgina de la que se llega; HTTP_USER_AGENT: el contenido del header User_Agent, por ejemplo "Mozilla/4.72 [en] (X11; I; Linux 2.2.14 i586)"; REMOTE_ADDR: la direccin IP del usuario conectado a nuestra pgina; REMOTE_PORT: como antes, pero referido a la puerta; por ejemplo, las dos variables podran tener un output del tipo: "127.0.0.1 1275"; SCRIPT_FILENAME: el nombre del script solicitado por el servidor, por ejemplo "prova.php3"; SERVER_ADMIN: el nombre del administrador del sistema; SERVER_PORT: la puerta en la que el servidor est en escucha, por ejemplo la puerta 80; SERVER_SIGNATURE: la posible "firma" del servidor; PATH_TRANSLATED: el recorrido del script invocado, por ejemplo "/var/www/php/prova.php3"; SCRIPT_NAME: el path, a partir de la DocumentRoot, del script; por ejemplo, /php/prova.php3"; REQUEST_URI: el URI que se necesita para acceder a la pgina; Variables de ambiente Tambin con PHP, como con otros lenguajes, es posible especificar y utilizar las variables de ambiente, pero tienen que depender de la shell que se ha utilizado si no es intil especificarlas. Para leerlas, intentad invocarlas desde el script PHP de esta forma: echo "Mi path es $PATH"; que visualizar vuestro path en el sistema. Variables PHP Para terminar, vamos a ver las variables que el mismo PHP nos pone a disposicin: argv: un array que inclluye los parmetros que pasan al script; argc: como arriba, pero si el script se ejecuta a travs de la lnea de mando;

PHP_SELF: el nombre del script actualmente en ejecucin; HTTP_COOKIE_VARS: un array de asociacin que incluye las variables que han pasado al script a travs de los cookies HTTP; HTTP_GET_VARS: un array de asociacin que incluye las variables que han pasado al script a travs de la solicitud de GET; HTTP_POST_VARS: como arriba, pero referido al mtodo POST. Hay que recordar que las ltimas tres variables tienen sentido slo si, en el archivo de configuracin (track_vars=On) o en el script con la instruccin "php_track_vars", ha sido habilitado el tracking de las variables. Constantes Adems de los datos que hemos visto anteriormente, PHP pone a disposicin de los programadores tambin unas constantes, es decir, lo opuesto a las variables. A un nombre se asocia un valor que el programador puede utilizar, pero que no puede modificar. Vamos a ver cules son: __FILE__ El nombre del script que est sometido al parsing; __LINE__ La lnea en la que se encuentra esta declaracin; PHP_VERSION La versin di PHP en uso; PHP_OS El nombre del sistema operativo sobre el que trabaja el script; TRUE Un valor siempre verdadero; FALSE Un valor siempre falso; E_ERROR Un error, diferente del error usual de parsing (es decir, escritura del cdigo), que no se puede recuperar; E_WARNING Como arriba, pero en este caso el PHP puede seguir la ejecucin del cdigo; E_PARSE Un error del parser (es ecir, de la sintaxis del archivo); E_NOTICE Algo que podra o no podra ser un error. La ejecucin no se interrumpe; La pregunta, a este punto, es: cmo utilizamos estas constantes? La respuesta es bastante simple: hay que utilizar un cdigo como:

<? echo "Lnea ", __LINE__ . " del file " ,__FILE__; ?> que os devolver Linea XX del archivo NOMBREFILE. Probadlo. Adems hay que aadir que, si stas son las constantes "de default" del lenguaje, es posible definir en un script las propias constantes de forma mucho ms simple, como veremos cuando hablemos de las funciones internas del lenguaje. Tipos de datos El PHP soporta distintos tipos de datos, que no los tiene que impostar el programador, sino que son asumidos directamente por el motor, siempre que el programador no cambie el tipo (utilizando la funcin settype() ). Los datos pueden ser: Integer; Floating Point number; String; Array; Object. Vamos a verlos de uno en uno. Integer Los Integers, o enteros, pueden tener distintos valores nmericos que se expresan con diferentes anotaciones. $a = 18; # decimal $a = -18; # decimal negativo $a = 022; # anotacin octal; es igual a 18 decimales $a = 0x12; # anotacin exadecimal, es igual a 18 decimales Probablmente, por lo menos para empezar, tendris que utilizar sobre todo los nmeros decimales, sin embargo hay que saber que el lenguaje admite incluso otras anotaciones ademas de la decimal. Floating point number Este tipo de datos son los nmeros con la coma mvil, por ejemplo, 9.876. La sintaxis para utilizarlos es bastante simple: $a = 9.876; $a = 9.87e6; Strings Con respecto a las strings hay mucho ms que decir porque son tipos de datos diferentes. La sintaxis de base es: $string = "Yo soy una cadena"; Si se utilizan las comillas (""), el contenido de la cadena se expande (o, tcnicamente, "interpolado") ,

como en el ejemplo a continuacin: $num = 10; $string = "El nmero es $num"; Esto visualizar "El nmero es 10". Sin embargo, como con todos los lenguajes, tambin con los PHP tenemos caracteres especiales que tienen que estar anticipados por un smbolo, por ejemplo: $num = 10; $string = "El nmero es "$num""; Los que piensen que el output de este cdigo es 'El nmero es "10"' se equivocan. A parte de que, as como est escrito, el script dara un error de redaccin, las comillas son caracteres especiales, sin embargo, es posible utilizarlas. Por lo tanto la sintaxis correcta para el mando es: $num = 10; $string = "El nmero es \"$num\""; Otros caracteres especiales son: \n -> newline \r -> carriage return \t -> tabulacin \\ -> backslash \$ -> smbolo del dlar La alternativa a los caracteres de escape, cuando no haya contenidos que extender, son los pices (''); por ejemplo: $string = '$ es el smbol del dlar'; visualizar precisamente los que estn en los pices. Cuidado con un error muy comn: $num = 10; $string = 'El nmero es $num'; no visualizar "El nmero es 10" sino "El nmero es $num". Por lo tanto, podemos decir que con los pices el contenido de la cadena se se hace una transmisin literal, tal como est escrito entre las pices. Array El PHP soporta tanto los array escalares como los array asociativos. En PHP un array de valores se puede crear explcitamente definiendo los elementos, o su creacin puede hacerse introduciendo valores en el array. Por ejemplo: $a = ("abc", "def", "ghi");

crea el array definiendo explcitamente los elementos del array, al contrario de lo que ocurre en el ejemplo siguiente: $a[0] = "abc"; $a[1] = "def"; $a[2] = "ghi"; En este caso, el array se crea con tres elementos. Recordemos que el primer elemento de un array se identifica con el nmero "0". Si, por ejemplo, la longitud de una array es "5", ste incluye seis elementos. El elemento que tiene el ndice "0" es el primero del array. Si, en cambio, para aadir elementos a un array (supongamos que nos referimos al que hemos creado arriba) se utilizan los corchetes vacos y los datos se ajustan al array. Por ejemplo: $a[] = "lmn"; $a[] = "opq"; En este caso caso, el array se alarga 2 elementos y resulta ser: $a[0] = "abc"; $a[1] = "def"; $a[2] = "ghi"; $a[3] = "lmn"; $a[4] = "opq"; Este ejemplo es mucho ms til cuando queremos ajustar los elementos al array sin acudir a funciones especficas y sin tener que leer el nmero de los elementos que estn en el array. Todo se ajustar automticamente y correctamente. Los array asociativos se basan, en cambio, en parejas "name-value" y un ejemplo podra ser: $a = array( "nombre" => "Mario", "apellido" => "Rossi", "email" => "mario@rossi.com", ); Es interesante la posibilidad que tiene la funcin array de introducir las entries, como en el ejemplo que sigue: $a = array( "primero" => array( "nombre" => "Mario", "apellido" => "Rossi", "email" => "mario@rossi.com", ), "segundo" => array( "nombre" => "Marco", "apellido" => "Verdi", "email" => "mario@verdi.com",

) ); Ejecutar en este array una instruccin del tipo: <? echo $a["segundo"]["email"]; ?> visualizar "mario@verdi.com". Objects En PHP se pueden utilizar tambin los objetos. Para empezar vamos a ver un ejemplo: class visualiza { function ejecutar_visualiza () { eco "Visualiza un mensaje"; } } $obj=new visualiza; $obj->ejecutar_visualiza(); En primer lugar definimos la clase "visualiza", que incluye la funcin "ejecutar_visualiza" que quiere decir que visualiza simplemente un mensaje en la pantalla. Con la declaracin "new" inicializamos el objeto "$obj" e invocamos la funcin visualizar con el operador -> en $obj. Como podis ver, utilizar los objetos no es nada difcil aunque, para describirlos ms en detalle, seran neceserario ms explicaciones. Operadores Los operadores que se pueden utilizar con PHP son parecidos a los que se utilizan con otros lenguajes de programacin. Para nuestra comodidad, los vamos a dividir en distintas "familias": los operadores aritmticos, los operadores de asignacin y todos los dems. 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: precision = 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 hubieramos utilizado "%" en vez de "/", el resultado habra sido "2". Asignacin A menudo, desgraciadamente, los operadores de asignacin se confunden con el operador de identidad. El operador "=" tiene un significado que no hay que confundir con el de "==". El operdaor de asignacin es el smbolo igual a (=) que da a una variable un valor, por ejemplo $a = 2; asigna a "$a" el valor "2". El error que se hace a menudo es escribir algo como: if ($a=2) { do_something; } que, si lo leen ojos inexpertos, podra parecer una expresin para decir que si $a es IGUAL a 2 hay que ejecutar el cdigo que est entre las llaves. Pues bien, no es tan grave: si hubieramos querido escribir lo que acabamos de decir, hubiramos tenido que utilizar: if ($a == 2) { do_something; } Otros operadores Los operadores que el PHP nos pone a disposicin son muchos y veremos en est pgina los ms importantes que hasta ahora no hemos tenido la posibilidad de analizar. En particular, hablaremos de los valores booleanos, los matemticos y los de incremento-decremento: $a & $b operador "And" ($a e $b); $a && $b como arriba, pero con una procedencia ms alta; $a | $b operador "Or" ($a o $b);

$a || $b como arriba, pero con una procedencia ms alta; $a ^ $b operador "Xor" ($a o $b pero con ambos); !$a operador "Not" (verdadero si $a no es verdadera); $a == $b operador de igualdad, verdadero si $a tiene el mismo valor que $b; $a != $b lo opuesto de lo de arriba; $a < $b; $a es menor de $b; $a <= $b $a es menor o igual a $b; $a > $b $a mayor que $b; $a >= $b $a es mayor o igual a $b; $a ? $b : $c ste, se utiliza ms con las expresiones que con las variables, evala $b si $a es verdadera, y evala $c si $a es falsa; ++$a incrementa de uno $a y la devuelve; $a++ devuelve $a y la incrementa de uno --$a $a-como los dos anteriores, pero se decrementa el valor; Estructuras de control No pueden faltar en un lenguaje de programacin las estructuras de control que permiten que el programador ejecute unas acciones en el programa cuando se dan (o no se dan) determinadas condiciones. IF If permite ejecutar un bloque de noticias si se da (o no se da) una determinada condicin. Su sintaxis es:

if (condicin) statement Por ejemplo, queremos que un script nos indique si dos variables son iguales: $a = 2; $b = 2; if ($a == $b) { eco "\$a es igual a \$b y valen $a.\n"; } If se puede utilizar tambin de forma diferente de la que acabamos de explicar. Aqu hay un ejemplo: <? $a = 2; $b = 2; if ($a == $b) : ?> $a es igual a $b. <? endif; ?> que hace lo mismo que la de arriba. "if" se puede utilizar incluso entre llaves, utilizando "endif" cuando se quiera terminar el bloque "if"; por ejemplo: if ($a == $b) eco "\$a es igual a \$b y valen $a.\n"; endif; ELSE Else sirve para "completar" if: con if, de hecho, hemos decidido que ocurra algo cuando se da una condicin. Con else podemos programar qu ocurre cuanda esta condicin no se da. Un ejemplo podra ser: $a = 2; $b = 3; if ($a == $b) { eco "\$a es igual a \$b y valen $a.\n"; } else { eco "\$a es distinta de \$b.\n\$a vale \"$a\" mientras \$b vale \"$b\".\n"; } ELSEIF Elseif permite especificar casos no definidos por "if". Un ejemplo podra ser: "Si $a es igual a $b visualiza $a, si $a es distinto de $b visualiza un mensaje de error; avisa si $a no existe, avisa si $b no existe". Slo con if y else no se podra conseguir, sin embargo con elseif se convierte en una oparacin muy simple: if ($a == $b) { echo "\$a es igual a \$b.\n"; } elseif ($a != $b) {

echo "\$a es distinto de \$b.\n"; } elseif (!$a) { echo "\$a no existe.\n"; } elseif (!$b) { echo "\$b no existe.\n"; } Fijaos en dos aspectos: en un bloque pueden estar todos los elseif que necesitis y, para los que conocen el Perl, cuidado con no escribir "elsif" en lugar de "elseif", porque el significado es el mismo pero "elsif" no es reconocido por el PHP as como elseif no es reconocido por el Perl. WHILE La condicin "while" se comporta exactamente como en C; la sintaxis de base es: while (expresin) declaracin Como "if", adems, "while" se puede utilizar con o sin corchetes, aadiendo en el segundo caso la declaracin "endwhile". Los dos ejemplos que ponemos a continuacin son lo iguales: /* Primer ejemplo: */ /* $a se incrementa y se visualiza */ /* hasta que su valor no supere "5" */ $a = 1; while ($a <= 5) { print $i++; } /* Segundo ejemplo */ $a = 1; while ($a <= 5) print $i++; endwhile; Traducidas, estas expresiones hacen posible que, hasta que (while) $a sea menor o igual a "5", $a se incrementa de una unidad y luego se visualiza. FOR Tambin "for" se comporta exctamente como en C o en Perl. Despus del "for", se tienen que introducir tres expresiones que, mientras devuelvan "TRUE" permiten la ejecucin de la declaracin que est a continuacin. Vamos a ver el ejemplo: for ($a = 0 ; $a <=10 ; $a++) { print $a; } Esto visualizar los nmeros entre "0" y"10". En las tres expresiones entre parntesis hemos definido que:

$a tiene valor "0"; $a es menor o igual a "10"; $a se incrementa de una unidad. Por lo tanto, por cada valor de $a a partir de "0" hasta "10" $a se visualiza. SWITCH "Switch" permite sustituir una serie de "if" en la misma expresin y, por supuesto, actuar independientemente del valor de sta: switch ($i) { case 0: echo "\$i vale 0"; break; case 1: echo "\$i vale 1"; break; } Aqu hemos introducido "break" que permite salir de un bloque en el caso de que se realice una condicin establecida. Abs, acos, array, asin, atan Vamos a ver ahora, despus de haber visto qu y cules son las variables, qu se hace con ellas y cmo se gestionan los bloques, es decir, pasemos a las funciones. Las funciones son una de las partes ms importantes de un lenguaje de programacin, porque permiten ejecutar unas operaciones en un script. Las funciones que el PHP nos pone a disposicin son muchsimas, y verlas todas sera intil. Por lo tanto nos centraremos en las ms importantes ordenadas alfabticamente. abs: devuelve el valor absoluto de un nmero. $num = -3.4; $aa = abs($a); echo $aa, "\n"; devolver 3.4 acos: devuelve el arco coseno del argumento. $arg = 1; $arc_cos = acos($arg); echo "$arc_cos\n"; devolver 0. array: vase la explicacin anterior con respecto a estos tipos de datos;

asin: devuelve el seno del argumento; atan: devuelve el arco tangente del argumento; bcadd, bcdiv, bcmult, bcpow... base64_decode: descodifica una cadena codificada en MIME base64 (vase abajo); base64_encode: codifica datos en MIME base64; por ejemplo con: $str = "Hola, soy tribiln\n"; echo "$str\n"; $enc_str = base64_encode($str); echo "$enc_str\n"; $dec_str = base64_decode($enc_str); echo "$dec_str\n"; si pasa al script la cadena "$str" que se ha codificado y visualizado antes, despus se vuelve a codificar y a visualizar otra vez; basename: devuelve, estableciendo un recorrido, su componente identificada por un nombre de archivo. Por ejemplo: $path = "/var/www/php/index.php3"; $base = basename($file); echo "$basename\n"; devolver "index.php3"; bcadd: sumar dos nmeros; $num = bcadd(1.334, 4.44554, 2); echo "$num\n"; devolver 5.77. La funcin "bcadd" toma, como los primeros dos argumentos, dos nmeros y, como terceros argumentos opcionales, el nmero de cifras que hay que visualizar despus de la coma; bccomp: compara dos nmeros. La funcin toma como argumento dos nmeros y, como opcin, otro nmero que determina el nmero de decimales que hay que tener en cuenta despus de la coma para considerar los dos nmeros iguales. Devuelve "0" si los dos nmeros son iguales, "+1" si el nmero a la izquierda es mayor que el de la derecha y "-1" si ocurre lo contrario. Fjaos en el ejemplo siguiente: $comp = bccomp(0.334, 0.301, 2); echo $comp; que devolver "1". Pero, si en vez de "2" hubisemos introducido 1 o nada, el resultado sera "0". bcdiv: divide dos nmers, con las mismas modalidades descritas para "bcadd" y "bccomp";

bcmult: multiplica dos nmeros y es posible aadir un parmetro ms para limitar el nmero de cifras despus de la coma: $molt = bcmul(2.31, 3.21, 2); echo "$molt\n"; devolver 7.41; bcpow: eleva a potencia dos nmeros con la posibilidad de especificar el nmero de cifras despus de la coma: $pot = bcpow(2.3, 3, 2); echo "$pot\n"; eleva 2.3 a la tercera potencia, aproximando el resultado a la segunda cifra decimal; bcsqrt: calcula la raz cuadrada de un nmero con la posibilidad de aproximar el nmero de cifras despus de la coma, aadiendo un segundo elemento a la funcin (como ocurra para las dems funciones matemticas vistas antes); bcsub: resta un nmero de otro con la posibilidad de aproximar las cifras despus de la coma: $num = bcsub(2, 5); echo "$num\n"; devolver "-3"; bin2hex: convierte una cadena de datos del formato binario al formato exadecimal; Ceil, chdir, checkdate, chgrp... ceil: devuelve el valor entero ms alto con respecto al nmero que se ha pasado como argumento a la funcin: $num = ceil(3.22112); echo "$num\n"; devuelve "4"; chdir: cambia el directorio de trabajo: $dir = "/var/www/"; chdir($dir); devuelve TRUE si la operacin tiene xito, FALSO en el caso contrario. Por ejemplo si el directorio no se puede leer; checkdate: controla que una fecha sea vlida. Para que sea vlida una fecha tiene que tener: - ao entre "0" y "32767";

- mes entre "1" y "12"; - da entre "0" y el nmero que se refiere al nmero de das del mes al que nos referimos; chgrp: intenta cambiar el grupo de un archivo a "grupo". La funcin acepta como argumentos el nombre del archivo al que queremos cambiar los permisos y el nuevo grupo al que pertenecen: chgrp(filename, grupo); En los sistemas Windows no funciona, sin embargo devuelve siempre verdadero. chmod: es lo mismo que el mando de sistema Unix "chmod" y tiene la misma sintaxis que chgrp; chmop: desplaza los "whitespaces" de una cadena. Se utiliza a menudo para borrar los caracteres "\n" cuando se recibe un argumento del estndar input; el carcter que se elimina se puede leer con: $carcter = chop($string); echo "$carcter\n"; chown: cambia el propietario de un archivo, como el correspondiente mando de sisetma Unix. Acepta como argumento el nombre del archivo y el nombre del nuevo propietario: $file = "prueba.txt"; chown($file, $user); En los sistemas Windows no hace nada y devuelve siempre verdadero (y adems es til introducir esta funcin en un script que no soporta el "chown"); chr: devuelve el carcter ASCII especificado por el nmero correspondiente. Me imagino que sabris, por ejemplo, que la combinacin "Alt + 0126" devuelve la smbolo (~); se puede ver con este cdigo: $ascii= "0126"; $char = chr($ascii); echo "$char\n"; chunk_split: divide una cadena en partes de "n" caracteres. El nmero puede pasar a la funcin despus de la cadena que hay que dividir. Si no se imposta, de default es asumido como 76. Por ejemplo: $string = "ste es un curso para aprender el lenguaje php": $split = chunk_split($string, 5); devolver: st o es u n cur so pa ra apr ender el l

engua je php La funcin es til para el encoding MIME base64 que hemos visto anteriormente con la fucin "base64_encode"; closedir: cierra un directorio que hemos abierto antes con la funcin opendir() - vase; copy: crea la copia di un archivo: $file = "prueba.txt"; copy($file, "$file.bak"); cos: devuelve el valor del coseno del argumento; count: cuenta los elementos en una variable, por ejemplo: $arr[0] = "abc"; $arr[1] = "def"; $arr[2] = "ghi"; $count = count($arr); echo $count; devolver "3", visto que en el array "$arr" hay 3 elementos ($arr[0], $arr[1], $arr[2]); crypt: cripta una cadena; la sintaxis de la funcin crypt() es: crypt(string, salt); Prcticamente tendramos que pasar a la funcin la cadena que tendr que ser criptada y, como opcin, el signo con el que la criptamos. Si ste no pasa a la funcin, se dar de forma random del PHP mismo. Un ejemplo podra ser el siguiente: $var = "sta es una variable"; $crypt = crypt($var, "aa"); echo $crypt; que devolver la cadena criptada; current: devuelve el primer elemento de un array: $arr[0] = "abc"; $arr[1] = "def"; $arr[2] = "ghi"; $current = current($arr); echo $current; visualizar "abc";

Debugger_off, date, decoct.. date: visualiza la fecha en un formato que se puede definir. La funcin reconoce como vlidos los siguientes formatos: a: am/pm; A: AM/PM d: da del mes con dos cifras, entre "0" y "31"; D: da del mes en formato texto, por ejemplo "Mon"; F: mes, en formato texto, por ejemplo "March"; h: hora en el formato "01", "12"; H: hora en el formato "00", "23"; g: hora en el formato "1", "12"; G: hora en el formato "0", "23"; i: minutos, en el formato "00", "59"; j: da del mes en el formato "1", "31"; l: da de la semana, por ejemplo "Monday"; L: especifica si el ao es bisiesto o no ("1" o "0"); m: mes en el formato "01", "12"; n: mes en el formato "1", "12"; M: mes en formato texto corto, por ejemplo "Jan"; s: segundos entre "00" y "59"; S: sufijo ingls para los ordinales, "st", "nd", "rd", "th"; t: nmero de das del mes en curso, entre "28" y "31"; w: da de la semana en formato numrico ("0"=domingo); Y: ao en cuatro cifras, por ejemplo "2000"; y: ao en dos cifras, por ejemplo "00"; Por ejemplo se podra escribir: echo (date("l d F y H:i:s a)); para tener la fecha en curso que, por ejemplo, podra ser: Friday 23 June 00 11:45:48 am debugger_off: inhabilita el depurador PHP; debugger_on: habilita el depurador PHP; decibin: convierte un nmero decimal en otro binario; por ejemplo, el nmero "10" decimal es "1010" en formato binario, y con el cdigo PHP podemos escribir: $bin = decbin(10); echo $bin, "\n"; que devuelve precisamente "1010"; dechex: convierte un nmero decimal en otro exadecimal; la sintaxis es igual a la que se ha utilizado para "decbin()";

decoct: convierte un nmero de formato decimal en otro de formato octal; la sintaxis es la misma que se ha utilizado para "decbin()"; define: define una constante. Como hemos visto en el captulo de las constantes, stas son parecidas a las variables, lo nico es que no llevan el smbolo del dlar delante. Para definir una constante se utiliza la siguiente sintaxis: define("CONSTANTE", "sta es una constante"); echo CONSTANTE; El ejemplo visualiza "sta es una constante"; defined: controla si existe una constante ya establecida. Por ejemplo, podra ser: define("CONSTANTE", "sta es una constante"); if (defined("CONSTANTE")) { echo "La constante se ha definido\n"; } else { echo "La constante no se ha definido\n"; } que visualiza un mensaje segn la constante se haya definido o no; die: visualiza un mensaje y sale del programa: if (defined($num)) { echo "\$num se ha definido\n"; } else { die ("\$num no se ha definido; imposibile seguir adelante\n"); } dirname: cuando se especifica un path, devuelve el path sin el nombre del archivo final: si por ejemplo el path es "/home/yourname/public_html/index.php3" la funcin devolver solamente "/home/yourname/public_html": $path = "/home/yourname/public_html"; echo(dirname($path)); Os habis dado cuenta de que esta funcin hace exctamente lo contrario de la funcin "basename()". Si combinamos las dos funciones, se puede obtener el path completo de un archivo, incluso su nombre; diskfreespace: devuelve el espacio del disco que est libre; si queremos, por ejemplo, ver cul es el espacio que nos queda en el directorio root del equipo, podemos escribir: echo(diskfreespace("/"));

Each, echo, ereg_replace, ereg...

each: devuelve el primer valor de un array utilizando las claves 0, 1, key y value; si el array es asociativo, se puede escribir: $array = array ("nombre" => "valor", "nombre2" => "valor2"); while (list($key, $val) = each ($array)) { echo "$key => $val\n"; } que devuelve: nombre => valor nombre2 => valor2 Si, en cambio, el array no es asociativo, el cdigo ser: $array = array ("nombre", "valor", "nombre2", "valor2"); while (list($key, $val) = each ($array)) { echo "$key => $val\n"; } y el resultado: 0 => nombre 1 => valor 2 => nombre2 3 => valor2 Seguramente os habis fijado en que la funcin "each()" a menudo se utiliza junto a "list()", que veremos a continuacin; echo: visualiza una o ms cadenas. No creo que haya mucho que comentar sobre esta funcin, en principio porque es muy simple y adems porque ya la hemos analizado y hemos visto como funciona. ereg_replace: devuelve una expresin regular con valores establecidos. En la funcin hay que incluir tres argumentos: el primero indica el texto que hay que sustituir, el segundo es el texto que se est utilizando y el tercero es la cadena que hay que modificar. Por ejemplo: $stringa = "ste es un curso ASP"; echo ereg_replace("ASP", "PHP", $cadena); Se hubiera podido escribir tambin: echo ereg:replace("ASP", "PHP", "ste es un curso ASP");

que, sin embargo, no tendra mucho sentido. ereg: ejecuta el matching de una expresin regular. El ejemplo que se encuentra en la documentacin es bastante claro: if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) { echo "$regs[3].$regs[2].$regs[1]"; } else { echo "Invalid date format: $date"; } Todo el procedimiento se desarrolla para controlar que una fecha est escrita en un formato correcto. Vamos a ver el significado de "[0-9]{4})-([0-9]{1,2})-([0-9]{1,2}". Para los que conocen las expresiones regulares, no ser difcil traducirlo con "un nmero entre 0 y 9 que hay que repetir cuatro veces y que tiene que astar seguido de un '-', de un nmero entre 0 y 9 repetido una o dos veces, de un '-' y de un nmero entre 0 y 9 repetido una o dos veces". Muy a menudo es mucho ms simple leer una expresin regular que traducirla al lenguaje hablado. eregi_replace: funciona exctamente como "ereg_replace()", solamente que, en este caso, la expresin regular se sustituye por una forma "case insensitive", es decir, pasando de los caracteres maysculas y minsculas; eregi: funciona excatmente como "ereg()", solamente que en este caso la expresin regular se sustituye mediante una forma "case insensitive"; error_log: enva un mensaje de error al archivo de log del servidor, directamente a la puerta TCP de la que ha llegado la solicitud o a un archivo. La sintaxis es: error_log(message, mesage_type, destination); Message_type es un nmero que especifica donde tiene que llegar el mensaje Puede ser: 0: el mensaje se enva al logger del PHP o al archivo especificado por "error_log"; 1: el mensaje se enva por email al parmetro (probablemente una direccin email vlida) especificado en "destination"; 2: el mensaje se enva al depurador; 3: el mensaje se introduce en append en el parmetro especificado en destination"; escapeshellcmd: si se invoca un mando exterior de una shell, con este mando se consigue que delante de los metacaracteres de la shell haya un carcter de escape para evitar que el mando produzca errores; exec: ejecuta un programa externo; exit: sale de un script; el mando "exit()" es til cuando se quiere parar un script siempre que no se cumplan unas condiciones, por ejemplo: if (condicin) { ejecutar el bloque; } else {

exit; } Recordad que "exit()" no lleva un mensaje de error como "die()": si os interesa dar "explicaciones" sobre el porqu el script termina, hay que utilizar "die()", pero no es posible escribir: exit "Salir del programa\n"; o mejor, es posible pero no tiene ningn efecto excepto el de salir; exp: eleva "e" (2.71828.....) a la potencia que es el argumento de la funcin: echo exp(3); devolver: 20.0855369... explode: divide una cadena segn un determinado pattern. Por ejemplo, si queremos dividir una cadena que incluye tres nombres separados por comas, podemos escribir: $nombres = "Fulano,Mengano y Zutano"; list ($nombre1, $nombre2, $nombre3) = explode (",", $nombres); echo "$nombre1\n$nombre2\n$nombre3\n"; que devolver: Fulano Mengano Zutano Explode() es una versin simplificada de "split() que veremos sucesivamente. Las dos funciones, adems, son muy tiles cuando tenemos la necesidad de leer unos archivos incluidos en los listados. Fclose, feof, filegroup, filesize...

fclose: cierra un puntero en un archivo que se ha abierto antes con fopen(). Vase fopen() para ms informaciones; feof: controla un puntero en un archivo para ver si est al final del mismo; fgetc: restituye el primer carcter del puntero que se ha abierto antes con fopen(). Si, por ejemplo, el puntero $file seala el archivo "/tmp/prova.txt" que incluye solamente la lnea "Hola", aparecer un cdigo como el siguiente: $char = fgetc($file); echo "$char\n"; devolver "C" (por supuesto sin comillas);

file_exists: controla si un archivo existe, en este caso dar TRUE sino FALSE, por ejemplo : if (file_exists($file)) { print "$file esiste; } Puede ser muy til utilizar esta funcin cuando necesitamos intervenir en uno o ms archivos para actuar sobre el mismo slo si ste existe sin arriesgarse a inexplicables "anomalas" del script; filegroup: devuelve el grupo al que pertenece el archivo: $filename = "/tmp/prueba.txt"; $group = filegroup($filename); echo "$filename pertenece al gruppo $group\n"; Obviamente, la funcin se implementa slo en los sistemas multiuser; filesize: devuelve la domensin de un archivo: $filename = "/tmp/prueba.txt"; $size = filesize($filename); echo "$filename -> $size\n"; filetype: determina el tipo de archivo; los valores posibles son: fifo, char, dir, block, link, file y unknown; flock: aplica el locking a un archivo; de modo especfico flock() opera en un puntero en un archivo que se ha abierto antes y las operaciones posibles son: 1: para el lock en lectura; 2: para el lock en escritura; 3: para quitar el lock, cualquiera que sea el tipo; 4: para impedir que flock() bloquee un archivo cuando aplica el lock; Por ejemplo, para aplicar flock() en un puntero "$file" definido antes, se necesita escribir: flock($file, 2); /* Para impedir que el archivo se lea*/ ..... /* Cdigo para trabajar en el archivo */ flock($file, 3); /* Para quitar el flock */ fopen: abre un archivo o un URL. La sintaxis es: fopen(filename, mode); Obviamente a "filename" le corresponde el nombre del archivo o el URL del mismo, y a "mode" la

modalidad con la que se tiene que abrir. Aqu se puede elegir entre: r -> abre el archivo slo cuando se lee; r+ -> abre el archivo cuando se lee y se escribe; w -> abre el archivo slo cuando se escribe; w+ -> abre el archivo cuando se lee y se escribe; a -> abre el archivo slo cuando se escribe e introduce el puntero al final del archivo ("w" lo introduce al final) a+ -> abre el archivo cuando se lee y se escribe introduciendo el puntero al final del archivo; Por ejemplo, para abrir un archivo local slo para leerlo tendremos que escribir: $file = fopen("/tmp/prueba.txt", "r"); Para un URL, en cambio: $file = fopen("http://www.myhost.com/index.html", r"); Para todas las sucesivas operaciones en el archivo, adems, tendremos que actuar directamente sobre el puntero ($file) y no directamente sobre el archivo. Header, hexdec, implode, in_array...

header: enva cualquier header HTTP; por ejemplo: header("Pragma: no-cache"); Esta funcin es muy til en distintos casos: por ejemplo, para forzar una autorizacin se puede enviar un "401", etc.; hexdec: devuelve el valor decimal de un nmero exadecimal; implode: como se puede entender por el nombre, esta funcin no es nada ms que lo contrario de "explode". La sintaxis es igual, pero en este caso devuelve una cadena con los valores separados del primer argumento y la funcin; in_array: devuelve valor verdadero si en un array hay un determinado valor. Un ejemplo podra ser: $nmeros = array("1", "2", "3", "4", "5"); $num = 2; if (in_array($num, $nmeros)) { print "$num est en el array \$nmeros\n"; } is_array: controla si una fecha variable es un array: if (is-array($var)) {

echo "\$var es un array\n"; } Lo mismo ocurre con las funciones siguientes, con la nica diferencia del argumento: - is_dir; - is_double; - is_executable; - is_file; - is_float; - is_int; - is_integer; - is_link; - is_long; - is_object; - is_readable; - is_real; - is_string; - is_writeable. isset: devuelve TRUE si existe la variable, falso si no existe. Por ejemplo, para ver si existe o no una variable es posible escribir: $a = 10; echo isset($a), "\n"; echo isset($b), "\n"; que devolver 1 y 0. recordemos que 1 se considera valor positivo (TRUE), 0 negativo (FALSE); join: une los elementos de un array con una cadena determinada; el uso es igual al de implde(); key: toma una clave de un array asociativo. Un ejemplo simple puede ser: $array = array("1" => "uno"); $clave = key($array); echo "$clave\n"; que devolver "1". Esta funcin es til pata retomar todas las claves de los array asociativos complejos; link: crea un hard enlace. La sintaxis es: link(target, link); Las informaciones sobre los enlaces (a propsito de la existencia del archivo al que se refiere el enlace mismo) se pueden visualizar con linkinfo(); list: da unas variables como si fueran partes de un array. Volvamos al ejemplo que hemos hecho con each:

$array = array ("nombre" => "valor", "nombre2" => "valor2"); while (list($key, $val) = each ($array)) { echo "$key => $val\n"; } En este caso, list() se utiliza para "redactar" una lista de variables que se recogern del array sin darles un valor sino dejando a las partes sucesivas del cdigo la asignacin de sus valores. Adems hay que notar que las variables creadas por list() no tienen slo un valor, sino que cada vez que se invocan tienen un valor diferente, segn los elementos que se encuentran en el array. Mail, max, mkdir, opendir, phpinfo...

mail: funcion para enviar email. La funcin tiene una sintaxis: mail(To, Subject, Message, Otros_headers); Si queremos enviar un email a "nombre@host.com" con subject "Prueba" y queremos especificar el nombre del remitente, podemos escribir: mail("nombre@host.com", "Subject", "ste es el texto del email", "From: remitente <remitente@host.net>); Como podis ver, enviar email con script PHP utilizando la funcin "mail" es muy simple. Obviamente, en el archivo de configuracin, tenis que haber especificado la locacin de sendmail (o programa anlogo para enviar email); max: restituye el valor ms alto de una serie de variables: $num = 1; $num2 = 23; $num3 = 0.3; $max = max($num, $num2, $num3); echo $max, "\n"; devolver "23"; Opuesto a max() es min(), que tiene la misma sintaxis que max(); mkdir: crea un directorio del que se tiene que especificar el recorrido y los permisos: mkdir("/tmp/prueba", 0777); crea el directorio "/tmp/prueba" con permisos impostados en 0777; opendir: abre un directorio del que es posible leer los elementos con readdir() y, sucesivamente, cerrarla con closedir();

phpinfo: es la funcin ms "representativa" del PHP, porque visualiza muchsimas informaciones en el PHP mismo. Su uso tendra que concerse ya: phpinfo(); phpversion: visualiza la versin de PHP que se est utilizando; popen: abre un puntero para un procedimiento que se tiene que cerrar con pclose(); print: visualiza una cadena de vdeo como eco(); rand: genera un valor numrico de forma casual. Si quisiramos un valor entre 10 y 20, se podra escribir: $random = rand(10, 20); range: crea un array que incluye una serie de valores enteros especificados. Por ejemplo, para crear un array con valores de 1 a 10 ser necesario escribir: $array = range(1, 10); rename: vuelve a nombrar un archivo. Por ejemplo, si se usa: rename("oldname", "newname"); para volver a nombrar "oldname" como "newname"; rmdir: como el anlogo mando unix, suprime un directorio. Esto se puede conseguir slo si: - el directorio est vaco; - los permisos en el directorio lo permiten. round: redondea un nmero: $nmero = round(2,3); /* devuelve 2 */ $nmero = round(2.5); /* devuelve 3 */ $nmero = round(2.6); /* devuelve 3 */ Como podis ver, los decimales de 0 a 4 se redondean en el nmero entero anterior, de 5 a 9 al nmero entero sucesivo. Shuffle, sin, sizeof, sleep, split...

shuffle: ordena de forma casual los elementos de un array. Por ejemplo, para poder visualizar los elementos de un array de manera casual se podra escribir: $num = range(0,10); shuffle($num); while (list(,$nmero) = each($num)) { echo "$nmero ";

} sin: devuelve el seno de la expresin; sizeof: calcula el nmero de los elementos en un array. Si, por ejemplo, se quiere calcular el nmero de elementos y actuar consecuentemente, se podra escribir: $array = array("1", "2", "3", "4", "5"); $size = sizeof($array); if ($size <= 10) { echo "El array incluye menos de 10 elementos\n"; } else { echo "El array incluye ms de 10 elementos\n"; } sleep: pone el script en pausa unos segundos que se pueden establecer y especificar como argumento de la funcin. Por ejemplo, "sleep(10)" deja el script inactivo durante 10 segundos, para proceder despus; split: divide una cadena segn un determinado pattern; por ejemplo: $linea = "fulano||mengano||zutano"; list ($uno, $dos, $tres) = split("\|\|", $lnea, 3); print "1 => $uno\n2 => $dos\n3 => $tres\n"; Fijaos que ha sido necesario introducir un carcter de escape (\) delante de cada "|" en la expresin que hay que utilizar para dividir la lnea; sqrt: restituye la raz cuadrada del argumento; strcmp: ejecuta una comparacin en dos lneas. Por ejemplo: $cmp = strcmp("Hola", "Hola a todo el mundo"); if ($cmp == "0") { print "Las cadenas son iguales\n"; } elseif ($cmp < 0) { print "La segunda lnea es ms larga que la primera\n"; } elseif ($cmp < 0) { print "La primera lnea es ms larga que la segunda\n"; } devuelve "La segunda lnea es ms larga que la primera". La funcin, por lo tanto, devuelve "0" si las cadenas son iguales, un valor menor de cero si la segunda es ms larga que la primera y mayor de cero si la primera es ms larga que la segunda; system: ejecuta un programa de sistema, devuelve el output y vuelve al script; tan: devuelve la tangente del argumento; unset: elimina el valor de una variable;

usleep: como sleep(), pero esta funcin bloquea el script durante N microsegundos. Con esto hemos acabado el anlisis de las funciones ms tiles del PHP, sin detenernos en argumentos como la base de datos y parecidos. Obviamente, el listado de las funciones no termina aqu. Sin embargo, como hay muchas que no son tan tiles para los que empiezan a programar con este lenguaje, hemos preferido parar aqu. Introduccin a las dems funciones Hasta ahora, hemos visto las funciones principales del lenguaje, las que se podran definir "esenciales" para crear nuestros script. Pero el PHP, debido tambin a su amplia difusin, no se limita a esto. Pone a disposicin otras familias de funciones con las que se pueden resolver otros problemas y crear nuevas soluciones, sin tener que acudir a ningn mecanismo extrao como invocar las funciones de sistema u otras cosas. Para nuestra comodidad, vamos a dividir estas funciones por "familia de pertenencia". Habr funciones dedicadas a Apache, a la criptacin, al protocolo FTP y mucho ms. Funciones ligadas a Apache

apache_lookup_uri Esta funcin ejecuta una solicitud para un determinado URI (Uniform Resource Identifier: lo definimos ms simplemente una direccn web) y ensea los resultados de esta solicitud. Los resultados estn incluidos en un array y la sintaxis es: $array = apache_lookup_uri($url); Con estas funcin tendremos informaciones sobre: estatus (que es un cdigo numrico); the_request: el tipo de solicitud, el mtodo, el archivo solicitado y el protocolo utilizado; method: el mtodo utilizado; uri: el uri al que se refiere a la solicitud; filename: el nombre del archivo con el path local; path_info: informaciones sobre path; no_cache; no_local_copy; allowed; sent_bodyct; bytes_sent; byterange; clenght; unparsed_uri; request_time. Por ejemplo, utilizando un cdigo como el siguiente:

$uri = "http://localhost"; $array = apache_lookup_uri("$uri"); while ( list ( $header, $valor ) = each( $array ) ) { echo "$header: $valor<br>\n"; } se podra obtener algo parecido a : status: 200 the_request: GET /php/prueba.php3 HTTP/1.0 method: GET uri: /php/localhost filename: /var/www/php/localhost path_info: no_cache: 0 no_local_copy: 1 allowed: 0 sent_bodyct: 0 bytes_sent: 0 byterange: 0 clength: 0 unparsed_uri: /php/localhost request_time: 965150868 getallheaders con esta funcin es posible pedir todos los headers que se refieren a una solicitud: estos headers, como muchos otros, se pueden leer incluso con la funcin "phpinfo()". La sintaxis es: $array = getallheaders(); y, utilizando un cdigo como: $headers = getallheaders(); while (list($header, $value) = each($headers)) { echo "$header: $value<br>\n"; } se puede obtener algo parecido a: Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Charset: iso-8859-1,*,utf-8 Accept-Encoding: gzip Accept-Language: en Connection: Keep-Alive Host: localhost Pragma: no-cache User-Agent: Mozilla/4.72 [en] (X11; I; Linux 2.2.14 i586)

virtual virtual() es igual a <!--# include virtual="/file.txt"-->, que se refiere a los Server Side Includes. Con esta funcin podemos incluir un archivo cualquiera en una pgina redactada de forma dinmica con el PHP. La sintaxis es simple: virtual(file); El archivo que hay que especificar puede ser cualquier archivo de texto y, normalmente, se refiere al directorio raz del husped. Por lo tanto, si tenemos un archivo visible en la red con "http:/www.dominio.com/file.txt", la sintaxis que hay que utilizar con "virtual()" es: virtual("/file.txt"); Funciones relativas a la criptacin

PHP ofrece a los programadores una serie de funciones para la criptacin, ligadas a la biblioteca mcrypt. Esta biblioteca soporta muchsimos algoritmos de criptacin, unos ms utilizados que otros. Los algoritmos son: DES TripleDES Blowfish 3-WAY SAFER-SK64 SAFER-Sk128 TWOFISH TEA RC2 GOST RC6 IDEA Para funcionar con esta biblioteca, el PHP se tiene que haber redactado con la opcin "--with-mcrypt". Los mandos fundamentales son cuatro, todos con la misma sintaxis: mcrypt_cfb(): cipher feedback; codifica byte por byte; mcrypt_cbc(): cipher block chaining: til para el encoding de los archivos con un amplio mrgen de seguridad; mcrypt_ecb(): electronic codebook: utilizada para datos remotos en el que el nivel de seguridad no es altsimo; mcrypt_ofb(): output feedback: parecido a cfb, pero cuida ms de los errores.

La sintaxis en general es: $encrypted = mcrypt_XXX(algoritmo, clave, input, encode/decode) en el que: XXX es el mtodo que se quiere utilizar (cfb, cbc, cfb o ofb); algoritmo es el algoritmo que se quiere utilizar, con la sintaxis: MCRYPT_ALGORITMO Por ejemplo, se podra utilizar MCRYPT_BLOWFISH o MCRYPT IDEA clave no es ms que la clave con la que se van a criptar los datos; input son los datos que hay que criptar; encode/decode indica la funcin si se deben criptar o descriptar los datos. Por eso, se utilizan respectivamente: MCRYPT_ENCRYPT e MCRYPT_DECRYPT Vamos a ver un ejempo: si queremos criptar una cadena de texto con clave criptada "Mi clave" utilizando CFB con el algoritmo IDEA, tendramos que escribir: $cadena = "Una cadena de texto"; $chiave = "Mi clave"; $encrypted = mcrypt_cfb(MCRYPT_IDEA, $clave, $cadena, MCRYPT_ENCRYPT); Todos los que quieran leer nuestros datos criptados ($encrypted) tendrn obviamente que conocer las claves, el mtodo y el algoritmo utilizados. Por lo tanto, se podra escribir algo parecido a: $clave = "Mi clve"; $cadena = mcrypt_cfb(MCRYPT_IDEA, $chiave, $encrypted, MCRYPT_DECRYPT); Su variable "$cadena", por lo tanto, incluir "Una cadena de texto". Funciones relacionadas con el protocolo FTP

Entre los protocolos que PHP nos pone a disposicin existe una amplia biblioteca de funciones relacionadas con el protocolo FTP (FILE TRANSFER PROTOCOL), para el traslado de un archivo de un ordenador a otro en la red. Vamos a ver las principales. ftp_connect sta es una funcin "principal" en el sentido de que nos permite establecer una conexin FTP entre nuestro equipo y el servidor FTP remoto. Su sintaxis es: $stream = ftp_connect(host, port); en el que el husped es el nombre del servidor al que queremos conectarnos y port (opcional) es la

puerta alternativa a la que nos queremos conectar. Si sta no se ha especificado se utiliza la puerta de default para el protocolo FTP, es decir la 21. En la variable $stream, adems, se almacenan precisamente el flujo de datos que el cliente (en este caso el PHP) recibe del servidor, es decir, los mensajes de conexin aceptada (incluidos los detalles) o de conexin rechazada. Por ejemplo, para conectarnos a la puerta de default del servidor FTP "ftp://ftp.host.com" utilizaremos: $stream = ftp_connect("ftp://ftp.host.com"); ftp_login Despus de la conexin, necesitamos identificarnos de forma que el servidor nos permita el intercambio de datos. Muchos estarn acostumbrados a no ver esta fase porque con los ms difundisos clientes FTP grficos se desarrolla automticamente utilizando las informaciones de login (nombre dle usuario y contrasea) introducidos como opciones para la conexin. Sin embargo, hay que saber que sta es una fase muy importante para la conexin. La sintaxis de la funcin es: $login = ftp_login(stream, username, password); Si, por ejejmplo, antes nos habamos conectado al husped "ftp.host.com", utilizando la variable "$stream", ahora podemos pasar al login verdadero con: $login = ftp_login($stream, "usuario", "contrasea"); La variable $login nos sirve para entender si el login se ha llevado a cabo o no, y si incluye el valor "1" para el xito, "0" para el fracaso. Por ejemplo, para ver si continuamos el intercambio de datos despus de la autorizacin podemos utilizar el valor que se ha dado a esta variable y escribir: if ($login == "1") { ... # Ejecutar las dems operaciones } else { echo "Autorizacin no llevada a cabo\n"; } Cuando nos hemos conectado, podemos saber sobre qu equipo estamos trabajando con la funcin "ftp_systype()" que tiene la sintaxis: $system = ftp_systype($stream); ftp_pwd Esta funcin invoca el mando "pwd", es deicr, "Print work directory", que podemos traducir como "Visualiza el directorio actual". Para ver a qu directorio nos conectamos despus del login, podemos escribir: $directory = ftp_pwd($stream); en el que $stream es siempre la variable que hemos utilizado para la conexin con "ftp_connect()". ftp_cdup e ftp_chdir

Estas dos funciones sirven respectivamente para moverse en el directorio superior y para moverse hacia un determinado directorio dentro del servidor. La primera se utiliza con sintaxis: $var = ftp_cdup($stream); La segunda, en cambio: $newdir = ftp_chdir($stream, "nuevo_directorio"); Si, por ejemplo, en el login estamos en el directorio "/" y queremos movernos a "/var/wwwdata" podemos escribir: $newdir = ftp_chdir($stream, "/var/wwwdata"); ftp_mkdir e ftp_rmdir Estas dos funciones invocan el mando "mkdir "(crea un directorio) y "rmdir" (quita un directorio). La primera devuelve el nombre del nuevo directorio, la segunda slo los valores true o false. Podemos crear un pequeo buqle y escribir: $mydir = ftp_chdir($stream, "/var/wwwdata/"); # Posicionarse en "/var/wwwdata". $newdir = ftp_mkdir($stream, "prueba") # Crear un directorio "prueba" como subdirectorio de "/var/wwwdata" $deleted_dir = ftp_rmdir($stream, $newdir); # Borrar el directorio creado # Controlarlo todo: if ($deleted_dir == "1") { print "Operacin llevada a cabo con xito.\n"; } else { print "Algo no ha salido bien.\n"; } Obviamente el ejemplo no tiene mucho sentido en una verdadera conexin (por qu crear un directorio y borrarlo en seguida?), pero se ha propuesto para comprender cmo utilizar mejor estas dos funciones. ftp_nlist Esta funcin es igual al mando "dir", es deicr, el mando utilizado para ver los nombres de los archivos que estn en un directorio. La sintaxis es: $list = ftp_nlist($stream, directory); Por ejemplo, podemos ir al directorio "/var/wwwdata" y leer los archivos con: $newdir = "/var/wwwdata"; $list = ftp_nlist($stream, $newdir);

Los resultados estn en un array, por lo tanto, 'echo "$list"' no tendra ningn sentido. ftp_get Funcin que invoca el mando GET, para bajar un archivo del servidor remoto. Tenemos que especificar para la funcin, adems del conocido stream, el nombre del archivo local, el nombre del archivo remoto y las modalidades de trasaldo (FTP_ASCII o FTP_BINARY). La sintaxis completa es: $file = ftp_get($stream, local_filename, remote_filename, mode); Por ejemplo, si queremos bajar del servidor el archivo "data.txt" (supongamos que estamos ya en el directorio que lo incluye) introducindolo en el directorio "/tmp" con nombre "file.txt" in ASCII mode, escribiremos: $file = ftp_get($stream, "/tmp/file.txt", "data.txt", FTP_ASCII); Para ver si la operacin ha tenido xito o no, podemos actuar de dos formas: controlar si efectivamente el archivo est en nuestro disco o controlar el valor de la variable $file: si tiene valor "1" entonces la operacin se ha llevado a cabo, si tiene valor "0" ningn archivo se habr bajado en nuestro disco. ftp_put Esta funcin hace exctamente lo contrario de "ftp_put()", es decir, carga un archivo en el servidor. Su sintaxis es: $file = ftp_put($stream, remote_filename, local_filename, mode); Las opciones son iguales a las anteriores, por lo tanto, podemos poner el ejemplo contrario al anterior: cargamos el archivo local "/tmp/file.txt" en el directorio remoto (ya estamos en este directorio) con el nombre "data.txt". Todo en ASCII mode obviamente: $file = ftp_put ($stream, "data.txt", "/tmp/file.txt", FTP_ASCII); Tambin aqu podemos controlarlo de dos formas: evaluando el valor de $file o invocando la funcin "ftp_nlist()" para ver si entre los archivos est tambin "data.txt". ftp_sise Devuelve el tamao de un archivo. La sintaxis es: $size = ftp_size($stream, remote_filename); Vovliendo a los ejemplos hechos anteriormente, vamos a conocer el tamao del archivo "data.txt", que est en el directorio en el que estamos actualmente; ser suficiente con escribir: $size = ftp_size($stream, "data.txt");

de modo que la variable $size incluya el tamao del archivo "data.txt". ftp_mdtm Devuelve la fecha del ltimo cambio de un archivo, devolvindola como Unix timestamp. La sintaxis es: $date = ftp_mdtm($stream, remote_filename); Por ejemplo, si queremos saber la fecha del ltimo cambio del archivo "data.txt" podemos escribir: $date = ftp_mdtm($stream, "data.txt"); Tambin en este caso, la variable "$data" incluye la fecha del ltimo cambio del archivo o el valor "-1" si fracasa (archivo inexistente o casos parecidos). ftp_rename e ftp_delete Como queda claro por los nombres, estas dos funciones sirven para volver a nombrar un archivo y para borrarlo. La primera tiene la sintaxis: $name = ftp_rename($stream, oldname, newname); en el que "oldname" es el nombre originario del archivo y "newname" es el nuevo nombre que queremos asignar al archivo. Por ejemplo, para volver a nombrar el archivo "data.txt" en "dati.dat" podemos escribir: $name = ftp_rename($stream, "data.txt", "datos.dat"); La variable $name incluir "1" si la operacin ha tenido xisto, "0" si no lo ha tenido (archivo inexistente o casos parecidos). La funcin "ftp_delete(),en cambio, se utiliza con sintaxis: delete = ftp_delete($stream, file); Por ejemplo, para eliminar el archivo "datos.dat" que estn en "current-directory" podemos escribir: $delete = ftp_delete ($stream, "datos.dat"); Tambin en este caso la variable puede incluir el valor "1" (el archivo ha sido eliminado) o "0" (algo no ha funcionado). ftp_quit Llegados a este punto, nuestro trabajo en el servidor se ha acabado y podemos dejar de conectarnos utilizando la funcin "ftp_quit()" que tiene una sintaxis muy simple: $quit = ftp_quit($stream).

Siempre es aconsejable invocar esta funcin en lugar de cerrar el programa en ejecucin, sobre todo para respetar al servidor. Funciones relacionadas con el networking

Esta familia de funciones que analizaremos por encima, se refiere al trabajo en red y trata sobre todo de los protocolos, direcciones, etc. Por supuesto no es fundamental para los script de simple creacin de pginas dinmicas, sin embargo puede ser til conocerla. gethostbyaddr e gethostbyname Estas dos funciones permiten, respectivamente, conseguir el nombre de un husped partiendo de su direccin IP y conseguir la direccin IP asociada a un nombre de dominio. Las sintaxis para las dos funciones son: $hostname = gethostbyaddr(IP_address); $hostaddress = gethostbyname(hostname); Por ejemplo, pongamos que "www.server.com" tenga la direccin IP 123.456.78.9 que nosotros conocemos, pero queremos que sea un script PHP quien lo reconozca. Escribiremos, por lo tanto: $hostname = gethostbyaddr("123.456.78.9"); $hostaddress = gethostbyname("http://www.host.com"); print "$hostname tiene direccin IP $hostaddress.\n"; Obviamente un script de este tipo es intil, ya que conocemos los datos, sin embargo lo hemos propuesto slo para subrayar las caractersticas de las dos funciones. getservbyname Esta funcin nos permite conseguir el nmero de la puerta a la que est asociado un determinado servicio. La sintaxis de la funcin es: $porta = getservbyname(service, protocol); Por ejemplo, queriendo saber a qu puerta est asociado el protocolo ftp, podemos escribir: $ftp_port = getservbyname("ftp", "tcp"); que, muy probablemente, nos devolver la puerta 21 (la de default para el FTP).

Estandr POSIX

El PHP pone a disposicin muchas funciones POSIX-compliant, como aparece definido en el estndar document IEEE 1003.1. Estas funciones nos permiten intrducir una interaccin completa con el sistema para mejorar la escritura de nuestros script. Vamos a ver cules son las funciones ms importantes de este grupo. posix_kill Enva un signal a un determinado PID, devolviendo FALSE si el PID no est asociado a ningn proceso, verdadero en el caso opuesto. Su sintaxis es: posix_kill(PID, SIG) en la que PID es el pid del proceso al que queremos enviar el signal y SIG es, supuestamente, el signal. Por ejemplo, si queremos enviar un signal de kill a Netscape (pid 1234), podemos escribir: $pid = "1234"; $signal = posix_kill($pid, KILL); Ms detalles se pueden encontrar en la manpage de kill(2). posix_getpid Utilizar la funcin que acabamos de describir trabajando desde un script es muy difcil porque, como no tenemos acceso a la shell, no podemos conocer el PID asociado a una determinada aplicacin. Sin embargo, el PHP nos echa un cable con la funcin posix_getpid que permite introducir en una variable el PID de un proceso. La sintaxis es: $pid = posix_getpid($application); en la que application es, obviamente, la aplicacin de la que nos interesa el PID. Utilizando esta funcin con la anterior, podemos escribir algo parecido a: $pid = posix_getpid("netscape"); $signal = posix_kill($pid, KILL); posix_getppid La funcin posix_getppid() devuelve el padre del proceso que estamos utilizando. Por ejemplo, escribiendo unas dos lneas de cdigo como las siguientes: $parent = posix_getppid(); echo $parent; visualizaremos en la pantalla el padre del proceso que acabamos de ejecutar: en nuestro caso, como hemos ejecutado el mando desde una shell, el PID se referir slo a la shell.

posix_getuid, posix_geteuid, posix_getgid, posix_getegid estas cuatro funciones son muy parecidas y devuelven respectivamente: Real user ID del proceso; Effective user ID del proceso; Real GID del proceso; Effective GID del proceso. Podemos poner un ejemplo que las visualice todas: $UID = posix_getuid(); echo "UID = $UID\n"; $EUID = posix_geteuid(); echo "EUID = $EUID\n"; $GID = posix_getgid(); echo "GID = $GID\n"; $EGID = posix_getegid(); echo "EGID = $EGID\n"; posix_getlogin Esta funcin nos permite recuperar el nombre de login del usuario que ejecuta el script. Por ejemplo, podemos escribir: $login = posix_getlogin("/usr/sbin/apache"); echo $login; para conseguir que el nombre del usuario que ejecuta el script se visualice en la pantalla. posix_uname esta funcin es precida al "uname" de los sistemas Posix-compliant y devuelve informaciones sobre el sistema. Estas informaciones estn organizadas en un array que incluye las claves: sysname nodename release version machine Por ejemplo, ejecutando un script del tipo: $uname = posix_uname(); while (list($key, $value) = each ($uname)) { echo "$key -> $value\n"; }

se obtiene el resultado: sysname -> Linux nodename -> scatolinux release -> 2.2.14 version -> #11 mar lug 4 00:06:07 CEST 2000 machine -> i586 posix:getpwname esta funcin nos permite tener determinadas informaciones sobre un usuario del sistema partiendo de su ID. De la misma forma, la funcin "posix_getpwuid()" da las mismas informaciones partiendo de su ID. Un ejemplo podra ser algo parecido a: $user = posix_getpwnam("edo"); while (list($info, $value) = each($user)) { echo "$info -- $value\n"; } que devuelve: name -- nombre_usuario passwd -- x uid -- NUM gid -- NUM gecos -- ,,, dir -- /home/nombre_usuario en la que "nombre_usuario" es el nombre del usuario y "/home/nombre_usuario" es su directorio principal, NUM son los dos atributos numricos asociados al UID y a GID y gecos son informaciones adicionales sobre el usuario, si las introducimos (nombre completo, etc.). posix_getrlimit Esta funcin devuelve un array que incluye los lmites de los recursos del sistema: sin analizar las voces, vamos a ver un ejemplo: $resources = posix_getrlimit(); while (list($key, $value) = each ($resources)) { echo "$key -> $value\n"; } que devolver un output del tipo: soft core -> 0 hard core -> unlimited soft data -> unlimited hard data -> unlimited soft stack -> 8388608

hard stack -> unlimited soft totalmem -> unlimited hard totalmem -> unlimited soft rss -> unlimited hard rss -> unlimited soft maxproc -> 256 hard maxproc -> 256 soft memlock -> unlimited hard memlock -> unlimited soft cpu -> unlimited hard cpu -> unlimited soft filesize -> unlimited hard filesize -> unlimited soft openfiles -> 1024 hard openfiles -> 1024 Las extensiones

En los captulos anteriores hemos visto las principales funciones referidas al lenguaje para la creacin de nuestras pginas dinmicas. La diferencia entre esas funciones y la familia de las que veremos a continuacin es esencial. Las primeras se encuentran directamente en el motor (built-in), las segundas estn en las bibliotecas aadidas que se tienen que instalar en el sistema de forma especfica. En primer lugar, intentamos comprender el mecanismo para cargar dinmicamente estas bibliotecas. Si abrimos el archivo "php3.ini" veremos un prrafo dedicado a las "Extension", es decir, extensiones en el mismo lenguaje. Para ser ms claros podemos decir que stas son un conjunto de bibliotecas que se invocan cuando se ejecuta un script como ocurre para cargar los mdulos con un servidor de la red. La sintaxis para cargar estas extensiones de lenguaje es muy simple: una vez instalada la biblioteca en el sistema, no nos queda que aadir en el archivo php3.ini la lnea: extension=biblioteca Llegados a este punto tenemos que diferenciar entre los sistemas Unix y los sistemas Windows. Para las dos sintaxis el procedimiento es el mismo, pero, por supuesto, el nombre de las bibliotecas y sus extensiones no lo es. En los sistemas Windows, una biblioteca se reconoce por la extensin ".dll", mientras que para Unix las extensiones son ".so". Por lo tanto, segn el sistema, tendremos que utilizar el nombre correcto para la biblioteca y, sobre todo, la extensin correcta. Obviamente, para los que tengan los dos sistemas instalados y consigan ver los dos est claro que las dll no se pueden cargar en un sistema Unix y viceversa. Cuando escribimos el nombre de la biblioteca que queremos cargar, no tenemos que detenernos en el recorrido completo, es necesario slo el nombre de la misma, por ejemplo "pgsql.so" para las bases de datos Postgres. Esto porque, en el mismo archivo, hay otra lnea de configuracin que define en qu directorio estn estas biblioteca. Leyendo el archivo php3.ini podis ewncontrar la lnea "extension_dir = directory" que le dir al motor la locacin estndar de las bibliotecas. Por lo tanto, cuando especificamos con "extension" una biblioteca que quremos cargar para ejecutar un script, de hecho se juntan "extension_dir" y "extension". Si, por ejemplo, "extension_dir" es "/usr/lib/php3" y hemos

impostado "extension=pgsql.so", el PHP sabr que para cargar la biblioteca "pgsql.so" tendr que buscarla en "/usr/lib/php3/pgsql.so". Adems, con "extension= ...." es posible especificar no slo una biblioteca sino toda la serie de las bibliotecas que nos hagan falta. Por ejemplo, podemos tener algo parecido como: extension=pgsql.so extension=mysql.so extension=gd.so extension=imap.so extension=ldap.do extension=xml.so etc. Como podis ver en la segunda lnea, es posible especificar tambin dos o ms bibliotecas para un mismo "campo". En este caso hay dos bibliotecas para dos bases de datos (Postgres e mySQL) que, adems de no interferir la una con la otra, podran tericamente ser utilizadas a la vez, siempre que esto sea til. Si intentamos invocar una funcin no built-in en un script, el script visualiza un mensaje de error que nos avisa de que estamos intentando utilizar una funcin que no est reconocida. Por ejemplo, para las bases de datos se tienen que cargar las extensiones como hemos dicho antes y, slo despus de haber dado este paso, ser posible utilizar las funciones relacionadas sin arriesgarnos a que salgan mensajes de error, siempre que se hayan utilizado de forma correcta. El porqu de las extensiones

Llegados a este punto, habr alguien que se est preguntando para qu sirven estas bibliotecas aadidas (a veces muy importantes e incluso esenciales) que se tienen que bajar, instalar e invocar indirectamente. La explicacin es simple: para no sobrecargar demasiado el motor. ste ya tiene muchas funciones built-in, que podemos definir como funciones "principales" para el lenguaje, aunque algunas puedan perecer poco tiles. Imaginaos que el motor tuviera tambin todas las funciones que se refieren a todas las bases de datos que soporta. Tendra otras cien (o ms) funciones, y esto no sera malo si el 95% de estas funciones no se quedara inutilizado. De hecho quin necesita trabajar con el PHP y unas diez bases de datos diferentes? Es mejor instalar la extensin para la base de datos que se tiene que utilizar en lugar de sobrecargar el motor con funciones que no vamos a utilizar nunca. Adems, pensad en las funciones de la biblioteca GD. Sin duda son interesantes por los resultados que permite alcanzar, sin embargo quin los utiliza realmente? Es ms simple tener todas estas informaciones en un archivo separado y dejar que ste se instale y sea utilizado cuando realmente sea necesario. Si os dais cuenta, es lo que ocurre con todos los lenguajes de programacin. Existen las primitivas (que podemos definir como las funciones esenciales y built-in en un sistema) y las funciones externas que se invocan cuando se necesitan. Si comparamos los lenguajes de scripting con el Perl, por ejemplo, podemos observar que ste tiene muchas funciones built-in en el intrprete, a las que se aaden infinitos mdulos que el programador puede utilizar en sus propias creaciones.

Introduccin a PHP y base de datos

Muchos sabrn que uno de los campos en los que el PHP da lo mejor de s es la interaccin con las bases de datos SQL. En las guas prcticas que de las pginas precedentes, habis visto como interactuar con una base de datos mySQL: aqu veremos las bases tericas, con ejemplos cuando lo necesitemos, para la conexin y la interaccin con una base de datos PostgreSQL. Por lo tanto analizaremos todas las funciones que el PHP nos pone a disposicin para poder trabajar en red con una base de datos y no cmo crear una base de datos. Nos puede resultar til el seminario de Lucio Benfante publicado en nuestras pginas. Supongamos que hemos creado una base de datos "agenda" que incluye la tabla "direcciones". Si lanzamos el mando "SELECT * FROM direcciones" obtenemos:

stos son los datos con los que trabajaremos, pero antes hagamos veamos las funciones que estn a disposicin del PHP para la interaccin con la base de datos PostgreSQL. Configuraciones antes de empezar

En primer lugar, tenemos que estar seguros de que hemos instalado en el sistema la biblioteca PHP que permite la interaccin con la base de datos. Esto lo conseguimos instalando el paquete y, si cabe, dando instrucciones al motor sobre la locacin en la que tiene que ir a buscar esta biblioteca. Con respecto al paquete ste se llama, en los sistemas Linux, "php3-pgsql", pero podra tener otros nombres en otros sistemas. Normalmente tenis que buscar (tericamente incluso en el sitio PHP) el paquete que permite conectarse a las bases de datos PostgreSQL directamente desde del script PHP. Una vez instalado tendris que localizar la biblioteca que se ha escrito para este fin, que en mi sistema se carga en: /usr/lib/php3/apache/pgsql.so. Obviamente, sta cambiar no slo de arquitectura a arquitectura, sino tambin de sistema a sistema. Por lo tanto, mucho cuidado y no olvidis este paso o, a cada conexin con una base de datos, os saldr un aviso diciendo que habis invocado una funcin no implementada en PHP (el mensaje de error es

algo parecido a "Call tu unsupported function nombre_funcin()"). Abramos un parntesis: si habis echado un vistazo al manula PHP, os habris dado cuenta de que hay muchsimas funciones (algunas las vimos en las pginas anteriores), entre las que hay algunas que son propias para la interaccin con las bases de datos. Sin embargo, muchas de estas funciones, por supuesto, no se implementan directamente en el motor y se tienen que cargar en runtime siguiendo determinadas instrucciones. Cuando decimos "por supuesto" nos referimos a que sera intil sobrecargar el motor con todas las bases de datos que posiblemente no utilicemos nunca. Dicho esto podemos pasar al archivo de configuracin del php, aadiendo el directorio en el que est la biblioteca que acabamos de cargar de forma que el motor la pueda utilizar. Para hacerlo ser necesario localizar la lnea que empieza por: extension_dir Como podemos ver en su descripcin, entendemos enseguida que en este directorio estn los mdulos que hay que utilizar. Por lo tanto Modifiqumosla de la siguiente forma: extension_dir = /path/perl/i/nuovos/mdulos que, por ejemplo, en mi sistema ser: extension_dir = /usr/lib/php3/apache Ahora ya estamos seguros de que conseguiremos utilizar las funciones referidas a las bases de datos sin problemas de ejecucin de los script. Veamos ya las funciones utilizando los ejemplos que sean necesarios y haciendo referencia a las guas prcticas al PHP para los dems ejemplos. Funciones

Empecemos con una pequea adevertencia: todas las funciones que se refieren a la base de datos PostgreSQL tienen el nombre que empieza por "pg_" para diferenciarlas de las funciones parecidas utilizadas en otras bases de datos. No hubiera tenido ningn sentido utilizar una funcin con el nombre genrico "connect()" para la conexin a una base de datos. Por lo tanto tendris la funcin "pg_Connect()" y la funcin "mysql_connect()" y muchas ms cuyo nombre termina por "connect", pero que se refieren a diferentes bases de datos. Ahora podemos empezar el anlisis de las funciones que pueden ser tiles para nuestros script. pg_connect Abre la conexin a una base de datos Postgres; la sintaxis de la funcin acepta mediante argumentos el husped, la puerta, determinadas opciones (opcionales), la tty (opcionales) y el nombre de la base de datos. Todos los valores se tienen que poner entre comillas. La conexin desde una base de datos PostgreSQL se puede hacer con: pg_connect("dbname=... port=... host=... tty=... options=... user=... password=...");

Obviamente, se tienen que sustituir los puntos suspensivos con los valores necesarios para la conexin. Podemos escribir simplemente: $conexin = pg_connect("dbname=agenda"); Con esta sintaxis, por lo tanto, nos hemos conectado a nuestra base de datos. Para comprobarlo, sin embargo, podemos aadir: $conexin = pg_connect("prueba_db"); if ($conexin) { print "Conectado\n"; } De este modo, si se logra establecer una conexin (y, por tanto, si la variable $conexin esta definida) aparecer una lnea de confirmacin. Uno de los errores ms usuales es pensar que $conexin, en este caso, se puede leer para ver los valores introducidos en la base de datos. Introducir "echo $conexin" no tiene ningn sentido porque el script slo conseguira restituirnos un "1", en caso de que la conexin se efecte, y un "0", en caso contrario. Por tanto, $conexin y, en general, cualquier variable que asociemos a la funcin pg_connect ( y, en general, a todas las funciones de connect relativas a otras bases de datos) es solamente el estado de la conexin, y no un instrumento para leer los datos del database. Veremos a continuacin cmo leer los datos y visualizarlos en una pgina web. pg_Close Como podemos imaginar, la funcin pg_Close cierra una conexin precedentemente abierta con pg_Connect. Para cerrar la conexin que hemos abierto con el cdigo antes presentado, ser suficiente utilizar la sintaxis: $desconexin = pg_Close($conexin); que reproducir valor verdadero (1) en caso de que la conexin se haya establecido precedentemente y, con este mando, cerrada, falso, en caso contrario. pg_DBname Esta funcin restituye el nombre de la base de datos a la que estemos conectados, o el valor falso en caso de que no se haya establecido ninguna conexin; la sintaxis para utilizar este mando es: $dbname = pg_DBname($conexin); echo "$dbname\n"; pg_ErrorMessage Restituye una cadena que contiene un mensaje de error que proviene del database. pg_Exec

-------- Bsicamente, este mando ejecuta una query (pregunta) en la base de datos. Nos podramos esperar que esta funcin representa los campos interesados en la query pero no es as. Si escribimos, por ejemplo: $query = pg_Exec($conexin, "SELECT * FROM indirizzi"); no podemos visualizar directamente el valor de $query, o mejor no tiene sentido hacerlo. Tendremos que servirnos de otras funciones que veremos a continuacin, por ejemplo pg_Numrows, pg_Fetch_Array etc. pg_Fetch_Array Ejecuta el fetch de una lnea introduciendo los valores dentro de un array. Hemos hablado antes de pg_Exec y de que muchas funciones son "complementari" a sta. Es el caso de pg_Fetch_Array. Podemos ejemplificar todo: $query = pg_Exec($conexin, "SELECT * FROM direcciones"); $query_result = pg_Fetch_Array($query, 0); echo "<b>Nombre:</b> "; echo $query_result[0], "<br>"; echo "<b>Apellidos:</b> "; echo $query_result[1], "<br>"; echo "<b>Direccin:</b> "; echo "$query_result[2], $query_result[3] <br>"; Veamos ms de cerca lo que hemos hecho. Entretanto con pg_Exec_Query hemos colocado la query que queremos ejecutar en la base de datos; con el sucesivo pg_Fetch_array hemos especificado que la primera lnea de la query (la lnea cuyo nmero es cero) se memorizase en la variable $query_result; despus hemos visualizado todos los datos formatndolos para una pgina HTML. Notad que pg_Fetch_Array acepta como parmetros la query (en nuestro caso $query) y la lnea a la que hace referencia; nosotros, en este caso hemos elegido la primera, pero con una sintaxis ms "fina" podremos crear la misma pgina con todos los datos introducidos en el database: $query = pg_Exec($conexin, "SELECT * FROM direcciones"); $righe=pg_numrows($query); // veremos la funcin pg_numrows ms adelante for ($num=0;$num<=$lneas-1;$num++) { $query_result=pg_fetch_array($query, $num); echo "<b>Nombre:</b> "; echo $query_result[0], " "; etc. etc. } De esta forma, con un simple "for" y sabiendo el nmero total de las lneas interesadas en la query, hemos logrado que todas sean procesadas y visualizadas. pg_Fetch_Object Esta funcin ejecuta las mismas operaciones que la anterior con la diferencia de que en este caso se

crea un objeto con los resultados de la query y no un array de datos. De este modo no tendremos ya que invocar los datos del interior del array con los nmeros del ndice, sino que podremos utilizar el nombre del campo, por ejemplo: $query = pg_Exec($conexin, "SELECT * FROM direcciones"); $query_result = pg_Fetch_Object($query, 0); echo "Nombre: ", $query_result->nombre; echo "Apellidos: ", $query_result->apellidos, "\n"; echo "Direccin:", $query_result->direccin, "\n"; Tambin en este caso hubiramos podido introducir un bloque "for" para visualizar todos los datos presentes en la base de datos. pg_NumFields e pg_NumRows Estas dos funciones restituyen, respectivamente, el nmero de campos y de lneas interesadas en la query. Hemos visto la funcin pg_NumRows precedentemente, pero podemos resumir el uso de las dos funciones con: $query = pg_Exec($conexin, "SELECT * FROM direcciones WHERE nombre LIKE 'Ma%' OR apellidos LIKE 'Ro%'"); $righe = pg_NumRows($query); $campi = pg_NumFields($query); echo "La query interesa $lneas lneas y $campos campos.\n"; Como veis, hemos complicado la query pero el resto del cdigo es muy fcil de entender. Y ahora qu?

Esperamos que hasta aqu os hayamos ofrecido una buena visin de conjunto de las funciones del PHP que se pueden utilizar con el Postgres. No hemos visto las funciones menos importantes por una razn muy simple: pensamos que es ms oportuno, por el momento, comenzar con un rodaje inicial del tema que, de todos modos, os capacite para poder operar. Si, ms adelante, el tema os interesa, cada uno por su cuenta puede profundizar en el mismo. Otra cuestin es la de la eleccin de la base de datos. El que escribe trabaja con Postgres, por lo tanto la eleccin es obligada. Para los que utilizis otros database, sabed que las funciones, aunque con nombres diferentes, se comportan en el 90% de los casos del mismo modo que se ha descrito aqu. La sintaxis es la misma, los resultados son los mismos, lo nico que cambia es el nombre de las funciones; por ejemplo, para Oracle8 los nombres de las funciones sern OCI... as encontraris OCIExecute, OCIRowcount etc. Encontraris adems funciones con un nombre ligeramente cambiado pero que se explica por s mismo. Con Oracle8 no tendris la funcin OCIConnect sino OCILogon, y lo mismo con las dems funciones. Resumiendo y como hemos dicho antes, se puede trabajar con la mayora de los database que trabajan con PHP.

Gestin de los Cookies

Como todo buen lenguaje referido a la creacin dinmica de pginas web, tambin el PHP permite gestionar los cookies, que son pequeos archivos de texto que incluyen informaciones tiles y no peligrosas para la gestin de las sesiones en el web. Siendo PHP un lenguaje que naci para la interaccin con el WWW, las funciones que se refieren a los Cookies son internas al PHP mismo. Otra cosa totalmente diferente ocurre con los dems lenguajes, Perl en primer lugar (para este tema vase el seminario sobre los Cookies en Perl publicado en CGIpoint y la recensin de cookie-lib en el mismo sitio). La funcin que nos interesa es slo una setcookie(). Bsicamente su sintaxis es: setcookie(Nombre, Valor, Caducidad, Recorrido, Dominio, Secure); Intentemos aclarar las opciones que se pueden pasar a la funcin: Nombre es el nombre del cookie que se puede elegir de forma arbitraria; Valor es el valor,arbitrario, que se asigna al cookie; Caducidad es la fecha de caducidad del cookie; Recorrido es el directorio a partir del dominio (ver abajo) para el que es vlido; Dominio es el dominio para el que es vlido; Secure es un valor que decide si el cookie se tiene que enviar a travs de una conexin HTTPS. Si queremos enviar de nuestra pgina un cookie llamado "Test", con valor "Prueba del cookie Test", con duracin de un minuto del envo, para el directorio "/nombreusuario" del dominio "http://www.dominio.com" sin utilizar una conexin HTTPS, los parmetros que hay que pasar a setcookie son: setcookie("Test", "Prueba del cookie Test", time()+60, "/nombreusuario", ".dominio.com", 0); Las cosas interesantes que hay que analizar son dos: el tiempo de duracin y la conexin HTTPS. Por lo que se refiere a la segunda, fijamos con "0" que la conexin tiene que ser normal. Si quisiramos utilizar el protocolo seguro HTTPS, tendramos que introducir el valor "1". El tiempo de duracin no se puede fijar como "Tres minutos", porque no da tiempo. En cambio tenemos que fijar el momento de caducidad a partir del momento en el que el cookie se enva al usuario, por eso utilizamos las funcin interna time() a la que aadimos el nmero de segundos a partir de los que tiene que caducar el cookie. Por ejemplo, si el cookie se enva a las 13:20:00 y queremos que caduque al cabo de 30 minutos (60x30=1800 secondi), podemos escribir una expresin de expire: time()+1800 De esta forma, time() corresponde a 13:20:00 y time()+1800 ser 13:50:00 Entre los seis valores que hay que pasar como argumento al cookie, solamente el primero es obligatorio, los dems se pueden dejar en blanco si no nos interesan. Adems, para enviar un cookie, es

necesario que ste se enve al browser antes de cualquier output, por eso es necesario introducir la funcin delante de todos los tag <HTML> o <HEAD>. Para terminar, vamos a ver cmo leer un determinado cookie de un script. Recordemos que un cookie se enva como un array de datos y que podemos acudir a las funciones relacionadas a los array. Por lo tanto, podemos escribir: if (isset ($cookie) ) { while (list ($nombre, $valor) = each ( $cookie ) ) { echo "$nombre = $value\n"; } } Para todas las informaciones introducidas en el cookie se visualizar una pareja "nombre = valor". Obviamente, el valor es el que habis establecido en el cookie, los "nombres" son: cookie, expires, path, domain y secure (ste ltimo es singular porque si se fija en 1 da "secure" en el cookie, sino no da nada). Para nuestro cookie de ejemplo, leeremos algo como: cookie=Test; epires=Thursday, expires=Monday, 31-Jul-00 11:50:00 GMT; path=/nombreusuario; domain=.dominio.com Si hubiramos fijado 1 en vez de 0 para el protocolo HTTPS, hubiera aparecido tambin "secure" al final de la cadena. Fijaos en una ltima cosa: la fecha se gestiona de default segn la hora GMT. La caducidad, de hecho, se ha fijado para las 11:50:00 GMT, que son las 13:50:00 locales. Autentificacin con PHP

Con el PHP y la ayuda de su funcin "header" es posible programar las pginas protegidas sin utilizar los archivos .htaccess o las autorizaciones del servidor. Bastar simplemente con enviar un header particular al browser antes de pasarle el output para que, en una pgina, se pidan username y password para el acceso. Para empezar, hay que copiar este cdigo en un archivo y hay que invocarlo a travs del browser: $username = "tribiln"; $pwd = "secreta"; if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"Zona protegida\""); Header("HTTP/1.0 401 Unauthorized"); echo "Imposibile ejecutar la autorizacin\n"; exit; } else { if (($PHP_AUTH_USER == $username) && ($PHP_AUTH_PW == $pwd)) { echo "Autorizacin ejecutada para $username."; } else { echo "Autorizacin fracasada.";}

} De esta forma, fijamos "tribiln" como nombre del usuario y "secreta" como contrasea. Si los datos introducidos por el usuario en la autorizacin corresponden a stos, la autorizacin se lleva a cabo, si no fracasa. Pero cmo funciona todo esto? Empecemos por el funcionamiento del script que acabamos de presentar. En primer lugar, hay que controlar si se ha fijado la variable PHP_AUTH_USER, es decir, el nombre del usuario que entra en la pgina protegida. Si existe, posiblemente el usuario se autorice antes y, por esta razn, se "recuerda". De todas formas, tanto si el usuario se ha autorizado anteriormente como si es su primera visita a la pgina, se controla que el nombre del usuario y la contrasea introducida en la autorizacin sean excctamente $username y $pwd. Si coinciden es posible visualizar el output de la autorizacin que se ha llevado a cabo (lo que hemos fijado como "Autorizacin llevada a cabo para $username"); si no se da un mensaje de error (en nuestro caso "Autorizacin fracasada"). Si, en cambio, no existe $PHP_AUTH_USER, se enva un header para la autorizacin (el cdigo 401) que muestra al usuario la instruccin que le pide username y password. Cuando se han introducido, se ejecutar el bloque que hemos descrito arriba y, si el usuario decide no autorizarse, se le muestra una pgina que incluye el texto "Imposibile ejecutar la autorizacin", que se puede personalizar. La funcin que controla todo este proceso es "header()", que se utiliza para mandar un header al browser que ha enviado la solicitud. Como lo que se enva es un header, es necesario que ste se enve antes de cualquier otro output. La funcin es muy simple: vamos a ver unos ejemplos: si quisiramos enviar un header que vuelva a mandar el browser a una determinada locacin, podemos escribir: header("Location: http://www.htmlpoint.com"); si, en cambio, quisiramos enviar un mensaje de pgina inexistente o una instruccin para que el browser no utilice la cache, podramos escribir respectivamente: header("http:/1.0 404 Not Found"); header("Pragma: no-cache"); Llegados a este punto, habis entendido cmo se vuelve a localizar con PHP sin la ayuda de archivos como .htaccess o archivos parecidos. Por supuesto podis mejorar los ejemplos que hemos propuesto para implementarlos con xito en vuestras pginas Web.