Ir ao conteúdo

Posts recomendados

Postado

Fatal error: Uncaught Error: Call to a member function prepare() on null

 

<?php

class Usuario

{

    private $pdo;

    public $msgErro = "";



    public function conectar($nomedb, $servidor, $usuario, $senha)

    {

        //  global $pdo;

        try {

            $pdo = new PDO("mysql:dbname=" . $nomedb . ";host=" . $servidor, $usuario, $senha);

        } catch (PDOException $e) {

            $msgErro = $e->getMessage();

            echo '$msgErro';

        } catch (PDOException $e) {

            echo "Erro: " . $e->getMessage();

        }

    }



    public function logar($usEmail, $usSenha)

    {

        global $pdo;

        // Verifica se existe o email e senha

        $u = $pdo->prepare("SELECT id FROM usuarios WHERE email = :e AND senha = :s");  // A Q U I   DÁ   O   ERRO

        $u->bindValue(":e", $usEmail);

        $u->bindValue(":s", md5($usSenha));

        $u->execute();

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

            // Se sim entrar no sistema (Sessão)

            $dado = $u->fetch();

            //usaremos a sessão abaixo em areaPrivada.php

            session_start();

            $_SESSION['id_user'] = $dado['id'];

            return true; //Cadastrado com sucesso

        } else {

            return false; // Não logou

        }

    }

}

$u = new Usuario;



?>

<!DOCTYPE html>

<html lang="pt-br">



<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <!-- VIEWPORT

        A largura será igual a do dispositivo

        Se tiver o atributo user-scalable=no

        quer dizer que não pode dar zoom

     -->

    <link rel="stylesheet" href="css\login.css">

    <title>Login Teste</title>

</head>



<body>

    <div id="corpo-form">

        <h1>Entrar</h1>

        <!-- Mais seguro o post do que o get para envio de senha

o processo.php vai processar os dados com o banco de dados -->

        <form method="post">

            <input type="email" name="email" placeholder="Usuário">

            <input type="password" name="senha" placeholder="Senha">

            <input type="submit" value="Acessar">

            <a href="cadastrar.php">Ainda não tem cadastro? <strong>Cadastre-se</strong></a>

        </form>

    </div>

    <?php

    //Verifica se clicou no botão

    if (isset($_POST['email'])) {

        // 2 - Guardar os dados dentro de variáveis

        $email = addslashes($_POST['email']);

        $senha = addslashes($_POST['senha']);

        //Verificar se está preenchido

        if (!empty($email) && !empty($senha)) {

            $u->conectar("projeto_comentarios", "localhost", "root", "");

            if ($u->msgErro == "") { // Se vazio td ok 

                ?>

                    <div class="msg-erro">

                        CONECTADO COM SUCESSO !

                    </div>

                <?php

                if ($u->logar($email, $senha)) {

                    header("location: areaPrivada.php");

                } else {

                ?>

                    <div class="msg-erro">

                        Email e/ou senha incorretos!

                    </div>

                <?php

                }

            } else {

                ?>

                <div class="msg-erro">

                    <?php

                    echo "Erro: " . $u->msgErro;

                    ?>

                </div>

            <?php

            }

        } else {

            ?>

            <div class="msg-erro">

                Preencha todos os campos!

            </div>

    <?php

        }

    }

    ?>

</body>



</html>

 

Postado

@Francisco Rolim de Moura

 

O problema está na utilização do escopo da class, existe outros problemas também.

 

Eu refatorei o seu código para que você possa entender a utilização do escopo dentro de uma class.

Eu também modifiquei a sua autenticação de senha para o padrão para o que é usando atualmente, "Bcrypt" muito mais seguro do que "MD5"!

 

Aqui tem um ótimo tutorial de como usar OOP em php: https://www.w3schools.com/php/php_oop_classes_objects.asp
 

<?php

session_start();

class Usuario
{
    private $db = [
        "host" => "localhost",
        "user" => "root",
        "pass" => "",
        "name"   => "projeto_comentarios"
    ];

    private $pdo;
    public $msgErro = "";

    function __construct()
    {
        try
        {
            $this->pdo = new PDO(
                "mysql:dbname=" . $this->db['name'] . ";host=" . $this->db['host'], 
                $this->db['user'], 
                $this->db['pass']
            );
        } 
        catch (PDOException $e)
        {
            $this->msgErro = $e->getMessage();
        } 
        catch (Exception $e)
        {
            echo "Erro: " . $e->getMessage();
        }
    }

    public function logar($usEmail, $usSenha)
    {
        $u = $this->pdo->prepare("SELECT `id`, `senha` FROM `usuarios` WHERE `email` = :e LIMIT 1;");

        $u->bindValue(":e", $usEmail);

        $u->execute();

        if ($u->rowCount() > 0)
        {
            $dado = $u->fetch();
            
            if (password_verify($usSenha, $dado['senha']))
            {
                $_SESSION['id_user'] = $dado['id'];

                return true;
            }
        }

        return false;
    }
}

$u = new Usuario;

if ($_SERVER['REQUEST_METHOD'] == "POST" && empty($u->msgErro))
{
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
    $senha = filter_input(INPUT_POST, 'senha', FILTER_SANITIZE_STRING);

    if (!empty($email) && !empty($senha))
    {
        if ($u->logar($email, $senha))
        {
            header("location: areaPrivada.php");
            die();
        }
        else
        {
            $u->msgErro = "Email e/ou senha incorretos!";
        }
    }
    else
    {
        $u->msgErro = "Preencha todos os campos!";
    }
}

?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css\login.css">
    <title>Login Teste</title>
</head>
<body>

    <div id="corpo-form">
        <h1>Entrar</h1>
        <form method="post">
            <input type="email" name="email" placeholder="Usuário">
            <input type="password" name="senha" placeholder="Senha">
            <input type="submit" value="Acessar">
            <a href="cadastrar.php">Ainda não tem cadastro? <strong>Cadastre-se</strong></a>
        </form>
    </div>
    <?php if (!empty($u->msgErro)): ?>
        <div class="msg-erro">
            <?= $u->msgErro ?>
        </div>
    <?php endif; ?>
</body>
</html>

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!