Construindo um mural de recados
Resumo
Nesse capítulo de nosso curso, aprenderemos como construir um sistema de mural de recados multi-usuários. O sistema terá os seguintes recursos:
Cadastro de novos usuários;
Login de usuários cadastrados;
Inclusão de novas mensagens;
Exibição de mensagens já incluidas.
A esse ponto do curso, você já deve ter uma boa idéia de como um sistema construído em PHP funciona, portanto esse tutorial não explicará coisas que já foram abordadas em capítulos anteriores.
A base de dados
Para construir nosso sistema de mensagens, precisaremos de duas tabelas. Uma contendo dados dos usuário e outra contendo dados das mensagens.
Exemplo 1.1. As tabelas
CREATE TABLE usuario (
cod INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR( 20 ) NOT NULL ,
sobrenome VARCHAR( 40 ) NOT NULL ,
email VARCHAR( 200 ) NOT NULL ,
login VARCHAR( 30 ) NOT NULL ,
senha VARCHAR( 50 ) NOT NULL ,
data DATETIME NOT NULL ,
);
CREATE TABLE mensagem (
cod INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
cod_usuario INT NOT NULL,
titulo VARCHAR(30) NOT NULL,
texto TEXT NOT NULL,
data DATETIME NOT NULL,
);
Na tabela de mensagens, colocamos uma chave estrangeira que aponta para o código do usuário que postou a mensagem. Toda essa coisa de separar tabelas e criar chaves estrangeiras chama-se normalização e fazemos isso para evitar a repetição dos dados do usuário. Através dessa chave estrangeira, podemos procurar na tabela de usuário seus dados.
Construindo o index.php
Primeiramente, construiremos o arquivo principal de nosso sistema, que será o index.php. Nele colocaremos os includes principais do site, que são o cabeçalho, o rodapé e a query string. A estrutura dele é basicamente assim:
Exemplo 1.2. index.php
<?php require_once 'header.inc.php'; ?>
<?php require_once 'menu.inc.php'; ?><div id="principal">
<?php
switch ($pagina) {
case 'home' :
include 'home.inc.php';
break;
case 'cadastro' :
include 'cadastro.inc.php';
break;
case 'login' :
include 'login.inc.php';
break;
case 'nova' :
include 'nova.inc.php';
break;
}?>
</div>
<?php require_once 'footer.inc.php'; ?>
Aqui já estão todas as query strings que serão utilizadas no site, porém você pode ir adcionando-as comandos conforme vai criando as respectivas páginas. O arquivo menu.inc.php, como o nome já diz, possui o menu que usaremos para fazer a navegação pelo site.
Menu
Para evitar ter que ficar repetindo o código que constrói o nosso menu de navegação em todas as páginas do site, criamos um arquivo especial só para ele, que contém somente HTML com os devidos links.
Exemplo 1.3. menu.inc.php
<div id="menu">
<ul>
<li><a href="?pagina=cadastro" title="Cadastrar novo usuário">Cadastrar</a></li>
<li><a href="?pagina=login" title="Fazer Login">Login</a></li>
<li><a href="logout.php" title="Fazer Logout">Logout</a></li>
<li><a href="?pagina=nova" title="Nova Mensagem">Nova mensagem</a></li>
</ul>
</div>
Cabeçalho
No arquivo de cabeçalho, além de colocarmos o código HTML que será repetido entre todas as páginas, também incluímos e criamos as variáveis e arquivos comuns que serão usadas por todos os scripts. O arquivo conecta.inc.php contém os comandos necessários para conectar nosso script ao MySQL; ele retorna a variável de conexão resultante da função mysql_connect().
Exemplo 1.4. header.inc.php
<?php
// Inicia a sessão
session_start();// Criamos uma variável $pagina com o valor da query string 'pagina'
$pagina = !empty($_GET['pagina']) ? $_GET['pagina'] : 'home';// Conectamos ao servidor. A variável $conexão agora contém
// o resource de conexão, retornado pelo mysql_connect
$conexao = require_once 'conecta.inc.php';?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Mural de recados</title>
<link rel="stylesheet" type="text/css" media="all" href="mural.css" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body><div id="container">
<div id="cabecalho"><h1><a href="index.php" title="Principal">Mural de Recados</a></h1></div>
Arquivo de conexão
O arquivo conecta.inc.php se encarrega de fazer a conexão com o MySQL. Ele retorna a variável de conexão resultante da função mysql_connect()
Exemplo 1.5. conecta.inc.php
<?php
$bdhost = 'host';
$bdusuario = 'usuario';
$bdsenha = 'senha';
$basededados = 'basededados';if (!$conexao = mysql_connect($bdhost,$bdusuario,$bdsenha))
echo 'Erro ao conectar-se ao MySQL';
elseif (!mysql_select_db($basededados,$conexao))
echo 'Erro ao selecionar a base de dados';
else
return $conexao;
?>
Rodapé
Bom, o rodapé não possui nada de diferente, apenas um HTML que será repetido entre as páginas.
Exemplo 1.6. footer.inc.php
</div>
<div id="footer">Sistema de mensagens - PHP & MySQL</div>
</body>
</html>
Cadastro de usuário
A primeira coisa que precisamos fazer para desenvolver o nosso mural de recados é o sistema de cadastro de novos usuários. Ele consiste em receber as informações do usário (nome, email, senha, etc) através de um formulário e passá-las para o banco de dados. Com essas informações guardadas, temos acesso a todos os dados do usuário, seja para fazer autenticação deste ou simplesmente para exibir dados.
A senha do usuário não será armazenada exatamente como uma string, mas sim como um MD5 hash gerado a partir da verdadeira senha. Um hash é o resultado da criptografia de uma string; criptografar alguma coisa é codificá-la de modo a torná-la ilegível a quem não possua conhecimento sobre sua chave de decodificação. MD5 é o algorítimo específico que receberá a senha e a retornará na forma de um número hexadecimal com 32 caracteres. Em nosso caso, não existe chave de decodificação, portanto não pode-se pegar um hash e transformá-lo de volta em string. Apesar da complexidade do algorítmo MD5, pelo PHP a única coisa que precisaremos fazer é usar a função md5(), que recebe uma string e retorna o hash, sem maiores dificuldades. Abaixo segue o código necessário para o cadastro de usuários:
Exemplo 1.7. cadastro.inc.php
<?php
$nome = $_POST['nome'];
$sobrenome = $_POST['sobrenome'];
$login = $_POST['login'];
$email = $_POST['email'];
$senha = $_POST['senha'];
$confsenha = $_POST['confsenha'];
function exibe_form () {
echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '?pagina=cadastro' . '">' . "\n";;
echo ' <p>Nome: <br /> <input type="text" name="nome" /></p>' . "\n";
echo ' <p>Sobrenome: <br /> <input type="text" name="sobrenome" /></p>' . "\n";
echo ' <p>Login (apelido): <br /> <input type="text" name="login" /></p>' . "\n";
echo ' <p>E-mail: <br /> <input type="text" name="email" /></p>' . "\n";
echo ' <p>Senha: <br /> <input type="password" name="senha" /></p>' . "\n";
echo ' <p>Confirmação de Senha: <br /> <input type="password" name="confsenha" /></p>' . "\n";
echo ' <p><input type="hidden" name="verifica_envio" value="1" /></p>' . "\n";
echo ' <p><input type="reset" value="Recomeçar" /> <br /> <input type="submit" value="Cadastrar" />' . "\n";
echo '</form>' . "\n";
}
// Função que faz o cadastro do usuário no banco de dados
function cadastra_usuario($nome,$sobrenome,$login,$email,$senha) {
// Usaremos a variável de conexão com o MySQL, criada no header.inc.php
global $conexao;
// Por segurança, guardamos o hash da senha
$senha = md5($senha);
$sql = "INSERT INTO
usuario
SET
nome ='$nome',
sobrenome ='$sobrenome',
email ='$email',
login ='$login',
senha ='$senha',
data = NOW()";
if ($resultado = mysql_query($sql,$conexao)) {
echo "Usuário cadastrado com sucesso! Você pode logar-se agora.\n";
}
else {
echo "Erro no cadastro, por favor tente de novo\n";
}
}
// Função que verifica se tudo está preenchido corretamente
function processa_cadastro($nome,$sobrenome,$login,$email,$senha,$confsenha) {
if ( (empty($nome)) or (empty($sobrenome)) or (empty($login)) or
(empty($email)) or (empty($senha)) or (empty($confsenha)) or
($senha != $confsenha) )
echo "Por favor, preencha todos os campos do formulário\n";
else
cadastra_usuario($nome,$sobrenome,$login,$email,$senha);
}
?>
<h2>Cadastro de novo usuário</h2>
<?php
if (!array_key_exists('verifica_envio', $_POST))
exibe_form();
else
processa_cadastro($nome,$sobrenome,$login,$email,$senha,$confsenha);
?>
Como aprendemos nos capítulos anteriores, usamos apenas um arquivo tanto para exibir o formulário de cadastro, quanto para incluir o cadastro no banco de dados. Esse arquivo possui três funções:
processa_cadastro() : verifica se o formulário foi corretamente preenchido (inxestência de campos vazios e confirmação da senha). Como parâmetro, ela recebe os dados preenchidos no formulário.
exibe_form() : Como o nome já diz, essa função exibe o formulário de cadastro na tela do usuário, caso ele ainda não o tenha preenchido.
cadastra_usuario() : essa é a função que faz o cadastro do usuário dentro do banco de dados. Ela recebe os dados preenchidos no formulário e os insere na devida tabela do MySQL, tomando o cuidado de criptografar a senha antes. É bom lembrar que essa função só é chamada caso o formulário tenha sido preechido.
Login de usuários
Para fazer o login de usuários, precisaremos de um arquivo com o formulário de login e outro para confirmar esse login. Nesse caso não podemos fazer tudo num mesmo arquivo pois quando um usuário é logado, uma sessão é escrita e o navegador é redirecionado; funções de redirecionamento precisam ir no HTTP Header, assim como as sessões, o que nos obriga a executá-las antes de qualquer saída para o navegador.
Exemplo 1.8. login.inc.php
<form method="post" action="login.post.php">
<p>Login: <br /> <input type="text" name="login" /></p>
<p>Senha: <br /> <input type="password" name="senha" /></p>
<p><input type="submit" value="Entrar" />
</form>
Exemplo 1.9. login.post.php
<?php
// Iniciamos a sessão
session_start();
// Função que valida o usuário no banco de dados
function valida_usuario($usuario,$senha) {
$conexao = require_once 'conecta.inc.php';
// Criptografa a senha
$senha = md5($senha);
$sql = "SELECT * FROM usuario WHERE login='$usuario' AND senha='$senha'";
if (!$resultado = mysql_query($sql,$conexao)) {
return false;
}
elseif(mysql_num_rows($resultado) != 1) {
return false;
}
else {
return true;
}
}
// Passamos as variáveis de $_POST para a
// função de verificação do usuário
$login = $_POST['login'];
$senha = $_POST['senha'];
if (valida_usuario($login,$senha)) {
// Escreve na session
$_SESSION['login'] = $login;
$_SESSION['senha'] = $senha;
// Redireciona o usuário
header ("Location: index.php");
}
else {
// Caso o usuário não for validado,
// apaga as variáveis de sessão e
// mostra mensgagem de erro
unset($_SESSION['login']);
unset($_SESSION['senha']);
echo "Senha ou usuário inválidos. Tente outra vez.";
}
?>
A função valida_usuario() recebe os valores preenchidos no formulário do arquivo anterior e os verifica no banco de dados. Retorna true ou false de acordo com o resultado da query no MySQL.
Logout de usuário
Caso um usuário queira sair do site ou logar-se como outro usuário, ele pode fazê-lo através do arquivo logout.php. O que ele faz é simplesmente apagar as variáveis de sessão e redirecionar o usuário para a página principal.
Exemplo 1.10. login.post.php
<?php
session_start();
// Apagando as variáveis de sessão
unset($_SESSION['login']);
unset($_SESSION['senha']);
header ('Location: index.php');
?>
Criando novas mensagens
Com nossos usuários podendo fazer login no site, agora precisamos criar a funcionalidade de envio e exibição de mensagens. Quanto ao envio, nada diferente do que você já viu. Um formulário para a entrada dos dados e depois uma função que insere esses dados no banco de dados.
Exemplo 1.11. nova.inc.php
<h2>Nova mensagem</h2>
<?php
function exibe_form() {
echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '?pagina=nova">' . "\n";
echo ' <p>Título: <br /> <input type="text" name="titulo" /> </p>' . "\n";
echo ' <p>Mensagem: <br /> <textarea name="mensagem" cols="40" rows="8"></textarea>' . "\n";
echo ' <p><input type="hidden" name="verifica_envio" value="1" />' . "\n";
echo ' <input type="reset" value="Recomeçar" />' . "\n";
echo ' <input type="submit" value="Enviar" />' . "\n";
echo ' </p>' . "\n";
echo '</form>' . "\n";
}
function insere_bd($titulo, $mensagem) {
global $conexao;
$login = $_SESSION['login'];
// Seleciona o código do usuário, de acordo com
// a variável $login, que está na sessão
$sql = "SELECT cod FROM usuario WHERE login='$login'";
$resultado = mysql_query($sql,$conexao);
// Como o select retornará apenas um usuário,
// não existe a necessidade de fazer um while
$cod_usuario = mysql_fetch_array($resultado);
$cod_usuario = $cod_usuario[0];
$insertsql = "INSERT INTO
mensagem
SET
cod_usuario='$cod_usuario',
titulo='$titulo',
texto='$mensagem',
data=NOW()";
if (!$resultado = mysql_query($insertsql,$conexao)) {
echo 'Erro ao criar nova mensagem';
}
else {
echo 'Mensagem criada com sucesso!';
}
}
?>
<?php
require_once 'pagina_fechada.inc.php';
if (!confirma_login()) {
echo "Você precisa estar logado para acessar esssa página";
}
else {
if ( !array_key_exists('verifica_envio',$_POST) ) {
exibe_form();
}
else {
$titulo = $_POST['titulo'];
$mensagem = $_POST['mensagem'];
if ( (!empty($titulo)) and (!empty($mensagem)) and (confirma_login()) )
insere_bd($titulo,$mensagem);
else
echo 'Você não preencheu todos os campos';
}
}
?>
Perceba que esse script chama o arquivo pagina_fechada.inc.php; ele contém a função confirma_login(), que certifica-se de que o usuáiro está logado. Isso serve para impedir que usuários não logados criem mensagens.
Exemplo 1.12. pagina_fechada.inc.php
<?php
function confirma_login () {
if ( (!isset($_SESSION['login'])) or (!isset($_SESSION['senha'])) )
return false;
else
return true;
}
?>
Página principal e exibição das mensagens
Precisamos agora construir a página principal do site, que exibirá as mensagens contidas no banco de dados.
Exemplo 1.13. home.inc.php
<?php
// Função que retorna se o usuário está logado ou não.
// Caso esteja, retorna também o nome do usuário
function status_usuario () {
if ( (!isset($_SESSION['login'])) or (!isset($_SESSION['senha'])) )
return 'Usuário não está logado';
else
return 'Usuário ' . $_SESSION['login'] . ' logado';
}
// Função que exibe as mensagens do mural de recados
function exibe_mural() {
// Usa a variável global da conexão com o MySQL
global $conexao;
$sql = "SELECT
u.login, u.email, m.titulo, m.texto, u.nome, u.sobrenome, m.data
FROM
usuario u, mensagem m
WHERE
u.cod=m.cod_usuario
ORDER BY
data DESC";
$resultado = mysql_query($sql,$conexao);
while ($linha = mysql_fetch_array($resultado)) {
$data = strtotime($linha['data']);
$dia = date("d/m/Y",$data);
$hora = date("H:i:s",$data);
echo '<div class="mensagem">';
echo '<h4>' . $linha['titulo']. "</h4>\n";
echo '<p>' . $linha['texto'] . "</p>\n";
echo '<h5>Criada dia ' . $dia . ' às ' . $hora . ',
por <a href=mailto:' . $linha['email'] . '>' .
Caso você não conheça bem SQL, a query do script acima pode parecer bem estranha. Como estamos guardando os dados do usuário em uma tabela diferente dos dados da mensagem, precisamos unir os dados dessas duas tabelas para podermos saber quais mensagens são de cada autor. Ela usa apelidos para indentificar as duas tabelas e seleciona os dados onde o código do usuário da tabela usuário é igual ao código do usuário da tabela mensagem [m.cod_usuario] (que indica o autor da mensagem).
O resto do script é detalhe, nada de novidade. Usamos o bom e velho mysql_fetch_array() para obter os dados retornados pelo MySQL. Existe uma função simples chamada status_usuario() que retorna se o usuário está logado ou não (de acordo com as variáveis de sessão).
Conclusão
Apesar do código do nosso sistema de mural de recados ser um pouco grande, ele não tem nada muito complicado. Tudo que ele utiliza você aprendeu aqui nesse curso e, como poder ver, PHP não é nenhum bicho de sete cabeças. Não se esqueça que o manual do PHP e o manual do MySQL são ótimas fontes de pesquisas para aprender coisas novas (e tirar dúvidas das antigas). Não deixe de acessá-los
Xo สล็อตออนไลน์ โปรสล็อต XO เกมออนไลน์ทำเงินยอดฮิตเกมสล็อต xopg.net คือเกมทำเงิน reeffutures2018 ผ่านทางออนไลน์อย่างหนึ่ง ที่เล่นง่าย และได้เงินไว แถมยังลงทุนด้วยเงินน้อย mavoixtavoie ทำเงินได้ตลอดเวลา ซึ่งหลายคนอาจได้เคยเห็นรีวิวเรื่องของ สล็อต xo สล็อตออนไลน์ ไว้มากมาย เทคนิคสล็อต ทั้งเรื่องการเล่นแล้วได้เงิน herbalpertpresents และเล่น สล็อต แล้วไม่ได้เงิน นั่นเองค่ะ ซึ่งการที่คุณจะเล่นได้เงินหรือไม่ได้เงินนั้น essentialsforasoul ส่วนหนึ่งก็เป็นในเรื่องของดวงเข้ามาเกี่ยวด้วย northbristol เพราะสล็อตเป็นเกมออนไลน์เสี่ยงโชค ทดลองเล่น xo เกมหนึ่งซึ่งจะมีสูตร หรือเทคนิคเข้ามาช่วย gclub เพื่อโกงดวงอยู่เสมอซึ่งในเว็บของเรา สมัคร xo ก็มีมาแนะนำไว้ให้เห็นกันมากมายหลายสูตร