用户输入有效的用户名/登录名后,我有一个登录页面可重定向到私人主页。我已通过会话变量将主页设置为私有-如果设置了会话变量(意味着用户已提交正确的登录信息),则该页面可见。如果未设置会话变量(!isset),则页面应为私有页面,并重定向回登录页面。但是,如果用户尚未登录,则主页不会显示为私有,而是直接进入登录页面。
登录页面PHP和HTML
<?php
session_start();
require_once("../inc_files/Lesson_5_DB_Connection.php");
error_reporting(E_ALL);
ini_set('display_errors', 1);
$error_message= "";
$user_name = "";
$user_password= "";
$member_name="";
$member_id="";
if (isset($_POST['submit'])) {
$user_name = $_POST['user'];
$user_password= $_POST['pass'];
// ADD QUERY TO CHECK IF USER/PASS COMBO IS CORRECT
if(!empty($user_name) && !empty($user_password)) {
$query = "SELECT * FROM employees WHERE username='$user_name' and password='$user_password'";
$result = mysqli_query($dbc, $query)
or die ('Error querying username/password request');
if(mysqli_num_rows($result) == 1) {
$_SESSION['member_name'] = $member_name;
$_SESSION['member_id'] = $member_id;
header("Location: /LESSON5/3%20-%20HOMEPAGE%20:%20WELCOME.php");
exit;
} // end if rows
else {
$error_message = "You were not able to log in";
} // end else
// Direct to other webpage
} // end query
} // end isset
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Login</title>
<link type="text/css" rel="stylesheet" href="/LESSON5/5_Signup_CSS.css">
</head>
<body>
<h1>Welcome to my website!</h1>
<h2>Please login below.</h2>
<h3>Don't have an account? <a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create one here.</a></h3>
<div class="formFormat" >
<div id="table1">
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<table id="cssTable">
<tr>
<td>Username:</td><td><input type="text" id="user" name="user" value="<?php echo $user_name;?>" /></td>
</tr>
<tr>
<td>Password:</td><td><input type="text" id="pass" name="pass" value="<?php echo $user_password;?>"/></td>
</tr>
</table>
</div>
<div id="table2">
<table>
<tr>
<td><input type="submit" name="submit"/></td>
</tr>
<tr>
<td id="createAccount"><a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create an account</a></td>
</tr>
<tr>
<td><p><?php echo $error_message?></p></td>
</tr>
</table>
</form>
</div>
</div>
<?php
mysqli_close($dbc);
if(isset($_SESSION['user']) && isset($_SESSION['pass'])) {
echo "Sessions are set";
}
else {
echo "Not set.";
}
?>
</body>
</html>
似乎会话变量$_SESSION['member_name'] = $member_name
&$_SESSION['member_id'] = $member_id
在登录页面提交后未设置,我也不知道为什么。
在此,如果未设置会话变量(通过!isset),则主页应重定向到登录名,而不显示主页。在这里,这是不起作用的,这是因为未设置上述代码中的会话变量,并且主页未正确读取PHP脚本并使主页公开。
主页PHP
<?php
session_start();
require_once("../inc_files/Lesson_5_DB_Connection.php");
$member_name="";
$member_id="";
if(!isset($_SESSION['member_name']) && !isset($_SESSION['member_id'])) {
header("Location: /LESSON5/1%20-%20LOGIN.php");
}
?>
我知道$_SESSION
变量中有错误,但是我无法弄清楚差距在哪里。任何对此的投入将不胜感激。
您需要使用mysqli_fetch_assoc()从查询中获取结果
http://php.net/manual/en/mysqli-result.fetch-assoc.php
这是您的相同代码,只是添加了fetch_assoc()并将其分配给您的会话变量:
<?php
session_start();
require_once("../inc_files/Lesson_5_DB_Connection.php");
error_reporting(E_ALL);
ini_set('display_errors', 1);
$error_message= "";
$user_name = "";
$user_password= "";
$member_name="";
$member_id="";
if (isset($_POST['submit'])) {
$user_name = $_POST['user'];
$user_password= $_POST['pass'];
// ADD QUERY TO CHECK IF USER/PASS COMBO IS CORRECT
if(!empty($user_name) && !empty($user_password)) {
$query = "SELECT * FROM employees WHERE username='$user_name' and password='$user_password'";
$result = mysqli_query($dbc, $query)
or die ('Error querying username/password request');
if(mysqli_num_rows($result) == 1) {
while ($row = mysqli_fetch_assoc($result)) {
$_SESSION['member_name'] = $row['member_name'];
$_SESSION['member_id'] = $row['member_id'];
}
header("Location: /LESSON5/3%20-%20HOMEPAGE%20:%20WELCOME.php");
exit;
} // end if rows
else {
$error_message = "You were not able to log in";
} // end else
// Direct to other webpage
} // end query
} // end isset
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Login</title>
<link type="text/css" rel="stylesheet" href="/LESSON5/5_Signup_CSS.css">
</head>
<body>
<h1>Welcome to my website!</h1>
<h2>Please login below.</h2>
<h3>Don't have an account? <a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create one here.</a></h3>
<div class="formFormat" >
<div id="table1">
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<table id="cssTable">
<tr>
<td>Username:</td><td><input type="text" id="user" name="user" value="<?php echo $user_name;?>" /></td>
</tr>
<tr>
<td>Password:</td><td><input type="text" id="pass" name="pass" value="<?php echo $user_password;?>"/></td>
</tr>
</table>
</div>
<div id="table2">
<table>
<tr>
<td><input type="submit" name="submit"/></td>
</tr>
<tr>
<td id="createAccount"><a href="/LESSON5/2%20-%20CREATE%20AN%20ACCOUNT.php">Create an account</a></td>
</tr>
<tr>
<td><p><?php echo $error_message?></p></td>
</tr>
</table>
</form>
</div>
</div>
<?php
mysqli_close($dbc);
if(isset($_SESSION['user']) && isset($_SESSION['pass'])) {
echo "Sessions are set";
}
else {
echo "Not set.";
}
?>
</body>
</html>
您说没有设置member_name和member_id,这是因为运行查询时从未从数据库中获取它们的数据。您需要获取查询的assoc数组,并将其分配给会话。由于您没有执行此操作,因此使用了您在顶部定义的值为空的值:
$member_name="";
$member_id="";
这就是为什么它们为空的原因,因为它们为空。
我在您的工作中看到了其他事情。文件名中有空格(即%20),应将其替换为下划线。虽然它会起作用,但您自己却会引起将来的头痛。您的密码似乎是纯文本的。您应该使用20年前的加密密码(例如:bCrypt)。您确实不需要在代码中设置error_reporting或ini_set,应在您的服务器配置(即php.ini)中根据您的环境进行配置。您不应该使用通配符(即SELECT *),而是声明需要使用的列。
我还将在查询中添加一个LIMIT 1。如果您的帐户注册/注册代码存在缺陷,那么您将获得不止一个匹配用户的唯一方法。
可能会将恶意代码添加到页面,因为您是在不对用户名/密码进行回显的情况下将其回显到页面上。
您正在使用mysqli,这是一个很好的开始,但是您在查询中使用的是未经消毒的。使用来自用户的数据时,应首先使用准备好的语句或首先使用mysqli_real_escape_string()。仅使用mysqli并不能保护您。
总而言之,如果您使用Yii之类的框架,将为您省去很多麻烦-开箱即用密码完成登录和注册,同时使用bcrypt密码,以及使用该框架的其他数百种理由: )Yii只是我的最爱,但是任何框架都可以帮助任何程序员。我已经很久没有处理会话或登录/注册代码了...
已添加表中的更多值以存储在会话中:
while ($row = mysqli_fetch_assoc($result)) {
$_SESSION['member_name'] = $row['member_name'];
$_SESSION['member_id'] = $row['member_id'];
// add everything you want from your table
$_SESSION['employeeId'] = $row['employeeId'];
$_SESSION['anotherColumn'] = $row['anotherColumn'];
}
最终思想
看来您有点混乱。我认为您需要从头开始使用此php代码。查看数据库中的表,确保其尽可能整洁。列名是有意义的,等等。然后重新制作此php文件以进行登录。
您需要做的就是对用户进行身份验证。您无需在会话中存储有关用户的所有信息。PHP本身将在会话终止时终止会话(它们将关闭其浏览器,或者通过PHP的默认会话时间限制)。正确配置的服务器可以自行处理会话。因此,您要做的就是对它们进行身份验证,并将基本数据存储在会话中。
确认用户和密码后,只需将其用户ID存储在会话中即可。然后在每个页面的顶部具有一个函数,以获取其用户数据以在页面上使用:
function getUserData($id) {
$query = "SELECT * FROM users WHERE id = $id LIMIT 1";
$result = mysqli_query($dbc, $query);
if ( $result ) {
if(mysqli_num_rows($result) == 1) {
$row = mysqli_fetch_assoc($result);
return $row;
}
}
return false;
}
$userData = getUserData($_SESSION['user_id']);
if ( ! $userData ) {
die('Error: User data not found!');
}
// we have the user data for the rest of the page
echo "ID: $userData['id']";
echo "Username: $userData['username']";
仅举一个例子,我的代码中可能存在缺陷。.但是,我希望您明白这一点。在我的示例中,即时消息仅将用户的ID存储在会话中。然后,我的函数(在代码中的其他任何函数之前使用)将用户信息返回到数组中。然后,您可以在页面中的任何位置使用$ userData数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句