Banco de dados em TXT e PHP – Parte 1
Autor: Criquio Calavera | Publicado: 2015-03-13T17:32:00-07:00



Fala galerinha! Tudo na tranquilidade? Espero que sim. 



Depois de algum tempo estou voltando com mais um pequeno tutorial, dessa vez voltado para o PHP. Falarei sobre como criar banco de dados em arquivo txt.


Você deve estar se perguntando porque raios alguém criaria um banco de dados em txt e usaria php para acessá-lo se a maioria dos servidores - mesmo os gratuitos - que tem suporte a php também tem suporte a mysql, certo? Eu respondo. Imagine a seguinte situação: você criou um site em um subdomínio ou mesmo com um domínio próprio mas com hospedagem gratuita. Geralmente hospedagens gratuitas são bastante limitadas. O banco de dados mesmo costuma suportar um número pequeno de registros. Imagine que o banco de dados do seu servidor gratuito lhe dá o direito a ter apenas dez mil registros na base de dados e você pretende criar uma pesquisa para a qual espera umas 50 mil respostas. Seu banco de dados não conseguirá armazenar isso tudo, concorda? E ainda existem alguns hosts gratuitos que tem suporte a php mas não tem suporte a bancos de dados. É aqui que entra o banco de dados em txt. 





Dica para quem trabalha com programação web 



Primeiramente, quero deixar uma dica muito útil para quem trabalha com programação voltada à web. Trata-se de um programa chamado phpStorm desenvolvido pela empresa jetBrains, bastante eficaz por trazer uma infinidade de recursos como reconhecer diversas linguagens de programação e de scripts, tais como: php, javascript, mySql, css, css3, html, html5 etc.






 


Entre os recursos do programa, podemos destacar o reconhecimento das milhares de dependências das linguagens que ele suporta bem como das variáveis já criadas, dando dicas sobre elas ao digitarmos os comandos. Isso facilita demais o trabalho do programador.


Para usufruir dessa maravilha, basta acessar a página de downloads no site da jebBrains, www.jetbrains.com/phpstorm.


Passos iniciais


Bem, em primeiro lugar, precisamos nos certificar de que o host tenha suporte a php, lógico. Talvez, nesse ponto, você esteja se perguntando porque não usamos javascript que roda em praticamente qualquer página? Novamente, eu respondo: o javascript é uma linguagem client-side, ou seja, que roda no lado cliente. Portanto, uma tentativa de criar um arquivo ou escrever nele usando essa linguagem faria-a tentar criar ou escrever o arquivo no computador do usuário e não no servidor, a não ser que seja dada permissão para isso no servidor, o que não é recomendado, pois acarretaria em falha de segurança, sem contar que o javascript puro, para esse caso, só funcionaria no Internet Explorer, pois os outros browsers não tem suporte nativo ao objeto de criação de arquivos. E ainda há o fato da possibilidade do javascript estar desabilitado no computador do usuário.


Com isso devidamente esclarecido, continuemos: também é conveniente verificar se o host aceita arquivos .htaccess, um tipo de arquivo de configurações que poderemos usar para dar uma certa segurança contra abertura do arquivo de texto pelo browser ou a partir de outro site - os chamados "hot links".


Quais arquivos criarei?


Para esse pequeno projeto, criaremos, a princípio, apenas três arquivos básicos, a saber:


1 - index.html: terá o formulário com os campos a serem preenchidos;


2 - cadastrar.php: aqui o código que fará toda a mágica acontecer;


3 - .htaccess: será o arquivo aonde definiremos parâmetros que permitirá uma certa proteção ao txt. 



Mais adiante veremos outros dois arquivos para criar uma enquete e gravar os resultdos no banco txt, além de pesquisar e retornar os resultados. 


Vamos aos códigos


Para esse projeto criaremos, a princípio, um banco de dados de usuários. 



index.html 



