|
Nem só de abrir e fechar ficheiros
vive um script php, é necessário
fazer alguma coisa com eles. A "coisa"
mais fácil é mostrar o conteúdo
do ficheiro no browser do utilizador, para
isso utilizamos a função "int
fpassthru( int fp )". Então,
para mostrar o ficheiro novidades.txt, que
contém as últimas notícias
da semana directamente para o browser do
utilizador, o script fica assim:
<?php
$fd = @fopen( "tmp/novidades.txt",
"r" ) or die( "ops, avise
o webmaster, tem ficheiro faltando no servidor");
fpassthru( $fd );
?>
A função fpassthru lê
a partir da posição actual
do ponteiro até ao final do ficheiro
e fecha o ficheiro, portanto, neste caso
não é necessário utilizar
a função fclose() (podes tentar,
mas vai provocar um erro). Se estás
a correr este script, notarás que
o ficheiro novidades.txt saiu com as linhas
juntas, para resolver isto coloca um <br>
no final de cada linha do ficheiro ou deixa
o script entre as tags <pre>. Se tentares
colocar alguns scripts php dentro do ficheiro
novidades.txt notarás que eles serão
mostrados no browser do utilizador e não
serão processados pelo php. Se quiseres
adicionar um script php á página,
utilza include ou require. Se só
for necessário mostrar o ficheiro
novidades directamente no browser sem precisar
de posicionar o ponteiro, utiliza a função
readfile, que abre o ficheiro, mostra e
fecha o mesmo:
<?php
if( !@readfile( "tmp/novidades.txt")
) die ("ops, chame o webmaster!");
?>
Claro, existem muitas funções
para ler o ficheiro: (todas elas dependem
do ponteiro do ficheiro, e não do
facto de fechar o ficheiro)
- string fread( int
fp, int tamanho )
Lê o ficheiro apartir da posição
actual do ponteiro no ficheiro até
ao tamanho em bytes ou até o final
do ficheiro, o que acontecer primeiro, e
devolve como uma string.
<?php
// este script faz a mesma coisa que o anterior
if( $fd = @fopen( "tmp/novidades.txt",
"r" ) ) {
while( !feof( $fd ) ) {
$novidades = fread( $fd, 1024 );
print $novidades;
}
fclose($fd);
}
?>
Enquanto não chegar ao final do
ficheiro ( feof() ), lê até
1024 bytes do ficheiro para a variável
$novidades e imprime seu conteúdo.
- string fgetc( int
fp )
Lê so um caractére do ficheiro.
Não utilize esta função
para ler mais do que um caractere de um
mesmo ficheiro, não é eficiente,
é mais eficiente ler o ficheiro em
blocos para a memória e fazer o processamento
na memória, pois o acesso ao disco
é extremamente lento se comparado
com o acesso à memória, e
aceder ao disco para ler um só caractere
para processar é um enorme disperdício
de recursos do servidor. Tenta trocar a
função fread pela fgetc no
script acima e usa um ficheiro novidades.txt
com alguns kbytes para perceberes a ideia.
Imagina 10.000 hits/hora com um script desses!
- string fgets( int
fp, int tamanho )
Se precisas de ler o ficheiro linha á
linha, utiliza esta função.
Ela lê até que 1 byte seja
lido, que encontre o final de uma linha
(que é incluída no resultado),
ou final do ficheiro e devolve como uma
string. Para ler até 10 bytes de
um ficheiro, utilize:
$texto = fgets( $fd,
11 );
- string fgetss( int
fp, int tamanho [, string tagspermitidas]
)
Idêntica à função
fgets, só que os tags html e php
serão ignoradas. Se for necessário
deixar alguns tags passarem pela função,
utiliza o parâmetro opcional tagspermitidas,
por exemplo, para ler um ficheiro novamente,
mas deixar so as tags <br>, <b></b>
e <p></p> serem exibidas, use:
$texto = fgetss( $fd,
1024, "<br><b><p>"
);
Mesmo podendo selecionar quais tags que
podem passar pela função,
se este ficheiro vier de fora, ou seja,
é um ficheiro que uma pessoa manda
pela internet para mostra no site, alguém
pode mandar algum código javascript
malicioso dentro de uma tag, e executar
comandos indevidos na máquina do
visitante do seu site. Cuidado!
array file( string
ficheiro [, int usa_include_path ] )
Lê o ficheiro inteiro e coloca cada
linha do ficheiro numa tabela. Esta função
utiliza como parâmetro o nome do ficheiro,
portanto não é necessário
abrir nem fechar o ficheiro para usar esta
função. Vamos ao exemplo:
Supondo que o ficheiro novidades.txt tem
uma novidade por linha, similar a este:
novidade.txt
Nova versão do php acaba de ser
lançada!
Linux eleito melhor sistema operativo do
mundo!
*Encontrado mais um furo de segurança
no dind.
O número de servidores linux cresce
a cada dia!
Queremos mostrar cada linha do ficheiro
novidades com um fundo diferente, e ainda
por cima as linhas que contém um
* no início devem ser exibidas em
negrito
<html>
<head><title>Novidades</title></head>
<body>
<?php
$txt = @file("tmp/novidades.txt");
if(!$txt) {
print "Sem novidades por hoje, só
o webmaster é que vai receber um
responso";
exit;
}
// count retorna o número de índices
da tabela
$tot = count($txt);
?>
<table width="500" align="center"
bgcolor="white" cellpadding="1"
cellspacing="0">
<?php
for($i=0;$i<$tot;$i++) {
// ct vai ler o primeiro caractere da linha
$ct=$txt[$i][0];
// Chop elimina espaços do final
da string e finais de linha também
$linha = Chop($txt[$i]);
// Seleciona a cor de fundo para a linha
if( $cor == "#DCDCDC" ) $cor =
"#DCDCFF";
else $cor = "#DCDCDC";
print "<tr><td bgcolor='$cor'>";
// strip_tags elimina todas as tags html
e php, como fgetss
// se a linha começa com um *, le
a partir do próximo caractere
// o ponto serve para concatenar as strings
if( $ct == "*" ) print "<b>".strip_tags(substr($linha,1))."</b>";
else print strip_tags($linha);
print "</td></tr>";
}
?>
</table>
</body>
</html>
Por hoje aprendemos várias funções
de leitura de dados apartir de ficheiros,
em breve falaremos de funções
de escrita.
|