Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pellegrini2106

Problema de Utilização de Sessões em PHP

Recommended Posts

Ola amigos programadores em php!!!

Estou com uma duvida tenho um código para realizar login no sistema em MVC só que não sei onde coloco estas sessões. Olha o Código ai por favor!!!!

 

modelo Usuário:

<?php

class usuario {

    private $id_usuario;
    private $nome;
    private $email;
    private $perfil;
    private $usuario;
    private $senha;
    private $logado;
    
    public function getLogado() {
        return $this->logado;
    }

    public function setLogado($logado) {
        $this->logado = $logado;
    }

      
    public function getId_usuario() {
        return $this->id_usuario;
    }

    public function getNome() {
        return $this->nome;
    }

    public function getEmail() {
        return $this->email;
    }

    public function getPerfil() {
        return $this->perfil;
    }

    public function getUsuario() {
        return $this->usuario;
    }

    public function getSenha() {
        return $this->senha;
    }
    
    public function setId_usuario($id_usuario) {
        $this->id_usuario = $id_usuario;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function setEmail($email) {
        $this->email = $email;
    }

    public function setPerfil($perfil) {
        $this->perfil = $perfil;
    }

    public function setUsuario($usuario) {
        $this->usuario = $usuario;
    }

    public function setSenha($senha) {
        $this->senha = $senha;
    }
}
?>

DaoLogar

class daoLogar {

    private $cnx;

    function __construct() {

        try {
            $this->cnx = new PDO('mysql:host=localhost;port=3306;dbname=usuarios', 'root', '');
        } catch (PDOException $ex) {
            echo '<div class="alert-danger">' . $ex->getMessage() . '</div>';
        }
    }

    public function logarUsuario(usuario $Usuario) {

        $sql = "SELECT * FROM tbusuario WHERE usuario ='{$Usuario->getUsuario()}' AND senha ='{$Usuario->getSenha()}'";
        $campo = $this->cnx->prepare($sql);
        $campo->bindValue(1, $Usuario->getUsuario(), PDO::PARAM_STR);
        $campo->bindValue(2, $Usuario->getSenha(), PDO::PARAM_STR);
        $campo->execute();

        switch ($campo->rowCount()) {
            case 0:
                echo '<div class="alert-danger">Usuário ou Senha Inválida!!</div>';
                break;
            case 1:
                echo '<div class="alert-success">Usuário Logado com Sucesso!!</div>';
                echo "<meta HTTP-EQUIV='refresh' CONTENT='8; URL=restrito.php'>";
                break;
        }
    }

}
?>

ControleLogar:

<?php

require_once 'modelo/usuario.php';
require_once 'dao/daoLogar.php';

class controleLogar {

    public function ctlLogarUsuario() {

        $Usuario = new usuario();
        $daoLogar = new daoLogar();

        if (isset($_POST["btnEntrar"])) {

            $Usuario->setUsuario($_POST['txtusuario']);
            $Usuario->setSenha($_POST['txtsenha']);

            if (empty($_POST["txtusuario"]) || (empty($_POST["txtsenha"]))) {
                echo '<div class="alert-danger"> Por Favor Preencha o Campo em Branco!!!!!!</div>';
            } else {
                return $daoLogar->logarUsuario($Usuario);
            }
        }
    }
}
?>

index.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>PRINCIPAL:</title>
        <link rel="stylesheet" type="text/css" href="css/style.css">
        <link rel="stylesheet" type="text/css" href="css/alerta.css">
        <link rel="stylesheet" type="text/css" href="css/bootstrap.css">
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
        <script language="javascript" type="text/javascript" src="js/JQuery.mim.js"></script>
        <script language="javascript" type="text/javascript" src="js/fechar.js"></script>
        <script language="javascript" type="text/javascript" src="js/bootstrap.js"></script>
    </head>
    <body>
        <div class="topo">
            <div class="letras">
                <div id="m">
                <?php
               	require_once 'controle/controleLogar.php';
                $lg = new controleLogar();
                $lg->ctlLogarUsuario();
                ?>
                </div></div>
        </div>
        <div class="cabecalho">
            <form method="post" class="letras alinhaLogin">
                <table width="688" border="0">
                    <tr>
                        <td width="58" align="center" valign="middle">Usuário:</td>
                        <td width="144" align="center" valign="middle"><input name="txtusuario" type="text" size="40" placeholder="Digite Usuário:" class="form-control"></td>
                        <td width="46" align="center" valign="middle">Senha:</td>
                        <td width="144" align="center" valign="middle"><input name="txtsenha" type="password" size="10"  placeholder="Digite Senha:" class="form-control"></td>
                        <td width="94" align="center" valign="middle"><input name="btnEntrar" type="submit" class="btn btn-info" value="Entrar:"> </td>
                    </tr>
                </table>
            </form>
        </div>