Algumas observações importantes para quem é iniciante em php e gravação de dados vindos de um formulário: 


1 - existem dois métodos de capturar os dados vindos do formulário. Um deles é o POST e o outro é o GET. Cada um é usado de uma forma diferente. Aqui usaremos o POST. Observe como o método é passado dentro da tag do "&lt;form&gt;";


2 – O nome da página que irá processar os dados e gravar no arquivo txt também é passado dentro dessa tag "&lt;form&gt;" por um parâmetro chamado "action";


3 - Os campos precisam ter um nome único dentro de cada "&lt;form&gt;". Esses nomes são passados através do atributo "name". O POST, no php, irá procurar por esses nomes para saber o valor de cada campo. Observe, dentro da tag de cada ‘&lt;input type="text"&gt;’, como esse parâmetro é usado; 



4 - Por último e não menos importante: o último &lt;input&gt; é do tipo "submit". Ele que irá chamar a página que passamos no "action" do formulário. 



código: 


   1:  &lt;form name="dbase" method="post" action="cadastrar.php"&gt;


   2:      Usuário: &lt;input type="text" name="user"&gt;


   3:      Email: &lt;input type="text" name="nome"&gt;


   4:      Senha: &lt;input type="text" name="idade"&gt;


   5:      Confirmar senha: &lt;input type="text" name="telefone"&gt;


   6:      &lt;input type="submit" value="Enviar dados"&gt;


   7:  &lt;/form&gt;

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }





cadastrar.php 



Irei dividir esse tópico em várias etapas para poder explicar melhor cada uma delas. 



Capturando os dados vindos do formulário: 



Para fins de melhor organização do código, criaremos variáveis para representar os dados vindos do formulário e nessas variáveis passaremos os nomes dos campos utilizando o método POST do qual já falamos anteriormente. Observe o código abaixo: 


código:

   1:      $user = $_POST["user"];


   2:      $nome = $_POST["nome"];


   3:      $idade = $_POST["idade"];


   4:      $telefone = $_POST["telefone"];

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }





O que vem antes do sinal de igual é o nome da variável. Podemos dar qualquer nome para uma variável seguindo algumas regras:

1 – Para criarmos uma variável, sempre começaremos colocando um cifrão($) antes do nome da variável;


2 – A variável deve ser única. Não podemos ter duas variáveis com o mesmo nome;


3 – Não podemos colocar espaços e nem acentos nos nomes das variáveis:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $Nome da variável → incorreto.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $NomeDaVariavel → correto.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $nome_da_variavel → correto.


4 – Para quem ainda não está familiarizado com o php, observe que toda linha, quando determinando recebimento de valores, termina com ponto e vírgula(;) assim como acontece no javascript.

O que vem depois do sinal de igual é o valor que cada variável receberá. Observe que para pegar esse valor, utilizamos o método $_POST, que deve ser escrito exatamente dessa maneira, seguido de colchetes. Dentro dos colchetes colocamos, entre aspas, o nome do campo do formulário que contém o dado que aquela variável receberá. O sinal de igual, nesse caso e em toda linguagem de programação, deverá ser ligo como “recebe” e não como “é igual”:


“$user = $_POST[‘user’];” lê-se “a variável $user recebe, pelo método POST, o valor do campo de nome user”.


Fazendo a validação dos dados


Vamos ver, inicialmente, a função que usaremos para criar e/ou abrir o arquivo txt:


fopen: essa é a função que cria o arquivo, caso ele ainda não exista, e abre-o. Essa função contém alguns parâmetros necessários. Para o nosso caso, utilizaremos dois: o nome do arquivo e o tipo de abertura:

código:

   1:  $arquivo = fopen(“dbtxt.azt”, “a+”);



O parâmetro “a+” indica que o arquivo será aberto para leitura e gravação e o cursor posicionado no final do texto para que o próximo texto seja gravado sempre no final do arquivo.

