登录后使用PHP会话

登录后使用PHP会话,php,database,session,Php,Database,Session,好的,我对PHP是新手。我在使用会话时遇到问题。我创建了一个小型预订系统,用户可以在其中注册、登录和预订活动。课程之外的基本内容。我遇到的问题是,一旦一个用户注册并登录,如果他们想从该页面更改用户名,他们可以。但是,如果用户确实更改了用户名,则无法重新登录系统。请帮忙 login.php页面 <?php session_start(); $con = mysql_connect("localhost","root",""); if(!$con) { die('Could not

好的,我对PHP是新手。我在使用会话时遇到问题。我创建了一个小型预订系统,用户可以在其中注册、登录和预订活动。课程之外的基本内容。我遇到的问题是,一旦一个用户注册并登录,如果他们想从该页面更改用户名,他们可以。但是,如果用户确实更改了用户名,则无法重新登录系统。请帮忙

login.php页面

<?php
session_start();

$con = mysql_connect("localhost","root","");

if(!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("flexiflash", $con);

$username = strtolower($_POST['user']);
$password = strtolower($_POST['pass']);

$result = mysql_query("SELECT * FROM user WHERE Username = '$username' AND Password = '$password'");
$usertype = mysql_query("SELECT Usertype FROM user");

if(($row = mysql_fetch_array($result)))
{
    $usertype = $row['Usertype'];
    //if an admin user, redirect to admin.html

    if ($usertype == 'Admin')
    {
        //Creating the session
        $_SESSION['usertype'] = 'admin';
        $_SESSION['userid'] = $row['User_ID'];

        header('Location: admin.php');
    }

    if ($usertype == 'User')
    {
        $_SESSION['usertype'] = 'user';
        // more??

        header('Location: user.php');
    }
}
else
{
    echo "<h2>Why do I see this page?</h2>";
    echo "<p>Your username may have not been found</p>";
    echo "<p>Your password was entered incorrectly</p>";
    echo "<h2>What can I do?</h2>";
    echo "<p>double check you have entered your username and password correctly</p>";
    echo "<br/>";
    echo "<a href='index.html' alt='click to go back home'>Click here to go back to login page!</a>";
}

mysql_close($con);

在更新查询中,您在用户名周围粘贴空格:

"UPDATE user SET Username = ' " . $username . " '...
所以用户名“foo”变成了“foo”

我认为这部分也是错误的:

WHERE Username = '$id'
看起来应该是:

WHERE User_ID = '$id'
警告:您的代码存在一些严重的安全问题,现在您很容易受到SQL注入攻击。阅读正确过滤用户输入的内容


另外,您正在使用不推荐的
mysql\u*
方法,应该切换到
mysqli\u*
PDO
。然后使用准备好的语句和绑定参数

在更新查询中,您在用户名周围粘贴空格:

"UPDATE user SET Username = ' " . $username . " '...
所以用户名“foo”变成了“foo”

我认为这部分也是错误的:

WHERE Username = '$id'
看起来应该是:

WHERE User_ID = '$id'
警告:您的代码存在一些严重的安全问题,现在您很容易受到SQL注入攻击。阅读正确过滤用户输入的内容


另外,您正在使用不推荐的
mysql\u*
方法,应该切换到
mysqli\u*
PDO
。然后使用准备好的语句和绑定参数

更新语句需要:

"UPDATE user SET Username = '$username' WHERE User_id = '$id'"
您不需要在“$username”周围加引号;以双引号开头的字符串意味着字符串将识别变量本身。但是最重要的部分是,您需要根据ID而不是用户名来标识用户。如果允许最终用户更新其用户名,则需要使用不同的变量作为唯一标识符。这样,即使他们的用户名发生更改,您也可以始终知道数据库中的哪个记录属于他们


还有一个注意事项-如果用户不是管理员,那么看起来您并没有为用户id设置$\会话变量。您也需要这样做。

您的更新语句需要:

"UPDATE user SET Username = '$username' WHERE User_id = '$id'"
您不需要在“$username”周围加引号;以双引号开头的字符串意味着字符串将识别变量本身。但最重要的是,您需要通过ID而不是用户名来识别用户。如果允许最终用户更新其用户名,则需要使用不同的变量作为唯一标识符。这样,即使他们的用户名发生更改,您也可以始终知道数据库中的哪个记录属于他们



还有一个注意事项-如果用户不是管理员,那么看起来您并没有为用户id设置$\会话变量。您也需要这样做。

在更新用户名后,也使用此新用户名更新会话,会话将正常工作。

在更新用户名后,也使用此新用户名更新会话,会话将正常工作。

您在查询中直接使用未过滤的POST数据。不会出错的…注册位在哪里?我认为您在Where:mysql_查询中使用了username而不是userid(“更新用户集username=”“$username.”“Where username=”$id“);为什么您要“strtolower”输入的密码?他们正在使用用户名和密码登录。然后,他们可以选择更改用户名。值是否存储在数据库中?如果是这样,理想情况下,您应该将他们注销,然后他们应该使用新用户名登录。但是我认为给他们一个更改用户名本身的选项是错误的。你在查询中直接使用未过滤的POST数据。不会出错的…注册位在哪里?我认为您在Where:mysql_查询中使用了username而不是userid(“更新用户集username=”“$username.”“Where username=”$id“);为什么您要“strtolower”输入的密码?他们正在使用用户名和密码登录。然后,他们可以选择更改用户名。值是否存储在数据库中?如果是这样,理想情况下,您应该将他们注销,然后他们应该使用新用户名登录。但是我认为给他们一个改变用户名的选项是错误的。谢谢大家的帮助。就像我说的,我是PHP新手。我现在使用这个旧版本只是为了学习基础知识。此外,目前不会有安全问题,因为它不是实时的。这一切都是在当地完成的。我创造这个是为了学习。下一站,一个小型社交媒体网站:)感谢所有的帮助。就像我说的,我是PHP新手。我现在使用这个旧版本只是为了学习基础知识。此外,目前不会有安全问题,因为它不是实时的。这一切都是在当地完成的。我创造这个是为了学习。下一站,一个小型社交媒体网站:)他没有在会话中存储用户名他没有在会话中存储用户名那么我如何创建此会话变量?与管理员的操作相同-“$会话['userid']=$row['User\u ID'];”。对于不是管理员的用户,您的“如果”块中似乎没有这样的设置。那么,我如何创建此会话变量?与管理员相同-“$\u会话['userid']=$row['User\u ID'];”。对于不是管理员的用户来说,在“如果”块中似乎没有这样的功能。