Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, tudo bem?
Eu estou desenvolvendo um sistema de login e senha orientado a objetos, para estudar apenas, estou com a seguinte dúvida:
Eu criei uma class DAO do usuário que tem a seguinte função:
public function login($senha, $login) {
$sql = 'select * from tb_usuarios where strUsuarioLogin = "' . $login . '" and strUsuarioSenha = "' . $senha . '"';
$executa = mysqli_query($this->conexao->getCon(), $sql);
if(mysqli_num_rows($executa)>0){
return true;
}else{
return false;
}
}
Eu queria adaptar esta função para trazer os dados do usuário, eu sei que eu poderia retornar a ID e simplesmente fazer uma query dentro do meu index.php, porém eu acredito que assim estaria errado (fora dos padrões da oop), então eu tentei modificar da seguinte forma:
public function login($senha, $login) {
$sql = 'select * from tb_usuarios where strUsuarioLogin = "' . $login . '" and strUsuarioSenha = "' . $senha . '"';
$executa = mysqli_query($this->conexao->getCon(), $sql);
if(mysqli_num_rows($executa)>0){
return mysqli_fetch_assoc($executa);
}else{
return false;
}
}
Ele me retornou os dados quando eu jogo isso num var dump, mas se eu eu tento puxar um único dado, tipo $user[''strUsuarioLogin']; ele fala que não existe.
Então ai vai a minha dúvida, como eu posso puxar dados do banco nessa lógica?
Obrigado :D>
50 minutos atrás, Gleydson lins disse:
Tenta assim:
var_dump($user[0][''strUsuario"]);
Se não der certo mostra a saída do var_dump.
Retornou:
**Notice**: Undefined offset: 0 in **C:\dev\holetires\index.php** on line **77**
NULL
:/Dá um var_dump($user) e mostra a saída.
>
2 minutos atrás, Gleydson lins disse:
Dá um var_dump($user) e mostra a saída.
array(4) { ["intUsuarioID"]=> string(1) "1" ["strUsuarioNome"]=> string(17) "Marcello Ruoppolo" ["strUsuarioLogin"]=> string(23) "contato@wpmasterlab.com" ["strUsuarioSenha"]=> string(32) "1e41eb41ce234ebf86b69853d4996146" }
Maaano, fui muito burro, eu descobri o que esta acontecendo, kkk, eu estava puxando $user['strUserID'] sendo que no banco de dados o nome do campo é strUsuarioID auehauehaeu.
Resolvi aqui, valeu Gleydson
Massa cara , que bom que conseguiu.
Bota o tópico com resolvido.
Se está tentando fazer orientado a objetos, já está fazendo errado. Um método de login, apenas realiza o login. Qualquer coisa além disso, é além da responsabilidade dele. Ou seja, estará violando a S.R.P. (Single Responsibility Principle). Além disso, seu código possui falhas de segurança.
Voltando ao ponto principal, detenha-se a uma interface lógica. Como, por exemplo:
A interface LoginService, define quem gerencia o Login do sistema. Ela fica responsável por cuidar de qualquer aspecto do login (sessão de usuário, quanto tempo expira, se há usuário logado, "lembra-me", etc...).
/**
* Responsible by the login management
* @author Gabriel Heming
**/
interface LoginService
{
/**
* Realize the login of an user
* @param string $username
* @param string $password
* @throws RuntimeExpception If it isn't possible to realize the login
**/
public function login(string $username , string $password) : void;
/**
* Return if an user is logged
* @return boolean
**/
public function hasUserLogged() : bool;
/**
* Return the user authenticated
* @return User
* @throws RuntimeExpception If there isn't user authenticated
**/
public function hasUserAuthenticated() : bool;
}
Perceba que, conforme documentado, o método login não retorna absolutamente nada, apenas lançará uma exception quando não for possível realizar o login. Mostrarei melhor mais para o fim.
Para gerenciar o login, LoginService precisa autenticar um usuário. Para isso, ela faz o uso da interface UserService Essa interface, por sua vez, trata dos aspectos do usuário. Ou seja, toda a regra de negócio que é pertinente a um usuário.
/**
* Manage any aspects of an user
* @author Gabriel Heming
**/
interface UserService
{
/**
* Authenticate the user
* @param string $username
* @param string $password
* @return boolean True if the user exists and the password match
**/
public function auth(string $username , string $password) : bool;
/**
* Return an user by his username
* @param string $username
* @return User The User object
**/
public function getUser(string $username) : User;
}
Já a interface UserService, trata dos aspectos do usuário. O método auth (autenticação), ele pode ser contraditório aonde deve estar. Entretanto, vamos aos "aspectos comuns" de onde ele pode ser utilizado:
- Login;
- Alteração de senha (quando a senha anterior deve ser validada para que uma nova senha seja inserida).
Se for ir mais a fundo:
- Autenticação via serviços (WS, Rest, API, etc...).
Ou seja, o método se preocupa apenas em autenticar o usuário. Ele não precisa informar se o problema é o usuário que não existe ou a senha que não confere, apenas se autenticou ou não.
Isso são interfaces básicas, bem grosseiras mesmo. Entretanto, demonstram o que cada participante deve se preocupar.
Quanto ao uso, bem, a coisa fica bem simples:
try
{
//instância do serviço com injeção de dependencia do storage
$loginService = new LoginService(new mysqli(/**dados de conexão**/));
$loginService->login('usuario' , 'minhasenha');
echo "login realizado com sucesso";
$user = $loginService->getUserAuthenticated();
echo "Usuário logado: ".$user->getNome();
} echo $exception->getMessage();
}
Do ponto de vista de orientação a objetos, o que a classe Login faz não é importante. Internamente, ela está utilizando o UserService para autenticar o usuário e para retornar o usuário que está autenticado, mas isso não é importante para a interface.
Agora, do ponto de vista de segurança é outra história e você precisa saber como está sendo realizado o login. E você pode verificar mais no link abaixo:
Tenta assim: