我正在为一家小公司开发一个内部使用的简单应用程序。我无法让帐户登录正常工作,我相信它与$ _SESSION没有像我预期的那样设置。现在我对PHP很新,并且一直在学习。
index.php包含:
<?php
session_start();
require_once('includes/config.inc.php');
require_once('includes/functions.inc.php');
// Check login status -- if not logged in, redirect to login screen
if (check_login_status() == false) {
redirect('login.php');
}
所以当我加载应用程序时,我被重定向到login.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
<title>Login Page</title>
<link rel="stylesheet" type="text/css" href="css/login.css" />
</head>
<body>
<form id="login-form" method="post" action="includes/login.inc.php">
<fieldset>
<legend>Login to Inventory System</legend>
<p>Please enter your username and password to access the Inventory system</p>
<label for="username">
<input type="text" name="username" id="username" />Username:
</label>
<label for="password">
<input type="password" name="password" id="password" />Password:
</label>
<label>
<input type="submit" name="submit" id="submit" value="Login" />
</label>
</fieldset>
</form>
</body>
</html>
当我在登录页面点击提交时,会调用/ login.inc.php:
<?php
session_start();
require_once('config.inc.php');
require_once('functions.inc.php');
// Escape any unsafe characters before querying database
$username = $con->real_escape_string($_POST['username']);
$password = $con->real_escape_string($_POST['password']);
// Construct SQL statement for query & execute
$query = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . MD5 ($password) . "'";
$result = mysqli_query($con,$query) or die(mysqli_error($con));
// If one row is returned, username and password are valid
if (is_object($result) && $result->num_rows == 1) {
$_SESSION['logged_in'] = true;
redirect('../index.php');
} else {
redirect('../login.php');
}
?>
现在我已经能够确定登录正在成功处理,因为如果我在index.php中禁用check_login_status函数,如果我使用有效帐户登录,我将被重定向到index.php。在相同条件下,错误的密码将重新加载login.php。在禁用该功能的情况下,我也尝试在index.php的顶部添加“print_r($ _ SESSION)”,但是没有任何东西加载,这让我觉得我的功能有问题。
functions.inc.php:
<?php
function redirect($page) {
header('Location: ' . $page);
exit();
}
function check_login_status() {
// IF $_SESSION['logged_in'] is set, return the status
if (isset($_SESSION['logged_in'])) {
return $_SESSION['logged_in'];
}
return false;
}
?>
config.inc.php:
<?php
$con=mysqli_connect("server_name","user","pass","db_name");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
?>
我真的很茫然,我不知道问题出在哪里。我用“php -l file.php”检查了语法错误,发现没有语法错误。我不知道如何用这个做任何其他调试,或者我缺少什么。真的很感激帮助!
代码块可能会稍微偏离。 是的,我知道不建议使用MD5密码,一旦我可以在我的应用中获得功能,这将被更改为使用salt。一旦我登录工作正常,我也将逃避/准备所有MySQL查询。
答案 0 :(得分:0)
这不会解决您的问题,但会简化您的check_login_status功能。
function check_login_status() {
return (isset($_SESSION['logged_in']) && $_SESSION['logged_in']===true);
}
还没有设置会话变量,因为浏览器没有存储cookie。 header()函数会覆盖已设置的其他标题。
很多人使用session_write_close();作为修复。在重定向之前添加它。
请参阅:https://bugs.php.net/bug.php?id=14636
<?php
session_start();
require_once('config.inc.php');
require_once('functions.inc.php');
// Escape any unsafe characters before querying database
$username = $con->real_escape_string($_POST['username']);
$password = $con->real_escape_string($_POST['password']);
// Construct SQL statement for query & execute
$query = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . MD5 ($password) . "'";
$result = mysqli_query($con,$query) or die(mysqli_error($con));
// If one row is returned, username and password are valid
if (is_object($result) && $result->num_rows == 1) {
$_SESSION['logged_in'] = true;
session_write_close();
redirect('../index.php');
} else {
redirect('../login.php');
}
?>
答案 1 :(得分:-1)
在我看来,在你的函数中你放return false;
这意味着你的函数总是返回false。这可能就是为什么在打印$ _SESSION时看不到任何内容的原因。我会在其他方面包含“返回错误”,如下所示:
function check_login_status() {
// IF $_SESSION['logged_in'] is set, return the status
if (isset($_SESSION['logged_in'])) {
return $_SESSION['logged_in'];
}
else {
return false;
}
}
另外,我会考虑在$ _SESSION变量中设置用户ID,而不是仅仅将其设置为布尔值。意味着您只需在开头的include中设置$i = $_SESSION['id'];
即可更轻松地创建与用户相关的内容。