Chat Simple 2 sem Banco de Dados

Este projeto utiliza basicamente formulários HTML para enviar as mensagens e arquivo tipo texto para arquivá-las.
O recurso principal para o funcionamento desse chat é o de redirecionamento de página. Antes de analisar os códigos HTML e PHP será revisto alguns conceitos simples usados nos códigos.
1. Revisão:
<input>: tag do HTML que insere um campo para a entrada de dados.
method="post": atributo do campo input com valor post onde os dados são enviados em forma de um bloco de dados através de um mecanismo denominado STDIN (Standard Input).
$_POST["bairro"]: esta variável do PHP pega os dados do campo <input name="bairro"> de outro arquivo.
<form action="..." target="meuiframe": quando apertar o botão submit os dados são enviados para o iframe de nome meuiframe.
{...}: insere variáveis do PHP dentro de tags HTML (ex: como valores de atributos de uma tag HTML ou de seu conteúdo. Quando o interpretador do php está lendo o script e encontra um $ (cifrão) automaticamente a variável é reconhecida e logo ele procura identificadores válidos para um nome seguido do cifrão. Com as chaves delimitando o nome da variável, faz com que o interpretador não fique tentando adivinhar o fim do nome da variável.
. (ponto): utilizado para concaternar variável PHP com texto com aspas simple ('...'), textos com aspas duplas ("...") não precisa concatenação.
fopen("chat.txt", "w"): abre o arquivo chat.txt apenas para escrita; coloca o ponteiro do arquivo no começo do arquivo e diminui (trunca) o tamanho do arquivo para zero. Se o arquivo não existe, tenta criá-lo.
fopen("chat.txt", "a"): abre o arquivo somente para escrita; coloca o ponteiro do arquivo no final. Se o arquivo não existir, tenta criá-lo.

Notação de Inglês:
header: s. pulo de cabeça; chifrada (de touro); cabeçalho (informática), legenda que se repete no inicio de todas as páginas de um documento.
refresh (rɪˈfrɛʆ): v. 1. refrescar, 2. to refresh sb's memory (of/about sth): refrescar a memória de alguém (acerca de algo).

1.1 Redirecionamento de Domínios
É o recurso que faz com que o navegador vá automaticamente para outro endereço ao entrar em um domínio ou subdomínio.
Redirecionamneto com o HTML
É feito com a tag <meta>
Exemplo:
<html>
<title>Titulo do site</title>
<head>
<meta http-equiv="refresh" content="1;url=http://www.site_a_ser_redirecionado.com">
</head>
<body>
</body>
</html>

Este tipo de redirecionamento é o mais simples, contudo, ele irá modificar o endereço que aparece na barra de endereços pelo outro que está na tag <meta>.

Repare que existe um número "1" na tag meta, no lugar dele deve ser colocado os segundos que o navegador tem que aguardar para ser redirecionado, lembrando que colocando "0" não irá funcionar dependendo do navegador, o valor mais baixo é o "1".

Redirecionamento comJavaScript

<script language= "JavaScript">
location.href="http://www.site_a_ser_redirecionado.com"
</script>

Em alguns momentos, o cliente deseja apenas que o redirecionamento seja feito quando alguém clica em um local da página ou quando um certo processo é feito, neste caso, não adianta usar frame ou meta, será necessário o redirecionamento via JavaScript, seria necessário o cliente dar um "print" ou um "echo" deste código no local onde ele quer que redirecione.

Contudo, este redirecionamento é como a tag meta, não tem como esconder o endereço real de onde ele vai estar acessando.

Redirecionamento com  PHP
<?php
header("Location: http://www.site_a_ser_redirecionado.com");
?>

Mais uma vez, este é como a tag meta também não oculta o endereço real para onde o visitante está sendo redirecionado.

Contudo, o problema com este é que ele não pode ser usado quando alguma impressão deste script já foi feita, por exemplo, se houver alguma tag html ou algum "echo" ou "print" antes desta função, não vai funcionar. Normalmente dá erro de "headers already by sent...", quando acontece isto, o redirecionamento deve ser substituído pelo do JavaScript, que é o mais ideal nesta situação
Também pode usar o código abaixo:
<?
echo "<meta HTTP-EQUIV='Refresh' CONTENT='0;URL=http://site.com.br>";
?>

Redirecionamento com 301
Esse tipo de redirecionamento serve para ajudar na busca (técnicas de SEO) quando se deseja mudar algum endereçamento do site. Caso contrário. O site perderá o seu ranqueamento junto ao buscador.

Redirecionamento 301 com PHP
<?
Header( “HTTP/1.1 301 Moved Permanently” );
Header( “Location: http://www.meusite.com.br” );
?>

Redirecionamento 301 com ASP
<%@ Language=VBScript %>
<%
Response.Status=”301 Moved Permanently”
Response.AddHeader “Location”,”http://www.meusite.com.br/”
%>


Redirecionamento 301 com ASP .NET
<script runat=”server”>
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = “301 Moved Permanently”;
Response.AddHeader(“Location”,”http://www.meusite.com.br”);
}
</script>

Redirecionamento 301 de arquivo velho para novo com .htaccess
redirect 301 /antigo/arquivo_antigo.htm http://www.seusite.com.br/aquivo_novo.htm

Redirecionamento .NET
<%
Response.Redirect "http://novo-domínio.com.br"
%>

A função header
Afunção header do PHP serve para definir ou modificar as diretivas do cabeçalho HTTP de uma mensagem de resposta do servidor para o cliente.
A utilização da função também é bastante simples. Ela recebe três parâmetros, mas apenas o primeiro é obrigatório:
header("parâmetro 1",parâmetro 2,parâmetro 3);
parâmetro 1. é a string com uma "linha" do cabeçalho (que pode ser uma Diretiva/Valor ou então a linha principal do cabaçalho).
parâmetro 2. é um valor booleano indicando se a string deve substituir a diretiva, caso ela já tivesse sido definida, ou se ela deve ser apenas adicionada.
parâmetro 3.é um valor inteiro indicando o código de retorno do cabeçalho HTTP (incluído na linha principal do cabeçalho HTTP).
Exemplos:
301
Moved Permanently// 301 Movido permanentemente
header("Location: /foo.php",TRUE,301);
302
Found (1.1), Moved Temporarily (1.0) // 302 Encontrado (se não forem fornecidos parametros assume 302)
header("Location: /foo.php",TRUE,302);
header("Location: /foo.php");
303
See Other (1.1) // 303 Ver outro
header("Location: /foo.php",TRUE,303);
304
Not Modified
305
Use Proxy (1.1)
307
Temporary Redirect (1.1)
// 307 Redirecionamento temporário
header("Location: /foo.php",TRUE,307);

Lembre-se que o PHP, quando usado em um sistema web, trabalha em conjunto com o servidor HTTP (por exemplo, o Apache). O servidor HTTP pode incluir o cabeçalho HTTP ou adicionar diretivas, de acordo com sua configuração. Além disso, o PHP também pode adicionar diretivas automaticamente, de acordo com algumas configurações.


index.html

Este arquivo é bem simples, o botão tipo submit de valor Entrar, executa a página entrar.php. O link espiar bate-papo abre a página espiar.php e o link termo de uso abre a página termo.php.
<html>
<head>
<title>Bate Papo</title>
</head>
<body>
<font face="Verdana" size="2">
<form action="entrar.php" method="post">
Apelido:
<input type="text" name="nick"><br>
Cor do apelido:
<select name="cor">
<option value="blue">Azul</option>
<option value="red">Vermelho</option>
<option value="green">Verde</option>
<option value="black" selected>Preto</option
</select><br
<input type="submit" value="Entrar">
</form>
<hr size="1">
<a href="#" onClick="window.open('espiar.php','Janela','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes, resizable=no,width=600,height=300'); return false;">Espiar bate-papo</a><br>
Antes de utilizar nossos serviços, leia nosso <a href="#" onClick="window.open('termo.htm', 'Janela','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=600,height=300'); return false;"> termo de uso</a>.</font>
</body>
</html>


entrar.php
<?php
$nick = $_POST['nick'];
$cor = $_POST['cor'];
if($nick == ""){
echo "<script> location.href='index.htm'; </script>";
exit;
}
$abre = fopen("chat.txt", "a");
if($abre) {
fwrite($abre,"<b><font color={$cor}>{$nick}</font color={$cor}><i> entrou no chat.</i></b><br>");
}
fclose($abre);
header("Location: batepapo.php",TRUE,307);
?>

Explicação:
1) $_POST["nick"] esta variável pega o valor do campo <input name="nick"> do arquivo index.html.
2) fopen("chat.txt", "a"): o arquivo chat.txt é aberto somente para escrita.
3) header("Location: batepapo.php",TRUE,307): A página atual é redirecionada junto com os dados do formulário POST. A função header do PHP serve para definir ou modificar as diretivas do cabeçalho HTTP de uma mensagem de resposta do servidor para o cliente. A utilização da função também é bastante simples. Ela recebe três parâmetros, mas apenas o primeiro é obrigatório como já foi visto na revisão. 307: significa Temporary Redirect.

