После отправки формы входа URL-адрес остается в действии php


Привет, в настоящее время я работаю над входом пользователя, где может быть 2 разных ситуации, когда человек отправляет форму.

Чего я пытаюсь добиться, так это того, что если кто-то войдет в систему, он будет перенаправлен либо на страницу пользователя, либо на страницу администратора в зависимости от того, в какой таблице находится его имя пользователя.

Моя проблема в том, что после отправки формы браузер показывает пустую страницу без ошибок, при этом URL-адрес является действием php формы.

Вот мой html-файл

<?php
//Start session
//error_reporting = E_ALL & ~E_NOTICE;
ini_set( 'error_reporting', E_ALL & ~E_NOTICE);
session_start();

//Unset the variables stored in session
unset($_SESSION['SESS_MEMBER_ID']);
unset($_SESSION['SESS_USERNAME']);
unset($_SESSION['SESS_PASSWORD']);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="css/style.css" title="" />
<link rel="stylesheet" href="css/animate.css" title="" />
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,600,700,300' rel='stylesheet' type='text/css'>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.js">            </script>
<script src="js/mouseEvents.js"></script>
<title>Grey Avenue Item Inventory Login</title>
</head>
<body>
<div id="container">

<div id="mainform" >
    <div id="formcontainer" class="animated fadeInDown">
        <div id="formheader">
        <div class="logocont">
            <a href="#"><span class="logoImg"></span></a>
            <h2 class="textheader">Inventory System Log-In</h2>
        </div>

        </div>
    <form action="login.php" method="post" id="loginform">

    <div class="inputbox">  <input type="text" name="username" placeholder="Username" maxlength="12"/></div>
    <div class="inputbox"> <input type="password" name="password" placeholder="Password"  maxlength="12"/></div>
    </form>
    <div id="loginbutton">
            <button type="submit" form="loginform" class="loginbutton" value="Log In">
            <span class="loginbut_text">Log In</span>
            </button>
            <button class="regbutton" value="Register">
            <span class="loginbut_text">Register</span>
            </button>
        </div>  

        <div id="errormsg">
<?php
if( isset($_SESSION['ERRMSG_ARR']) && is_array($_SESSION['ERRMSG_ARR']) &&     count($_SESSION['ERRMSG_ARR']) >0 ) {
echo '<ul class="err">';
foreach($_SESSION['ERRMSG_ARR'] as $msg) {
echo '<li>',$msg,'</li>';
}
echo '</ul>';
unset($_SESSION['ERRMSG_ARR']);
}
?>
</div>
</div>
</div>
</div>



</body>
</html>

И мой login.php файл

<?php

session_start();

require("connect.php");
require("lib/password.php");

//Array to store validation errors
$errmsg_arr = array();

//Validation error flag
$errflag = false;


$username = $_POST["username"];
$password = $_POST["password"];

//Input Validations
if($username == "") {
    $errmsg_arr[] = "*Username missing";
    $errflag = true;
}
if($password == "") {
    $errmsg_arr[] = "*Password missing";
    $errflag = true;
}

//If there are input validations, redirect back to the login form
if($errflag) {
    $_SESSION["ERRMSG_ARR"] = $errmsg_arr;
    session_write_close();
    header("location: index.php");
    die();
}

