由于登录脚本无法读取会话变量

时间:2016-10-17 08:24:04

标签: php session variables login

目前我在设置会话变量时遇到问题。

    <?php

session_start();

if( isset($_SESSION['user_id']) ){
    header("Location: home.php");
}

require 'pdoconnect.php';

if(!empty($_POST['email']) && !empty($_POST['password'])):

    $records = $conn->prepare('SELECT id,email,password FROM users WHERE email = :email');
    $records->bindParam(':email', $_POST['email']);
    $records->execute();
    $results = $records->fetch(PDO::FETCH_ASSOC);

    $message = '';

    if(count($results) > 0 && password_verify($_POST['password'], $results['password']) ){

        $_SESSION['user_id'] = $results['id'];
        header("Location: glogin.php");
        $_SESSION['email'] = $_POST['email'];
        $email = $_SESSION['email'];


    } else {
        $message = 'Login failed, try again';
    }

endif;

上面你可以看到我正在使用的登录脚本,此代码在

运行
  

的login.php

<form action="login.php" method="POST">

<input type="email" placeholder="Enter your e-mail" name="email" required>
<input type="password" placeholder="Enter your password" name="password" required>

<input type="submit" value="Log in">

<?php if(!empty($message)): ?>
<p><?= $message ?></p>
<?php endif; ?> 

</form>

这是用于登录的表单,表单也在

运行
  

的login.php

现在出现问题,我想将用户登录的电子邮件放入会话变量,但是我无法将表单操作设置为其他页面,因为登录脚本将不再起作用。

所以我的问题是:&#39;如何在不更改表单操作的情况下阅读$ _SESSION [&#39; email&#39;]?

我已经尝试将login.php包含在另一个页面中但不幸的是没有工作。

2 个答案:

答案 0 :(得分:0)

您在header()值分配之前使用重定向$_SESSION

:此:

$_SESSION['user_id'] = $results['id'];
header("Location: glogin.php");
$_SESSION['email'] = $_POST['email'];
$email = $_SESSION['email'];

应该是:

$_SESSION['user_id'] = $results['id'];
$_SESSION['email'] = $_POST['email'];
$email = $_SESSION['email'];
header("Location: glogin.php"); // at last
exit;

如果您想在$_SESSION['email']页面中使用glogin.php值,那么您还需要在页面中session_start()开始会话。

最后一个建议是,您可以$results在您的会话中使用$_POST值而不是id值与$_SESSION['email'] = $results['email']; 字段相同,如:

exit()

您还需要了解header()功能后vscode.workspace.onDidOpenTextDocument(function (doc) { if (doc && doc.fileName.endsWith('.scpt')) { console.log("You're trying to open a binary AppleScript file") } }); 所需的原因,您可以阅读以下文章:PHP: Utilizing exit(); or die(); after header("Location: ");

答案 1 :(得分:0)

使用$_SERVER['PHP_SELF']代替login.php作为表单操作。

<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>">

使用exit后,您还应该header('Location: ...')

if (isset($_SESSION['login'])) {
    header("Location: index.php");
    exit;
}

如果在执行重定向后没有退出,则仍将执行完整的脚本。有些变量可能没有设置好,简而言之..只需exit;

此外,您在设置会话变量之前会重定向。

$_SESSION['user_id'] = $results['id'];
$_SESSION['email'] = $_POST['email'];
header("Location: glogin.php");
exit;

更新

不确定你要用gloging.php做什么,但看起来应该是这样的。

<?php 
session_start();
if (isset($_SESSION['user_id'])) {
    echo $_SESSION['email'];
    exit;
} else {
    header("Location: nologin.php");
    exit;
}
?>