batepapo.php

<?php
$nick = $_POST['nick'];
$cor = $_POST['cor'];
if($nick == ""){
echo "<script> location.href='index.htm'; </script>";
exit;
}
?>
<html>
<head>
  <title>Bate Papo</title>
</head>
<body bgcolor="#C92E01"><font face="Verdana" size="2" color="#FFFFFF">

<div><iframe name="chat" src="chat.php" width="100%" height="80%" frameborder="0">Atualize seu navegador.</iframe><br></div>
<div><iframe name="ultimo" src="ultima.php" frameborder="0" width=300 height=16 marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no>Favor atualizar seu navegador.</iframe></div>
<!--FORM DE FALA-->
<hr color="white">
<form action="gravar.php" method="post" target="chat">
 <font color="<?php echo $cor ?>"><b><?php echo $nick ?></b></font color="<?php echo $cor ?>">
<input name="nick" type="hidden" value="<?php echo $nick ?>">
<input name="cor" type="hidden" value="<?php echo $cor ?>">
<select name="acao">
<option value="fala" selected>fala</option>
<option value="grita">grita</option>
<option value="beija">beija</option>
<option value="canta">canta</option>
<option value="pergunta">pergunta</option>
<option value="concorda">concorda</option>
<option value="discorda">discorda</option>
<option value="desculpa-se">desculpa-se</option>
<option value="surpreende-se">surpreende-se</option>
<option value="sorri">sorri</option>
<option value="diverte-se">diverte-se</option>
<option value="briga">briga</option>
<option value="dá o fora">dá o fora</option>
  </select> : <input type="text" name="texto"> <input type="submit" value="Falar" onclick="submitForm()">
