Escritura en archivos con PHP

Cómo y para qué usar la función fwrite.
Siguiendo con la gestión de archivos por medio de PHP, en este artículo veremos los pasos elementales para la creación y escritura de un archivo texto por medio de esta tecnología 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 más complicado.

Por otra parte, las posibilidades que estas dos operaciones nos pueden ofrecer conjuntamente son realmente sorprendentes. Sin ir más 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 difícil la puesta en marcha de una base de datos elemental, siempre podremos solventar el inconveniente almacenando nuestros datos en archivos que luego podrán ser leídos. Por supuesto, este método no tiene nada de seguro ni de versátil y sólo es valido para un sitio sin información confidencial y con poca cantidad de datos.

Podemos pensar también en crear documentos dinámicos a partir de datos introducidos en un formulario: cartas, páginas HTML y otros.

Otro ejemplo particularmente práctico es la creación dinámica de archivos que nos ahorren recursos de servidor. Imaginemos que tenemos una página, 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 ejecución masiva de un mismo script con el consiguiente ahorro de recursos y por otra automatizamos la actualización de una determinada página o sección ejecutando periódicamente 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 función fwrite, o su alias fputs, la cadena que deseamos incluir en nuestro archivo.

Para ejemplificar esta nueva función de escritura y combinarla con la de lectura, fgets, os proponemos este contador inspirado en una nota de la página 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);

echo "Este script ha sido ejecutado $contador veces";
}

?>

Aquí podéis ver el resultado producido cuando llamamos a esta función.

Como en otros ejemplos, el script es expresado en forma de función para que sea más sencilla su reutilización. 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 línea. 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 función fwrite puede ser utilizada también para enviar datos en otros tipos de aperturas como son las de sockets o de programas. Pero esto ya es otra historia...

Autor

Rubén Alvarez

Rubén es doctor en química y programador aficionado con experiencia en PHP.

Compartir

Comentarios

Juan Manuel

31/3/2002
La clave de escribir en un archivo son las autorizaciones, porque la web está para leer, pero escribir sólo lo puede hacer normalmente el administrador de la página. Sería conveniente explicar un poco mejor quién y cómo se puede autorizar a los usuarios a acceder a la lectura y escritura de un archivo.

Respuesta rápida:

Si tenéis problemas a la hora de escribir en un archivo, efectivamente, es que estará protegido contra escritura. O bien el archivo o bien el directorio.

Si tenéis vuestro propio servidor tendréis que modificar los permisos de tal archivo o directiorio por vosotros mismos. Sin embargo, si estáis publicando en un alojamiento contratado en un proveedor tendréis que enteraros de qué mecanismo hay que poner en marcha en ese proveedor para conseguir los permisos. En muchos casos existirá un panel de control donde modificar esas cosas, en otros casos tendréis que escribir a soporte técnico para que lo hagan a mano éllos o os digan cómo hacerlo, si es que es posible.

Daniel Guajardo

11/8/2002
Con este artículo, como ha quedado más o menos señalado, se puede hacer fácilmente un contador. He realizado algunas modificaciones que se pueden ver en otro artículo de DesarrolloWeb: Contador simple para páginas PHP.

Anip

19/2/2003
Los permisos se pueden cambiar desde una shell con "chmod".
Una buena idea es hacer un "CAJA DE SUGERENCIAS" en el que el usuario deja un mensaje/sugerencia, con su respectivo nick, esto se le puede sumar de usar password.. claro que aqui necesitariamos MySQL o una base de datos similar.
Tambien se puede hacer para una facil configuracion, en mi site tengo una marquesina que muestra la ultima noticias importante. Luego tengo otra hecha con JavaScript que corre verticalmente que tiene noticias de la semana, importantes o no importantes. Ambas la actualizo desde una pagina ajena, simplemente escribo y le mando ENVIAR y listo!.
Se le pueden encontrar muchas mas utilidades!
Chau. Argentina

Fernando

26/1/2004
Creo que la utilidad mas importante, que aqui no se menciona es la posibilidad de migrar datos de una base de datos al excel.

nombre

06/2/2004
creo que se puede usar en multiples formas

incluso para hacer esto
(algo como lo que yo ando buscando)
comentar el articulo

parece ser algo parecido

saludos

frederick

30/4/2004
me parece muy interesante y muy bien elaborado, pero como yo no soy un experto en el oficio, me he encontrado con problemas para poder hacer funcionar el contador y agradeceria que alguien se pusiera en contacto y me echara la mano
de antemano gracias y suerte para todos

Francisco Telles Gamez

18/7/2004
Compañeros les comento que tengo el proyecto de crear una página y colocarla promeramente en intranet y sobre la transformación de coordenadas de un sistema de referencia a otro, sin embargo requiero lo siguiente.
1. Que la página permita la lectura de un archivo de datos con las coordenadas que quiere cambiar, esto para evitar que tenga que teclearlos en un formulario.
2. Necesito que el servidor lea ese archivo más datos del formulario y los almacene en un directorio automaticamente.
3. Despues automáticamente que ejecute un programa (en el servidor) realice los calculos de transformación del archivo enviado y luego los almacene en el mismo directorio automaticamente.
4. Luego que el servidor tome los datos transformados y los envie al que tiene la página abierta (usuario remoto) y le permita desplegarlos en pantalla y luego que tenga la opción de almacenarlos en un archivo en la máquina que esta haciendo la consulta.
5. He leeido el JavaScript o VbScript sin embargo comentan que eso no lo permiten porque se ponen en riesgo los sistemas de archivos por que le permite a los usuario con malas intenciones tomar el control y causar daños.
6. He leido el ASP y al parecer este permite el acceso a los archivos solo en el servidor.
7. ¿Que sistema puedo utilizar y poder ayudar a los usuarios de mi intranet?

