我刚完成我的第一个工作登录表单。我可以验证自己是否使用特定的用户名/ 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信息标识。 您不希望他们都互相获取数据,是吗?