Вы находитесь на странице: 1из 32

Curso programacin en PHP y MySQL

Bloque II: El Lenguaje PHP Funciones y bibliotecas.


Ponentes: Vicente Martnez Martnez y Juan Jos Guarinos Huesca

CEFIRE

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.

ndice de contenidos
1 - Presentacin de la Sesin.......................................................................................5 2 - Crear funciones y reutilizar cdigo...........................................................................6 2.1 - Definicin de funciones.....................................................................................6 2.2 - Paso De Parmetros Por Referencia................................................................7 2.3 - Parmetros Por Defecto....................................................................................8 2.4 - Reutilizar Cdigo...............................................................................................8 3 - Funciones de manejo de cadenas.........................................................................11 3.1 - Formato De Cadenas......................................................................................11 3.1.1 - Limpiar cadenas......................................................................................11 3.1.2 - Aplicar formato a cadenas para presentaciones.....................................11 3.1.3 - Cambiar mayscula y minsculas...........................................................12 3.1.4 - Formato para almacenamiento...............................................................12 3.2 - Combinar Y Dividir Cadenas...........................................................................13 3.3 - Comparar Cadenas.........................................................................................14 3.4 - Buscar subcadenas y reemplazarlas con funciones de cadena.....................15 3.4.1 - Buscar cadenas en cadenas...................................................................15 3.4.2 - Buscar la posicin de una subcadena.....................................................16 3.4.3 - Sustituir subcadenas...............................................................................16 3.5 - Expresiones Regulares...................................................................................17 3.5.1 - Buscar subcadenas con expresiones regulares.....................................18 3.5.2 - Sustituir cadenas con expresiones regulares.........................................18 3.5.3 - Dividir cadenas con expresiones regulares............................................18 4 - Funciones de gestin de archivos y flujos.............................................................19 4.1 - Apertura y cerrado de un fichero.....................................................................19 4.1.1 - Problemas al abrir un archivo..................................................................21 4.2 - Funciones de escritura y lectura.....................................................................21 4.3 - Funciones de utilidad.......................................................................................24 4.4 - Funciones de desplazamiento dentro del flujo................................................24 4.5 - Bloquear archivos............................................................................................25 5 - Funciones De Gestin De Fecha y Hora...............................................................27 6 - Resto de la Biblioteca De Funciones.....................................................................29 7 - Gestin de errores procedural...............................................................................30

CEFIRE

Programacin en PHP y MySQL

7.1 - Configuracin de errores.................................................................................30 7.2 - Captura de errores..........................................................................................30 7.3 - Sistema de abandono de la ejecucin............................................................31 7.4 - Generacin de asertos para depuracin.........................................................31 7.5 - Funciones de traza y depuracin....................................................................32 8 - Bibliografa.............................................................................................................33

-4-

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

1 - PRESENTACIN DE LA SESIN
En este bloque se presenta la forma que PHP tiene de modularizar el cdigo mediante el uso de procedimientos y funciones. Adems se abordarn tres de las principales bibliotecas de funciones que el lenguaje tiene como son el manejo de cadenas, ficheros y tiempo.

-5-

CEFIRE

Programacin en PHP y MySQL

2 - CREAR FUNCIONES Y REUTILIZAR CDIGO


2.1 - Definicin de funciones
PHP adems de su vertiente Orientada a Objetos. Nos permite aplicar esquemas de programacin estructurada como puede ser la divisin en mdulos (funciones) de un problema. Esto nos permitir reutilizar cdigo, disminuir costes, aumentar la fiabilidad y uniformidad de nuestro cdigo, etc Una funcin se puede definir con la siguiente sintaxis:
<?php function nombre_funcion($arg_1, $arg_2, ..., $arg_n) { echo "Funci&oacute;n de ejemplo.\n"; return $valor_retorno; // Opcional } ?>

La declaracin comenzar con la palabra clave function seguida de nombre_funcion que ser el identificador o nombre escogido por el programador para la misma. Los parmetros formales sern los representados por las variables $arg_1, $arg_2, Tambin se puede declarar funciones que acepten un nmero de parmetros variable. Por medio de las funciones de ayuda func_num_args(), func_get_arg() y func_get_arcgs() se puede saber cuntos parmetros se han pasado y qu valores tienen. http://docs.php.net/manual/es/function.funcget-args.php Cualquier instruccin vlida de PHP puede aparecer en el cuerpo de la funcin, que estar comprendido entre las llaves, incluso otras funciones y definiciones de clases. Los valores se retornarn usando la palabra reservada opcional return esta interrumpir la ejecucin de las instrucciones dentro de la funcin, finalizando la misma, pudiendo devolverse cualquier tipo de valor incluso matrices y objetos. Si nos fijamos bien no hace falta definir como en otros lenguajes el tipo de retorno, este ser igual al de la variable o el literal que se retorne, por tanto si ponemos ms de un retorno conviene que siempre retornemos el mismo tipo.

Si la funcin tiene excesiva carga lgica, salvo en casos muy claros, evitaremos usar retornos en medio de la lgica de la funcin. Esta prctica adems de liar puede conducir a errores por no cerrar descriptores de fichero, no cerrar conexiones a bases de datos, etc

-6-

El Lenguaje PHP Funciones y bibliotecas. Una llamada a funcin tendr el siente aspecto:

Vicente Martnez Martnez Juan Jos Guarinos Huesca

$retorno = nombre_funcion(val_1, val_2, , val_n);

Si la funcin retorna algn valor este debera ser asignado a alguna variable. val_1, val_2, sern los parmetros reales y podrn ser literales, constantes, variables e incluso otras llamadas a funciones, aunque esto ltimo no es una buena prctica. Los nombres de funcin, al contrario que las variables, no discriminan entre maysculas y minsculas, a la hora de ser llamada.

2.2 - Paso De Parmetros Por Referencia


Por defecto, los parmetros de una funcin se pasan por valor (de manera que si cambias el valor del argumento dentro de la funcin, no se ve modificado fuera de ella). Si deseas permitir a una funcin modificar sus parmetros, debes pasarlos por referencia. Si quieres que un parmetro de una funcin siempre se pase por referencia, puedes anteponer un ampersand (&) al nombre del parmetro en la definicin de la funcin. Esto puede ser til en casos en que necesitemos ms de un parmetro de salida. y no queramos retornarlos mediante una matriz al quedar ms confuso.
// $nombre y $dominio son variables que se pasan por referencia y // actuan como parmetros de salida. function ObtenerNombreYDominio($correo, &$nombre, &$dominio) { $datosCorreo = explode('@', $correo); $nombre = $datosCorreo[0]; $dominio = $datosCorreo[1]; } $correo = 'ejemplo@iesdoctorbalmis.com'; ObtenerNombreYDominio($correo, $nombre, $dominio); echo $nombre.'<br>'.$dominio;

-7-

CEFIRE

Programacin en PHP y MySQL

2.3 - Parmetros Por Defecto


Deberemos tener cuidado al utilizarlos, ya que pueden dan lugar a que una funcin haga ms de una cosa; lo que traera como consecuencia una baja cohesin entre los mdulos. Otros lenguajes no los permiten.

Estos se definirn al estilo de C++ donde valor por defecto tiene que ser una expresin constante, y no una variable, miembro de una clase o llamada a una funcin. Destacar que cuando se usan parmetros por defecto, estos tienen que estar a la derecha de cualquier parmetro sin valor por defecto.
function DibujaMenuBotones($menu_botones_enlace, $estilo = 'st_menu') { echo '<div class="'.$estilo.'">'; foreach ($menu_botones_enlace as $descripcion => $enlace) echo '<a href="'.$enlace.'"><span>'.$descripcion.'</span></a>'; echo '</div>'; } $menu_botones_enlace = array( 'Listado altas' => 'listado_altas.php'); 'Listado bajas' => 'listado_bajas.php'); DibujaMenuBotonesEnlace($menu_botones_enlace); DibujaMenuBotonesEnlace($menu_botones_enlace, 'st_menu_listado');