    </body>
</html>

Obs: Criei outra Pagina chamada restrita.php onde fica fechada por sessões accesadas pelo controle. Esse é o problema passar as sessões pelo controle.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está trabalhando com OOP :smile: então você pode criar uma classe que manipula estas sessões.

 

Desacoplando de todo resto.

 

E de uma olhada na PSR

 

Os nomes de classe DEVEM ser declarados em StudlyCaps.
 

https://en.wikipedia.org/wiki/Studly_caps

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que seria ser redundante?

 

Estou falando sobre desacoplamento. Pegar os dados apos login TRUE e manipular em outra classe.
Se precisar serializar, criar cookie, adicionar mais algum dado ou algo do gênero no futuro, você só ira editar uma unica classe.

 

Outro detalhe, se está aplicando a arquitetura MVC, como vejo sempre nos títulos dos seus posts, menos nesse. :smirk:

 

Então que faça da forma correta. :thumbsup:

 

Sua DAO, não tem que renderizar HTMLs, isso é responsabilidade da Views

Correto abaixo é retornar um Status (True or False), não isso!



        ....................

        switch ($campo->rowCount()) {
            case 0:
                echo '<div class="alert-danger">Usuário ou Senha Inválida!!</div>';
                break;
            case 1:
                echo '<div class="alert-success">Usuário Logado com Sucesso!!</div>';
                echo "<meta HTTP-EQUIV='refresh' CONTENT='8; URL=restrito.php'>";
                break;
        }