Para aprender como usar os demais parâmetros, acesse o link sobre a função no site oficial do php:

http://php.net/manual/pt_BR/function.fopen.php


A intenção básica de um banco de dados em txt não é exatamente cadastrar usuários, pois um txt não oferece mecanismos de segurança e proteção à privacidade como um banco de dados mySql por exemplo. Assim sendo, devo alertar que, caso a privacidade das informações a serem cadastradas sejam de vital importância, será melhor utilizar um host com armazenamento de dados ilimitado ou pelo menos com uma quantidade máxima de registros que seja suficiente, apesar de que poderemos adotar alguns métodos que dificultará bastante a invasão ao sistema. Mas como esse tutorial é apenas ilustrativo e pode ser que para determinado caso seja necessário evitar duplicidade de registros, aprenderemos como verificar se o nome de usuário que estamos cadastrando já existe no arquivo txt bem como verificar se algum campo não ficou em branco.

Aqui vai uma dica sobre esse arquivo txt:


1 - Procure dar um nome e uma extensão que sejam difíceis de serem deduzidos, como por exemplo jkmnyukpxd.znk;


2 - Adicione uma página index, mesmo que vazia, na pasta aonde está o arquivo. Isso dificultará que alguém possa abrir o diretório no navegador e ver a lista de arquivos;

Aprenderemos também a melhorar a segurança e a privacidade mais à frente, quando falarmos do arquivo .htaccess.


O bloco de códigos anterior é bem genérico, contendo apenas o básico para se ter uma noção de como funciona a “coleta” de valores vindos de um formulário. Em alguns casos, pode ser que seja gerado um erro no código caso não venha nenhum valor da variável. Isso pode acontecer principalmente na primeira abertura de uma página que contenha, ela mesma, o formulário e o código php para a validação. Nesse caso, o action do formulário ficaria vazio: action="".

Para solucionar esse problema, podemos utilizar alguns métodos envolvendo uma condicional If em união com a função isset do php para verificar se o método POST com o campo “user” está trezendo algum resultado:


código:

   1:  If(isset($_POST[“user”])){


   2:      $user = $_POST["user"];


   3:  }



Isso, contudo, pode gerar outro erro, pois a variável $user ainda não existe no momento que for iniciada a verificação na primeira linha do If. Para corrigir isso podemos criá-la antes, sem nenhum valor:

código:

   1:  $user = "";



   1:      If(isset($_POST[“user”])){


   2:          $user = $_POST["user"];


   3:      }







Entretanto o código ficará um pouco extenso se forem muitos os campos a serem verificados. Para resolver isso, podemos resumir essas quatro linhas em apenas uma, mudando um pouco a sintaxe da condicional If:

código:


   1:  $user = isset($_POST["user"]) ? $_POST["user"] : "";