</form>
<script>
function submitForm()
{
    document.forms["myForm"].submit(); //first submit
    document.forms["myForm"].reset(); //and then reset the form values
    document.forms["myForm"].texto.focus(); // recebe o foco
}
</script>
<form action="sair.php" method="post">
<input name="nick" type="hidden" value="<?php echo $nick ?>">
<input name="cor" type="hidden" value="<?php echo $cor ?>">
<input type="submit" value="Sair">
</form>
</font>
</body>
</html>

1) o código php inicial redireciona (usando o JavaScript) a página index.html para a janela atual do browser caso a variável $nick  esteja vazia.
2) o iframe de nome chat receber o arquivo chat.php.
3) o iframe de nome ultimo recebe o arquivo ultimo.php.
4) <form action="gravar.php" method="post" target="chat"> ao apertar o botão submit de valor Falar, os dados do arquivo gravar.php serão inseridos no arquivo chat.php que está dentro de inframe de nome chat.
5) <form action="sair.php" method="post">  ao apertar o botão submit de valor Sair o arquivo sair.php será executado
6) a função em JavaScript submitForm() limpa o <input name="texto"> após o envio do valor desse campo e recebe o foco, ficando pronto para nova entrada de dados. Primeiro executa o submit (envio de dados) e depois faz o reset do formulário.
7) a função submitForm() funcionou no Internet Explore 11, porém não no Google Chrome Versão 44.0.2403.157, para corrigir esse erro, delete essa função e adicione o evento onfocus="this.value='';" no campo texto, assim:
<input type="text" name="texto" id="texto" onfocus="this.value='';" />

gravar.php
<?php
$nick = $_POST['nick'];
$acao = $_POST['acao'];
$cor = $_POST['cor'];
$hora = date("h:i:s");
if($nick == ""){
echo "<script> location.href='index.htm'; </script>";
exit;
}
$texto = $_POST['texto'];
$abre = fopen("chat.txt", "a");
if($abre) {
fwrite($abre,"<b><font color={$cor}>{$nick}</font color={$cor}> <i>{$acao}, às {$hora}</i>:</b> {$texto} <br>");
}
fclose($abre);
 // marca hora da ultima mensagem
