Jump to content
mruoppolo

Dúvidas OOP

Recommended Posts

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

Share this post


Link to post
Share on other sites
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

 

:/

Share this post


Link to post
Share on other sites
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" }

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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();
}
catch (\RuntimeException $exception)
{
    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:

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Rizer
      Galera, estamos buscando um profissional para atuar como Desenvolvedor PHP Junior/Pleno na Rizer. Está interessado?
       
      Empresa: Rizer (www.rizer.com.br)
      Vaga: Desenvolvedor PHP Pleno
      Carga horária: 40h semanais (seg a --- / 9h-18h)
      Local de trabalho: Edf. Cosmopolitan, Paralela - Salvador/BA
       
      Buscamos um profissional que não tenha potencial somente para exercer com excelência a posição de Desenvolvedor PHP, mas também para - num futuro próximo - liderar times na sua área de expertise. Para tornar isso possível, iremos imergi-lo no mercado e no mundo de empresas de tecnologia e startups, apresentando ainda mais sobre o funcionamento de empresas como a nossa (não tão tradicionais assim) e sobre as metodologias que utilizamos para atingir nossos resultados.
       
      A Rizer cresce exponencialmente a cada dia e gostamos de fazer todos crescerem junto conosco. Por isso, além de uma excelente política de reconhecimento e promoção (algumas vezes meteórica) de funcionários, possuímos também um programa de Vesting para oferecer quotas da sociedade da empresa para membros do nosso time que se destacam.
       
      Pré-requisitos:
      Conhecimento sólido em PHP (2+ anos de experiência);
      Integração via APIs rest;
      Framework Laravel;
      Banco de dados relacional (mysql);
      Utilização de metodologias ágeis (Scrum);
      Git / gitflow.
      Phpunit;
      Boas práticas e design pattern;;
      CSS, HTML e JavaScript
       
      Interessados deverão preencher o seguinte formulário:
       
      http://bit.ly/rizer1
       
      e fazer o upload do currículo com nome “Desenvolvedor PHP Pleno - SEU NOME”
      Você se considera uma excelente pessoa e um ótimo profissional? Curtiu a vaga? Então vem trabalhar com a gente, vem!
    • By danilo759
      Tenho uma tabelinha de programas para uma rádio... está da seguinte forma.

      titulo
      data (YYYY-MM-DD)
      hora (00:00:00)

      Minha consulta, mas não retorna o programa da hora corrente. O que eu fiz de errado?
      SELECT * FROM programas WHERE data = CURDATE() AND hora = CURTIME() LIMIT 1
    • By Ro_JnR
      Estou tentando a semanas resolver um problema, consumir uma API e verificar se o campo no banco está vazio, se estiver faz insert se não faz update.
      Até aí tudo bem, agora não consigo passar do meu select para o banco, ele da erro.
       
      Segue o código:
       
      <?php

          require_once("db.class.php");
          
          $url = "https://servicodados.ibge.gov.br/api/v1/localidades/distritos";
              $ch = curl_init($url);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
              $resultado = json_decode(curl_exec($ch));
              foreach ($resultado as $cidades) {
                  $nome = $cidades->nome;
                  $stmt = $conn->prepare("SELECT name FROM cidades WHERE name=?");
                  $stmt->bind_Param(':name', $nome);
                  $stmt->execute();
                  $stmt->bind_result($resultSelect);
                  $stmt->fetch();
                  if(!$stmt->execute()){
                      print_r($stmt->errorInfo());
                  }
              } 

      ?>
       
      Código do banco:
       
      $conn = new PDO("mysql:host=localhost;dbname=exercicio", "root", "");
      //"sqlsrv:Database=dbphp7;server=localhost\SQLEXPRESS;ConnectionPooling=0", "sa", "root");
      $stmt = $conn->prepare("SELECT * FROM cidades ORDER BY nome");
      $stmt->execute();
      //fetchALL basicamente faço while do mysqli
      $results = $stmt->fetchALL(PDO::FETCH_ASSOC);
       
      Print do erro:

       
      Tenho um outro exercicio que fiz bem parecido, consumi a API de estados e inseri no banco de dados, esse funcionou normalmente.
      Alguém poderia me dar uma luz, não sei mais o que fazer.
      Era para ser simples rsrsrrs.
    • By asacap1000
      Galera me foi solicitado a criação de um servidor web, para disponibilizar serviços para os clientes. O que vocês recomendam?
      Tenho um servidor da DELL com windows 2016. Todo o desenvolvimento será em PHP, Javascript e companhia Ltda com conexão aos bancos de dados Mysql, SQL e ORACLE.
      Já temos um servidor que será desativado porém está utilizando uma versão muito antiga de PHP 5.4 e como base de instalação foi utilizado o WampServer. 
    • By asacap1000
      Galera me foi solicitado a criação de um servidor web, para disponibilizar serviços para os clientes. O que vocês recomendam?
      Tenho um servidor da DELL com windows 2016. Todo o desenvolvimento será em PHP, Javascript e companhia Ltda com conexão aos bancos de dados Mysql, SQL e ORACLE.
      Já temos um servidor que será desativado porém está utilizando uma versão muito antiga de PHP 5.4 e como base de instalação foi utilizado o WampServer. 
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.