我正在构建一个用户登录的网站,然后重定向到另一个页面。我想在顶部栏中显示他们的用户名和个人资料图片,但我的代码不起作用 我使用下面的代码,现在我认为它显然无法工作,因为它将始终显示数据库中的第一个用户名和图片。但我不知道如何解决这个问题,以便显示已登录用户的用户名和图片。
HTML和PHP
<?php
mysql_select_db($database_connection, $connection);
$query_user = "SELECT username, profilepic FROM user";
$user = mysql_query($query_user, $connection) or die(mysql_error());
$row_user = mysql_fetch_assoc($user);
$totalRows_user = mysql_num_rows($user);
?>
<div id="top">
<img src="images/<?php echo $row_user['profilepic']; ?>">
<?php echo $row_user['username']; ?></a>
</div>
的修改
登录脚本
<?php
if (isset($_REQUEST['login'])){
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$query = "SELECT * FROM `username` WHERE username='$username' and password='$password'";
$result = mysql_query($query) or die(mysql_error());
$count = mysql_num_rows($result);
if ($count == 1){
$_SESSION['username'] = $username;
header('Location: content.php');
}else{
echo "Invalid Login Credentials.";
}
}
if (isset($_SESSION['username'])){
$username = $_SESSION['username'];
header('Location: content.php');
}
?>
答案 0 :(得分:1)
在登录代码之后将用户名存储在会话中
<?php
session_start();
.......
//your php login code which validates the username and password ...
.......
//then here
$_SESSION['valid_user']=$username;//$username is who is logged in
现在在上面使用这个会话值就像这样
session_start();
$query_user = "SELECT username, profilepic FROM user where username=".$_SESSION['valid_user'];//or
$user = mysql_query($query_user, $connection) or die(mysql_error());
$row_user = mysql_fetch_assoc($user);
$totalRows_user = mysql_num_rows($user);
答案 1 :(得分:1)
HTTP是无状态协议。
这意味着(对于我们的讨论)服务器不知道您是在他处理的上一个事务中登录的同一个人。因此,您需要每次都表明自己。 这是通过会话完成的。会话标识符是标识特定客户端的唯一字符串。在每个请求中,客户端使会话标识符包含在GET,POST或COOKIE变量中。
将每次用户名和密码发送到服务器是非常有效和危险的。你应该做的是:
检查用户发送到您的php脚本的用户名和密码。如果凭证正确执行
session_start();
然后你应该存储从
返回的会话标识符(这是一个随机字符串)session_id();
在具有两列的数据库表中。第一列用于随机字符串,第二列用于存储users表中行的主键值,用于保存向其发送凭据的用户数据。这样做的脚本是:
$userResult = mysql_query('select id from users where binary userName = \''.
mysql_real_escape_string($_POST['userName']) .'\' and binary passWord= \''.
mysql_real_escape_string($_POST['passWord']) .'\'');
if (mysql_num_rows($userResult))
{
start_session();
$userId = mysql_fetch_row($userResult);
mysql_query('insert into sessions (sessionId, userId) values (\''.
mysql_real_escape_string(session_id()) .'\', \''. (int)$userId[0] .'\')');
}else
{
//handle user supplying bad username or password
}
每次用户发送请求时,您都应该知道他是谁:
session_start();
$inputSessionIdentifier = mysql_real_escape_string(session_id());
$result = mysql_query('select * from sessions where sessionId = \''.
$inputSessionIdentifier .'\'');
if (mysql_num_rows($result))
{
// user is already logged in, lets find out his data
$sessionData = mysql_fetch_assoc($result);
$userResult = mysql_query('select * from users where id=\''.
mysql_real_escape_string($sessionData['userId']) .'\'');
$userData = mysql_fetch_assoc($userResult);
echo 'Hello '. $userData['userName'];
}else
{
//user is not logged in, ask for credentials or whatever ...
}
会话表的示例定义可以是:
create table sessions ( sessionId varchar(255) not null,
userId int(10) unsigned not null,
unique(sessionId));
假设您的users表具有无符号整数主键,并且沿着以下行定义:
create table users (id int(10) unsigned not null auto_increment primary key,
userName varchar(16) not null,
passWord varchar(100) not null,
unique(userName));
请记住,会话必须过期,相关表应清除非活动会话。这意味着现实生活中的剧本会更复杂......
重要的安全问题!
上面的示例假定您在数据库中存储纯文本密码。这是错误, 是一种非常糟糕的安全措施 。密码应始终以加密(散列)形式存储,最好是由河豚密码生成的形式。