php session user,关于php:isset($ _SESSION [‘user_id’])vs登录

作者分享了在创建登录表单时遇到的问题,包括登录状态判断、$_SESSION使用不当以及页面刷新后的逻辑混乱。通过细致的代码审查和会话管理技巧,探讨了如何修复session_start()的位置和检查登录状态的有效方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我刚完成我的第一个工作登录表单。我可以验证自己是否使用特定的用户名/ ID登录或根本没有登录。

但是,登录页面无法正常工作。我认为下面的代码应该显示一个登录表单(如果用户尚未登录)或指向注销页面的链接(如果您已经登录)...

Login Here

(etc.)

Logout Here

Log Out Link

但是,即使我已登录,它也只显示注销链接。

我不确定从哪里开始进行故障排除,因为这对我来说并不陌生。我有一个数据库表,其中包含字段" user_id"(以及" username"和" password"。在此示例中,user_id的值是数字1。

我试图回显user_id的值但没有成功,即使登录时也是如此...

echo $_SESSION['user_id'];

如果我将此粘贴到页面顶部...

...然后相反。如果我已登录,它会显示一个登录表单,并在我已经注销时显示一个注销链接。

这是login_submit.php中的(经过大量编辑的)代码...

session_start();

/*** check if the users is already logged in ***/

if(isset( $_SESSION['user_id'] ))

{

$message = 'Users is already logged in';

}

/*** check that both the username, password have been submitted ***/

if(!isset( $_POST['username']))

{

$message = 'Please enter a valid username and password';

}

else

{

/*** if we are here the data is valid and we can insert it into  database ***/

$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);

$password = filter_var($_POST['password'], FILTER_SANITIZE_STRING);

/*** now we can encrypt the password ***/

$password = sha1( $password );

/*** connect to database ***/

try

{

// Database stuff...

/*** prepare the select statement ***/

$stmt = $dbh->prepare("SELECT user_id, username, password FROM     g1_members WHERE username = :username AND password = :password");

/*** bind the parameters ***/

$stmt->bindParam(':username', $username, PDO::PARAM_STR);

$stmt->bindParam(':password', $password, PDO::PARAM_STR, 40);

/*** execute the prepared statement ***/

$stmt->execute();

/*** check for a result ***/

$user_id = $stmt->fetchColumn();

/*** if we have no result then fail boat ***/

if($user_id == false)

{

$message = 'Login Failed';

}

/*** if we do have a result, all is well ***/

else

{

/*** set the session user_id variable ***/

$_SESSION['user_id'] = $user_id;

/*** tell the user we are logged in ***/

$message = 'You are now logged in';

}

}

catch(Exception $e)

{

/*** if we are here, something has gone wrong with the database    ***/

$message = 'We are unable to process your request. Please try again later.';

}

}

?>

PHPRO Login

附言在将$ _SESSION设置为有效的登录名登录后,无法通过Discussion @ isset()进行提示,因此我插入了session_start();在页面顶部,然后添加以下脚本:

if(isset($_SESSION['valid'])) { echo 'logged in'; } else { echo 'not logged yet'; }

即使我已登录,它也会显示"尚未登录"。

使用_SESSION数组的每个页面必须在页面的最顶部具有session_start();。 如果它与您的预期相反,那么您的IF语句就会出现问题或出现未捕获的错误。 尝试将这行if($user_id == false)更改为if($user_id === false),这只是一个猜测。

If I paste this at the top of the page... session_start(); ...then it

works ...

你是在自问自答。

..in reverse. If I'm logged in, it displays a login form, and it displays a logout link when I'm already logged out.

^-------------------Here

您只是忘了否定if语句

at the top of the page, then added this script:

if(isset($_SESSION['valid'])) { echo 'logged in'; } else { echo 'not logged yet'; }

^------- here

会话名称是user_id而不是valid,因此将永远不匹配。

在使用$ _SESSION之前,始终始终先使用session_start。 否则,$ _ SESSION将不起作用。

Login Here

(etc.)

Logout Here

Log Out Link

当你说使用session_start(); 首先,什么才是"第一"? 用户访问的首页是我的首页? 我是否正确放置session_start(); 在我的1)注册页面,2)登录页面和3)login_submit.php中,然后使用session(); 在我网站上几乎所有其他页面上?

每个新页面就是这样。 一个新页面,在您提供任何信息之前,通常不包含任何信息,通常带有变量。

要向其提供有关当前用户的信息(可能一次有几个用户),请使用session_id代码。 为此,您必须首先开始一个会话。 这样可以确保每个用户都有自己的会话启动,并由他们自己的session_id信息标识。 您不希望他们都互相获取数据,是吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值