if ($sql = $conn->prepare("SELECT id, username, password, firstName, lastName FROM users WHERE username = ?")){

    $sql->bind_param("s", $username) ;
    $sql->execute();
    $sql->store_result();
    $result = $sql->num_rows;
    $sql->bind_result($id, $username, $passwordhash, $firstName, $lastName);
    $sql->fetch();

    if ($result > 0){
        if(password_verify($password, $passwordhash)){
            session_regenerate_id();
            $_SESSION["SESS_MEMBER_ID"] = $id;
            $_SESSION["SESS_USERNAME"] = $username;
            $_SESSION["SESS_PASSWORD"] = $password;
            $_SESSION["SESS_FIRSTNAME"] = $firstName;
            $_SESSION["SESS_LASTNAME"] = $lastName;

            session_write_close();

            header("location: inventory.php");
            die();  
        }
        else {
            //Login failed
            $errmsg_arr[] = "Username and Password do not match";
            $errflag = true;
            if($errflag) {
                $_SESSION["ERRMSG_ARR"] = $errmsg_arr;
                session_write_close();
                header("location:index.php");
                die();
            }
        }
    }
}
else {
    if($sql = $conn->prepare("SELECT id, username, password, firstName, lastName     FROM admin WHERE username=?")){
        $sql->bind_param("s", $username);
        $sql->execute();
        $sql->store_result();
        $result = $sql->num_rows;

        $sql->bind_result($id, $username, $passwordhash, $firstName, $lastName);
        $sql->fetch();

        if($result > 0){
            if(password_verify($password, $passwordhash)){
                session_regenerate_id();
                $_SESSION["SESS_MEMBER_ID"] = $id;
                $_SESSION["SESS_USERNAME"] = $username;
                $_SESSION["SESS_PASSWORD"] = $password;
                $_SESSION["SESS_FIRSTNAME"] = $firstName;
                $_SESSION["SESS_LASTNAME"] = $lastName;

                session_write_close();

                header("location:  http://www.greyavenue.ph/shoplogin/inventoryadmin.php");
                die();  
            }
            else {
                //Login failed
                $errmsg_arr[] = "Username and Password do not match";
                $errflag = true;
                if($errflag) {
                    $_SESSION["ERRMSG_ARR"] = $errmsg_arr;
                    session_write_close();
                    header("location: index.php");
                    die();
                }
            }
        }
        else{
            //Login failed
            $errmsg_arr[] = "Username and Password not found";
            $errflag = true;
            if($errflag) {
                $_SESSION["ERRMSG_ARR"] = $errmsg_arr;
                session_write_close();
                header("location: http://www.greyavenue.ph/shoplogin/index.php");
                die();
            }
        }
    }
}
?>

Я в замешательстве, потому что логин, кажется, функционирует и перенаправляет браузер на страницы, когда я раньше не хэшировал пароль, но теперь после изменения кода с помощью хэш-функции URL-адрес остается в этом php-файле.

Очень ценю ваши усилия, потратившие время на то, чтобы прочитать и ответить на мой вопрос заранее! Спасибо!

Author: Axel Amthor, 2015-06-02

4 answers

Здесь логическая ошибка:

Ваш код, разделенный до мяса:

if ($sql = $conn->prepare("SELECT id, username, password, firstName, lastName FROM users WHERE username = ?")){

    // retrieve result

    if ($result > 0){
        // check result
    }
}
else {
    // select from admin
}

В случае, если у вас есть тупель пользователя/pwd, который не подходит, $result равно 0. В этом конкретном cse ни одна из ветвей перенаправления не будет затронута, и страница просто отображается как пустая.

Вам необходимо изменить примерно следующее:

if ($sql = $conn->prepare("SELECT id, username, password, firstName, lastName FROM users WHERE username = ?")){
  // handle sql error
}
// retrieve result
if ($result > 0){
        // check result, either logged in or error
}

// no result in users, check admin:
if ($sql = $conn->prepare("SELECT id, username, password, firstName, lastName FROM admin WHERE username = ?")){
  // handle sql error
}
// retrieve result
if ($result > 0){
        // check result, either logged in or error
}
 1
Author: Axel Amthor, 2015-06-02 14:01:51

Внесите эти изменения в свой html-код

        <form action="login.php" method="post" id="loginform">
        <div class="inputbox">  <input type="text" name="username"   placeholder="Username" maxlength="12"/></div>
       <div class="inputbox"> <input type="password" name="password"   placeholder="Password"  maxlength="12"/></div>
        <div id="loginbutton">
        <button type="submit" form="loginform" class="loginbutton" value="Log In">
        <span class="loginbut_text">Log In</span>
        </button>
        <button class="regbutton" value="Register">
        <span class="loginbut_text">Register</span>
        </button>
       </form>
 0
Author: Mudassar Saiyed, 2015-06-02 13:36:41

Похоже, что происходит то, что отчеты об ошибках отключены (вы включили их в своем файле "html", но не в login.php ) и в то же время есть проблема внутри вашей функции password_verify().

Вы также должны опубликовать эту функцию, чтобы мы могли взглянуть.

ОБНОВЛЕНИЕ Также, если вы используете, как кажется, password_verify, который не является встроенным, и ваш PHP 5.5 или выше, вы можете пытаться определить функцию с зарезервированным именем (password_verify) и, таким образом, получает фатальную ошибку, которую вы не видите, так как, по-видимому, ошибки не отображаются на вашем сервере.

 0
Author: Ioannis Loukeris, 2015-06-02 13:45:41

Привет, ребята, я решил свою проблему, которая была довольно простой, и мне очень жаль, если я вас побеспокоил.

Я забыл поместить вторую инструкцию запроса else в первую, где она проверяет количество доступных строк.

Большое спасибо за ваши идеи и отзывы!

 0
Author: Kenreaper, 2015-06-02 14:07:07