Manual Gestion Archivos PHP
Manual Gestion Archivos PHP
com
Autores del manual Este manual ha sido realizado por los siguientes colaboradores de DesarrolloWeb.com: Rubn Alvarez Miguel Angel Alvarez Rene Sterling Neira
Redactor de DesarrolloWeb.com http://www.desarrolloweb.com (4 captulos) Director de DesarrolloWeb.com http://www.desarrolloweb.com (5 captulos) Webmaster de Blasten.com http://www.blasten.com (2 captulos) (1 captulo)
Alfredo Anaya
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
Funciones para la lectura de archivos Funcin fopen fgets fwrite fseek feof Descripcin Abre un archivo y le asigna un identificador id. Veremos el modo ms adelante Lee una lnea de un archivo hasta un numero mximo de caracteres Escribe una cadena dentro del archivo Avanza o retrocede el puntero del archivo un cierto numero de posiciones Comprueba si el puntero que lee el archivo ha llegado al final Sintaxis $id = Fopen($archivo, $modo) fgets($id,$max) fwrite($id, $cadena) fseek($id,$posiciones) feof($id) fpassthru($id) fclose($id)
fpassthr lee completamente el archivo y lo muestra u fclose Cierra el archivo abierto previamente
Las operaciones ms elementales, copia, borrado y cambiar el nombre, requieren nicamente el nombre (y path) del archivo sobre el cual se ejerce la operacin. Para operaciones ms complejas, como la lectura de lneas o la escritura de texto dentro del archivo, se requiere de una previa apertura del archivo al cual le asignaremos un indentificador $id. Una vez abierto el archivo, podremos desplazarnos a lo largo de l por medio de un puntero imaginario que avanza o retrocede por las lneas de texto y mediante el cual nos situaremos en el lugar escogido para insertar, modificar o simplemente copiar una cadena. Existen distintos modos de apertura que nos permiten definir las acciones que podemos realizar sobre el archivo. Aqu os mostramos los diferentes modos que, como veris, son de lo ms variado: Modos de apertura de archivos Sintaxi Descripcin
2
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
s 'r' 'r+' 'w' 'w+' 'a' 'a+' Slo lectura Lectura y escritura Slo escritura Lectura y escritura. Suprime el contenido anterior si se escribe. El archivo es creado si no existe. Slo escritura. El archivo es creado si no existe y el puntero se coloca al final. Lectura y escritura. El archivo es creado si no existe y el puntero se coloca al final.
A notar que si tratamos con archivos en binario hemos de colocar una b delante del modo (ej. ba, bw+,...) Recordamos que esta lista no es ms que una recopilacion y que muchas otras funciones relacionadas pueden sernos tambin tiles.
Nota:Tambin puedes profundizar ms en la gestin de archivos con nuestro manual Gestin de archivos en PHP
//Leemos linea por linea el contenido del archivo while ($linea= fgets($fp,1024)) { //Sustituimos las ocurrencias de la cadena que buscamos $linea = str_replace($cadena,"<b>$cadena</b>", $linea); //Anadimos la linea modificada al texto $texto .= $linea; } return $texto; } //Definimos el path y la cadena $path="escribe el camino de acceso a tu archivo"; $cadena = "escribe tu cadena"; //Llamamos la funcion $texto = negrita ($path,$cadena); //Mostramos el texto echo $texto; ?> Podis ver el resultado de esta funcin en una variante del script donde hemos incluido un formulario para recibir el parmetro cadena y que busca las ocurrencias dentro del texto de este mismo articulo: Introduce la cadena de bsqueda:
Buscar!
El script es utilizado en forma de funcin para facilitaros su empleo y almacenamiento. Su modo de actuar es el siguiente: Inicializa la variable texto en la cual iremos almacenando las lneas ledas en el bucle. Abre el archivo (local o remoto) en modo lectura por medio de la funcin fopen. Lee una por una las lneas del archivo hasta una longitud de 1024 caracteres y remplaza las posibles ocurrencias de la cadena de bsqueda por la misma cadena colocada entre las etiquetas <b> y </b> por medio de la funcin str_replace. El texto, modificado o no, es almacenado en la variable texto. Devolvemos la variable texto como resultado de la funcin.
El resto de script es simplemente un ejemplo de llamada a la funcin donde los parmetros path y cadena han de ser especificados. Artculo por Rubn Alvarez
elementales para la creacin y escritura de un archivo texto por medio de esta tecnologa de lado servidor. Tras haber visto como funciona la lectura secuencial de un archivo, podemos imaginar que escribir sobre ste no debe de resultar mucho ms complicado. Por otra parte, las posibilidades que estas dos operaciones nos pueden ofrecer conjuntamente son realmente sorprendentes. Sin ir ms lejos, y guardando las distancias, escribir y leer archivos puede en cierta manera sustituir muy primariamente a una base de datos. En efecto, si por diversas razones (hosting, presupuesto, conocimientos...) nos resulta difcil la puesta en marcha de una base de datos elemental, siempre podremos solventar el inconveniente almacenando nuestros datos en archivos que luego podrn ser ledos. Por supuesto, este mtodo no tiene nada de seguro ni de verstil y slo es valido para un sitio sin informacin confidencial y con poca cantidad de datos. Podemos pensar tambin en crear documentos dinmicos a partir de datos introducidos en un formulario: cartas, pginas HTML y otros. Otro ejemplo particularmente prctico es la creacin dinmica de archivos que nos ahorren recursos de servidor. Imaginemos que tenemos una pgina, o archivo, en nuestro sitio que carga muy frecuentemente y que realiza constantemente llamadas a bases de datos o ejecuta scripts medianamente largos. Si el contenido que estamos mostrando es el mismo para todos los usuarios y no tiene necesidad de ser actualizado constantemente, podemos contentarnos con crear un script accesorio que ejecute una nica vez el script principal y que almacene su resultado en forma de archivo HTML que ser en realidad el que mostraremos a nuestros visitantes. De esta forma, evitamos por una parte la ejecucin masiva de un mismo script con el consiguiente ahorro de recursos y por otra automatizamos la actualizacin de una determinada pgina o seccin ejecutando peridicamente el script accesorio. La escritura de archivos pasa, como es de esperar, por la previa apertura de archivo en un modo apropiado. Una vez abierto, el paso siguiente ser introducir por medio de la funcin fwrite, o su alias fputs, la cadena que deseamos incluir en nuestro archivo. Para ejemplificar esta nueva funcin de escritura y combinarla con la de lectura, fgets, os proponemos este contador inspirado en una nota de la pgina oficial de PHP: <? function incremento_contador($archivo) { // $archivo contiene el numero que actualizamos $contador = 0; //Abrimos el archivo y leemos su contenido $fp = fopen($archivo,"r"); $contador = fgets($fp, 26); fclose($fp); //Incrementamos el contador ++$contador; //Actualizamos el archivo con el nuevo valor $fp = fopen($archivo,"w+"); fwrite($fp, $contador, 26); fclose($fp);
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
echo "Este script ha sido ejecutado $contador veces"; } ?> Aqu podis ver el resultado producido cuando llamamos a esta funcin. Como en otros ejemplos, el script es expresado en forma de funcin para que sea ms sencilla su reutilizacin. Las etapas que llevamos a cabo son verdaderamente cortas y comprensibles: Iniciamos nuestra variable contador. Abrimos el archivo en modo lectura y extraemos el valor actual del contador leyendo la primera y nica lnea. Cerramos el archivo. Aumentamos de una unidad el valor de contador. Abrimos el archivo y lo sobrescribimos (modo +w) con el valor contador modificado.
Ni que decir tiene que para que este tipo de scripts funcionen, el archivo al que queremos acceder ha de estar autorizado para lectura y escritura. La funcin fwrite puede ser utilizada tambin para enviar datos en otros tipos de aperturas como son las de sockets o de programas. Pero esto ya es otra historia... Artculo por Rubn Alvarez
uncin
pendir Abre un directorio situado en $path y le asigna un identificador $dir Lee un elemento del directorio $dir abierto previamente con opendir y desplaza el puntero al elemento siguiente Elimina el directorio $dir Crea un directorio situado en $path con los derechos de acceso $derechos (entero)
eaddir
mdir
mkdir
La forma de tratar con estas funciones es la similar a la que ya hemos visto para le lectura secuencial de archivos. Podemos distinguir tres etapas elementales: Apertura del directorio por medio de la funcin opendir asignndole al mismo tiempo un
6
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
identificador Realizacin de las tareas necesarias en relacin con ese directorio Clausura del identificador por medio de la funcin closedir
A notar que, para que un directorio pueda ser borrado, hace falta previamente haber eliminado cada uno de los elementos contenidos dentro del directorio. Para esto, nos podemos servir de la funcin unlink, presentada en otor artculo. Por otra parte, la creacin de un directorio por medio de la funcin mkdir requiere la definicin de los derechos de acceso por medio de un numero entero. Esperamos poder explicar en qu consisten estos derechos prximamente. Como ejemplo sencillo de lo que podemos hacer con estas funciones, aqu os presentamos un pequeo script de lectura que os permite visualizar el contenido de un directorio: <? //definimos el path de acceso $path = "mi/camino"; //abrimos el directorio $dir = opendir($path); //Mostramos las informaciones while ($elemento = readdir($dir)) { echo $elemento."<br>"; } //Cerramos el directorio closedir($dir); ?> Otra forma de abordar la gestin de directorios es por medio de la clase dir que permite la creacin de un objeto sobre el cual podremos aplicar toda una serie de mtodos equivalentes a las funciones previamente vistas. Si estas familiarizado con la programacin orientada a objetos, puede que esta modalidad te resulte mas intuitiva. Si no sabes en qu consiste la programacin orientada a objetos, puedes visitar este artculo. En este caso, la forma de operar es anloga a la ya vista: Creamos un objeto $dir con la instruccin: $dir = dir($path) Realizamos las tareas necesarias llamando a los mtodos de la clase dir Cerramos el directorio con el mtodo close
Algunos de los mtodos que podemos utilizar con esta clase son los siguientes: Mtodos de la clase dir Mtodo path read rewind Descripcin Indica el path del directorio Lee un elemento del directorio Vuelve el puntero de lectura del directorio al primer elemento Sintaxis $objeto->path $objeto->read $objeto>rewind
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
$objeto->close
Como ejemplo, he aqu el script equivalente al abordado para el caso de las funciones, esta vez usando la clase dir: <? //definimos el path de acceso $path="mi/camino/"; //instanciamos el objeto $dir=dir($path); //Mostramos las informaciones echo "Directorio ".$dir>path.":<br><br>"; while ($elemento = $dir->read()) { echo $elemento."<br>"; } //Cerramos el directorio $dir->close(); ?> Los scripts propuestos no son ms que ejemplos sencillos de lo que estas funciones pueden ofrecernos. En vuestras manos queda el combinar estas funciones con otras vistas en este mismo taller de manera a crear aplicaciones que gestionen los archivos y directorios de vuestro servidor. Recordamos que esta lista no es ms que una recopilacin y que muchas otras funciones relacionadas pueden sernos tambin tiles. Artculo por Rubn Alvarez
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
Es un formulario cualquiera, pero tiene una serie de particularidades y campos file, que no solemos utilizar habitualmente.
<form action="subearchivo.php" method="post" enctype="multipart/form-data"> <b>Campo de tipo texto:</b> <br> <input type="text" name="cadenatexto" size="20" maxlength="100"> <input type="hidden" name="MAX_FILE_SIZE" value="100000"> <br> <br> <b>Enviar un nuevo archivo: </b> <br> <input name="userfile" type="file"> <br> <input type="submit" value="Enviar"> </form>
Para empezar vemos que se ha colocado un nuevo atributo en el formulario: enctype="multipart/form-data", necesario para subir en un mismo formulario datos y archivos. Tambin tenemos el campo hidden MAX_FILE_SIZE, que sirve para indicar el tamao en bytes de los archivos a subir. Este campo algunos navegadores no tienen porqu entenderlo o hacerle caso. Adems, es fcil saltarse esa proteccin, por lo que deberemos en las propias pginas PHP comprobar que el archivo tenga el tamao que deseamos. Por ltimo, tenemos el campo tipo file, donde se seleccionar el archivo a subir. Tambin hemos colocado un campo de tipo text, para subir datos por POST de tipo texto acompaados a los datos binarios del archivo. Pgina que sube los archivos Esta pgina debe hacer las comprobaciones necesarias para saber si las caractersticas del archivo a subir son las que deseamos y realizar la copia del archivo en un directorio del servidor. Para hacer las comprobaciones, PHP nos crea una serie de variables que podemos acceder con la informacin del archivo enviado. $HTTP_POST_FILES['userfile']['name'] El nombre original del fichero en la mquina cliente. $HTTP_POST_FILES['userfile']['type'] El tipo mime del fichero (si el navegador lo proporciona). Un ejemplo podra ser "image/gif". $HTTP_POST_FILES['userfile']['size'] El tamao en bytes del fichero recibido. $HTTP_POST_FILES['userfile']['tmp_name'] El nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.
<? //tomo el valor de un elemento de tipo texto del formulario $cadenatexto = $_POST["cadenatexto"]; echo "Escribi en el campo de texto: " . $cadenatexto . "<br><br>";
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
//datos del arhivo $nombre_archivo = $HTTP_POST_FILES['userfile']['name']; $tipo_archivo = $HTTP_POST_FILES['userfile']['type']; $tamano_archivo = $HTTP_POST_FILES['userfile']['size']; //compruebo si las caractersticas del archivo son las que deseo if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) && ($tamano_archivo < 100000))) { echo "La extensin o el tamao de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb mximo.</td></tr></table>"; }else{ if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){ echo "El archivo ha sido cargado correctamente."; }else{ echo "Ocurri algn error al subir el fichero. No pudo guardarse."; } } ?>
Para empezar, recogemos el campo de texto enviado por POST, de la forma habitual. Aunque esto no tenga nada que ver con subir archivos, es muy normal que en el mismo formulario deseemos mezclar varios tipos de informacin. Luego se recogen los datos necesarios del archivo, como su nombre, extensin y tamao para, en el siguiente if, comprobar que la extensin sea .gif o .jpg y que el tamao menor que 100000 bytes. Si el archivo tena las caractersticas deseadas, se puede subir al servidor. Para ello se utiliza la funcin move_uploaded_file(), que recibe el nombre del archivo temporal que se desea subir y el nombre del archivo que se desea dar. Cuando se sube el archivo, el servidor lo copia en una localizacin temporal para que seamos nosotros los que elijamos la posicin definitiva donde queremos que se almacene. Si no lo copiamos a ningn sitio, despus de la ejecucin de la pgina, se borra de su localizacin temporal. La funcin move_uploaded_file() se utiliza para mover el archivo a la posicin definitiva. Recibe por un lado el nombre temporal del fichero y por otro el nombre que deseamos colocarle definitivamente y, si se desea, la ruta para llegar al directorio donde queremos guardarlo. En el caso del ejemplo slo se indica el nombre del archivo, por ello el fichero se subir al mismo directorio donde estn las pginas PHP que hacen el upload. Esta funcin devuelve un boleano que indica si hubo o no xito al subir el archivo.
Nota: Es importante sealar que el upload de archivos es un proceso crtico que puede dar lugar a errores y agujeros de seguridad. Por ejemplo, si los directorios destino estn protejidos contra escritura, nos dar un error. Podemos ver los errores comunes relatados en la pgina de PHP.
Recomendamos una vez ms ampliar esta informacin en la pgina de PHP: http://www.php.net/manual/es/features.file-upload.php Se pueden descargar los cdigos del ejemplo en este enlace. Artculo por Miguel Angel Alvarez
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
10
/*SEGMENTO PARA REEMPLAZAR PARRAFOS, 1. ASOCIAR LOS PARRAFOS EN EL LUGAR DE LA CLAUSULA QUE SE DESEE PARA QUE SEA BUSCADA Y REMPLAZA POR LA RESPUESTA SELECCIONADA
2. ES IMPORTANTE CREAR UNA CLAVE IGUAL A LA RESPUESTA E INCLUIR ESTA CLAVE EN LA CLAUSULA, DE ESTA MANERA EL BUSCADOR ENCONTRARA ESTA CLAVE, BUSCARA EL PARRAFO CON ID DE LA CLAVE LO TRAERA Y LO REEMPLAZARA POR EL PARRAFO EJEMPLO: TENEMOS UNA CLAUSULA PREAMBULO LA CUAL TIENE QUE ESTAR ARMADA POR UN PARRAFO, PERO ESTE PARRAFO DEPENDE DE UNA RESPUESTA SELECCIONADA PREAMBULO CON PARRAFO 'ESTE ES UN EJEMPLO' SI LA RESPUESTA DADA ES QUE EJEMPLO Y ESTA RESPUETA GENERA LA CLAVE -1254- ENTONCES EN LA CLAUSULA PREAMBULO ASOCIAMOS 01 PREAMBULO -1254*/
/* $clave2 = mysql_query("select distinct parrafos.id, parrafos.detalle from tem_claves, asociar_parrafos, parrafos where tem_claves.clave_excluyente = $id and asociar_parrafos.id_respuesta = tem_claves.id_respuesta and parrafos.id = asociar_parrafos.id_parrafo"); */ $clave2 = mysql_query("select distinct parrafos.id, parrafos.detalle from parrafos"); while($rowcl = mysql_fetch_array($clave2))
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
11
{ $modificar1 = mysql_query("select clausula from tem_clausulas where clave_excluyente = $id order by id_respuesta"); $cantidad = mysql_num_rows($modificar1) -1; $i = 0; for($i;$i<= $cantidad;$i++) { $r = mysql_result($modificar1,$i); $cm2 = str_replace('-par'.$rowcl[0].'-', $rowcl[1], $r); $ing = mysql_query("update tem_clausulas set clausula = '$cm2' where clave_excluyente = $id and clausula = '$r'"); } } /* EL RESULTADO ES
01 PREAMBULO 'ESTE ES UN EJEMPLO' DIGAMOS QUE EL PARRAFO Y LA CLAUSULA LE ASOCIAMOS UNA CLAVE PARA SER REEMPLAZADA POR OTRA RESPUESTA EJEM 01 PREAMBULO -1684'ESTE ES UN EJEMPLO -1896-' Y ESTA CLAVES PERTENECEN AL RESPUESTA: -1684- = HOLA -1896- = MUNDO /*SEGMENTO PARA REEMPLAZAR CLAVES UNA VEZ INCLUIDO EL PARRAFO */
$clave2 = mysql_query("select * from tem_claves where clave_excluyente = $id"); while($rowcl = mysql_fetch_array($clave2)) { $modificar1 = mysql_query("select clausula from tem_clausulas where clave_excluyente = $id order by id_respuesta"); $cantidad = mysql_num_rows($modificar1) -1; $i = 0; for($i;$i<= $cantidad;$i++) { $r = mysql_result($modificar1,$i); $cm2 = str_replace('-'.$rowcl[0].'-', $rowcl[2], $r); $ing = mysql_query("update tem_clausulas set clausula = '$cm2' where clave_excluyente = $id and clausula = '$r'"); } }
/* EL RESULTADO ES
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
12
while($cont = mysql_fetch_array($genera_contrato)) {?> <form method='POST' action='--WEBBOT-SELF--'> <table border='0' cellpadding='0' cellspacing='0' style='border-collapse: collapse' bordercolor='#111111' width='100%' id='AutoNumber1'> <tr> <td width='50%'><font color="#FF9933"><? echo $cont[0].' '.$cont[1]; ?></font></td> </tr> <tr> <td width='50%'><? echo $cont[3];?> </td> </tr> <tr> <td width='50%' height="31"></td> </tr> <? } ?> </table> </form> </form> <? pie_selector(); ?>
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
13
Primer paso, Preparar la plantilla: Para nuestro ejemplo partimos de un documento .DOC que certifica que un alumno ha realizado un curso. En la siguiente imagen vemos un certificado tipo.
Ser preciso crear un certificado para cada uno de los alumnos que ha realizado un curso, los datos que vara son los del alumno y los del curso realizado. Una vez abierto el documento con Word, lo guardamos en formato RTF y sustituimos cada dato variable por unos cdigos fcilmente reconocibles. Ojo, el formato RTF es muy puetero, por lo que ser preciso escribir los cdigos sin confundirse para que no se introduzcan caracteres raros.
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
14
En el caso del ejemplo utilizamos la # y el * de tal manera que por ejemplo, sustituimos el nombre del alumno por #*NOMBRE*# Guardaremos el documento con el nombre de plantilla.rtf Segundo paso, El programa PHP: Crearemos dos funciones auxiliares, la primera se llama leef().
Esta funcin como se puede ver, recibe como argumento el nombre del fichero RTF, lo abre y almacena el contenido en la variable de texto $todo. Esta funcin por tanto devuelve el contenido de un fichero. La siguiente funcin, rtf(), es la que crea un RTF a partir de una plantilla y sustituyendo los cdigos por los datos de la Intranet.
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
15
Esta funcin recibe cuatro argumentos: $sql: la sentencia sql que devuelve los datos que se necesitan $plantilla: la plantilla RTF con los cdigos $fsalida: el nombre del fichero resultado $matequivalencias: una matriz con las equivalencias entre los datos procedentes de la sentencia sql y los campos del certificado. Vamos a comentar lnea por lnea el programa: Las lneas 13 y 14 determinan el nombre y la ruta del fichero de salida, utilizamos la funcin time() para asegurarnos de que no se producirn dos ficheros con el mismo nombre. En la lnea 17 se almacena el contenido de la plantilla en la variable $txtplantilla En las lneas de la 19 a la 24 se extrae el cuerpo del documento RTF, el cuerpo del documento es lo que se repite, para extraerlo primero obtenemos la cabecera del documento, la cabecera queda determinada por la etiqueta rtf sectd. Un documento rtf termina siempre en }, con esa informacin extraemos el cuerpo. En el paso 3, a partir de la lnea 26 vamos escribiendo el archivo resultado.
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
16
En la lnea 27 escribimos la cabecera del documento En la lnea 28 ejecutamos la consulta y en la 29 entramos un un bucle, en cada ciclo obtendremos los datos de un alumno y crearemos un certificado. En la lnea 30 creamos una copia del cuerpo del documento llamada $despues, sobre esa copia realizaremos los cambios. En la lnea 31 entramos en un bucle que recorre la matriz de equivalencias, la lnea 32 obtiene de la base de datos el dato, la lnea 34 obtiene de la matriz el cdigo a sustituir en la plantilla y la lnea 35 sustituye el dato por el cdigo. Una vez sustituidos todos los campos la lnea 37 escribe el certificado del alumno y las lneas 38 y 39 generan un salto de pgina para volver a escribir el siguiente certificado. Una vez que hemos salido del While que va extrayendo los datos, la lnea 41 cierra el documento rtf y la 42 la escritura del fichero. Tercer paso, Llamada a la funcin RTF: Una vez hemos creado estas dos funciones ya podemos llamar a la funcin rtf() y generar el documento.
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
17
Comentamos las lneas: En la lnea 48 especificamos cual es la plantilla. En la lnea 49 establecemos la sentencia SQL que extrae los datos, en el caso del ejemplo es un poco compleja pues extrae los datos de varias tablas. En las lneas desde la 50 a la 71 creamos la matriz de equivalencias, se trata de una matriz de dos dimensiones que relaciona el cdigo que se encontrar en el archivo RTF con el campo de la sentencia SQL. La lnea 72 llama a la funcin rtf() Y por fin las lneas 73 y 74 generan un enlace al archivo resultado. Mejoras y comentarios. Todo en esta vida es susceptible de ser mejorado, en este caso me queda pendiente el generar el archivo de salida directamente al navegador, con el objeto de no tenerlo que escribir en el disco duro. Adems tenemos desarrollados ejemplos de listados y de etiquetas que podemos documentar en posteriores artculos. Un aspecto importante para seguir progresando en este tema es conocer la sintaxis de los documentos rtf, se trata de un trabajo un poco durillo que tambin podemos abordar en posteriores artculos. Artculo por Alfredo Anaya
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
18
Nota: Si se est interesado en alternativas de generadores gratis de PDF que no utilizen liberas externas PDF, mirar este FAQ relacionado.
Requerimientos PDFlib est disponible para descargar en http://www.pdflib.com/products/pdflib/index.html, pero requiere la compra de una licencia para uso comercial. Se requieren las libreras JPEG y TIFF para compilar esta extensin. Compatibilidad con versiones antiguas de PDFlib Cualquier versin de PHP despus del 9 de Marzo del 2000 no soporta versiones de PDFlib anteriores a la 3.0. PDFlib 3.0 o superior es compatible desde PHP 3.0.19 en adelante. Instalacin Para los datos de la instalacin, os adjunto aqu unas notas extradas de la propia documentacin de la librera:
To get these functions to work, you have to compile PHP with --with-pdflib[=DIR]. DIR is the PDFlib base install directory, defaults to /usr/local. In addition you can specify the jpeg, tiff, and pnglibrary for PDFlib to use, which is optional for PDFlib 4.x. To do so add to your configure line the options --with-jpegdir[=DIR] --with-png-dir[=DIR] --with-tiff-dir[=DIR]. When using version 3.x of PDFlib, you should configure PDFlib with the option --enable-shared-pdflib.
Configuracin en tiempo de ejecucin Esta extensin no tiene directivas de configuracin en php.ini. Confusiones con antiguas versiones de PDFlib Desde PHP 4.0.5, la extensin PHP para PDFlib es oficialmente soportada por PDFlib GmbH. Esto significa que todas las funciones descritas en el manual de PDFlib (V3.00 o superior) son soportadas por PHP 4 con el mismo funcionamiento y parmetros. Slo los valores devueltos pueden variar en el manual PDFlib, ya que PHP adopt la convencin de devolver FALSE. Por razones de compatibilidad, PDFlib an soporta las antiguas funciones, pero deberan reemplazarlas en sus nuevas versiones. PDFlib GmbH no dar soporte a cualquier problema causado por el uso de estas funciones obsoletas. Ejemplos La mayora de las funciones son bastante fciles de utilizar. La parte ms difcil probablemente es la creacin de un primer documento PDF. El siguiente ejemplo debera ayudar para comenzar. El ejemplo crea el archivo test.pdf en una pgina. La pgina contiene el texto "Times Roman outlined" en un contorno, con fuente de 30pt. El texto tambin est subrayado. Ejemplo 1. Creando un documento PDF con PDFlib
<?php $pdf = pdf_new(); pdf_open_file($pdf, "test.pdf"); pdf_set_info($pdf, "Author", "Javier Tacon"); pdf_set_info($pdf, "Title", "Test for PHP wrapper of PDFlib 2.0"); pdf_set_info($pdf, "Creator", "See Author"); pdf_set_info($pdf, "Subject", "Testing"); pdf_begin_page($pdf, 595, 842); pdf_add_outline($pdf, "Page 1"); $font = pdf_findfont($pdf, "Times New Roman", "winansi", 1); pdf_setfont($pdf, $font, 10); pdf_set_value($pdf, "textrendering", 1); pdf_show_xy($pdf, "Times Roman outlined", 50, 750); pdf_moveto($pdf, 50, 740); Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin. 19
pdf_lineto($pdf, 330, 740); pdf_stroke($pdf); pdf_end_page($pdf); pdf_close($pdf); pdf_delete($pdf); echo "<A HREF=getpdf.php>finished</A>"; ?>
El script getpdf.php simplemente devuelve el documento pdf. Ejemplo 2. Mostrando un documento PDF precalculado
<?php $len = filesize($filename); header("Content-type: application/pdf"); header("Content-Length: $len"); header("Content-Disposition: inline; filename=foo.pdf"); readfile($filename);
?>
La distrubucin PDFlib contiene un ejemplo ms complejo para crear un reloj analgico en una pgina. Aqu se utiliza el mtodo de creacin en memoria de PDFlib para no tener que crear un archivo temporal. El ejemplo se ha convertido a PHP desde uno de PDFlib (El mismo ejemplo est disponible en la documentacin ClibPDF.) Ejemplo 3. Ejemplo pdfclock de la distribucin PDFlib
<?php $radius = 200; $margin = 20; $pagecount = 10; $pdf = pdf_new(); if (!pdf_open_file($pdf, "")) { echo error; exit; }; pdf_set_parameter($pdf, "warning", "true"); pdf_set_info($pdf, "Creator", "pdf_clock.php"); pdf_set_info($pdf, "Author", "Uwe Steinmann"); pdf_set_info($pdf, "Title", "Analog Clock"); while ($pagecount-- > 0) { pdf_begin_page($pdf, 2 * ($radius + $margin), 2 * ($radius + $margin)); pdf_set_parameter($pdf, "transition", "wipe"); pdf_set_value($pdf, "duration", 0.5); pdf_translate($pdf, $radius + $margin, $radius + $margin); pdf_save($pdf); pdf_setrgbcolor($pdf, 0.0, 0.0, 1.0); /* minute strokes */ pdf_setlinewidth($pdf, 2.0); for ($alpha = 0; $alpha < 360; $alpha += 6) { pdf_rotate($pdf, 6.0); pdf_moveto($pdf, $radius, 0.0); pdf_lineto($pdf, $radius-$margin/3, 0.0); pdf_stroke($pdf); Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin. 20
} pdf_restore($pdf); pdf_save($pdf); /* 5 minute strokes */ pdf_setlinewidth($pdf, 3.0); for ($alpha = 0; $alpha < 360; $alpha += 30) { pdf_rotate($pdf, 30.0); pdf_moveto($pdf, $radius, 0.0); pdf_lineto($pdf, $radius-$margin, 0.0); pdf_stroke($pdf); } $ltime = getdate(); /* draw hour hand */ pdf_save($pdf); pdf_rotate($pdf,-(($ltime['minutes']/60.0)+$ltime['hours']-3.0)*30.0); pdf_moveto($pdf, -$radius/10, -$radius/20); pdf_lineto($pdf, $radius/2, 0.0); pdf_lineto($pdf, -$radius/10, $radius/20); pdf_closepath($pdf); pdf_fill($pdf); pdf_restore($pdf); /* draw minute hand */ pdf_save($pdf); pdf_rotate($pdf,-(($ltime['seconds']/60.0)+$ltime['minutes']-15.0)*6.0); pdf_moveto($pdf, -$radius/10, -$radius/20); pdf_lineto($pdf, $radius * 0.8, 0.0); pdf_lineto($pdf, -$radius/10, $radius/20); pdf_closepath($pdf); pdf_fill($pdf); pdf_restore($pdf); /* draw second hand */ pdf_setrgbcolor($pdf, 1.0, 0.0, 0.0); pdf_setlinewidth($pdf, 2); pdf_save($pdf); pdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0)); pdf_moveto($pdf, -$radius/5, 0.0); pdf_lineto($pdf, $radius, 0.0); pdf_stroke($pdf); pdf_restore($pdf); /* draw little circle at center */ pdf_circle($pdf, 0, 0, $radius/30); pdf_fill($pdf); pdf_restore($pdf); pdf_end_page($pdf); # to see some difference sleep(1);
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
21
Copiar un archivo
copy('El_archivo.xxx','/nuevo_directorio/');
is_readable('archivo.xxx');
Mover un archivo cargado a travs de HTTP POST de un directorio a otro predefinido move_uploaded_file ('directorio/archivo.xxx','directorio2/archivo.xxx'); Leer el contenido resultante de archivo file_get_contents('el_archivo.xx'); Renombrar un archivo o directorio
rename("/tmp/archivo_temp.txt", "/home/usuario/login/docs/mi_archivo.txt");
ELIMINAR UN DIRECTORIO
rmdir('/directorio');
La mayora de ellas devuelven un booleano, por lo cual se puede imprimir un resultado en pantalla de la siguiente manera:
if(unlink('el_archivo.txt') echo 'se ha eliminado el archivo'; else echo 'Imposible eliminar el archivo, compruebe que el fichero exista y que tenga permiso xxx.'; ?>
Recuerda que para establecer permisos a directorios o archivos se deben emplear 4 cifras no 3 como usualmente se hace y produce error. Ejemplos: 0777, 0755, 0666, etc Esto se debe a que el nmero para especificar el permiso debe incluirse en octal (Base 8). En PHP y otros lenguajes de programacin. Los nmeros en Base 8 se escriben con un 0 delante para diferenciarlos de los nmeros en Base 10 o sistema decimal.
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
23
La sintaxis de esta funcin con la que trabajaremos es la siguiente: fopen ('archivo.xxx','Modo'); Donde archivo es el nombre del mismo y (.xxx) su extensin, cabe destacar que si la llamada de este archivo se hace de la siguiente forma: esquema://, se asume que es una URL y Php buscara un gestor de protocol para tal esquema. Recordemos que los protocoles pueden ser (http, https, ftp, ftps, pop, pop3, y otros), si Php no encuentra una o ms envolturas registradas para dicho protol, se emitir un mensaje de error. Modo, se refiere a la forma en que abrimos el archivos (bajo que recursos). Por ejemplo: Si queremos hacer una apertura para solo lectura, o lectura y escritura u otro. Estos modos se designan con Letras predefinidas en Php, que son las siguientes: '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. 'x' Creacin y apertura para slo escritura; ubica el apuntador de archivo al comienzo de ste. Si el archivo ya existe, la llamada a fopen() fallar devolviendo FALSE y generando un error de nivel E_WARNING. Si el archivo no existe, intenta crearlo. Esto es equivalente a especificar las banderas O_EXCL|O_CREAT en la llamada de sistema open(2) interna. Esta opcin es soportada en PHP 4.3.2 y versiones posteriores, y slo funciona con archivos locales. 'x+' Creacin y apertura para lectura y escritura; ubica el apuntador de archivo al comienzo de ste. Si el archivo ya existe, la llamada a fopen() fallar devolviendo FALSE y generando un error de nivel E_WARNING. Si el archivo no existe, intenta crearlo. Esto es equivalente a especificar las banderas O_EXCL|O_CREAT en la llamada de sistema open(2) interna. Esta opcin es soportada en PHP 4.3.2 y versiones posteriores, y slo funciona con archivos locales. Un ejemplo:
<? $archivo= fopen("documento.txt" , "r"); if ($archivo) { while (!feof($archivo)) { echo fgets($archivo, 255).'<br>'; } } fclose ($archivo); ?>
Explicando:
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin. 24
Primero abrimos el archivo en modo de lectura y lo agrupamos a la variable $archivo, si se puede realizar la apertura (sea si fopen() devuelve TRUE), Ejecutamos un bucle WHILE y en el argumento introducimos la funcin feof(), Encargada de verificar si el apuntador a un fichero esta al final del mismo. Luego la funcin fgets(), se encarga de imprimir la lnea del fichero apuntado. y finalmente cerramos el archivo con fclose(); Otro Ejemplo:
<? $archivo=fopen("documento.txt" , "w"); if ($archivo) { fputs ($archivo, "Resulto el script"); } fclose ($archivo); ?>
Explicando: Abrimos el archivo nuevamente pero esta vez en modo de solo Escritura. Si se puede ejecutar ese proceso if($archivo), agregamos una lnea con fputs(), que tendr como contenido Resulto el script. El ultimo paso en esta oportunidad como ya conocemos es cerrar el archivo. Cabe destacar que para que este ultimo ejemplo funcione, obviamente el archivo documento.txt, requiere tener PERMISO DE ESCRITURA, preferiblemente 0777 CHMOD.
Ms informacin:http://www.php.net/manual/es/ref.filesystem.html
Vamos a ver si existe un archivo llamado "mifichero.txt" en el mismo directorio que la pgina PHP:
if (file_exists("mifichero.txt")){ echo "El fichero existe"; }else{ echo "El fichero no existe"; }
Si quisiramos comprobar si existe ese fichero dentro de un directorio determinado, bastara con que escribisemos la ruta de directorios sobre la que deseamos buscar el fichero. file_exists("datos/mifichero.txt") Esta funcin buscara el archivo "mifichero.txt" dentro del subdirectorio "datos". Este subdirectorio "datos" estara contenido dentro del directorio donde colocamos el script PHP. Indicando rutas absolutas Tambin podramos buscar un archivo indicando una ruta absoluta dentro del sistema de archivos del servidor. En este caso habra que comprobar si desde PHP tenemos permisos para acceder a la ruta en la que se pretende buscar el archivo, sobretodo si la ruta es externa al directorio de publicacin del servidor. file_exists("c:/mif.txt") Esta funcin buscara el archivo mif.txt en el directorio raz del disco c:. Habra que ver si tenemos permisos para acceder al directorio raz del disco. Podemos averiguar la ruta del directorio de publicacin de la pgina con la variable del entorno del servidor $_SERVER["DOCUMENT_ROOT"]. Podemos utilizar esta variable para generar la ruta absoluta a un archivo que pretendamos comprobar su existencia.
file_exists($_SERVER["DOCUMENT_ROOT"] . "\mifichero.txt")
Esta funcin buscara el archivo "mifichero.txt" dentro de la raz del directorio de publicacin.
Nota:Como se puede ver, hemos utilizado el carcter "\" (contrabarra) para separar los directorios en la ruta de un archivo. Esto es porque estas lneas estn extradas de ejemplos de PHP realizados sobre el sistema Windows. En Windows se utilizan contrabarras para escribir rutas, mientras que en Linux se utiliza el carcter "/" (barra normal). Hay que tener cuidado para saber qu barra debemos utilizar en cada sistema, de lo contrario, podemos equivocarnos y entonces PHP puede tener problemas para localizar un fichero determinado.
Ejemplo: si existe un fichero, abrirlo y si no existe, crearlo Ahora vamos a mostrar un cdigo muy tpico que sirve para abrir un fichero con un nombre dado. Primero habra que comprobar si existe o no existe ese fichero. Si existe, entonces lo abrimos tal cual est y si no existe, lo crearemos previamente a abrirlo.
if (file_exists("mifichero.txt")){ echo "El fichero existe. Lo abro"; $reffichero = fopen("mifichero.txt", "a"); }else{ echo "El fichero no existe. Lo creo y abro.";
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
26
En este cdigo, primero se comprueba la existencia del fichero. Si existe (caso afirmativo del if), se abre con el modo "a", que indica que se desea aadir informacin al fichero. Si no existe fichero (caso else del if), se abre con el modo "w+", que indica lectura y escritura y adems indica que si no existe el fichero, se crear en el sistema de archivos en la ruta indicada. Despus de este cdigo, el fichero est abierto para escritura, con lo cual, podemos operar sobre el fichero (escribiendo informacin) y luego deberamos cerrarlo. El cdigo sera como este:
//operar con el fichero fwrite ($reffichero,"nuevo texto!!!!"); //cerrar el fichero fclose ($reffichero);
El script est comentado, pero daremos unas explicaciones adicionales. Primero abrimos el archivo para lectura. El fichero se llama "miarchivo.txt" y se supone que est en el mismo directorio que este script PHP. Luego creamos un par de variables para llevar la cuenta de las lneas y de los caracteres. Seguidamente hacemos un bucle para recorrer el archivo. El bucle iterar mientras que no se llegue al final del fichero. En cada iteracin del bucle extraigo una lnea, a la vez que compruebo que lo que he extrado tiene validez (Con fgets() se extrae una lnea de texto y si hay un error la funcin devuelve false). Si se extrajo correctamente la lnea de texto se acumula 1 en la variable que cuenta el nmero de lneas y se acumula el nmero de caracteres que tenga en la variable que cuenta los caracteres del archivo. Una vez finalizado el bucle, porque se ha llegado al final del fichero, se muestran los contenidos de las variables con el nmero de lneas y caracteres. Artculo por Miguel Angel Alvarez
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
28
La funcin recibe una ruta. Por ejemplo, si queremos que liste los directorios de la carpeta donde est el archivo la llamaramos con:
listar_directorios_ruta("./");
Si lo es realizaremos las acciones, pero si no lo es, mostraremos un mensaje diciendo que no es una ruta vlida. En el siguiente if extraemos el gestor de directorio y lo guardamos en una variable $dh
if ($dh = opendir($ruta))
En caso que sea un directorio, simplemente escribimos en la pgina. Adems, tenemos que ver si ese directorio contiene a su vez otros directorios. Para eso llamamos a la funcin de nuevo pasndole ese nuevo directorio. As la funcin se llama a si misma para mostrar todo el rbol de carpetas. Por ltimo se cierra el gestor de directorio abierto previamente.
closedir($dh);
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
29
Simplemente indicamos la ruta del archivo con una URL por el protocolo FTP. En dicha URL se indican los siguientes datos. ftp:// es el protocolo. usuario:clave es el usuario y la clave del acceso FTP que estemos utilizando. Si fuera un ftp annimo podramos omitir estos datos. @ para separar lo que es el usuario y la clave del nombre del servidor. Tambin se debera omitir en el caso de un servidor annimo. ftp.servidor.com es el nombre del servidor FTP al que estamos conectando /html/archivo.txt es la ruta desde el directorio raz del FTP hacia el archivo que se desea abrir.
Luego trataramos el archivo de manera similar a como hemos visto en otros casos en el manual sobre gestin de archivos por PHP. Veamos un ejemplo completo de conexin por FTP para abrir, leer y mostrar un fichero de texto remoto:
<?php $archivo = fopen ("ftp://user:[email protected]/html/probando.txt", "r"); if (!$archivo) { echo "<p>No puedo abrir el archivo para lectura</p>"; exit; } $texto=""; while ($linea = fgets($archivo,1024)) { if ($linea) $texto .= $linea; } echo $texto; fclose ($archivo); ?>
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
30
Gestin de archivos en PHP: http://www.desarrolloweb.com/manuales/75/ Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorizacin.
31