Veja que agora a variável $user aparece primeiro. Assim sendo, ela já existirá quando a verificação for iniciada. O que vem antes do ponto de interrogação equivale à primeira linha do exemplo do If anterior. O ponto de interrogação pode ser interpretado como sendo a abertura da chave({) do If anterior e os dois pontos(:) como sendo um else(caso contrário). A leitura dessa linha seria algo parecido com:

Crie a variável $user que receberá, caso esteja setado o campo “user”, o valor, por POST, desse campo. Caso contrário, ela ficará vazia.


Pronto, agora não teremos mais problemas de validação de dados.


Agora vou falar um pouco sobre algumas funções que utilizaremos nesse processo de criação/abertura do arquivo txt e da validação dos dados.

Em primeiro lugar, criaremos uma variávem de nome sugerido $mensagem que, inicialmente, ficará vazia:


código:

   1:  $mensagem = “”;



Essa variável será usada para auxiliar no retorno dependendo dos resultados das validações dos dados. Sempre que cocorrer um erro de validação, colocaremos um aviso nessa variável e, ao final, será feita uma avaliação da mesma. Se tiver algum aviso nessa variável, significa que alguma fase da validação falhou. Nesse caso, será exibido o aviso e o registro não será gravado. Se, por outro lado, essa variável continuar vazia, significa que a validação dos dados não encntrou nenhum erro. Aí então o registro será gravado.

A primeira verificação é se todos os campos requeridos foram preenchidos. Isso pode ser feito mais ou menos da seguinte forma:


código:

   1:  If(!$_POST["user"]){


   2:      $mensagem = "Não foi digitado um nome de usuário.";


   3:  }



Em PHP, o ponto de exclamação signifca negação. É o mesmo que NOT(NÃO). No bloco acima estamos dizendo que, caso não tenha vindo nenhum valor do campo de nome "user", a variável $mensagem receberá o texto "Não foi digitado um nome de usuário". Veja como ficaria uma validação de todos os campos, verificando se todos foram preenchidos, se os dois campos da senha tem valores iguais e se a senha tem oito ou mais dígitos:

código:


   1:  if(!$user) {
   2:      $mensagem = "Não foi digitado um nome de usuário.";
   3:  }elseif(!$email){
   4:      $mensagem = "Não foi digitado um Email válido!";
   5:  }elseif(!$senha){
   6:      $mensagem = "Não foi digitada uma senha!";
   7:  }elseif(strlen($senha) &lt; 8){
   8:      $mensagem = "A senha precisa ter pelo menos 8 dígitos!";
   9:  }elseif(!$csenha){
  10:      $mensagem = "A senha não foi confirmada!";
  11:  }elseif($senha != $csenha){
  12:      $mensagem = "As senhas não conferem!";
  13:  }

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }




Nesse ponto, fizemos a validação de todos os campos. Agora, teremos que adicionar, a título de validação, a verificação se o arquivo existe e se o usuário já existe ou não. Por que não fizemos essa validação antes das demais? Porque esse processo pode ser um pouco lento dependendendo a quantidade de registros no arquivo txt. Assim sendo, melhor começar pelo mais rápido, pois, caso haja algum erro, o usuário não precisará esperar vários segundos para saber o que está acontecendo.

Para validar a existência do usuário, usaremos as funções file_exists para retornar a existência ou não do arquivo, filesize para retornar o tamanho do arquivo, fgets para retornar o texto do arquivo e strpos para pesquisar o usário dentro do texto. Isso será feito linha a linha. Veja uma breve explicação dessas funções:


file_exists: antes de tentarmos abrir um arquivo, precisamos verificar se ele existe. Como aqui usaremos um método que só criará o arquivo no primeiro cadastro, essa verificação se fará necessária para não ocorrer erro na execução da verificação. E também porque pode, por algum motivo, esse arquivo sumir do mapa. Será com a função file_exists que faremos essa verificação. Se a convertermos para um número inteiro utilizando a função (int) assim mesmo entre parênteses, a mesma retornará 0(zero) caso o arquivo não seja encontrado e 1(um) caso o arquivo seja encontrado.


A utilização dessa função é muito simples, bastanto passar o caminho e nome completos do arquivo com a sua extensão dentro de parênteses e entre aspas: file_exists(“caminho/arquivo.ext”). Incluindo o (int) para retornar um número inteiro, ficaria assim: (int)file_exists(“caminho/arquivo.ext”). Caso o arquivo esteja na mesma pasta, basta colocar o nome dele entre as aspas: (int)file_exists(“arquivo.ext”). Podemos criar uma variável que será do tipo número inteiro para receber esse valor:

código:

   1:  $arqExiste = (int)file_exists("dbtxt.azt");