2.4 - Reutilizar Cdigo


PHP incorpora dos instrucciones muy sencillas pero de gran utilidad para permitir la reutilizacin de cualquier tipo de cdigo. Mediante las instrucciones require() o include() puede cargar un archivo en la secuencia de comandos de PHP de forma muy similar a como funciona el #include en C o C++. La sentencia require() incluye y evala el archivo especificado. require() incluye y evala el archivo especificado. Informacin detallada de como esta inclusin funciona se puede encontrar en la documentacin de la funcin include(). require() y include() son idnticas en todos los aspectos excepto en el modo de actuar ante un error. include() produce un Warning mientras que require() produce un Error Fatal. En otras palabras, no dude en utilizar require() si quiere que un fichero no encontrado cuelgue el procesamiento de la pgina. include() no se comporta de esta manera, el script seguir funcionando de todas maneras. Cuando un fichero es incluido, el cdigo que contiene hereda la variable scope de la lnea en donde el include ocurre. Cualquier variable disponible en esa lnea en el fichero desde donde se hace la inclusin estar disponible en el fichero incluido a partir de ese momento. -8-

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

Si la inclusin ocurre dentro de una funcin en el fichero donde se incluye, todo el cdigo contenido en el fichero incluido se comportar como si hubiese sido definido dentro de esta funcin. PHP antes de hacer include() o require() cierra la secuencia de comandos con ?> y tras incluir el fichero la vuelve a abrir <?php PHP no examina la extensin del archivo a incluir, aunque normalmente suelen usarse las siguientes: .inc EL archivo contiene una librera de funciones o secuencia de comandos en PHP. .html Si el archivo slo contiene cdigo HTML. .php Si el archivo contiene una secuencia de comandos PHP que tenga sentido por si sola adems de incluirse en otro.php. Los archivos incluidos se buscarn en: Una ruta absoluta si esta se especifica (poco recomendable). SI no se especifica ruta se buscarn en la ubicacin donde se encuentra el script que los incluye o en las rutas especificadas en la opcin de configuracin de PHP.INI include_path. Si esta a on la opcin del configuracin de PHP.INI allow_url_fopen, podremos referenciar los archivos a incluir a travs de una URL. Dispondremos tambin de require_once() e include_once() que me garantizarn que un archivo slo es incluido una vez, de esta forma evitaremos errores por doble definicin de una funcin por ejemplo. A continuacin podemos ver un ejemplo donde en el archivo principal.php se incluyen archivos con cdigo HTML y PHP que pueden ser reutilizados en otra pginas web.

-9-

CEFIRE

Programacin en PHP y MySQL

