Escolar Documentos
Profissional Documentos
Cultura Documentos
no PHP Parte 1
Fala pessoal! Tudo na paz? Que tal um super tutorial de ano novo?!
Esse o primeiro
artigo do ano, as 00:01 de 1 de Janeiro! Vamos comear o ano bem!
Hoje vamos comear um tutorial que ser divido em vrias partes Nele vamos aprender
a fazer um sistema de logins decente, usando classes no PHP Meu objetivo aqui que
voc aprenda duas coisas: como fazer um sistema de login desde o comeo e aprenda um
pouco mais sobre o uso de classes.
O sistema de login usar banco de dados MySQL e ter suporte a encriptao de
senha(MD5, SHA1 e etc) Totalmente customizvel e ser fcil alter-lo caso voc
precise de alguma coisa especial. Tambm teremos um suporte a opo lembrar minha
senha, onde o usurio permanecer logado caso volte no site algum tempo depois, outra
funcionalidade customizvel e opcional.
Outro detalhe importante sobre o sistema que ele ir funcionar nas verses 4 e 5 do PHP
e do MySQL, ento, se a sua hospedagem uma vergonha, no se preocupe!
A Tabela de Usurios
Se voc j tem uma tabela de usurios pode pular essa parte Se no, vamos criar a
seguinte tabela no banco de dados do seu site:
Tabela de Usurios
Para criar essa tabela, voc poder usar o seguinte cdigo SQL:
1 CREATE TABLE `usuarios` (
2
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
3
`nome` VARCHAR(150) NOT NULL ,
4
`usuario` VARCHAR(100) NOT NULL ,
5
`senha` VARCHAR(40) NOT NULL ,
6
PRIMARY KEY (`id`) )
ENGINE = MyISAM;
A classe Usuario
Vamos ao que interessa!
Antes de tudo, precisamos criar o nosso arquivo, vamos seguir algumas boas pticas de
programao e vamos dar o nome de usuario.class.php. Criado o arquivo vazio, vamos
comear a construir nossa classe:
1
2
<?php
class Usuario {
3
4
5
}
?>
Agora vamos comear a inserir algumas propriedades (variveis) que sero usadas pela
classe ao longo do projeto
04 /**
05 * Nome do banco de dados onde est a tabela de usurios
06
*/
07
var $bancoDeDados = 'meu_site';
08
09
/**
10
* Nome da tabela de usurios
11
*/
12
var $tabelaUsuarios = 'usuarios';
13
14 /**
15 * Nomes dos campos onde ficam o usurio e a senha de cada usurio
16
* Formato: tipo => nome_do_campo
17
*/
18
var $campos = array(
19
'usuario' => 'usuario',
20
21
So com essas propriedades da classe que voc vai poder customizar a classe para ela
funcionar no seu site.. Cada uma esta devidamente comentada e explicada, s alterar da
forma que voc necessitar.
Agora vamos definir o primeiro mtodo da nossa classe:
23 /**
24 * Usa algum tipo de encriptao para codificar uma senha
25 *
26 * Mtodo protegido: S pode ser acessado por dentro da classe
27 *
Esse mtodo cuidar da encriptao da senha (caso ela exista, claro) Se o seu sistema
no usar nenhum tipo de criptografia, pode deixar esse mtodo do jeito que est, mas caso
voc use, por exemplo, o SHA1, voc precisa mudar ali na linha 34 e colocar, por exemplo:
34
return sha1($senha);
Caso voc use outro tipo de encriptao, voc vai precisar modificar esse mtodo O
importante voc receber a senha pura/plana como parmetro ($senha) e retornar a
senha encriptada.
Agora vamos criar o segundo mtodo da classe e o ltimo mtodo dessa parte do tutorial:
37
38
39
40
41
42
43
44
/**
* Valida se um usurio existe
*
* @param string $usuario - O usurio que ser validado
* @param string $senha - A senha que ser validada
* @return boolean - Se o usurio existe ou no
*/
function validaUsuario($usuario, $senha) {
45
$senha = $this->__codificaSenha($senha);
46
47
48
49
50
51
52
53
54
55
if ($query) {
56
57
58
59
60
61
62
63
64
34
35
* @var mixed
36
37
*/
var $dados = array('id', 'nome');
38
39
/**
40
41
* @var boolean
42
43
44
*/
var $iniciaSessao = true;
45
/**
46
47
* @var string
48
49
*/
var $prefixoChaves = 'usuario_';
50
51
/**
52
53
* @var boolean
54
*/
55
56
57
/**
58
59
* @var string
60
*/
61
108
109
110
111
112
113
*/
function logaUsuario($usuario, $senha) {
114
115
115
if ($this->validaUsuario($usuario, $senha)) {
116
117
// Continuaremos aqui...
118
119
} else {
120
121
return false;
122
// Inicia a sesso?
118
119
120
session_start();
}
O prximo passo atrazer (ou no) os dados do banco de dados para a sesso:
122
123
if ($this->dados != false) {
124
125
if (!in_array($this->campos['usuario'], $this->dados)) {
126
127
$this->dados[] = 'usuario';
}
128
129
130
131
132
// Consulta os dados
133
134
FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}`
135
136
$query = mysql_query($sql);
137
138
// Se a consulta falhou
139
if (!$query) {
140
141
142
143
return false;
} else {
144
145
$dados = mysql_fetch_assoc($query);
146
147
mysql_free_result($query);
148
149
150
151
152
153
}
}
154
Da linha 124 at a linha 135 n montamos a consulta que ser usada para fazer a
busca no banco de dados, depois disso ns a executamos e, caso a consulta tenha
sido bem sucedida, salvamos os dados na sesso.
157
158
159
160 if ($this->cookie) {
161
16
$valor = join('#', array($usuario, $_SERVER['REMOTE_ADDR'],
2 $_SERVER['HTTP_USER_AGENT']));
163
164
165
$valor = sha1($valor);
166
167
168
169
170
171
return true;
Resumindo tudo:
Depois de logado, seguindo o nosso exemplo, sero criados os seguintes valores na
sesso:
Por hoje s pessoal Na Parte 3 do tutorial iremos criar o mtodo que ir verificar o
usurio est logado (que vocs podero usar nas suas pginas protegidas) e o mtodo
para logout, mas isso no tudo Ainda vai faltar o lembrar minha senha e outras
implementaes Talvez um sisteminha de permisses, quem sabe?
Pra quem quiser, o download do script completo:
para vocs usarem em vossos sites, lembrando sempre que o importante aqui que
vocs aprendam como fazer e no apenas copiem o cdigo e usem.
Vamos comear fazendo uma correo que o Leo Baiano sugeriu no
mtodovalidaUsuario() criado na Parte 1 A mudana vai acontecer entre a linha 87
e a linha 96:
097 // Procura por usurios com o mesmo usurio e senha
098 $sql = "SELECT COUNT(*)
099
FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}`
100
WHERE
101
`{$this->campos['usuario']}` = '{$usuario}'
102
AND
103
`{$this->campos['senha']}` = '{$senha}'";
if ($query) {
$total = mysql_result($query, 0);
FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}`
90
WHERE
91
`{$this->campos['usuario']}` = '{$usuario}'
92
AND
93
`{$this->campos['senha']}` = '{$senha}'";
94 $query = mysql_query($sql);
95
96
if ($query) {
$total = mysql_result($query, 0, 'total');
97
98
99
/**
184
185
186
187
188
*/
function usuarioLogado() {
189
190
// Continuaremos aqui...
}
// Inicia a sesso?
190
191
192
session_start();
}
193
194
195
196
197
Pra quem no lembra, esse valor $this->prefixoChaves . logado foi criado pelo
mtodologaUsuario().
200
if ($this->cookie) {
201
202
if (!isset($_COOKIE[$this->prefixoChaves . 'token'])) {
203
return false;
204
} else {
205
206
// Continuaremos aqui...
}
207
Caso haja o cookie, precisamos criar novamente uma string encriptada contendo as
informaes do usurio para checar com o valor salvo no cookie:
205 // Monta o valor do cookie
$valor = join('#', array($_SESSION[$this206 >prefixoChaves . 'usuario'],
$_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']));
207
208
209
210
211 // Verifica o valor do cookie
212 if ($_COOKIE[$this->prefixoChaves . 'token'] !== $valor) {
213
214
return false;
}
Feita a verificao do cookie sabemos que, depois disso tudo, o usurio est logado e
podemos retornar true e fechar o mtodo..
218 // A sesso e o cookie foram verificados, h um usurio logado
219 return true;
/**
* Faz logout do usurio logado
224
225
* @return boolean
226
*/
227
function logout() {
228
229
// Continuaremos aqui...
}
// Inicia a sesso?
229
230
231
session_start();
}
232
233
234
// Tamanho do prefixo
$tamanho = strlen($this->prefixoChaves);
235
236 // Destroi todos os valores da sesso relativos ao sistema de login
237 foreach ($_SESSION AS $chave=>$valor) {
238
239
240
241
242
unset($_SESSION[$chave]);
}
}
Repare que entre a linha 236 e 242 fizemos uma coisa interessante: removemos da
sesso apenas os valores que pertencerem ao nosso sistema de login Muita gente
usa um simples session_destroy() para acabar com a sesso, mas se o seu site
salvar valores na sesso no podemos simplesmente apag-los, concorda?
Por isso ns fazemos uma verificao a mais, que checa se ainda existem valores na
sesso e [caso no exista nada] usamos o session_destroy() e depois removemos o
cookie que identifica qual sesso de qual visitante:
244
245
if (count($_SESSION) == 0) {
246
session_destroy();
247
248
249
if (isset($_COOKIE['PHPSESSID'])) {
250
251
unset($_COOKIE['PHPSESSID']);
252
253
257
258
unset($_COOKIE[$this->prefixoChaves . 'token']);
259
Terminando o mtodo poremos retornar o valor booleano (true ou false) que informa se
o usurio foi deslogado com sucesso Existe forma melhor de fazer isso do que
verificando se no h um usurio logado?
261
262
return !$this->usuarioLogado();
Espero realmente que tenham gostado e aprendido com essa sequencia de tutoriais.
Abraos e at a prxima!