A função file_exists, além de verificar se o arquivo existe, também será usada para definirmos se o registro que está sendo gravado ficará na mesma linha ou se deverá ser inserida uma quebra de linha antes dele. Ou seja, caso já exista algum registro no arquivo, será inserida uma quebra de linha antes do registro atual. Para controlar isso, teremos uma variável de nome sugerido $dados. Se o arquivo já existir e o tamanho dele for maior que 0, significa que já há pelo menos um registro gravado nele. Então, adicionaremos uma quebra de linha antes dos dados propriamente dito. No php, poderemos utilizar “\r\n” para adicionar essa quebra de linha. Caso o arquivo não exista ou se o tamanho dele for 0, então não precisa adicionar a quebra de linha.


filsesize: essa função retorna o tamanho de um arquivo em bytes e a utilização dela é muito simples. Basta passar o caminho com o nome e extensão do arquivo. Caso o arquivo esteja na mesma pasta da página php que está executando a função, basta passar o nome do arquivo com a extensão: filesize(“dbtxt.azt”).


Agora que já conhecemos as funções file_exists e filesize, iremos utilizá-las para montar a linha do registro:

código:

   1:  if($arqExiste == 1 &amp;&amp; filesize("dbtxt.azt") &gt; 0){
   2:      $dados = "\r\n" . $user . ";" . $email . ";" . $senha;
   3:  }else{
   4:      $dados = $user . ";" . $email . ";" . $senha;
   5:  }


No bloco acima estamos dizendo ao php que se o arquivo existir e o tamanho dele foi maior que 0, montaremos a variável $dados adicionando uma quebra de linha antes com “\r\n”. Caso contrário, monta a variável sem a quebra de linha.

Uma dica mais, baseada no bloco de código acima, para quem ainda não conhece o PHP:

Você deve ter observado que há partes entre aspas, alguns pontos no meio de algumas linhas e sinais de igual duplicados, certo? Certo. Vamos desvendar o porquê de tudo isso:

1 – Texto entre aspas: quando precisarmos inserir uma parte de texto em algum campo ou, nesse caso, na linha de registro, essa parte deverá ficar entre aspas. Quando formos inserir um número puro ou os dados de uma outra variável, não colocaremos as aspas. Por isso “\r\n” está entre aspas, pois, quebras de linhas são inseridas na forma de texto. E por isso $user, $mail, etc, estão fora de aspas, pois são dados que estão em outras variáveis existentes.

2 – Ponto: em PHP, quando precisarmos concatenar(juntar) textos com números e variáveis, utilizamos o ponto(.), o que equivale a dizer “”um texto” &amp; $uma_variavel” por exemplo.

3 – Sinal de igual duplicado. Como já dizemos anteriormente, um sinal de igual em programação significa “recebe”. Quando queremos fazer uma comparação entre duas coisas, usamos o sinal de igual duplicado para diferenciar do “recebe”. O contrário do sinal de ==(igual a) é !=(diferente de). Há ainda o sinal triplo(===) que diferencia&nbsp; 0 como numeral de 0 como falso. Mais a frente veremos um exemplo disso.

Uma outra dica: podemos “encriptar” a senha para dificultar que alguém saiba qual é caso tenha acesso ao arquivo txt. Existem várias funções nativas do PHP para fazer essa “encriptação” que não é bem uma encriptação mas sim um hash. Para o nosso caso, podermos utilizar a função MD5. A forma de usá-la é muito simples:
MD5($senha)&nbsp; ou hash("MD5", $senha)

A segunda forma é melhor porque é compatível com todas as funções hashes enquanto que a maioria não reconhece a primeira. Isso deve ser feito na passagem da senha na montagem da linha e não no $_POST.


fgets: captura o texto do arquivo txt. Essa função exige uma variável para receber esse texto:

código:

   1:  $linha = fgets($arquivo);



Veja que foi passada a variável $arquivo, pois usaremos o arquivo que abrimos no início utilizando essa variável como nome. Essa função fica dentro de um loop while que fará ela ser executada linha a linha enquanto não chegar o fim do arquivo. O que identifica o fim do arquivo é a função feof. Colocando o sinal de negação(!) do qual já falamos, dizemos para executar o loop enquanto não for o fim do arquivo:

código:

   1:  while(!feof($arquivo)){
   2:      $linha = fgets($arquivo);
   3:  &nbsp;
   4:      if(strpos($linha, $user . ";") === 0){
   5:          $mensagem = "Escolha outro nome de usuário.";
   6:          break;
   7:      }
   8:  }

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }

<!--CRLF-->





Explicando as linhas do código acima:


1: Enquanto não chegar o fim do arquivo…


2: …$linha receberá a próxima linha do arquivo que está na variável $arquivo.


4: Se o valor de usuário da variável $user estiver no início da linha…


5: a variável $mensagem receberá o texto “Escolha outro nome de usário”.


6: Interrompe o loop caso o nome de usuário seja encontrado na base de dados txt. Por que devemos usar o break para interromper o código se o nome de usuário for encontrado? Imagine que sua base de dados tenha 500.000 linhas e o nome de usuário seja encontra na linha número 200. O código será finalizado bem mais rápido se for interrompido na linha 200.


7: Fim da condicional If.


8: Fim do loop While.


O código acima funcionará corretamente desde que não haja diferença de maiúsculas e minúsculas entre o user digitado e o da linha da base de dados. O php diferencia maiúsculas e minúsculas. Isso significa que para ele user é diferente de User e de uSer. Dessa forma, precisaremos igualar as duas partes, colocando tudo em minúsculas ou maiúsculas para comparar com eficiência. Podemos fazer isso utilizando a função strtolower:


if(strpos(strtolower($linha), strtolower($user) . ";") === 0)



Se você bem observou, deve ter visto que estamos concatenando o nome de usuário com o ponto e vírgula. Por que estamos fazendo isso? Para garantir que não haverá erros de interpretação. Um exemplo de linha:

criquiocalavera;criquio@prov.com;senha



Se um usuário tentar cadastrar criquio e não tiver o ponto e vírgula como final, a validação não deixará prosseguir, pois criquio foi encontrado. Então, colocamos o ponto e vírguala como final para fazer essa diferenciação, ficando assim “criquio;” e “criquiocalavera;”.



Verificando a validação para gravar ou não o registro



Agora que fizemos todas as validações, iremos finalizar o processo gravando o registro ou exibindo uma mensagem de erro. Como dissemos antes, o que irá garantir se houve ou não erros será a variável $mensagem. Caso não tenha nada nela, é porque não foi encontrado nenhum erro e, portanto, nenhuma mensagem foi recebida por essa variável:



   1:  if($mensagem == ""){


   2:      $escreve = fwrite($arquivo, $dados);


   3:      if(intval($escreve) &gt; 0){


   4:          $mensagem = "Seus dados foram gravados com sucesso.";


   5:      }else{


   6:          $mensagem = "Ocorreu um erro na gravação dos dados.";


   7:      }


   8:  }

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }




O bloco acima está dizendo que se a variável $mensagem estiver vazia, será criada mais uma variável de nome $escreve. Essa variável utilizará a função fwrite para gravar o registro no arquivo de texto. Essa função tem os parâmetros a saber:



1– Nome  do arquivo, no qual foi passado $arquivo, que é a variável que guarda o nome do arquivo;



2 – Texto a ser gravado. No nosso caso, passamos a variável que montamos com a linha que contém os dados do registro $dados.



A seguir usarmos um método para verificar se a linha foi gravada com sucesso. intval($escreve) retorna o número 0 caso a linha não tenha sido gravada e maior que 0 caso ela tenha sido gravada. E então a variável $mensagem recebe um texto de acordo o resultado.



Para finalizar, fechamos o arquivo txt com a fclose($arquivo) e exibimos o resultado da variável $mensagem para o usuário:

   1:  echo $mensagem;

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }




