logo

Paleta - Deixe colorido🎨

Palette — Construtor visual de páginas. Não precisa ser designer.

Demonstração ao vivo Baixar Palette

Scroll

Aulas PHP - aula 2 - Trabalhando com arquivos: abrindo, gravando, lendo.

08/12/2019, by Ivan

Na aula anterior criamos um framework para nosso livro de visitas, blog ou bate-papo. Agora resta apenas adicionar funcionalidade. Nesta aula vamos escrever nossas entradas em arquivos e exibir as entradas de arquivos.

PHP tem muitas funções para trabalhar com arquivos. Vamos considerar alguns deles. Muito provavelmente seu site armazenará dados em um banco de dados (tenho certeza disso), e não em arquivos, então consideraremos apenas alguns deles para que você entenda a essência. Abordaremos o trabalho com banco de dados mais tarde.

Bem, se você não tiver os arquivos que fizemos na aula anterior, retorne uma aula e baixe esses arquivos.

Vamos ir para o formulário de adição de entrada:

/index.php?admin=1

A partir deste formulário, vamos adicionar nossas entradas. Para processar essas entradas, precisamos verificar na página index.php (esta página recebe dados do formulário) se há valores na variável $_POST. E isso é verificado de forma muito simples:

if($_POST){

}

Não é verdade que é simples? Agora dentro das chaves, você precisa processar o array $_POST. Não escreveremos o código de processamento diretamente nas chaves, mas o colocaremos em nossa classe, e chamaremos o processamento através de um método de objeto. No arquivo index.php chamamos o método:

if($_POST){
 $obj->write($_POST);
}

E no arquivo simpleCMS.php teremos uma implementação do método write():

  public function write($p) { // método para escrever mensagem

  }  

Por que fazemos isso? Para encurtar o código no arquivo index.php. O arquivo index.php é necessário apenas para gerenciamento, e o processamento de arrays e exibição de dados deve ser feito a partir de outro arquivo, por exemplo, do arquivo de nossa classe simpleCMS. Esta separação permite aumentar a eficiência do código. Se alguém mais olhar para nosso código, ele imediatamente entenderá onde tudo está localizado. E será mais fácil para você entender o código quando tudo estiver organizado.

Vamos começar a escrever o processamento de forma simples, imprimindo nosso array $_POST recebido do formulário. Para fazer isso, você precisa inserir este código:

  public function write($p) { // método para escrever mensagem
     print_r($p);
  }  

Como você pode ver, acessamos a variável local $p, embora uma variável superglobal seja passada nos parâmetros do método write(). Não acessamos a variável superglobal diretamente porque em outros casos podemos querer adicionar uma entrada no blog não através de um formulário, mas obtendo dados de um arquivo XML. Usar uma variável local nos permite unificar o uso deste método, torná-lo geral para muitos casos.

Bem, preenchemos o formulário e o enviamos. Obtive esses dados:

Array ( [title] => Ivan [bodytext] => Olá, Mundo! ) 

Se você preencheu de forma diferente, seu array também será diferente. Imprimimos o array para ver quais chaves podemos usar. Para nós, é $p['title'] e $p['bodytext']. Agora sabemos quais serão nossos dados, resta escrevê-los em um arquivo. Bem, começamos a escrever em um arquivo.

Escrita em arquivo PHP

Antes de escrever algo em um arquivo, você precisa "abri-lo para escrever". Abrir para escrever significa vincular um arquivo a uma variável PHP. Todo o trabalho com um arquivo em PHP se resume a ações em uma variável do tipo resource. Agora vou mostrar o que isso significa:

  public function write($p) { // método para escrever mensagem
	$message = fopen("messages/file.txt","w");
	print_r($message);
  }  

Para fazer isso, criei um arquivo file.txt na pasta messages. E agora se preenchermos o formulário e o enviarmos, obteremos:

Resource id #4

Resource é o tipo da variável $message, e 4 é o número de série, id de nossa variável entre outras variáveis de resource. E agora, se realizarmos ações com a variável $message, isso será automaticamente refletido no arquivo. Escreveremos no arquivo linha por linha, para que depois possamos ler do arquivo também linha por linha:

  public function write($p) { // método para escrever mensagem
	$message = fopen("messages/file.txt","w");
	fputs ($message, $p['title']. "\r\n");
	fputs ($message, $p['bodytext']);
  }  

Os caracteres \r\n entre aspas duplas (pode não funcionar entre aspas simples) significam uma mudança para uma nova linha. Como resultado, no arquivo file.txt terá este texto:

Ivan
Olá, Mundo!

Depois de realizar todas as operações com o arquivo, você precisa remover a variável do arquivo para que ela não ocupe espaço na memória.

  public function write($p) { // método para escrever mensagem
	$message = fopen("messages/file.txt","w");  // abrimos o arquivo
	fputs ($message, $p['title']. "\r\n");
	fputs ($message, $p['bodytext']);
	fclose ($message); //fechamos o arquivo
  } 

