ULTIMATE PHP Blog

Conheça 15 Ferramentas Essenciais Para PHP
15 Ferramentas Essenciais Para PHP

Coloque seu e-mail abaixo e baixe agora um PDF 100% gratuito mostrando 15 ferramentas indispensáveis para PHP

Fique tranquilo. Odeio spam tanto quanto você :)
Sobre Roberto Beraldo
Desenvolvedor Web desde 2007, com foco em PHP. Criador do Curso ULTIMATE PHP e autor do Blog do Beraldo (rberaldo.com.br), onde compartilha dicas sobre PHP e Programação em geral.
  • Airton Miguel Junior

    Boa tarde.
    Achei ótimo o seu artigo e estou tentando implementá-lo, mas aparece para mim o seguinte erro quando tempo realizar o login: Fatal error: Uncaught Error: Call to undefined function make_hash() in C:xampphtdocssistemaloginlogin.php:17 Stack trace: #0 {main} thrown in C:xampphtdocssistemaloginlogin.php on line 17

    • Airton Miguel Junior

      E eu me certifiquei de colocar outro “require ‘functions.php’;” dentro do arquivo login.php para ter certeza que seria possível realizar a chamada da função, mas ainda assim nada feito… Poderia me ajudar por favor?

  • Eugênio Junior

    Boa tarde Beraldo!
    Curti demais o artigo! Simples e preciso!
    Só tenho uma dúvida:
    Você deu a dica de criar uma array na sessão…certo? Para não destruir toda a sessão.
    Mas se o sistema tem login então o ideal não seria destruir mesmo? Para não ficar dados em sessão sem o usuário estar logado?
    Não entendi.

    • Olá, Eugênio.
      Se você for usar a sessão só para login, pode destruir a sessão inteira.
      Sugeri o array pois sessões são úteis para várias coisas, não só login

  • Ezeki Gomes

    Cara Show de Bola, o Único artigo que me ajudou realmente….. OBRIGADO!

  • Caio

    Como que eu poderia manipular esse codigo com a classe conexao sendo statica?

    require_once ‘config.php’;
    class DB{
    private static $instance;

    public static function getInstance(){

    if(!isset(self::$instance)){

    try {
    self::$instance = new PDO(‘mysql:host=’ . DB_HOST . ‘;dbname=’ . DB_NAME, DB_USER, DB_PASS);
    self::$instance->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    self::$instance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    } catch (PDOException $e) {
    echo $e->getMessage();
    }
    }
    return self::$instance;
    }
    public static function prepare($sql){
    return self::getInstance()->prepare($sql);
    }
    }

  • Caio

    Oi, queria sua ajuda, tentei adicionar este codigo no meu CRUD PDO, so que esta dando erro nao sei sobre oque, o login nao vai, como sou iniciante ainda no php queria saber se poderia me ajudar a como adptar o codigo. Teria uma forma de eu te mostrar o meu crud

  • Lucas Figueredo

    Beraldo, me dê mais uma aula ai meu amigo.
    preciso printar dados de uma array, fiz tudo normalmente como deve ser feito para o print pegar os dados já definidos na array.
    Porém eu preciso que no print o valor venha do banco com a session, como eu faço isso?
    Como eu fiz:
    $array = [
    “3” => “12%”,
    “6” => “15%”,
    “12” => “17%”,
    ];

    print $array[‘3’];

    Como preciso:
    $array = [
    “3” => “12%”,
    “6” => “15%”,
    “12” => “17%”,
    ];

    print $array[‘.$_SESSION[‘user_id’];’]; OBS: Só pra vc entender o que quero, não fiz assim pq sei que dá erro.

    No print pra vc entender, eu preciso que o valor 3 por exemplo venha do banco que já está definido qual o valor do usuário.

    Me ajuda novamente ai meu amigo.

    • Você só trocou “.” por “;”. O certo seria:

      print $array[‘.$_SESSION[‘user_id’] . ‘];

      E como o índice é numérico, nem precisa de aspas:

      print $array[$_SESSION[‘user_id’]];

      • Lucas Figueredo

        vdd cara, como eu não me lembrei da questão de numérico não usa aspas… aff, funfou aqui, quando for trabalhar novamente com esse tipo de informação não me esquecerei mais disso, muito obg Beraldo, ajudou de maaaaaais.

      • Lucas Figueredo

        Nesse caso então se a informação não for numérico eu poderei usar aspas ou nem precisa tbm que o valor é retornado normalmente?

  • Zack Arcanjo

    GOD do PHP, SHOW DE BOLA CARA. NOTA 1000000.

  • Lucas Figueredo

    Parabéns Roberto, perfeito!
    Funcionou excepcionalmente bem aqui.
    Devido a isso, vou continuar seguindo seus tutoriais. Nota 100000000000 para você cara.
    Fiz apenas alteração na forma de login, ao invés da pessoa logar com e-mail, eu alterei para a pessoa logar com CPF afim de usar em um sistema meu que requer esse tipo de login do cliente, agora irei fazer apenas o front-end para adaptar no código. Muito obrigado pelo tutorial.

    • Obrigado, Lucas!
      Fico feliz que o artigo tenha ajudado você! 😊

      • Lucas Figueredo

        Boa noite meu amigo, me tire uma dúvida aqui, como posso exibir outras informações do usuário, tipo, ali você exibe o nome da pessoa do cadastro, mas eu preciso informar uma porrada de dados do usuário, como consigo fazer isso? Eu já fiz isso não em pdo, tentei fazer ali, mas não consegui.

        • Lucas Figueredo

          Para simplificar, vc em pronto ai uma consulta, que exibe as informações de outras tabelas do db usando essa mesma conexão init.php sendo que tentei aqui e não obtive sucesso devido a essa conexão. vc poderia simplificar pra mim me dando essa consulta mastigada cara? Só para constar estou no pdo agr a pouco empo, nem para o msqli ainda não aprendi a fundo, só sei pegar o código pronto e modificar.
          Mas irei estudar direito sobre pdo assim que eu tiver tempo.

        • Se forem dados que sempre serão exibidos, vale a pena salvar na session, da mesma forma que fiz com “user_id” e “user_name”.
          Se forem dados que serão exibidos apenas em algumas páginas, é melhor montar uma consulta nas páginas onde os dados serão exibidos. É um simples SELECT usando $_SESSION[‘user_id’] no WHERE.
          Tenho um tutorial passo-a-passo, bem mastigado, sobre PDO: http://rberaldo.com.br/pdo-mysql/

          • Lucas Figueredo

            Blz, consegui fazer aqui algumas coisas, mas nada 100% do que preciso, vou seguir seu Tuto. Muito obg mesmo. Novamente, ajudou muito.

          • Lucas Figueredo

            Beraldo, como passo a session na where? Simplesmente do jeito que vc adicionou ai? Tipo: Select coluna1, coluna2 From “Table” Where $_session[‘user_id’] assim que deverei fazer?

          • A sintaxe do WHERE é sempre assim: campo = ‘valor’ (sem aspas se for valor numérico).
            Então basta fazer isto:

            $sql = “SELECT campos FROM tabela WHERE id = ” . $_SESSION[‘user_id’];

            Melhor ainda é usar Prepared Statements, com bindParam, como mostro no meu artigo sobre PDO

          • Lucas Figueredo

            Vou fazer aqui, assim que eu tiver o resultado, irei fazer o feedback, até então… Agradeço muito novamente pela atenção e instrução.

          • Lucas Figueredo

            Cara, sensacional, vc é simplesmente fodastico, literalmente expert no pdo, funfo aqui de boa cara, maravilhosamente bem, cara, assim que eu liberar esse projeto aqui, que já está praticamente pronto depois disso, eu irei entrar nesse seu curso cara, não entrei ainda devido a falta de tempo, mas logo irei poder dedicar aos estudos, pretendo ser bom no pdo como vc. Muito obg mesmo.

          • Obrigado! Que bom que conseguiu resolver. Fico feliz que meus artigos te ajudaram 😊

          • Lucas Figueredo

            Beraldo, me passa como posso fazer um “Count” para exibir a quantidade de registros na tabela dos usuários? tentei algumas formas aqui que eu pensei que saberia, mas ao ler algumas coisas na net, percebi que o pdo tem uma forma diferente de fazer. Tentei como falavam mas ficou dando erro nos parâmetros ao tentar adaptar na consulta. Quero só o count nada mais na consulta.

          • Não muda nada ao usar PDO. Basta executar a consulta abaixo:

            SELECT COUNT(*) AS total FROM tabela;

            Será retornada a coluna “total” com o número de registros na tabela de nome “tabela”

          • Lucas Figueredo

            Beraldo, obg pela explicação, segui a consulta dessa forma, porém no meu servidor local xampp, funciona belezinha, agr depois que joguei no job no servidor online a pagina passou a não abrir me dizendo que está com um erro 500.
            Fiz a consulta dessa forma:
            query($sql) as $row) {
            print $row[‘total’] . “t”; } } ?>

            Aonde eu errei ai?

          • O método query() não retorna os resultados da consulta. Ele apenas retorna true ou false.
            Para buscar os resultados de uma consulta, use o método fetch() ou fetchAll().

          • Lucas Figueredo

            Ótimo novamente, funcionou aqui. Quanto ao erro 500, eu estava com muito sono na hora que estava trabalhando no job e descobri que estava substituindo a pagina errada no server. Aff, tudo certo agr. Obg pelo apoio.

  • Boa tarde. Estou com uma dúvida, caso eu não queira mostrar a mensagem de erro dentro do login.php e sim no form-login.php, como eu posso fazer para armazenar em uma variável e imprimir a mesma na página de login?

  • Danilo Ferreira

    Boa tarde, ótimo conteúdo. Porém, sempre da e-mail e senha incorretos e já verifiquei o código inteiro.

    • Olá.
      Faça debug das variáveis principais. Exiba o valor de $passwordHash e compare com o valor salvo no banco de dados

      • Danilo Ferreira

        O Problema era na variavel $passwordHash, já foi resolvido muito obrigado !!!

  • Sora

    Gostei muito, me ajudou bastante em um projeto meu aqui. Eu tenho uma dúvida, se eu quiser fazer um sistema onde o usuario possa postar algo em sua linha do tempo e ver o que as pessoas que sao amigas dele postam, como eu poderia fazer? No banco de dados eu preciso por um registro de “postagens varchar(255)”?
    Muito obrigado, gostei muito do seu blog 🙂

  • fiz esse codigo mais

    prepare(“INSERT INTO config (site_titulo, site_tags) VALUE (:site_titulo,:site_tags, :site_descricao)”);
    $dados = array(‘:site_titulo’ => $site_titulo, ‘:site_tags’ => $site_tags);
    $cadastra = $insert->execute($dados);

    if($cadastra){
    echo ‘alert(“cadastrato com sucesso!”); location.href=”index.php?abrir=configs”;’;

    }else {
    echo ‘alert(“nao foi possivel cadastra!”); location.href=”index.php?abrir=configs”;’;

    }
    }
    ?>

    Título do Site

    Tags do Site

    Enviar
    Limpa

    mais retorna

    link
    localhost/php7/admin/conteudo/card.php
    retorna
    admin/conteudo/card.php?
    e nao envia pro bd

  • ola boa noite amigo, vc tem algum poste sobre
    Consultar, Inserir, Editar e Excluir utilizando PDO ?

  • podes me ajuda ?

    Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user ‘asbhostt_alyson’@’localhost’ (using password: YES) in /home/asbhosttk/public_html/php7/admin/functions.php:8 Stack trace: #0 /home/asbhosttk/public_html/php7/admin/functions.php(8): PDO->__construct(‘mysql:host=loca…’, ‘asbhostt_alyson’, ‘qcOkD+uZGHt,’) #1 /home/asbhosttk/public_html/php7/admin/login.php(19): db_connect() #2 {main} thrown in /home/asbhosttk/public_html/php7/admin/functions.php on line 8

    • O erro diz que o MySQL negou o acesso. Verifique as credenciais (host, usuário e senha)

  • Carlos Magno Borba Chaves

    Amigo, muito bom seu artigo!!
    Só que o meu esta retornando o erro que não digitei o email e a senha nos campos do login!!
    Vc sabe dizer o prq?
    Já conferi tudo e não achei o erro.
    Desde já agradeço

    • Olá.
      Verifique se o atributo “name” está igual à string entre aspas simples em $_POST.

      Por exemplo:
      no HTML:
      no PHP: $_POST[‘email’]

  • Rhaniery Mueller

    otimo artigo, porem esta sempre retornando que o usuario ou senha invalidos

    • Verifique se preencheu os dados corretamente. Compare o hash salvo no banco com o hash gerado na ação de login.

  • Bruno Rodrigues Moutta

    Olá muito bom o artigo.
    Porém estou tendo dois erros, um é :session_start(): Cannot send session cookie e o outro é o :Cannot modify header information – headers already sent by apenas modifiquei o endereço do seu código.

    }else{

    // pega o primeiro usuário
    $user = $users[0];
    session_start();
    $_SESSION[‘logged_in’] = true;
    $_SESSION[‘user_id’] = $user[‘id’];
    $_SESSION[‘user_name’] = $user[‘name’];

    header(‘Location: https://sirm.000webhostapp.com/Home.php‘);
    }
    ?>

    Saberia o pq desse erro?
    Grato.

  • root mean square

    Bom, achei a pagina do Beraldo procuranto funções para tempo e matemáticas.
    Muito bom. Sempre uma informação ou formato de comando. Bom.

  • THIAGO SOUZA DOS SANTOS

    O meu deu Parse erro: syntax erro, unexpected, expecting ir) in C:Xamphtdocslogin.php on LINE 8.

    • Poste aqui o conteúdo de login.php entre as linhas 7 e 9

      • THIAGO SOUZA DOS SANTOS

        Consegui acertar, mais apareceu um novo erros.
        Fatal error: Uncaught Error: Call to undefined funcionários db_conect() in C:Xamphtdocslogin.php : 19 Stack trave: #0 {mais} trown in C:Xamphtdocslogin.php on line 19

      • THIAGO SOUZA DOS SANTOS

        Valeu, eu refiz tudo e agora deu certo, obrigado.

  • Lucas Rocha

    Olá Roberto, como implementar notificações Toastr nesse exemplo? no arquivo login.php no lugar do echo..

  • Bruno Rodrigues

    Olá Roberto, primeiramente gostaria de parabenizar pelas explicações aqui colocadas. Gostaria de saber se é possível criar o sistema de login e senha, onde assim que usuário logar o painel já apresenta o cadastramento . Porém ele só tem a opção de visualizar, editar e remover os dados e não exibir o total de usuários que ali estão cadastrados. Basicamente um sistema de privilégios onde o usuário só mexe ou visualiza a conta dele.

    • Olá. Sim, é possível. A ideia é criar mais um campo na tabela (“level”, por exemplo) com um valor inteiro que indique o nível de acesso do usuário. Ao exibir cada recurso, antes faça um if para verificar o nível do usuário logado, para determinar se ele tem ou não acesso ao recurso solicitado.

      • Bruno Rodrigues

        Tem algum exemplo para demonstrar?

        • Não tenho artigo sobre isso. Mas procure por “sistema de login com níveis de acesso”, que encontrará vários sites falando sobre esse assunto

  • Dragos Zagareanu

    Boa tarde, eu preciso de ajuda a fazer um login para o meu website, ainda sou novo, só preciso de um login e uma password, sem email. Eu gostava que me ajuda-se se for possivel. Vou compratilhar o ficheiro do meu website.
    Aqui o meu email: dragosz19@gmail.com

    • Olá. A lógica é a mesma, seja usando email ou usando login (username). Onde você tem dúvidas, exatamente?

      • Dragos Zagareanu

        se vc poder me dizer o seu email, estaria grato, pra poder enviar o meu projeto.

        • Clique no link “Contato” no topo do site e me mande uma mensagem

          • Dragos Zagareanu

            Já mandei mensagem.

  • betobto

    Boa tarde, uma pergunta… Se eu criar mais um campo no banco de dados “status”, e o usuario estiver como “0” (inativo) e ele for tentar logar, para gerar uma mensagem… como fazer?

    • Olá. Nesse caso, no SELECT do login, busque, além do ID e do nome, o campo “status”. Em seguida, verifique o valor retornado. Se for 0, exiba a mensagem de erro. Caso contrário, efetue o login normalmente.

  • jean

    Boa noite neste pequeno artigo para ficar mais esclarecido devia colocar códigos de form_cadastro.php , verifica_cadastro_existente.php e sim depois o login.php .Falo isso pois assim fica mais facil de entender o sistema de login com cadastro essa é minha opinião aos que não muita idéia de php.

  • Márcio Souza

    Boa tarde.
    Tenho um site em php que essa semana após o Cpanel do servidor ser atualizado, a pagina de login da administração para de funcionar, não loga mais.
    O que devo fazer?

  • Cristiene Rodrigues

    Só mais uma dúvida…no sistema de cadastro, coloquei senha. Tentei passar o valor do post para uma variável e já alterando para md5 e mandando inserir no banco, mas não deu certo… o que está errado?

    Salvei a senha inserida no formulario:
    $password = isset($_POST[‘password’]) ? $_POST[‘password’] : null;

    Fiz o hash com a senha usando a função que você já tinha criado:
    $passwordHash = make_hash($password);

    E inseri no banco:
    $sql = “INSERT INTO users(name, lastname, email, password) VALUES(:name, :lastname, :email, :$password)”;

    $stmt->bindParam(‘:password’, $passwordHash);

  • Cristiene Rodrigues

    Parabéns pelo post!
    Teria como inserir níveis de acesso nesse código?

    • Olá. Obrigado!
      Sim, é possível. A forma mais simples é adicionar um campo para armazenar o nível do usuário, na tabela de usuários. Em seguida basta verificar o valor desse campo, fazendo um if para determinar se o conteúdo pode ser exibido.
      Essa é a ideia básica. Mas há várias formas de implementar. Leia sobre ACL (Access Control Level).

  • Ednelson Amaral

    Bom dia, Beraldo.
    Então eu excluir a criptografia para que eu pudesse entender melhor o script, porém agora estou com um pequeno problema, onde aodigitar login e senha me retorna o seguinte erro.Fatal error: Call to undefined function isLoggedIn() in …check.php – Cara, agradeceria muito se me ajudasse nessa. Não sei mais o que fazer, da mais essa moral aí favor, se puder lógico! agradecido.
    Obs: Estou migrando os arquivos das pastas login e cadastro para USERS.
    https://drive.google.com/file/d/0B2LlVUSZUxP0eTBVMlFGVWVxeFU/view?usp=sharing

  • Ednelson Amaral

    Então pessoal alguém saberia como eu posso fazer um cadastro de uma senha no banco sendo que já cadastre em HASH MD5?
    prepare($sql);
    $stmt->bindParam(‘:name’, $name);
    $stmt->bindParam(‘:email’, $email);
    $stmt->bindParam(‘:password’, $password);
    $stmt->bindParam(‘:gender’, $gender);
    $stmt->bindParam(‘:birthdate’, $isoDate);

    if ($stmt->execute())
    {
    header(‘Location: index.php’);
    }
    else
    {
    echo “Erro ao cadastrar”;
    print_r($stmt->errorInfo());
    }

    • Basta chamar a função md5() no parâmetro. Assim:

      $stmt->bindParam(‘:password’, md5($password));

      • Ednelson Amaral

        Vou tentar aqui Roberto. Gostei do site e já é meu favorito, obrigado Cara, estamos aqui para ajudar uns aos outros,conta com agente ai.Abraços.

        • Ednelson Amaral

          Funcionou Roberto, obrigado cara, eu não acreditava mas Papai Noel existe mesmo :). Roberto, eu gostaria de abrir um tópico para saber a opinião da alera e sua também me responde uma coisa. Qual segurança o MD5 traz se a criptografia da senha está somente no banco de dados? se por acaso o sistema for invadido por qual quer outra brecha o MD5 infunenciaria em alguma coisa sendo que qual quer site na internet Decrypta esse MD5? Por quer usar, qual segurança ele me traz? Abraço, thau!

          • Não é bem assim. Não é qualquer site que decifra MD5. MD5 é um hash e, sendo assim, não há como decodificá-lo. O que existem são tabelas de associação (chamadas rainbow-tables), que vinculam uma string a seu hash md5. Ou seja, a “decodificação” só pode ser feita se o hash já for conhecido ou se forem feitas tentativas repetidamente (força bruta ou brute force).
            Por isso o ideal é usar um salt e também misturar hashes. Por isso usei md5 e sha1 no artigo.
            Para saber mais sobre salt, veja: http://rberaldo.com.br/seguranca-em-sistemas-de-login-senhas-e-cookies/#salt

          • Ednelson Amaral

            Vlw Beraldo vou da uma olhada
            Obrigado cara.

          • Ednelson Amaral

            não conseguiu, meu conhecimento em PHP ainda é Juvenil 🙂 mas estou tentando consertar…

      • Ednelson Amaral

        apartir deste cadastro que te mandei acima, estou tentando fazer login (em um outro sistema seu de login com MD5) mas não está logando, só faz login com “123mudar” por quê?

        • Edson Carlos

          Amigo, basta alterar a senha cadastrada no banco de dados com a mesma criptografia. Recomendo fazer um sistema de cadastro com a mesma criptografia utilizada no sistema de login. Aqui aborda e o foco é o sistema de login.

  • David Almeida

    Vlw me ajudou muito sua postagem

  • Pedro Henrique

    Voce criou o arquivo check.php para o panel.php mas ele tem uma falha de bypass redirect, como poderia resolver isso?

  • James Silva (espacojames. com.

    Amigo, seu sistema é otimo, mas como faço para descriptogragar a senha? Preciso fazer isso para alterar a senha

    * Cria o hash da senha, usando MD5 e SHA-1
    function make_hash($str)
    {
    return sha1(md5($str));
    }

    • Não é possível desfazer o hash.
      Para implementar o Esqueci Minha Senha, há duas possibilidades:
      1. Enviar uma nova senha aleatória, pedindo para o usuário logar e alterá-la o mais breve possível
      2. Gerar um link único que envia o usuário para uma página onde ele define uma nova senha

  • Mateus M Gomes

    cara salvou meus cabelos. já estava ficando grisalho tentando achar um sistema mais simples e de fácil entendimento e implementação para o meu sistema! Valeu mesmo!

  • Helder Tosta

    Beraldo como seria o raciocínio para colocar restrições a alguns usuários. Por exemplo como eu poderia fazer para que dependendo do usuário ele tivesse acesso apenas a algumas paginas enquanto outros usuários poderiam acessar todas. desde já agradeço e deixo meus parabéns pois os seus artigos tem me ajudado muito na minha caminhada para aprender PHP.

    • Olá. Na tabela de usuários, você pode adicionar um campo a mais que diz qual é o nível de acesso do usuário. Conforme esse valor, exiba ou não algum conteúdo. A ideia é fazer um if antes de exibir cada uma das páginas.

  • Henrique

    Parabéns pelo tópico e pela quantidade de detalhes e explicações que deixou. Beraldo, fiquei com um pequeno problema quanto a isso. Mesmo com os dados inseridos no form batendo com os do banco de dados, continuo recebendo que os dados estão incorretos.

    Vou dar uma estudada mais a fundo pra corrigir esse problema.

    • Olá, Henrique.
      Sobre o erro, dê echo nas variáveis e veja os valores de cada uma delas. Compare os dados vindos do formulário com oso valores vindos do banco. Deve haver algum erro nesse ponto.
      Sobre o curso, não pretendo lançar livro físico. A ideia é manter o curso 100% online, para que todos os alunos possam receber quaisquer futuras atualizações.

  • Antonio Junior

    Parabéns pela iniciativa Beraldo de compartilhar informação.
    Esse sistema de login mim ajudou com o trabalho da faculdade, que é um sistema para reserva de veículos o funcionário faz login e realiza uma reserva. Vlu!

    • Que bom que foi útil

      Só uma correção. Sou Beraldo (meu sobrenome), não Bernardo 🙂