Posted 12/08/2004, 15:41
Recentemente pude verifica que as pessoas(os programadores PHP, cito) tem muita dificuldades em se ultilizar de arquivos de texto, que em línguagem PERL é conhecido como FLAT, então neste artigo pretendo mostrar como escrever, exibir, páginar, mudar e deletar dados de arquivos de texto.
1º Disposição dos DadosVocê deve ter primeiramente a noção de como serão gravados os dados no arquivo de texto, para que tenha um melhor aproveitamento do mesmo.
Serão gravados uma linha abaixo da outra, e com um difusor separador que no nosso caso vou usar "|", estou usando ele por que não é muito usual e se for um
caractere usual confundira o sistema na hora da leitura.
Exemplo:
Dado1|Dado2|Dado3 [Linha 1]
Dado1|Dado2|Dado3 [Linha 2]
Dado1|Dado2|Dado3 [Linha 3]
Assim serão disposta os dados no arquivo de texto.
Como se fossem um banco de dados visto de um sistema de adminsitração.
2º A GravaçãoDa gravaçao do arquivo, esse só tem uma forma ao contrario da leitura que tem outras, pois bem é só abrir o arquivo e gravar os dados que devam vir de um "formulário", "query string", "cookie" ou qualquer outro meio idôneo de se enviar dados, não se esqueçendo do
"\n"(nova linha) no final, isso garantira que ele realmente pule de linha.
* Lembrado: Sempre que o apêndice de abertura deve ser:
a = Colocar uma linha abaixo da outra, ou
a+ = Colocar uma linha abaixo da outra, e cria o arquivo se não existir ou em termos mais técnicos coloca o ponteiro de gravação no final do arquivo.
Uma observação que devo salientar e que dependendo de onde vem (como um textarea) e o tipo de dado pode comromper a linha.
Dai uma solução adotada é tirar esses caracteres que prejudique a linha.
Compete ao programador definir qual dado está mais sujeito a rebeber esses caracteres e tomas as diligencia de correção;
PHP |
Exemplo [Retirara de dados que comprometem a linha]: $dado = str_replace("\t", "", $dado); $dado = str_replace("\r", "", $dado); $dado = str_replace("\n", '\n', $dado); $dado = str_replace("|", "|", $dado);
Exemplo [Gravaçao normal]: <?php $fp = fopen("arquivo.txt","a"); fwrite($fp,"$dado1|$dado2|$dado3\n"); fclose($fp); ?> |
3º A LeituraCome citei no inciso anterior a leitura possui mais de 1(um) modo com as funções:
"file()+while()+each()+explode()", "file()+for()+count()+explode()" e também com "fopen()+fread()+fclose()+while()/for()+explode()", de qualquer forma vou ultilizar apenas uma a (2º) para não se confudirem, e também fica findo a facilitação, para a ultilização de páginação.
É páginação pode ser feita com txts ao contrario do que muitos pensam.
Primeiro devemos trasformar cada linha em array ultilizado a função file(), depois contar quantas linhas há com o count(), lista-las com o for e por último extrair os dados dos "|" com o explode().
Exemplo:
<?php
$linha = file("arquivo.txt");
$total = count($linha);
for ($i = "0"; $i < $total; $i++){
list($dado1,$dado2,$dado3) = explode("|",$linha[$i]);
echo "Dado 1: $dado1 - Dado 2: $dado2 - Dado 3: $dado3";
echo "+ <a href=\"deletar.php?codigo=$i\">Apagar</a>-<a href=\"mudar.php?codigo=$i\">Mudar</a><br />";
}
?>
A parte do explode(), também pode ser escrita de forma simples sem list()
para no caso de não for nescessário o uso de todos os dados na listagem:
Exemplo:
<?php
$linha = file("arquivo.txt");
$total = count($linha);
for ($i = "0"; $i < $total; $i++){
$dados = explode("|",$linha[$i]);
echo "Dado 1: $dados[0] - Dado 2: $dados[1] - Dado 3: $dados[2]";
echo "+ <a href=\"deletar.php?codigo=$i\">Apagar</a>-<a href=\"mudar.php?codigo=$i\">Mudar</a><br />";
}
?>
Uma coisa que devo dizer é se você quiser exibir as últimas gravações primeiro, em alusão dessas serem as mais novas, para ser mostradro basta usar a função array_reverse() depois de file(), mas mesmo assim a desvantagem do (texto X banco de dados) nesse quesito de organição, é enorme no sentido de mostragem por order de coluna, ascendente, descendente.
PHP |
Exemplo: <?php $linha = file("arquivo.txt"); $linha = array_reverse($linha); $total = count($linha); /* Resto do script indelével */ ?> |
3.1º A Leitura com PáginaçãoAgora vou mostrar como se fazer a páginação de um arquivo de texto o que é possivel e muitos pensam que não.
A primeira atitude a se tomar e colocar uma variável definido quandos dados por página vamos colocar nesse exemplo será 5, depois para ser uma páginação bem feita somaremos quantas páginas vão existir na divisão do total por 5 e vamos ultilizar a função ceil() para arredondar valores quebrados e será tirado 1(um) pelo fato de estar lidando com array e eles começam do 0(zero), em seguida iremos verificar se a página requerida pelo usuário é valida ou seja que contenha
numero e não exceda do total que exite em especial devo citar a função is_numeric(), que serve para verificar se é um número, depois vamos vazer as somas do inicio/final das linhas de acordo com a página e o final, e verificar se o final e maior que o total para não haver erros, depois vamos formular os links de ida e volta.
Exemplo:
<?php
$divisao = "5";
$linha = file("arquivo.txt");
$total = count($linha);
$paginas = ceil($total/$divisao)-1;
if (!$pagina) { $pagina = "0"; }
else if (!is_numeric($pagina)) { $pagina = "0"; }
else if ($pagina > $paginas) { $pagina = "0"; }
else { $pagina = $pagina; }
$inicio = $pagina*$divisao;
$final = $inicio+$divisao;
$final = ($final > $total) ? $total : $final;
for ($i = $inicio; $i < $final; $i++){
list($dado1,$dado2,$dado3) = explode("|",$linha[$i]);
echo "Dado 1: $dado1 - Dado 2: $dado2 - Dado 3: $dado3";
echo "+ <a href=\"deletar.php?codigo=$i\">Apagar</a>-<a href=\"mudar.php?codigo=$i\">Mudar</a><br />";
}
$anterior = $pagina-1;
$proxima = $pagina+1;
$paginass = ($paginas <= "0") ? "1" : $paginas+1;
echo "[Total <b>$total</b> Dados - Página <b>$proxima</b> de <b>$paginass</b>]<br />";
echo ($pagina == "0") ? "« Anterior" : "<a href=\"$PHP_SELF?pagina=$anterior\">« Anterior</a>";
echo " ";
for ($i = "0"; $i < $paginass; $i++){
$atual = $i+1;
echo ($i == $pagina) ? "<b>$atual</b> " : "<a href=\"$PHP_SELF?pagina=$i\">$atual</a> ";
}
echo " ";
echo ($pagina < $paginas) ? "<a href=\"$PHP_SELF?pagina=$proxima\">Próxima »</a>" : "Próxima »";
?>
4º Deletando DadosAgora chegou a hora de tirar um dado do arquivo de texto.
Bem o processo é simples basta indicar a linha que você deseja tirar por qualquer meio como query string "deletar.php?codigo=7" e ele a tirara.
O Processo consiste em gravar todo o arquivo em uma variável diz-se file(), e depois limpar o arquivo o re-escrevendo totalmente sem a dita cuja linha.
É um processo chato, ruim mas fazer o que !?!?! não existe melhor jeito.
* Lembrado: Sempre que o apêndice de abertura deve ser:
w = Limpar todo o arquivo, ou
w+ = Limpar todo o arquivo, e cria o arquivo se não existir
ou em termos mais técnicos limpa e coloca o ponteiro de gravação no inicio do arquivo.
Devo fazer mais uma observação se você usar o array_reverse() na listagem e no link o mesmo terá de usa-lo aqui também, senão ele lera as linhas de forma trocada.
PHP |
Exemplo: <?php $arquivo = "arquivo.txt"; $linha = file($arquivo); $total = count($linha); $fp = fopen($arquivo,"w+"); for ($i = "0"; $i < $total; $i++){ list($dado1,$dado2,$dado3) = explode("|",$linha[$i]); if ($codigo != $i){ fwrite($fp,"$dado1|$dado2|$dado3"); }} fclose($fp); ?> |
5º Mudando DadosE por final mudar os dados que exige 2(duas) estapas a primeita consiste em pegar os dados e segundo propriamente dita mudar os dados, a parte de pegar é simples é como a listagem só que em vez de exibir será trasformado em um Array de uso do sistema, você pode pegar a linha que queira com query string também "mudar.php?codigo=7", perceba que a novidande no caso é o "break"
para quando ele achar a linha para de listar assim consumindo menos tempo e bandhitch.
Devo fazer mais uma observação se você usar o array_reverse() na listagem e no link o mesmo terá de usa-lo aqui também, senão ele lera as linhas de forma trocada.
Exemplo:
<?php
$linha = file("arquivo.txt");
$total = count($linha);
for ($i = "0"; $i < $total; $i++){
list($dado1,$dado2,$dado3) = explode("|",$linha[$i]);
if ($codigo == $i){
$dados = array($codigo,$dado1,$dado2,$dado3);
break;
}}
echo "<form action=\"muda.php\" method=\"post\">\n".
"<input type=\"hidden\" name=\"codigo\" value=\"$dados[0]\" />\n".
"Dado 1: <input type=\"text\" name=\"dado1\" value=\"$dados[1]\" /><br />\n".
"Dado 2: <input type=\"text\" name=\"dado2\" value=\"$dados[2]\" /><br />\n".
"Dado 3: <input type=\"text\" name=\"dado3\" value=\"$dados[3]\" /><br />\n".
"<input type=\"submit\" value=\"Mudar\" /></form>";
?>
E agora da mudança propiamente dita a diferença entre mudar e deletar é minina uma vez que o processo é o mesmo apagar e recolocar tudo de novo, só que sem tirar nenhuma linha, apenas trocar
os dados delas.
PHP |
<?php $arquivo = "arquivo.txt"; $linha = file($arquivo); $total = count($linha); $fp = fopen($arquivo,"w+"); for ($i = "0"; $i < $total; $i++){ list($dado1_txt,$dado2_txt,$dado3_txt) = explode("|",$linha[$i]); if ($codigo == $i){ fwrite($fp,"$dado1|$dado2|$dado3\n"); } else { fwrite($fp,"$dado1_txt|$dado2_txt|$dado3_txt"); } } fclose($fp); ?> |
Bem isso é tudo pessoal; espero que de alguma forma ajude na construção de seus scripts.
Qualquer coisa escreve AI !!!//
Editado por motivo de erro na caixa de texto PHP do fórum.. (danificando o código)
Edição feita por: felipensp, 21/08/2004, 15:04.