显示连接到登录用户的数据

时间:2014-03-22 13:22:00

标签: php html mysql database

我正在构建一个用户登录的网站,然后重定向到另一个页面。我想在顶部栏中显示他们的用户名和个人资料图片,但我的代码不起作用 我使用下面的代码,现在我认为它显然无法工作,因为它将始终显示数据库中的第一个用户名和图片。但我不知道如何解决这个问题,以便显示已登录用户的用户名和图片。

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');
}
?>


2 个答案:

答案 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));

请记住,会话必须过期,相关表应清除非活动会话。这意味着现实生活中的剧本会更复杂......

重要的安全问题!

上面的示例假定您在数据库中存储纯文本密码。这是错误 是一种非常糟糕的安全措施 。密码应始终以加密(散列)形式存储,最好是由河豚密码生成的形式。