После отправки формы входа 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-файле.
Очень ценю ваши усилия, потратившие время на то, чтобы прочитать и ответить на мой вопрос заранее! Спасибо!
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
}
Внесите эти изменения в свой 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>
Похоже, что происходит то, что отчеты об ошибках отключены (вы включили их в своем файле "html", но не в login.php ) и в то же время есть проблема внутри вашей функции password_verify().
Вы также должны опубликовать эту функцию, чтобы мы могли взглянуть.
ОБНОВЛЕНИЕ Также, если вы используете, как кажется, password_verify, который не является встроенным, и ваш PHP 5.5 или выше, вы можете пытаться определить функцию с зарезервированным именем (password_verify) и, таким образом, получает фатальную ошибку, которую вы не видите, так как, по-видимому, ошибки не отображаются на вашем сервере.
Привет, ребята, я решил свою проблему, которая была довольно простой, и мне очень жаль, если я вас побеспокоил.
Я забыл поместить вторую инструкцию запроса else в первую, где она проверяет количество доступных строк.
Большое спасибо за ваши идеи и отзывы!