$ultima = fopen("ultima.txt", "w");
fwrite($ultima, $hora);
fclose($ultima);
?>
<meta http-equiv="refresh" content="0; url=chat.php">

1) o teste condicional avalia se o se o nick for uma string sem caractere a página será redirecionada para a página index.html.
2) a função fopen("chat.txt", "a") abre o arquivo chat.txt somente para escrita; coloca o ponteiro do arquivo no final. Se o arquivo não existir, tenta criá-lo.
3) a função fwrite() grava os textos no arquivo aberto
4)  acontece quase o mesmo com a função fopen("ultima.txt", "w") que abre o arquivo ultima.txt apenas para escrita; coloca o ponteiro do arquivo no começo do arquivo e diminui (trunca) o tamanho do arquivo para zero. Se o arquivo não existe, tenta criá-lo.
5) a tag meta redireciona para a página chat.php automaticamente.

chat.php
<html>
<head>
<title>Bate Papo</title>
<META HTTP-EQUIV="Refresh" CONTENT="5;URL=chat.php">
<script language="javascript">
function ultima() {
location.href = "#ultima";
}
</script>
</head>
<body bgcolor="#ffffff" onLoad="javascript:ultima()">
<font face="Verdana" size="2">
<?php include("chat.txt"); ?>
<a name="ultima"> </a>
</font>
</body>
</html>
1) <META HTTP-EQUIV="Refresh" CONTENT="5;URL=chat.php"> atualiza a página chat.php
2) a função ultima() do JavaScript redireciona a página atual para a âncora <a name="ultima"> </a> dentro da própria página, com isso
Uma âncora é uma marcação do HTML que possibilita saltar de uma posição em uma página para outra posição determinada na próppria página ou também o salto de uma posição na página para outra página, ou seja, a ligação de hipertextos e a rolagem da tela.
Esse recurso possibilita com o uso do JavaScript a rolagem automática da tela.  O objeto location com a propriedade href = "#ultima" tem a finalidade de roda a tela automaticamente, esse código foi testado no Internet Explore 11 e funcionou, já no Google Chrome Versão 44.0.2403.157 não funcionou, uma alternativa é usar o método window.scroll(x,y) ou scrollTo(x,y) na função JavaScript, onde x é a coordenada do eixo horizontal e y é a coordenada do eixo horizontal, ambos em pixels.
A função JavaScript fica assim então:
function ultima() {
window.scroll(0,10000);
//scrollTo(0,10000);
}
</script>

Obs:
janela é parte de um aplicativo (janela do Windows, janela do eclipse, etc, é redimensionável)
tela: é uma parte do monitor, é um hardware cuja dimensões são fixas.
3) a função include() do PHP inclui o arquivo chat.txt na página chat.php.
4) o elemento <a name="ultima"></a>, não é um objeto Link, pois não contém o atributo HREF, é uma âncora, ou seja, destino de um link interno.
#id ou nome
Link para um elemento com o id ou nome  dentro da página atual.
http: // ... Link para uma página web externa
ftp: // ... A conexão com um servidor FTP.
mailto: ... Abre a janela de e-mail nova do cliente de e-mail padrão com o endereço de e-mail especificado.
javascript: ... Código JavaScript a ser excutado.

ultima.php
<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="5;URL=ultima.php">
</head>
<body bgcolor="#C92E01"><font face="Verdana" size="2" color="white">
<b>Última mensagem enviada às <?php include("ultima.txt"); ?>.</b></font>
</body>
</html>

sair.php
<?php
$nick = $_POST['nick'];
$cor = $_POST['cor'];
$abre = fopen("chat.txt", "a");
if($abre) {
fwrite($abre,"<b><font color={$cor}>{$nick}</font color={$cor}><i> saiu do chat.</i></b><br>");
}
fclose($abre);
?>
<meta http-equiv="refresh" content="0; url=index.htm">
1) o código PHP insere a mensagem de saída no arquivo chat.txt como já foi mencionado anteriormente.
2) a tag meta redireciona o arquivo index.html para a janela atual.