PHP- code conflict - blank page

1

The following code allows the user to log in and direct to a particular page, or log in as an administrator and direct to another page. The user login is working, however when logging out appears undefinied variable on line 28 and 29. And if I try to log in as an administrator, in addition to not redirecting, the page is left blank.

<?php
require('config.php');

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

    $stmt = $conn->prepare("SELECT password FROM registo WHERE email=?");
    $stmt->bind_param("s", $email);
    $email = $_POST['email'];
    $password = $_POST['password'];
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($pass);
    $stmt->fetch();
    if($stmt->num_rows > 0) {
        if(password_verify($password,$pass)) {
            $_SESSION['email'] = $email;
            $_SESSION['user'] = true;
            header("Location: home.php");
        } else {
            echo "<div class='form'>
                  <h3>Email/password is incorrect.</h3> <br>
                    Click here to <a href='memberarea.html'>Login</a>
                  </div>";
        }
    }
    } else {
        $ustmt = $conn->prepare("SELECT password FROM Admin WHERE email=?");
        $ustmt->bind_param("s", $email);
        $email = $_POST['email'];//linha 28
        $password = $_POST['password']; //linha 29
        $ustmt->execute();
        $ustmt->store_result();
        $ustmt->bind_result($pass);
        $ustmt->fetch();
        if($ustmt->num_rows > 0) echo "hello"; //linha 36 {
        if(password_verify($password,$pass)) {
                $_SESSION['email'] = $email;
                $_SESSION['Admin'] = true;
                header("Location: adminarea.html");
            } else { //linha 47
                echo "<div class='form'>
                        <h3>Email/password is incorrect.</h3> <br>
                        Click here to <a href='memberarea.html'>Login</a>
                      </div>";
            }

} else {
    echo "<div class='form'>
                        <h3>You are now logged out!.</h3> <br>
                        Click here to <a href='home.php'>Home</a>
                      </div>";
}
}
?>
    
asked by anonymous 25.05.2017 / 14:24

2 answers

1

The error of undefined variable occurs in item 18. The code is commented on and is self-explanatory.

<?php

// (0) Não falta um session_start() aqui?

require('config.php');

// (1) Verifica-se se existe um e-mail na requisição:
if (isset($_POST['email'])) {

    // (2) Monta uma consulta à tabela registo (seria registro)?
    $stmt = $conn->prepare("SELECT password FROM registo WHERE email=?");

    // (3) Associa a variável $email à consulta:
    $stmt->bind_param("s", $email);

    // (4) Recupera os valores de $email e $password:
    $email = $_POST['email'];
    $password = $_POST['password'];

    // (5) Executa a consulta:
    $stmt->execute();

    // (6) Armazena os resultados
    $stmt->store_result();

    // (7) Associa a variável $pass ao resultado da consulta:
    $stmt->bind_result($pass);

    // (8) Obtém o resultado da consulta:
    $stmt->fetch();

    // (9) Verifica se há resultados:
    if($stmt->num_rows > 0) {

        // (10) Valida a senha informada comparando com a do banco de dados:
        if(password_verify($password,$pass)) {

            // (11) Armazena as sessões:
            $_SESSION['email'] = $email;
            $_SESSION['user'] = true;

            // (12) Redireciona o usuário:
            header("Location: home.php");

        // (13) A senha informada é inválida:
        } else {

            // (14) Exibe uma mensagem de erro:
            echo "<div class='form'>
                  <h3>Email/password is incorrect.</h3> <br>
                    Click here to <a href='memberarea.html'>Login</a>
                  </div>";
        }

    }

// (15) A variável $_POST["email"] não existe:
} else {

    // (16) Monta uma consulta à tabela Admin:
    $ustmt = $conn->prepare("SELECT password FROM Admin WHERE email=?");

    // (17) Associa a variável $email à consulta:
    $ustmt->bind_param("s", $email);

    // (18) Recupera os valores de $email, que não existe (vide 15), e $password:
    $email = $_POST['email']; //linha 28
    $password = $_POST['password']; //linha 29

    // (19) Executa a consulta:
    $ustmt->execute();

    // (20) Armazena os resultados da consulta:
    $ustmt->store_result();

    // (21) Associa a variável $pass ao resultado da consulta:
    $ustmt->bind_result($pass);

    // (22) Obtém o primeiro resultado:
    $ustmt->fetch();

    // (23) Veririca se há resultados:
    if($ustmt->num_rows > 0) {

        // (24) Verifica se a senha informada é válida:
        if(password_verify($password,$pass)) {

            // (25) Sim, armazena os valores em sessão:
            $_SESSION['email'] = $email;
            $_SESSION['Admin'] = true;

            // (26) Redireciona o usuário:
            header("Location: adminarea.html");

        // (27) A senha não é válida:
        } else {

            // (28) Exibe uma mensagem de erro:
            echo "<div class='form'>
                    <h3>Email/password is incorrect.</h3> <br>
                    Click here to <a href='memberarea.html'>Login</a>
                  </div>";
        }

    // (29) Não há registros:
    } else {

        // (30) Exibe uma mensagem de erro (logout? deveria ser dados incorretos):
        echo "<div class='form'>
                <h3>You are now logged out!.</h3> <br>
                Click here to <a href='home.php'>Home</a>
              </div>";
    }
}

?>

Solution will be given as soon as you set a plausible logic for the problem.

    
25.05.2017 / 16:04
1

In order to do what you need, you would have to create only one table to store all users. You have two registo and Admin . In this table you would have, for example:

user, email, password, type (Usuário e Administrador)

Assuming your table was named usuarios , the code would look like this:

<?php
require('config.php');

// Verifica se está passando o e-mail e senha
if (isset($_POST['email']) and isset($_POST['password'])) {
    $email    = $_POST['email'];
    $password = $_POST['password'];

    // Seleciona o tipo pelo email e senha
    $stmt = $conn->prepare("SELECT type FROM usuarios WHERE email=? and password=?");
    $stmt->bind_param("ss", $email, $password);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($type);
    $stmt->fetch();

    if($stmt->num_rows > 0) {
        $_SESSION['email'] = $email;
        $_SESSION['type']  = $type; // crio uma sessão com o tipo para facilitar a identificação ao invéz de ter duas sessões (user e admin)

        if $type = 'usuario' { // Se for usuário
            header("Location: home.php");
        } else { // Senão é admin
            header("Location: adminarea.html");
        }
    } else { // Caso não tenha encontrado pelo e-mail e senha informado
        echo "<div class='form'>
            <h3>Email/password is incorrect.</h3> <br>
            Click here to <a href='memberarea.html'>Login</a>
            </div>";
    }
}
?>
    
25.05.2017 / 16:27