-------------------------estilo.css------------------------------.texto_cabeceras { background-color: #000099; font-family: Verdana, Arial; font-size: medium; color: #FFFFFF; font-weight: bold; } .menu_botones_enlace a { font-size: 90%; font-weight: normal; font-family: Arial, Helvetica, sans-serif; margin-top: 2mm; margin-right: 1mm; margin-bottom: 2mm; margin-left: auto; border:1px solid #111111; padding:3px; width: 15%; color: #0066CC; background-color: #FFFFFF; text-align: center; text-decoration: none; } .menu_botones_enlace a:hover { border:1px ridge #0066CC; color: #FFFFFF; background-color: #0066CC; } -------------------------cabecera.html-----------------------------<html> <head> <title> IES Inventado </title> <link href="estilo.css" rel="stylesheet"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="texto_cabeceras" width="100%"> I.E.S. DOCTOR BALMIS </td> </tr> </table> -------------------------pie.html-----------------------------------<table width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="texto_cabeceras" width="100%">php powered</td> </tr> </table> </body> </html> -------------------------libreria.inc-------------------------------<?php function EscribeParrafo($texto, $estilo='texto_normal') { echo '<div class='.$estilo.'>'.$texto.'</div>'; } function DibujaMenuBotones($menu_botones_enlace) { echo '<div class="menu_botones_enlace">'; foreach ($menu_botones_enlace as $descripcion => $enlace) echo '<a href="'.$enlace.'"><span>'.$descripcion.'</span></a>'; echo '</div>'; } ?> -------------------------principal.php-----------------------------<?php // Inclusin de la cabecera comn a todas las pginas. include('cabecera.html'); // Inclusin libreria de funciones. require('libreria.inc'); $menu = array('Inicio'=>'inicio.php','Secretaria' =>'secretaria.php', 'Oferta educativa'=>'oferta.php', 'Departamentos'=>'dep.php'); DibujaMenuBotones($menu); EscribeParrafo('Fechas exmenes de septiembre...'); // Inclusin del pie comn a todas las pginas. include('pie.html'); ?>

- 10 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

3 - FUNCIONES DE MANEJO DE CADENAS


Hemos visto alguna de las caractersticas de las mismas al hablar de literales de cadena, as como de operadores de concatenacin como '.' y '.='. En este punto vamos a abordar algunas de las funciones de utilidad ms usadas o interesantes sobre cadenas como las siguientes.

3.1 - Formato De Cadenas.


3.1.1 - Limpiar cadenas
A menudo es necesario limpiar de espacios en blanco de cadenas procedente de la entrada de usuarios, por ejemplo antes de almacenarlas en una base de datos, archivo, etc string trim ( string cad) Elimina espacios del principio y final de una cadena. Los caracteres de espacio que elimina realmente son: "\n", "\r", "\t", "\v", "\0", y el espacio en s. string ltrim ( string cad) Igual que trim pero slo elimina los del principio de cadena. string rtrim ( string cad) Igual que trim pero slo elimina los del final de cadena. Existe una funcin anloga denominada string chop ( string cad)

3.1.2 - Aplicar formato a cadenas para presentaciones


string nl2br ( string cadena) Convierte nuevas lneas a saltos de lnea HTML. Imaginemos que tenemos saltos de lnea procedentes por ejemplo de un fichero y queremos visualizarlos en HTML.
$saludo = "Hola\nMundo"; echo nl2br($saludo); // Imprime: Hola<br />Mundo

string sprintf ( string formato [, mixed args]) y int printf ( string formato [, mixed args]) Equivalente en PHP de las funciones de ANSI C y se pueden usar por ejemplo para mostrar datos numricos con un formato determinado. Ms informacin sobre esta funcin y las opciones de formato se puede encontrar en esta URL: http://docs.php.net/manual/es/function.sprintf.php mixed sscanf ( string cad, string formato [, string var1]) de funcionamiento idntico a su equivalente en C la cual me permite extraer valores de una cadena a variables a partir de un formato dado (Ver referencia en manual). Quiz el formato no tenga mucho sentido en HTML que ignora los espacios pero puede servirnos para serializar a algn tipo de fichero de texto.

- 11 -

CEFIRE

Programacin en PHP y MySQL

string number_format ( float numero [, int decimales [, string punto_dec, string sep_miles]] ) Esta funcin puede evitarnos usar sprintf si queremos formatear un determinado valor numrico. Nos permitir indicar el nmero de decimales, el carcter de punto decimal y el carcter de separacin de miles.
// Extrae los valores de cdigo y precio de la cadena $texto $texto = 'Codigo: ACE y Precio: 80'; sscanf($texto, "Codigo: %s y Precio: %f", $codigo, $precio); // Imprime la cadena cdigo (%-6s) alineado a la // izquierda 6 caracteres y rellenado con espacios a la // derecha (%-6s). // Imprime el precio de tipo float (%10.2f) con dos // decimales (%10.2f) alinendolo a la derecha 10 posiciones // rellenando con espacios por la izquierda ( %10.2f) // $textoFormateado = 'ACE 80.00' $textoFormateado = sprintf("%-6s%10.2f", $codigo, $precio);

3.1.3 - Cambiar mayscula y minsculas


Deberemos tener el cuenta la configuracin local a la hora de pasar a maysculas caracteres como ''. string strtoupper ( string cadena) Pasa a maysculas una cadena. string strtolower ( string cad) Pasa a minsculas una cadena. string ucfirst ( string cad) Pasar a maysculas el primer carcter de una cadena. string ucwords ( string cadena ) Pone en maysculas el primer carcter de cada palabra de una cadena.

3.1.4 - Formato para almacenamiento


Algunos caracteres pueden dar problemas al insertarse en bases de datos pues pueden interpretarse como caracteres de control. La forma de evitar esto es escaparlos, para ello dispondremos de las funciones: string htmlspecialchars ( string cadena) Convierte caracteres especiales a entidades HTML.
$texto = 'La expresin es: ($a > 10 && $a < 50)'; // Imprime: La expresin es: ($a &gt; 10 &amp;&amp; $a &lt; 50) echo htmlspecialchars($texto);

- 12 -

string addslashes ( string cad) Aade caracteres de marcado para almacenamiento en Bases de Datos y evitar ataques SQL Injection. string stripslashes ( string cad)

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

Funcin inversa a addslashes puesto que elimina caracteres de marcado.


$texto = 'La ruta "Principal" es D:\USBAMP<br>'; $textoEscapado = addslashes($texto); // Imprime: La ruta \"Principal\" es D:\\USBAMP echo $textoEscapado; // Imprime: La ruta "Principal" es D:\USBAMP echo stripslashes($textoEscapado);

Existe una opcin en el PHP.INI denominada magic_quotes_gpc si esta a on PHP escapara de forma automtica cualquier cadena proveniente de un GET, un POST o una cookie, como si llamramos a addslashes, por tanto para poder verlas correctamente deberemos llamar a stirpslashes. Adems PHP nos proporciona la funcin long get_magic_quotes_gpc ( void ) que me devolver 1 si la opcin esta habilitada y 0 si no lo est, de esta forma podremos controlar condicionalmente por cdigo si tenemos que llamar a addslashes o stripslashes.

3.2 - Combinar Y Dividir Cadenas.


En ocasiones necesitaremos examinar partes de una cadena por separado, para ello provee de funciones de utilidad de las que veremos las ms destacadas. array explode ( string separador, string cadena [, int limite]) Funcin bastante utilizada que devuelve una matriz de cadenas, cada una de las cuales es una subcadena de cadena formada mediante su divisin en las fronteras marcadas por la cadena separador. Si se especifica limite, la matriz devuelta contendr un mximo de limite elementos con el ltimo conteniendo el resto de la cadena.
$correo = 'juanjo@ejemplo.com'; $datosCorreo = explode('@', $correo); echo "Usuario: $datosCorreo[0]<br>"; // Usuario: juanjo echo "Dominio: $datosCorreo[1]<br>"; // Dominio: ejemplo.com

string implode ( string cola, array piezas) igual que la funcin join Funcin contraria a explode y une elementos de una matriz en una cadena separados por la cadena cola. string strtok ( string arg1, string arg2) Divide una cadena en elementos. Equivalente a so homnima en ANSI C. En el ejemplo dividimos la cadena Una cadena de ejemplo, proponiendo como divisor el carcter espacio. Slo la primera llamada a strtok utiliza el argumento cadena. Cada llamada subsiguiente necesita slo el divisor a utilizar, puesto que ella guarda la posicin actual en la cadena. Para comenzar de nuevo o para dividir otra cadena, simplemente llame a strtok con el argumento de cadena y se inicializar.

- 13 -

CEFIRE

Programacin en PHP y MySQL

$cadena = "Una cadena de ejemplo"; $tok = strtok ($cadena, ' '); while ($tok) { echo "Palabra=$tok<br>"; $tok = strtok (' '); }

string substr ( string cadena, int comienzo [, int largo]) Devuelve la porcin de cadena especificada por los parmetros comienzo y largo. Si comienzo es positivo, la cadena devuelta comenzar en dicho caracter de cadena. Si comienzo es negativo, la cadena devuelta comenzar en dicha posicin desde el final de cadena. Si se especifica largo y es positivo, la cadena devuelta terminar largo caracteres tras el comienzo. Si esto resulta en una cadena con longitud negativa (porque el comienzo est pasado el final de la cadena), la cadena devuelta contendr nicamente el caracter que haya en comienzo. Si se especifica largo y es negativo, la cadena devuelta terminar a largo caracteres desde el final de cadena. Si esto resulta en una cadena con longitud negativa, la cadena devuelta contendr nicamente el caracter que haya en comienzo.
$resto $resto $resto $resto $resto $resto = = = = = = substr substr substr substr substr substr ("abcdef", ("abcdef", ("abcdef", ("abcdef", ("abcdef", ("abcdef", 1); 1, 3); -1); -2); -3, 1); 1, -1); // // // // // // devuelve devuelve devuelve devuelve devuelve devuelve "bcdef" "bcd" "f" "ef" "d" "bcde"

3.3 - Comparar Cadenas.


int strcmp ( string cad1, string cad2) Comparacin de cadenas con seguridad binaria. Equivalente a so homnima en ANSI C. Devuelve < 0 si cad1 es menor que cad2; > 0 si cad1 es mayor que cad2, y 0 si son iguales. Ntese que esta comparacin es sensible a maysculas y minsculas. int strcasecmp ( string cad1, string cad2) Igual que strcmp pero no es sensible a maysculas ni minsculas.

- 14 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

int strnatcmp ( string cad1, string cad2) Esta funcin implementa un algoritmo de comparacin que ordena las cadenas alfanumricas como lo hara un ser humano, que es lo que se denomina "orden natural". (http://www.naturalordersort.org/)
$matriz1 = $matriz2 = array ("i12.png","i10.png","i2.png","i1.png"); echo "Comparacion de cadenas estandar<br>"; usort($matriz1,"strcmp"); // Imprime: i1.png i10.png i12.png i2.png foreach ($matriz1 as $archivo) echo $archivo.' '; echo "<br>Comparacion de cadenas en orden natural<br>"; usort($matriz2,"strnatcmp"); // Imprime: i1.png i2.png i10.png i12.png foreach ($matriz2 as $archivo) echo $archivo.' ';

int strncasecmp ( string cad1, string cad2, int longitud) Igual que strnatcmp pero no es sensible a maysculas ni minsculas. int strlen ( string cad) Devuelve la longitud de la cadena. Equivalente a so homnima en ANSI C

3.4 - Buscar subcadenas y reemplazarlas con funciones de cadena.


3.4.1 - Buscar cadenas en cadenas
string strstr ( string pajar, string aguja) alias strchr Encuentra la primera aparicin de una cadena. Devuelve pues, todo el pajar desde la primera aparicin de la aguja hasta el final. Si la aguja no es encontrada, devuelve FALSE.
$correo = 'ejemplo@ieslloixa.com'; if (strstr($correo, 'ieslloixa')) header("Location: http://www.ieslloixa.com/"); else header("Location: http://www.cult.gva.es/"); exit();

Si la aguja no es una cadena, se convierte a entero y se aplica como el valor ordinal de un caracter. Podemos utilizarla para buscar una cadena dentro de otra o un carcter dentro de una cadena. string stristr ( string pajar, string aguja) Igual que strstr pero no es sensible a maysculas ni minsculas. string strrchr ( string pajar, string aguja) Encuentra la ltima aparicin de un carcter o cadena (aguja) en pajar. Por lo dems es idntica a strstr. - 15 -

CEFIRE

Programacin en PHP y MySQL

3.4.2 - Buscar la posicin de una subcadena.


int strpos ( string pajar, string aguja [, int desplazamiento]) int stripos ( string pajar, string aguja [, int desplazamiento]) Funciona igual que strstr, con la diferencia que en lugar de devolver una subcadena, devuelve la posicin numrica de la primera aparicin de la cadena aguja en pajar. Para buscar la aparicin de una cadena dentro de otra es ms eficiente usar esta funcin que strstr.
$entrada = 'Notas provisional'; if (stripos($entrada, 'nota') !== false) echo 'Consulte enlace de notas.'; elseif (stripos($entrada, 'matricula') !== false) echo 'Consulte enlace de matricula';

Como ya se adverta al explicar la estructura if, usamos el operador ! == en lugar de !=, puesto que al encontrar stripos la cadena 'nota' en la posicin 0, cuando haga 0 != false se evaluar a falso, no mostrando el mensaje.

El parmetro opcional desplazamiento le permite especificar a partir de qu caracter del pajar comenzar a buscar. La posicin devuelta es an relativa al comienzo de pajar. int strrpos ( string pajar, char aguja) Idntica a strpos salvo que en lugar de devolver la primera aparicin, devuelve la ltima aparicin de la cadena aguja en pajar

3.4.3 - Sustituir subcadenas.


Este tipo de funciones se pueden utilizar para personalizar documentos generados por PHP a partir de plantillas. Tambin puede utilizarse para censurar el uso de determinadas entradas, por ejemplo en un foro. La funcin que ms se suele utilizar es: mixed str_replace ( mixed cadena_buscada, mixed cadena_sustituta, mixed cadena_original [, int &veces] ) Esta funcin sustituye todas las apariciones de la cadena_buscada en la cadena cadena_original por la cadena_sustituta dada. Esta funcin es bastante potente e inteligente puesto que todos los parmetros de la funcin pueden ser de tipo array. No obstante conviene tener claro su funcionamiento: Si cadena_original es una matriz, la bsqueda y sustitucin se realiza en cada una de las entradas de cadena_original y por tanto, el valor devuelto tambin es una matriz. - 16 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

Si cadena_buscada y cadena_sustituta son matrices, la funcin str_replace() selecciona cada vez un valor de ambas matrices y realiza la bsqueda/sustitucin. Si cadena_buscada tiene menos elementos que cadena_sustituta, se emplea una cadena vaca para realizar el resto de sustituciones. Si cadena_buscada es una matriz y cadena_sustituta es una cadena, se emplea esta cadena para realizar la sustitucin de todos los valores de cadena_buscada.

$texto1[0] = 'Lanz el cuchillo con fuerza.'; $texto1[1] = 'No tenia fuerza para levantar el cuchillo.'; $texto2 = str_replace( array('cuchillo','fuerza'), array('machete','energa'), $texto1); print_r($texto2); //$texto2[0] = 'Lanz el machete con energa.' //$texto2[1] = 'No tenia energa para levantar el machete.'

3.5 - Expresiones Regulares.

Ver punto 5.2.1 de los apuntes del Bloque 3

3.5.1 - Sustituir cadenas con expresiones regulares


mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) Realiza una bsqueda y sustitucin de una expresin regular. El patrn de bsqueda. Puede ser tanto una cadena como una matriz de cadenas. Ver ms en http://es2.php.net/manual/es/function.preg-replace.php Si vamos ha hacer una sustitucin sencilla es mejor usar str_replace.

3.5.2 - Dividir cadenas con expresiones regulares


array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) Devuelve una matriz que contiene sub-cadenas de subject dividido por los lmites coincidentes de pattern.