Saludos

abraham villa

02/12/2004
hola, comentabas que la funcion fwrite se puede aplicar para el envio de archivos verdad?

tengo una duda acerca de eso la cual es la siguiente:

while(fwrite(&animalito,sizeof(char),1,prueb)){
printf(" Leyendo los datos del fichero"%s": ",nombre);

--------->while(j!=caracter fin de archiobo sige leyendo)<-------

EN ESTE CODIGO FWRIT TE ESTA LEYENDO UN ARCHIVO QUE SUPUESTAMENTE ALGUIEN TE ESTA MANDANDO, TE LO HACE SABER CON PRINTF, PERO CUANDO J!=A FIN DE ARCHIVO DE VE DEJAR DE LEER COMO SE HARIA ESO?

APARTE TENGO QUE HACER OTRA FUNCION PARA DARLE DIRECCION AL ARCHIVO ENTRANTE?

Alvaro

14/1/2005
¿Pero que significa el numero 26?, aún no he visto ningún articulo que diga que significa ese "26" hay.

Perdon si es una pregunta tonta, pero es que soy un ignorante en estos temas.

18/1/2006
Muuy buen articulo gracias.

Memo

23/7/2006
como puedo actualizar mi archivo de tal manera que yo no pierda los datos anteriores y me pueda mostrar desde el primero hasta el ultimo dato que se inserto?

joreg

28/8/2006
y si queremos agregar texto?

Jorge Cabanillas

30/8/2006
Me parece que esta muy bien y muy clara la explicación de esta seccion, es lo que necesitaba. Gracias.

Samuel G.

03/10/2006
El problema basico que tengo es que necesito generar un archivo desde una bda delimitado por cierto formato, donde cada campo de la base de datos me va a ocupar una posicion y todas las lineas deben de cumplir con una longitud especifica no importando la cantidad de caracteres que que contengan las variables, y el enter no me funciona. algun code ejemplo que me ayude, ya he hecho lo imposible y nada

Sam

03/11/2006
Como puedo escribir en un archivo el resultado de una consulta mysql usando PHP, de manera que pueda eligir la posicion de la columna donde yo quiero que se escriban las variables?

lo he intentado y no me sale.. por eje.:
Tomo los valores de una consulta dentro de un bucle:
$tiporegistro = $row["TipoRegistro"];
$rnc=$row["ClaveAgente"];
$nss=$row["NSS"];
$nombre=$row["PrimerNombre"];

luego escribo en el arvhivo asi:$archivo=fopen($coco , "a+");
if ($archivo) {
fputs ($archivo, $tiporegistro);
fseek($archivo, 1);
fputs ($archivo, $rnc);
fseek($archivo, 12);
fputs ($archivo, $nss);
fseek($archivo, 21);
fputs ($archivo, $nombre);
fclose($archivo);}

Y todo esto dentro de un bucle que mientras hayan registros se va ejecutando.. lo unico que no me esta colocando las vaiables en las posiciones que yo quiero que se escriban. ¿alguna idea?

gabriel

14/3/2007
esta bueno la implementacion de un archicvo plano,Yo lo utilize para cargar la temperatura.el tema es si quiero cargar varios datos extras, como ser el dia, l hora..si alguien sabe como implementarlo..desde ya gracias

daemos

12/6/2007
Me parecio muy completo el tutorial, pero quisiera saber si hay una manera de grabar el archivo de texto en el cliente, no en el servidor.

si alguien sabe seria tan amable de decirme como

oscar sebas

19/5/2009
como ago un contador en php
ayudenme a realizar un contador con mysql que cuando sea visitante lo mencione y al igual cuando es usuario.graxas

fernando

29/11/2009
no funciona el codigo o faltaalgun permiso
hola en mi web <a href="http://www.cuscoperuvian.com">mi sitio</a> http://www.cuscoperuvian.com/admin/borrar.php me manda el sigueinte error sera falta de permisos probe con chmos pero tampoco el error es el sigueinte


PHP Error Message

Warning: fopen(fer.txt) [function.fopen]: failed to open stream: No such file or directory in /home/a1990066/public_html/admin/borrar.php on line 8

Free Web Hosting

PHP Error Message

Warning: fgets(): supplied argument is not a valid stream resource in /home/a1990066/public_html/admin/borrar.php on line 9

Free Web Hosting

PHP Error Message

Warning: fclose(): supplied argument is not a valid stream resource in /home/a1990066/public_html/admin/borrar.php on line 10

Free Web Hosting

PHP Error Message

Warning: fopen(fer.txt) [function.fopen]: failed to open stream: Permission denied in /home/a1990066/public_html/admin/borrar.php on line 16

Free Web Hosting

PHP Error Message

Warning: fclose(): supplied argument is not a valid stream resource in /home/a1990066/public_html/admin/borrar.php on line 18

Free Web Hosting
Este script ha sido ejecutado veces

isabela

16/3/2010
BUenas
Hola a tod@s quisiera ver si me pueden ayudar a como leer un archivo plano en php, debo cargar esa informacion a una tabla creada por varios campos, como hago para leer eso??? los archivos que leere son algo asi:

D1961 03012512690218 0 4268385168 20100122142639000002500755040 C3B0 FCS20100122 2669

son miles de registros en cada Txt... cada espacio significa algo para cada campo. por ejemplo D es un campo en mi tabla, (1961 ) este es otro campo, se cuentan los espacios en blanco... no se si me entendieron =S