e criamos mais uma linha na página com um link para o usuário voltar para a página de registro ou outra página qualquer:

   1:  echo "&lt;br&gt;&lt;a href='index.html'&gt;Voltar&lt;/a&gt;";

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }




Para facilitar ainda mais o seu trabalho, deixarei abaixo o código completo e melhorado conforme todas as dicas passadas até aqui:


   1:  &lt;?php


   2:  &nbsp;


   3:      header('Content-Type: text/html; charset=utf-8');


   4:  &nbsp;


   5:      $user = isset($_POST["user"]) ? $_POST["user"] : "";


   6:      $email = isset($_POST["email"]) ? $_POST["email"] : "";


   7:      $senha = isset($_POST["senha"]) ? $_POST["senha"] : "";


   8:      $csenha = isset($_POST["csenha"]) ? $_POST["csenha"] : "";


   9:  &nbsp;


  10:      $mensagem = "";


  11:      $arquivo = fopen("dbtxt.azt", "a+");


  12:  &nbsp;


  13:      if(!$user) {


  14:          $mensagem = "Não foi digitado um nome de usuário. Por favor, volte e digite um nome de usuário!";


  15:      }elseif(!$email){


  16:          $mensagem = "Não foi digitado um Email válido. Por favor, volte e digite o Email!";


  17:      }elseif(!$senha){


  18:          $mensagem = "Não foi digitada uma senha. Por favor, volte e digite a senha!";


  19:      }elseif(strlen($senha) &lt; 8){


  20:          $mensagem = "A senha precisa ter pelo menos 8 dígitos. Por favor, volte e reformule-a!";


  21:      }elseif(!$csenha){


  22:          $mensagem = "A senha não foi confirmada. Por favor, volte e confirme-a!";


  23:      }elseif($senha != $csenha){


  24:          $mensagem = "A senha não confere com a validação. Volte e digite-as novamente.";


  25:      }else{


  26:  &nbsp;


  27:          $arqExiste = (int)file_exists("dbtxt.azt");


  28:  &nbsp;


  29:          if($arqExiste == 1 &amp;&amp; filesize("dbtxt.azt") &gt; 0){


  30:              $dados = "\r\n" . $user . ";" . $email . ";" . MD5($senha);


  31:          }else{


  32:              $dados = $user . ";" . $email . ";" . MD5($senha);


  33:          }


  34:          while(!feof($arquivo)){


  35:              $linha = fgets($arquivo);


  36:  &nbsp;


  37:              if(strpos(strtolower($linha), strtolower($user) . ";") === 0){


  38:                  $mensagem = "O nome de usuário \"" . $user . "\" não está disponível no momento.&lt;br&gt;&lt;br&gt;Volte e digite outro nome de usuário.";


  39:                  break;


  40:              }


  41:          }


  42:      }


  43:  &nbsp;


  44:      if($mensagem == ""){


  45:          $escreve = fwrite($arquivo, $dados);


  46:          if(intval($escreve) &gt; 0){


  47:              $mensagem = "Seus dados foram gravados com sucesso.";


  48:          }else{


  49:              $mensagem = "Ocorreu um erro na gravação dos dados.";


  50:          }


  51:      }


  52:  &nbsp;


  53:      fclose($arquivo);


  54:  &nbsp;


  55:      echo $mensagem;


  56:      echo "&lt;br&gt;&lt;a href='/dbtxt/'&gt;Clique aqui para voltar&lt;/a&gt;";


  57:  &nbsp;


  58:  ?&gt;

.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, "Courier New", courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }





É isso, pessoal, aqui terminamos a parte 1 desse tutorial. Em breve retornarei com a parte 2 aonde passarei as formas de proteger o site e o arquivo txt de forma a dificultar a exibição dele digitando o endereço na barra de endereços do browser ou em um link dentro de sites externos. Também falaremos sobre a criação de uma enquete quando então veremos como pesquisar e retornar os dados do arquivo txt para a tela não necessariamente nessa ordem.


Até lá!