Tras ver diversos casos de operaciones con cadenas, podemos deducir que uno de los principales potenciales de PHP es el manejo de las mismas, con el fin de renderizar cdigo interpretable por el cliente. Podemos ver ms funciones relacionadas con cadenas en: http://docs.php.net/manual/es/ref.strings.php

- 17 -

CEFIRE

Programacin en PHP y MySQL

4 - FUNCIONES DE GESTIN DE ARCHIVOS Y FLUJOS


En este punto vamos a ver diferentes funciones para creacin, borrado, almacenamiento y recuperacin de informacin con archivos. A lo largo de este manual ya hemos alguna similitud entre funciones del lenguaje ANSI C y PHP por ejemplo con el formateo de cadena. En el caso de funciones de Entrada/Salida (E/S), va a suceder lo mismo, ya que tienen bastante similitud a las de C.

4.1 - Apertura y cerrado de un fichero


En cualquier proceso de E/S con ficheros, deberemos abrir el fichero del cual obtendremos un descriptor que nos permitir realizar operaciones de E/S serie sobre el fichero y que finalmente deberemos cerrar al terminar. resource fopen ( string nombre_archivo, string modo [, bool usar_ruta_inclusion [, resource contexto_z]] ) Abre un fichero o una URL nombre_archivo: Pude ser una ruta de un fichero o una URL. Si se trata de una ruta de fichero deberemos tener presente que: Si ponemos un fichero sin ruta, este se buscar en el mismo directorio donde se encuentre la secuencia de comandos que estemos ejecutando. Esto puede dar problemas de acceso si el PHP se esta ejecutando a travs de algn tipo de contenedor CGI. Si la opcin safe_mode de PHP.INI esta a on,PHP comprueba si los directorios que va a utilizar tienen la misma UID que el script que est siendo ejecutado. Las rutas son sensibles a maysculas y minsculas. No debemos usar rutas absolutas, ya que el administrador de donde tenemos alojadas las pginas puede decidir en cualquier momento cambiar la estructura de directorios. Estas debern ser relativas a la raz de ubicacin del site definida a travs de la variable superglobal $_SERVER['DOCUMENT_ROOT'].
$raiz = $_SERVER['DOCUMENT_ROOT']; $fp = fopen($raiz.'/./alumnos/notas.txt','w');