        .....................

Desta forma vai fazer como? É meio que obvio, dependendo vai retornar um erro ao enviar os headers da Session Start

 

 

 

Mas....

Em todo caso, leia o basico

http://blog.thiagobelem.net/aprendendo-a-usar-sessoes-no-php
 

 

Dica

 

if( $campo->rowCount() > 0) {

    session_start();
    $_SESSION['usuario'] = $Usuario->getUsuario();

}

ou
 

if( $campo->rowCount() > 0) {
    session_start();
    $_SESSION['dados'] = [];
    $_SESSION['dados'] = $campo->fetch(PDO::FETCH_ASSOC);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Willian se eu entendi bem e assim que tenho que fazer na minha classe DaoLogar? Mas e depois como vou passar a Sessão pelo controle?

Porque na minha sã consciência acho eu né que as variáveis Globais POST, GET e SESSION são Passados na classe controle.

switch ($campo->rowCount()) {
            case 0:
                return false; //retorna false se consulta não achar nenhum registro na tabela.
                break;
            case 1:
                 return true; // retorna true se consulta achar um ou mais registros na tabela
                break;
        }

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe, Falei controller, correto era a DAO.

 

Vou postar um exemplo aqui!
Como é a forma correta, só um minuto!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Correto seria assim, não aquela bagunça na DAO, você esta misturando HTML, dados de conexão dentro de um construtor, está a maior zona, veja, basta estender a conexão, tem varios exemplos de classes de CONEXÃO prontas na web, basta usar.

 

 

<?php

/**
 * LogarDAO
 */
class LogarDAO extends Conexao
{

    public function logarUsuario(Usuario $usuario)
    {

        try {

            $sql = "SELECT * FROM tbusuario WHERE usuario ='{$usuario->getUsuario()}' AND senha ='{$usuario->getSenha()}'";
            $campo = $this->cnx->prepare($sql);
            $campo->bindValue(1, $usuario->getUsuario(), PDO::PARAM_STR);
            $campo->bindValue(2, $usuario->getSenha(), PDO::PARAM_STR);
            $campo->execute();

            if ($campo->rowCount() <= 0){
                return false;
            }

            return $campo->fetch(PDO::FETCH_ASSOC);

        } catch (\PDOException $e) {
            //Captura o erro
        }

    }

}

 

 

Controller, outra vez é seu controller, misturando HTML, siga o mais próximo disso, faz tempo heim que você vem perguntando a mesma coisa. Então veja o basico. Retorne um status do erro para a VIEW

<?php

/**
 *
 */
class LogarController
{

    protected $usuario;
    protected $dao;
    protected $status;

    public function setStatus($status)
    {
        $this->status = $status;
    }

    public function getStatus()
    {
        return $this->status;
    }

    public function __construct()
    {
        $this->usuario = new Usuario();
        $this->dao = new LogarDAO();
    }

    public function ctlLogarUsuario() {

        if (isset($_POST["btnEntrar"])) {


            if (empty($_POST["txtusuario"]) || (empty($_POST["txtsenha"])))
            {
                return $this->setStatus('E-mail ou senha invalidos');
            }

            $this->usuario->setUsuario($_POST['txtusuario']);
            $this->usuario->setSenha($_POST['txtsenha']);

            $dados = $this->dao->logarUsuario($this->usuario);

            if ($dados === false) {
                return $this->setStatus('E-mail ou senha invalidos');
            }

            session_start();
            $_SESSION['usuario'] = $this->usuario->getUsuario();

            //ou outra forma


        }

    }

}

 

View.  Codigo de Controllers vem Antes do HTML

 

<?php
require_once 'controle/LogarController.php';
$lg = new LogarController();
$lg->ctlLogarUsuario();

?>


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>PRINCIPAL:</title>
        <link rel="stylesheet" type="text/css" href="css/style.css">
        <link rel="stylesheet" type="text/css" href="css/alerta.css">
        <link rel="stylesheet" type="text/css" href="css/bootstrap.css">
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
        <script language="javascript" type="text/javascript" src="js/JQuery.mim.js"></script>
        <script language="javascript" type="text/javascript" src="js/fechar.js"></script>
        <script language="javascript" type="text/javascript" src="js/bootstrap.js"></script>
    </head>
    <body>
        <div class="topo">
            <div class="letras">
                <div id="m">
                    <?php

                    //Aqui vai o status
                    if (isset($lg->status())):
                        echo $lg->status();
                    endif; 
                    ?>
                </div></div>
        </div>
        <div class="cabecalho">
            <form method="post" class="letras alinhaLogin">
                <table width="688" border="0">
                    <tr>
                        <td width="58" align="center" valign="middle">Usuário:</td>
                        <td width="144" align="center" valign="middle"><input name="txtusuario" type="text" size="40" placeholder="Digite Usuário:" class="form-control"></td>
                        <td width="46" align="center" valign="middle">Senha:</td>
                        <td width="144" align="center" valign="middle"><input name="txtsenha" type="password" size="10"  placeholder="Digite Senha:" class="form-control"></td>
                        <td width="94" align="center" valign="middle"><input name="btnEntrar" type="submit" class="btn btn-info" value="Entrar:"> </td>
                    </tr>
                </table>
            </form>
        </div>

    </body>
</html>


 
Veja que o Status  esta dentro do HTML


 

<div class="topo">
            <div class="letras">
                <div id="m">
                    <?php

                    //Aqui vai o status
                    if (isset($lg->status())):
                        echo $lg->status();
                    endif; 
                    ?>
                </div></div>
        </div>

 

Bom maiores detalhes já dei em outros posts seus, o problema que você não aplica nada do que é falado, continua sempre no mesmo erro. :tounge_wink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian não deu certo a pagina index.php ficou em branco!!!!!! E outra queria logar para outra página que esteja restrita e protegida por sessões e informando a seguinte mensagem Olá Usuário "tal" seja bem vindo!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.