Vou postar 3 páginas: teste.php que é um formulário normal. check_function.php que faz o tratamento dos dados. E error_handle.php que exibe as mensagens de erro personalizadas e podendo ser alteradas facilmente. Detalhe: Tableless
teste.php
<?php
echo "<form action=\"check_function.php\" method=\"post\">";
echo "Login ";
echo "<input type=\"textfield\" name=\"login\" /><br />";
echo "Senha ";
echo "<input type=\"password\" name=\"pass\" /><br />";
echo "<input type=\"submit\" value=\"consultar\" />";
echo "</form>"
?>
Sem comentários, apenas um formulário com 2 campos.
check_function.php
<?php
#############################
#
# Tratamento de Dados para Login e Senha
# Por Dirceu Bimonti Ivo
# E-mail: contato at bimonti dot com
#
# Utilize o script a vontade, nem precisa
# deixar os créditos porque não tem nada
# de complexo apenas funções do PHP.
#
#############################
ob_start(); //segura o buffer se você for usar include ou outra função similar
session_start();
require_once "db_connect.php"; // inclui o arquivo de conexão com o DB, faça o seu
$login = $_POST['login'];
$pass = $_POST['pass'];
// consulta com o DB, eu uso a tabela sis_login com os campos
// id, login e senha
$consulta = mysql_query("SELECT * FROM sis_login");
$dados = mysql_fetch_array($consulta);
// ctype_alpha retorna TRUE se existir somente caracateres de A-Z
if (ctype_alpha($login)) {
// ctype_almun retorna TRUE se existir somente caracteres A-Z e números
if (ctype_alnum($pass)) {
// comparação com os dados do DB
if ($_POST['login'] == $dados['login']) {
if ($_POST['pass'] == $dados['senha']) {
// coloca em sessões, você pode alterar para cookies se quiser
$_SESSION["login"] = $dados["login"];
$_SESSION["senha"] = $dados["senha"];
header("Location: index.php");
} else {
header("Location: error_handle.php?errn=4");
}
} else {
header("Location: error_handle.php?errn=3");
}
}
else {
header("Location: error_handle.php?errn=2");
}
}
else {
header ("Location: error_handle.php?errn=1");
}
// libera o buffer
ob_end_flush();
?>
Não muito complexo também, veja no manual do php as funções ctype para verificação de strings. Acho ela melhor que usar eregi, etc...
Note que os ifs fazem as comparações e os elses redirecionam (header) para a página de erro indicando um código que exibirá a descrição do erro.Veja:
error_handle.php
<style>
.divcentral {
position: absolute;
z-index: auto;
height: auto;
width: 480px;
left: 50%;
top: 50%;
background-color: #EEEEEE;
text-align: left;
margin-left: -240px;
margin-top: -120px;
text-align: justify;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: #333333;
text-indent: 0px;
}
.titulo {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
font-weight: bold;
text-align: left;
text-indent: 0pt;
color: #333333;
}
.email {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: normal;
text-align: left;
text-indent: 0pt;
color: #0000CC;
}
</style>
<?php
// pega o código do erro
$get_error_number = $_GET['errn'];
//sua pagina inicial
$home = "http://www.site.com";
//abaixo a descrição de cada erro, altere como quiser.
$error_0 = "<p class=\"titulo\">Página não encontrada:</p>Desculpe, mas a página que você está tentando acessar não existe em nosso servidor. Se você está digitando o endereço direto no navegar certifique-se que digitou corretamente. Se você acessou esta página através de um link na nossa página por favor entre em contato com o administrador neste e-mail: <p class=\"email\">contato arroba bimonti ponto com.</p>";
$error_1 = "<p class=\"titulo\">Login Inválido:</p>Você digitou o seu login errado. Lembre-se que o login aceita apenas caracteres A-Z e não aceita números, símbolos (\" ! @ # $ % ¨ & * _ . ; ? etc) ou espaços em branco. Confira suas informações e tente novamente, ou entre em contato com o administrador: <p class=\"email\">contato arroba bimonti ponto com.</p>";
$error_2 = "<p class=\"titulo\">Senha Inválida:</p>Você digitou sua senha errada. Lembre-se que a senha aceita apenas caracteres A-Z e números, mas não aceita símbolos (\" ! @ # $ % ¨ & * _ . ; ? etc) ou espaços em branco. Confira suas informações e tente novamente, ou entre em contato com o administrador: <p class=\"email\">contato arroba bimonti ponto com.</p>";
$error_3 = "<p class=\"titulo\">Login não confere</p>O login que você digitou não é igual ao do cadastro. Tente novamente, lembrando que o sistema diferencia maiúsculas de minúsculas(Ex.: <b>LoGiN</b> é diferente de <b>login</b>).";
$error_4 = "<p class=\"titulo\">Senha não confere</p>A senha que você digitou não é igual a do cadastro. Tente novamente, lembrando que o sistema diferencia maiúsculas de minúsculas(Ex.: <b>SeNhA</b> é diferente de <b>senha</b>).";
$error_5 = "<p class=\"titulo\">Erro desconhecido:</p>Este erro pode ter sido gerado se você digitou um endereço errado ou estava tentando acessar conteúdo proibido no site. Por questões de segurança seus dados foram gravados (IP, Navegador usado, hora do acesso e página acessada) e enviados para o administrador que irá analisar o ocorrido e tentar resolver o problema. Clique aqui para retornar para a página principal: <a href=\"".$home."\">Página Principal</a>";
// verificação da query:
// verifica se não está vazia com o !=null (diferente de nulo)
// verifica se não é maior que o numero de erros cadastrados, para evitar que
// usuários mais experientes fiquem mexendo com a query
// verifica se é numerico, qualquer outro caracterer retorna erro (A-Z,",$, etc.)
if ($get_error_number !=null && $get_error_number <= 5 && ctype_digit($get_error_number)) {
//switch para exibir o código em questão
echo "<div class=\"divcentral\">";
switch ($get_error_number){
case 0: echo "$error_0"; break;
case 1: echo "$error_1"; break;
case 2: echo "$error_2"; break;
case 3: echo "$error_3"; break;
case 4: echo "$error_4"; break;}
echo "</div>";
}
else {
// ou caso o usuário faça uma cagada muito grande ele mostra o erro
// desconhecido. Eu acho melhor no $erro_5 implementar uma função para
// gravar o IP mesmo e a query usando o $_SERVER['QUERY_STRING'],
// para ver se alguém está tentando usar códigos maliciosos pela URI
echo "<div class=\"divcentral\">";
echo "$error_5";}
echo "</div>";
?>
Essa página só é responsável por pegar o código do erro e exibir a mensagem. Eu faço separada para ficar mais fácil de manusear, mas ela pode ser junto com a check_function, ae você chama assim check_function?errn=1, só tome cuidado na hora de alterar para não estragar as outras comparações.
Editado
---------------------------------------
Tava com um bug que eu vi quando fui usar o script essa semana, não tava inicializando a sessão no pagina de check_function, ae claro que não ia funcionar.. bad, bad server, no donut for you ....
Edição feita por: bimonti, 18/05/2005, 19:06.