Fijmonos que hemos usa do la barra estndar de UNIX '/', esta funciona tambin en Windows y hace compatible el cdigo entre sistemas.

- 18 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

Si se trata de una URL deberemos tener presente que: Deberemos tener a on la opcin de configuracin de PHP.INI allow_url_fopen. Lo ms normal es abrir el fichero en modo lectura, ya que de lo contrario deberemos autenticarnos en la URL y el servidor debe soportar escritura.
$fp = fopen(ftp://user:pass@localhost/notas.txt,'r');

Las rutas no son sensibles a maysculas y minsculas. Si especificamos un directorio deberemos poner una '/' al final de la URL.
$fp = fopen('http://localhost:8080/','r');

Si abrimos sobre SSL (https://...) deberemos asegurarnos que tenemos habilitada la compatibilidad para OpenSSL.

modo: Este parmetro especifica el tipo de acceso que requiere para la secuencia. Puede ser cualquiera de los siguientes valores: 'r' Apertura para slo lectura; ubica el apuntador de archivo al comienzo del mismo. 'r+' Apertura para lectura y escritura; ubica el apuntador de archivo al comienzo del mismo. 'w' Apertura para slo escritura; ubica el apuntador de archivo al comienzo de ste y lo trunca a una longitud de cero. Si el archivo no existe, intenta crearlo. 'w+' Apertura para lectura y escritura; ubica el apuntador de archivo al comienzo de ste y lo trunca a una longitud cero. Si el archivo no existe, intenta crearlo. 'a' Apertura para slo escritura; ubica el apuntador de archivo al final del mismo. Si el archivo no existe, intenta crearlo. 'a+' Apertura para lectura y escritura; ubica el apuntador de archivo al final del mismo. Si el archivo no existe, intenta crearlo. Windows ofrece una bandera de traduccin de modo-texto ('t') la cual traducir transparentemente \n a \r\n cuando trabaje con el archivo. En contraste, tambin puede usar 'b' para forzar el modo binario, el cual no traduce sus datos. Para usar stas banderas, indique 'b' o 't' como el ltimo caracter del parmetro modo. Debe tener en cuenta esto si desea portabilidad. Por defecto si no especificamos ningn modo se supone binario b

- 19 -

CEFIRE

Programacin en PHP y MySQL

4.1.1 - Problemas al abrir un archivo.


Pueden surgir multitud de problemas a la hora de abrir un archivo, si esto sucede la funcin retornar FALSE y se mostrar un mensaje de aviso por parte de PHP. Si no deseamos que se muestre este mensaje deberemos usar el operador de supresin de errores @ de la siguiente manera:
$notas = "Juanjo\t5\nVicente\t5\n"; @$fp = fopen('notas.cvs','at'); if ($fp === false) { echo '<p><strong> No se han podido guardar las notas.<br>'. 'Intentelo ms tarde !!!</strong></p></body></html>'; exit; } fwrite($fp, $notas, strlen($notas)); fclose($fp);

Somos nosotros quienes gestionamos el error con if ($fp === false) int fclose (int handle) Cierra un archivo valindose de su referencia en la apertura. Devuelve TRUE si el fichero se cerr correctamente, FALSE en caso contrario.

4.2 - Funciones de escritura y lectura.


int fwrite ( resource gestor, string cadena [, int longitud] ) idntica a fputs fwrite() escribe los contenidos de cadena a la secuencia de archivo apuntada por gestor. Si el argumento longitud es entregado, la escritura se detendr despus de que longitud bytes hayan sido escritos, o al alcanzar el final de cadena, aquello que ocurra primero. fwrite() devuelve el nmero de bytes escritos, o FALSE en caso de fallo. Para formatear cadena podemos utilizar cualquiera de las funciones de formato vistas con anterioridad.
Si se utiliza el argumento longitud, entonces la opcin de configuracin magic_quotes_runtime ser ignorada y no se eliminarn caracteres de barra desde la cadena.

int file_put_contents ( string nombre_archivo, mixed datos [, int banderas [, resource contexto]] ) int feof ( int handle ) Funcin necesaria para saber cuando dejar de leer una rachivo. Un esquema tpico de lectura puede ser un bucle while del tipo.
while(feof($fp) === FALSE) { // Lectura de datos }

feof() evuelve TRUE si el apuntador del fichero est en EOF o si ocurre un error (incluyendo tiempo de espera agotado); en otro caso devuelve FALSE.

- 20 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

string fread ( resource gestor, int longitud ) Funcin contraria a fwrite. fread() lee hasta longitud bytes desde el apuntador de archivo indicado por gestor. La lectura se detiene cuando se han ledo hasta longitud bytes, se alcanza EOF (el final de archivo), (en el caso de secuencias de red) cuando un paquete se encuentra disponible, o (despus de abrir una secuencia de espacio de usuario) cuando se han ledo 8192 bytes, aquello que ocurra primero. Devuelve la cadena leda o FALSE en caso de error. string fgets ( resource gestor [, int longitud] ) Devuelve una cadena de hasta longitud - 1 bytes ledos desde el archivo apuntado por gestor. La lectura termina cuando se han ledo longitud - 1 bytes, se alcanza un salto de lnea (el cual se incluye en el valor devuelto), o en EOF (lo que ocurra primero). Si no se especifica una longitud, el valor predeterminado es de 1k, o 1024 bytes. Si ocurre un error, devuelve FALSE. array fgetcsv ( resource handle, int length [, string delimiter [, string enclosure]]] ) Se utiliza para dividir lneas de archivo se ha utilizado un carcter de delimitacin, como por ejemplo el carcter de tabulacin '\t' del ejemplo u otros como ',', ';' como se suele hacer en hojas de clculo u otras aplicaciones. Suelen tener extensin CSV (http://es.wikipedia.org/wiki/CS) handle: Un apuntador de archivo vlido abierto exitosamente por fopen(), popen(), o fsockopen(). lenght: Debe ser mayor que la lnea ms grande (en caracteres) a ser encontrada en el archivo CSV (permitiendo los caracteres de fin de lnea). delimiter (Opcional): Fija el delimitador del campo (slo un caracter). El valor por defecto es la coma. enclosure (Opcional): Fija el caracter de delimitacin (slo un caracter). El caracter por defecto son las dobles comillas.
<?php @ $fp = fopen('notas.cvs','rt'); if ($fp !== false) { // Leo los ttulos de las columnas, que se corresponde con // la primera lnea del CSV. $columnas = fgetcsv($fp, 1024, ','); // Mientras no sea final del fichero leo datos de alumnos // y lo metro en un array de notas, que a su vez contendr // el array con los datos del alumno devuelto por fgetcsv $i = 0; while (feof($fp) === false) $notas[$i++] = fgetcsv($fp, 1024, ','); fclose($fp); echo '<table width="100%" border="1" cellspacing="0">'; // Visualizo los ttulos de las columnas. echo'<tr>'; foreach ($columnas as $columna) echo'<th scope="col">'.$columna.'</th>'; echo'</tr>';

- 21 -

CEFIRE

Programacin en PHP y MySQL

// Visualizo los la matriz notas. foreach ($notas as $alumno) { echo '<tr>'; for ($i = 0; $i < count($alumno); ++$i) echo '<td width="8%" >'.$alumno[$i].'</td>'; echo '</tr>'; } echo '</table>'; } else echo 'Error abriendo el fichero.'; ?>

int readfile ( string nombre_archivo [, bool usar_ruta_inclusion] ) Lee un archivo y lo escribe al bfer de salida. Devuelve el nmero de bytes ledos desde el archivo. Si ocurre un error, FALSE es devuelto y a menos que la funcin sea llamada como @ readfile(), se genera un mensaje de error. int fpassthru ( resource gestor ) Lee hasta EOF en el apuntador de archivo dado a partir de la posicin actual y escribe los resultados en el bfer de salida. Si ocurre un error, fpassthru() devuelve FALSE. De lo contrario, fpassthru() devuelve el nmero de caracteres ledos desde gestor y pasados a la salida. array file ( string nombre_archivo [, int usar_ruta_inclusion ] ) Funcin idntica a file_get_contents(), excepto que file() devuelve el archivo en una matriz. Cada elemento de la matriz corresponde a una lnea en el archivo, con el salto de lnea incluido (usaremos pues rtrim si no queremos conservar el final de lnea). Si ocurre un fallo, file() devuelve FALSE. Es posible usar el parmetro opcional usar_ruta_inclusion, y definirlo como "1", si desea buscar por el archivo en include_path. string file_get_contents ( string nombre_archivo [, bool usar_ruta_inclusion [, resource contexto [, int desplazamiento [, int long_max]]]] ) Funcin idntica a file(), con la excepcin de que file_get_contents() devuelve el archivo en una cadena, comenzando en el desplazamiento especificado y hasta long_max bytes. En caso de fallo, file_get_contents() devolver FALSE. file_get_contents() es el mtodo ms eficiente para leer los contenidos de un archivo en una cadena y podemos utilizarla por ejemplo para cargar una plantilla y posteriormente con funciones de cadena rellenarla y mostrarla.

- 22 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

4.3 - Funciones de utilidad


bool file_exists ( string nombre_archivo ) Devuelve TRUE si el archivo o directorio especificado por nombre_archivo existe; o FALSE de lo contrario. int filesize ( string nombre_archivo ) Devuelve el tamao del archivo en bytes, o FALSE (y genera un error de nivel E_WARNING) en caso de fallo.
$fp = fopen('notas.cvs','rt'); echo nl2br(fread($fp, filesize('notas.cvs'))); fclose($fp);

Para tamaos de archivo superiores a 2Gb el valor retornado puede ser inesperado. bool unlink ( string nombre_archivo [, resource contexto] ) Elimina nombre_archivo. Es similar a la funcin unlink() de C en Unix. Devuelve TRUE si todo se llev a cabo correctamente, FALSE en caso de fallo.

4.4 - Funciones de desplazamiento dentro del flujo


Nos ayudarn a manipular y descubrir la ubicacin del puntero del archivo. int ftell ( resource gestor ) Devuelve la posicin del apuntador de archivo indicado por gestor; es decir, su desplazamiento al interior de la secuencia de archivo. Si ocurre un error, devuelve FALSE. Si abrimos el fichero en modo 'a' puede devolver resultados indefinidos. int fseek ( resource gestor, int desplazamiento [, int desde] ) Casi idntica a su equivalente en C. Establece el indicador de posicin para el archivo referenciado por gestor. La nueva posicin, medida en bytes desde el comienzo del archivo, se obtiene al sumar desplazamiento con la posicin especificada por desde, cuyos valores se definen como se indica a continuacin: SEEK_SET: Define la posicin igual a desplazamiento bytes. SEEK_CUR: Define la posicin como la posicin actual ms desplazamiento. SEEK_END: Define la posicin como el final-de-archivo ms desplazamiento. (Para moverse a una posicin anterior al final-dearchivo, es necesario pasar un valor negativo en desplazamiento.)

- 23 -

CEFIRE

Programacin en PHP y MySQL

Si no se especifica desde, se asume que sea SEEK_SET. De tener xito, la funcin devuelve 0; de lo contrario devuelve -1. Note que realizar una reubicacin ms all del final de archivo no se considera un error. bool rewind ( resource gestor ) Lleva el puntero del archivo al comienzo de la secuencia o flujo. Devuelve TRUE si todo se llev a cabo correctamente, FALSE en caso de fallo.
Tanto para rewind como para fseek, si ha abierto el archivo en modo de adicin ("a" o "a+"), cualquier informacin que escriba al archivo ser siempre agregada al final de ste, independientemente de la posicin del archivo.

4.5 - Bloquear archivos


En ocasiones nos interesar abrir un fichero de modo exclusivo, sobre todo a la hora de actualizar algn dato para evitar problemas de informacin inconsistente. Para ello dispondremos de la funcin: bool flock ( resource gestor, int operacion [, int &bloquearia] ) Me permite bloquear archivos en diferentes platadormas. flock() necesita que le especifiquemos en operacin las siguientes opciones de bloqueo: LOCK_SH: Para adquirir un bloqueo compartido (de lectura). LOCK_EX: Para adquirir un bloqueo exclusivo (de escritura). LOCK_UN: Para liberar un bloqueo (compartido o exclusivo). LOCK_NB: Si no desea que flock() bloquee mientras opera.flock() le permite ejecutar un modelo de lectura/escritura simple que puede ser usado en prcticamente cualquier plataforma.

El tercer argumento opcional recibe el valor TRUE si el aviso producira un bloqueo. El bloqueo es liberado tambin por fclose() o al finalizar el script. Devuelve TRUE si todo se llev a cabo correctamente, FALSE en caso de fallo.
flock() no funcionar en los sistemas de archivos FAT o NFS (Net File System).

En la siguiente pgina podemos ver un ejemplo donde se implementa un contador de visitas, almacenando la cuenta en un fichero con acceso bloqueado en exclusin. - 24 -

El Lenguaje PHP Funciones y bibliotecas.


<?php define('FICH_CUENTA','contador.txt');

Vicente Martnez Martnez Juan Jos Guarinos Huesca

// Compruebo si existe el fichero donde llevo la cuenta por si tengo // que iniciar esta y crearlo. if (file_exists(FICH_CUENTA) === false) { $contador = 1; $modo ='w'; } else $modo ='r+'; // Interruptor que se pondr a cierto si hemos podido actualizar el // valor de la cuenta. $cuenta_disponible = false; @ $fp = fopen(FICH_CUENTA, $modo); if ($fp !== false) { // Bloqueamos el archivo en modo exclusivo. if (flock($fp, LOCK_EX) === true) { // Si el fichero ya exista leemos el ltimo valor de la // cuenta y la incrementamos. if ($modo == 'r+') { $contador = intval(fgets($fp)); $contador++; } // En cualquier caso situamos el puntero al principio de // la secuencia y almacenamos el valor del contador. // OJO !! esto no funciona si abrimos en modo a o a+ rewind($fp); fputs($fp, strval($contador)); // Liberamos el bloqueo y cerramos el fichero. flock($fp, LOCK_UN); $cuenta_disponible = true; } fclose($fp); } if ($cuenta_disponible === true) echo 'Visita nmero: '.$contador; else echo 'Nmero de visitas no disponible..'; ?>

- 25 -

CEFIRE

Programacin en PHP y MySQL

5 - FUNCIONES DE GESTIN DE FECHA Y HORA


Podemos encontrar una gran cantidad de funciones de gestin de fecha y hora en el manual de PHP http://docs.php.net/manual/es/ref.datetime.php de las cuales nosotros vamos destacar algunas por funcionalidad. int time ( void ) Devuelve la hora actual medida en nmero de segundos desde el Epoch Unix (Enero 1 1970 00:00:00 GMT). Lo cual es de bastante utilidad para obtener marcas de tiempo (TIMESTAMP) array getdate ( [int marca_de_tiempo] ) Devuelve un valor array asociativo que contiene informacin de fecha sobre la marca_de_tiempo, o la hora local actual si no se entrega una marca_de_tiempo, con los siguientes elementos en la matriz asociativa: Clave "seconds" "minutes" "hours" "mday" Descripcin Valores devueltos Representacin numrica de segundos 0 a 59 Representacin numrica de minutos 0 a 59 Representacin numrica de horas 0 a 23 Representacin numrica del da del mes 1 a 31 Representacin numrica del da de la 0 (para el Domingo) a 6 "wday" semana (para el Sbado) "mon" Representacin numrica de un mes 1 a 12 Una representacin numrica completa "year" Ejemplos: 1999 o 2003 de un ao, 4 dgitos "yday" Representacin numrica del da del ao 0 a 365 Una representacin textual completa del "weekday" Sunday a Saturday da de la semana Una representacin textual completa de "month" January a December un mes, como January o March Segundos desde el Epoch Unix, similar a Depende del sistema, 0 los valores devueltos por time() y usados tpicamente -2147483648 a por date(). 2147483647. string setlocale ( int categoria, array localizacion ) Fijara la informacin de localizacin. En categoria pondremos LC_TIME para indicar que la localizacin va a afectar a las funciones de tiempo y en localizacin pondremos el cdigo del pas siguiendo la codificacin ISO-639 http://www.loc.gov/standards/iso639-2/php/code_list.php Si localizacion es NULL o una cadena vaca "", los nombres localizados se fijarn a partir de las variables de entorno con los mismos nombres de las categoras anteriores, o desde "LANG". Si la localizacion es "0" (cero) o no se modifica la configuracin de localizacin, slo se devuelve la configuracin actual.
setlocale(LC_TIME,"es_ES");

- 26 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

bool checkdate ( int mes, int dia, int anyo ) Devuelve TRUE si la fecha dada es vlida segn el calendario gregoriano; de lo contrario devuelve FALSE. bool date_default_timezone_set ( string $timezone_identifier ) Establece la zona horaria predeterminada usada por todas las funciones de fecha/hora en un script. En la siguiente URL: http://es.php.net/manual/es/timezones.php podemos encontrar un listado de los timezones soportados como primer parmetro de la funcin,
A partir de PHP 5.1.0 (cuando las funciones de fecha/hora fueron reescritas), cada llamada a la funcin de fecha/hora generar un E_WARNING si se usa la configuracin del sistema.

string date ( string formato [, int marca_de_tiempo] ) Como hemos mencionado, su llamada debe ser precedida de date_default_timezone_set y devuelve una cadena con formato de acuerdo a la cadena de formato dada usando el entero marca_de_tiempo entregado o la hora local si no se da una marca de tiempo. En otras palabras, marca_de_tiempo es opcional y su valor predeterminado es el valor de time(). Debido a la gran cantidad de formatos posibles, algunos disponibles segn la versin de PHP, lo mejor es consultaros en la tabla de manual oficial que podemos encontrar en http://docs.php.net/manual/es/function.date.php
$fecha_hora = date("Y-m-d H:i:s"); // Ej. formato ISO 8601 para MySQL <?php date_default_timezone_set('Europe/Madrid'); $aMeses = array('enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'); $aDias = array('Domingo', 'Lunes', 'Martes', 'Mircoles', 'Jueves', 'Viernes', 'Sbado'); $indDia = (int)date("w"); $indMes = (int)date("m") - 1; $sFecha = $aDias[$indDia].', '.date("d").' de '. $aMeses[$indMes].' de '.date("Y"); echo '<p>'.$sFecha.'</p>' ?>

- 27 -

CEFIRE

Programacin en PHP y MySQL

6 - RESTO DE LA BIBLIOTECA DE FUNCIONES


Podemos encontrar una gran cantidad de funciones de gestin de fe A lo largo de lo anteriores puntos hemos visto ya una gran cantidad de funciones incluidas en el lenguaje ya sea para gestin de matrices, cadenas, archivos, etc Una de las caracteristicas que ms potencia le dan al lenguaje y ms ha extendido su uso, es la incorporacin a lo largo de las diferentes versiones de gran cantidad de funciones y APIs de todo tipo tiles para el desarrollo de portales y tecnologas Web. Estas funciones podremos encontrarlas agrupadas en el siguiente enlace al manual oficial http://docs.php.net/manual/es/funcref.php Muchas de estas funciones se encuentran en las denominadas extensiones del lenguaje que se encuentran en la carpeta ext de la instalacin. En ocasiones deberemos habilitar las extensiones en el archivo de configuracin PHP.INI en la seccin Dynamic Extensions. Para habilitarlas simplemente tendremos que quitar el ';' delante de la entrada ;extension=librera que queramos habilitar. Ms adelante cuando expliquemos el uso del API de acceso a MySQL haremos referencia a estas extensiones. Adems de estas extensiones que suelen ir con la instalacin oficial existen otros paquetes que podremos descargar del denominado proyecto PEAR. El proyecto PEAR PHP Extension and Application Repository es un poderoso sistema de distribucin y entorno de trabajo para componentes PHP. En castellano, las siglas PEAR significan Repositorio de Aplicacin y Extensin PHP. Podremos encontrar documentacin y una referencia a los distintos paquetes en la siguiente URL http://pear.php.net/index.php.

- 28 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

7 - GESTIN DE ERRORES PROCEDURAL


Aunque ahora se trate la gestin de errores; posteriormente, en el bloque que trata la POO en PHP, veremos la gestin de errores mediante excepciones.

Las funciones cuando producen un error devolvern algo indicndome el mismo, propagndose estos hacia arriba en la jerarqua de mdulos normalmente hasta algn mdulo de gestin de errores. Por esta razn muchas de las funciones vistas hasta ahora retornan false ante cualquier error.

7.1 - Configuracin de errores


Dispondremos de muchas opciones de configuracin de tratamiento de errores incluidas en el PHP.INI las cuales podemos ver en http://docs.php.net/manual/es/errorfunc.configuration.php De entre las opciones de configuracin podemos destacar display_errors, que debe estar a On si queremos que los errores producidos se muestren en la salida en el momento que se produzcan. Aunque como ya hemos visto, siempre podremos usar el operador @ para suprimir esta salida en una determinada sentencia y gestionar nosotros el error, propagndolo hacia algn mdulo gestor. Esta forma de gestin de errores es costosa de mantener y suele generar bastante lgica en el cdigo.

7.2 - Captura de errores


Entre las funciones de gestin de errores tendremos: mixed set_error_handler ( callback gestor_errores [, int tipo_error = E_ALL | E_STRICT ] ) http://docs.php.net/manual/es/function.set-error-handler.php Permite establecer una funcin manejadora de errores. Usar bool restore_error_handler ( void ) para recuperar la funcin anterior de gestin de errores. bool trigger_error ( string mensaje_error [, int tipo_error] ) http://docs.php.net/manual/es/function.trigger-error.php Permite al programador desencadenar errores propios. La funcin tiene una alias denominada user_error

- 29 -

CEFIRE

Programacin en PHP y MySQL

7.3 - Sistema de abandono de la ejecucin


En ocasiones si el error es fatal podremos detener la ejecucin del script mediante la funcin void exit ( [string status] ) y su alias die, las cuales adems de detener la ejecucin imprimir un mensaje.

7.4 - Generacin de asertos para depuracin


Al igual que en otros lenguajes como dispondremos de una funcin para incluir aserciones en el cdigo: bool assert ( mixed asercion ). Esta recibir como parmetro una expresin booleana, que si se evala a true no se generar ningn aviso y si se evala a false generar un aviso indicndome el fuente y el nmero de lnea donde se produjo. Iremos introduciendo aserciones en casos que no deberan darse como pudiera ser un default en un switch que se supone contempla todos los casos o una comprobacin de divisor distinto de cero antes de una divisin etc Adems podremos utilizarlas como base para aplicar esquemas de diseo por contrato, utilizndolas a modo de precondiciones o postcondiciones. Las aserciones podrn detener la ejecucin y podremos desactivarlas en un sistema en produccin a travs de la funcin mixed assert_options ( int que [, mixed valor] ). Adems esta funcin me permitir centralizar en una funcin de callback la gestin de aserciones.
<?php assert_options(ASSERT_ACTIVE, 1); assert_options(ASSERT_CALLBACK, 'GestionDeAsertos'); // Funcin de gestin de aserciones. function GestionDeAsertos( $fuente, $linea, $mensaje ) { echo 'Error en <b>'.$fuente.'</b><br>'; echo 'Lnea <b>'.$linea.'</b><br>'; echo '<b>'.$mensaje.'</b><br>'; echo ' Revise la ejecucin en ese punto !'; exit; } function Divide($dividendo, $divisor) { // Proecondiciones. Si se cumplen se cumple el contrato de // uso de la funcin asegurando que retorna un valor correcto. assert(isset($dividendo) === true); assert(isset($divisor) === true); assert(is_numeric($dividendo) === true); assert(is_numeric($divisor) === true); assert($divisor > 0); return $dividendo / $divisor; } echo Divide(100, 20); echo Divide(100, 0); ?>

- 30 -

El Lenguaje PHP Funciones y bibliotecas.

Vicente Martnez Martnez Juan Jos Guarinos Huesca

7.5 - Funciones de traza y depuracin


int error_reporting ( [int nivel] ) http://docs.php.net/manual/es/function.error-reporting.php La funcin error_reporting() establece la directiva error_reporting en tiempo de ejecucin. Me permite establecer en tiempo de ejecucin el nivel de los avisos de PHP, por ejemplo para un determinado bloque que deseemos depurar. bool error_log ( string mensaje [, int tipo_mensaje [, string destino [, string cabeceras_extra]]] ) http://docs.php.net/manual/es/function.error-log.php Enva un mensaje de error al registro del servidor web, a un puerto TCP o a un archivo. Puede utilizarse para generar un log con una traza de ejecucin de nuestro script. void debug_print_backtrace ( void ) http://docs.php.net/manual/es/function.debug-print-backtrace.php Imprime en pantalla las llamadas a funcin, archivos includos y el material evaluado mediante eval(), que llevemos hasta ese momento en la ejecucin del script.

- 31 -

CEFIRE

Programacin en PHP y MySQL

8 - BIBLIOGRAFA
DIVERSOS AUTORES Manual PHP Oficial Versin web 17/08/2010 desde RedIris http://docs.php.net/manual/es/ Editor principal Philip Olson. Copyright 1997-2010 por el Grupo de documentacin de PHP Bajo Licencia http://creativecommons.org/licenses/by/3.0/

- 32 -

Вам также может понравиться