Você provavelmente notou que cada vez que escrevemos o arquivo novamente, o arquivo é sobrescrito. Tudo depende do parâmetro na função fopen. Também podemos adicionar ao arquivo ou simplesmente abri-lo para leitura. Por exemplo, assim:

$message = fopen("messages/file.txt","r");  // abrimos o arquivo apenas para leitura
  1. r – abertura do arquivo apenas para leitura.
  2. r+ - abertura do arquivo simultaneamente para leitura e escrita.
  3. w – criação de um novo arquivo vazio. Se no momento da chamada tal arquivo já existir, ele será destruído.
  4. w+ - semelhante a r+, apenas se no momento da chamada tal arquivo existe, seu conteúdo é excluído.
  5. a – abre um arquivo existente no  modo de escrita, enquanto o ponteiro é deslocado para o  último byte do arquivo (no final do arquivo).
  6. a+ - abre o arquivo em modo de leitura e escrita, enquanto o ponteiro é deslocado para o último byte do arquivo (no final do arquivo). O conteúdo do arquivo não é excluído.

 

Como escrito acima, se abrirmos um arquivo usando o parâmetro w, um novo arquivo é criado cujo nome é obtido do primeiro parâmetro. Vamos criar um nome de arquivo correspondente ao tempo recebido da função time().

A função time() retorna o número de segundos desde 1º de janeiro de 1970.

Você deve obter o seguinte:

  public function write($p) { // método para escrever mensagem
	$message = fopen('messages/'.time(),"w");  // abrimos o arquivo
	fputs ($message, $p['title']. "\r\n");
	fputs ($message, $p['bodytext']. "\r\n");
	fputs ($message, time());
	fclose ($message); //fechamos o arquivo
  }  

Assim, a cada segundo a função time() retornará um número cada vez maior de segundos e os nomes dos arquivos terão um número cada vez maior. Você pode tentar adicionar novas entradas e novos arquivos aparecerão na pasta messages. Agora resta ler os arquivos e exibir nossas entradas.

Leitura de arquivo PHP

Para ler de um arquivo, você precisa abrir o arquivo para leitura. Para fazer isso, na função fopen() usaremos o parâmetro r. Todos os arquivos necessários estão na pasta messages. Para ler todos os arquivos, usaremos um loop while (até que os arquivos terminem).

Navegaremos pelos arquivos na pasta usando a função opendir(), que abre a pasta para leitura:

	if (is_dir('messages')) { // verificamos a presença da pasta
		if ($dh = opendir('messages')) { // abrimos a pasta para leitura
			while (($file = readdir($dh)) !== false) { // enquanto os arquivos existem, lemos-os
				// executamos as operações necessárias
			}
			closedir($dh); //fechamos o diretório
		}
	} 

Obtemos os nomes dos arquivos usando a função readdir(), ou seja, os nomes serão armazenados na variável $file. Após terminar o loop, fechamos a pasta para liberar espaço na memória.

Agora que podemos ler os arquivos, vamos melhorar o método display_public():

  public function display_public() { // método para exibir mensagens
    $content = '';
	if (is_dir('messages')) { // verificamos a presença da pasta
		if ($dh = opendir('messages')) { // abrimos a pasta para leitura
			while (($file = readdir($dh)) !== false) { // enquanto os arquivos existem, lemos-os
			  if(substr($file, -4) == '.txt'){ // pegamos apenas arquivos .txt
				$filename = 'messages/' . $file; // nome completo do arquivo
			    $message = fopen($filename, 'r'); // abrimos o arquivo
				$title = fgets($message); // lemos a primeira linha
				$body = fgets($message);  // lemos a segunda linha
				$time = fgets($message);  // lemos a terceira linha
				print '<div class="post">'; // div envolvendo a entrada
				print '<span class="time">' . date('d-m-Y', $time) . '</span><h2>' . $title . '</h2>'; 	// exibimos data e título
			    print '<p>' . $body . '</p>'; // exibimos o texto da mensagem
				print '</div>'; // fim da div envolvente
				fclose($message); // fechamos o arquivo
			  }
			}
			closedir($dh); //fechamos o diretório
		}
	}
	$content .= '<p><a href="/index.php?admin=1">Adicionar mensagem</a></p>';
    return $content;
  }

Comentei cada linha. Se algo não estiver claro, escreva nos comentários e vou explicar.

Não acho que você precisará de leitura linha por linha de um arquivo na prática, mas para entender os princípios de como funcionam as funções PHP, trabalhar com arquivos e pastas, tais aulas são muito úteis.

Abaixo está o código-fonte do site intermediário.