【问题标题】:Setting Session Variables and Calling them on Another Page设置会话变量并在另一个页面上调用它们
【发布时间】:2016-04-23 14:35:04
【问题描述】:

我向大家致敬,感谢你们之前的帮助。 谁能想象这个非常简单的错误,它让我沮丧了几个小时。

从登录页面,我将登录用户名和密码与数据库值进行比较(验证)。如果它们匹配,我将它们存储在会话变量中并重定向到仪表板页面。

在重定向之前,我 print_r ($_SESSION) 查看变量是否设置。他们的输出为 TRUE(会话已设置)。

但在仪表板上,调用会话变量返回会话!set。 请检查以下代码。

[登录页面]

<?php

session_start();

require_once('../data/conString_mysqli.php');
$uNameErr = $pWordErr = "";
$uName = $pWord = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {

   //*************************************
    if (!empty($_POST["username"])) {
        $uName = test_input($_POST["username"]);
    } else {
        $uNameErr = "Email is required!";
        // check if e-mail address is well-formed
        if (!filter_var($uName, FILTER_VALIDATE_EMAIL)) {
            $uNameErr = "Invalid email format"; 
        }
    }
    if (!empty($_POST["password"])) {
        $pWord = test_input($_POST["password"]);
        $hashed = md5($pWord);
    } else {
        $pWord1Err = "Password is Required!";
        if ($pWord < 8) {
            $pWordErr = "Invalid Password.";
        }
    }

}//end if... IS_POST
    function test_input($data) {
    //require connection file

        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);    
        return $data;
    }//end function
?>

<?php

    if (!empty($uName) && !empty($pWord)){
        $hashed = md5($pWord);

        $read_data = mysqli_query($connect, "SELECT * FROM service_providers WHERE activated='1' AND ppword ='".$hashed."' AND pemail='".$uName."'") or die(mysqli_error());

        $count = mysqli_num_rows($read_data);
        if($count >= 1){/*echo '<script type="text/javascript">alert("Records Found!");</script>';*/

            //store session variables
            $row = mysqli_fetch_array($read_data);
            $_SESSION[ 'serv_pid' ]     = $row[ 'serv_pid' ];
            $_SESSION[ 'providerName' ] = $row[ 'pname' ];

            echo '<script type="text/javascript">alert("Session Name: '.$_SESSION['providerName']." - Session ID: ". $_SESSION['serv_pid'].'");window.location="../dashboard/";</script>'; 

/*echo "<pre>";
print_r ($_SESSION);
echo "</pre>";
*/      
        }else{echo '<script type="text/javascript">alert("Invalid Login Details");window.location="../login/";</script>';

        }
    }
?>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" style="margin-top: 1.5em;">
<div class="form-group">
<div class="input-group">
<input type="text" name="username" class="form-control text-center" placeholder="username (your email)" value="<?php echo $uName;?>"><span class="error"> <?php echo $uNameErr;?></span>
<span class="input-group-addon btn btn-warning" style="background: #f0ad4e; color: #fff;">
<span class="glyphicon glyphicon-user" style="margin: 0;"></span>
</span>
</div>
</div>
<div class="form-group">
<div class="input-group">
<input type="password" name="password" class="form-control text-center" placeholder="password" value="<?php echo $pWord;?>"><span class="error"> <?php echo $pWordErr;?></span>
<span class="input-group-addon btn btn-warning" style="background: #f0ad4e; color: #fff;">
<span class="glyphicon glyphicon-lock" style="margin: 0;"></span>
</span>
</div>
</div>

<p style="font-size: 16px !important;"><a style="color: #fff; text-decoration: none; margin-top: 2em; display: block;" href="../sign-up/">Don't have an Account? <u>Get one!</u></a> <span style="color:#FF0000; font-weight:bold; text-decoration:underline;"><em><a href="forgot_pass.php" title="Click here to get your password">Forgot your password?</a></em></span></p>
<div class="col-md-6 col-md-offset-3 text-center" style="margin-top: 5px;">
<button type="submit" name="login" class="btn btn-warning btn-lg btn-custom" style="margin-right: 1em; border-width: 3px;">LOGIN</button>
<a href="../sign-up/" class="btn btn-warning" style="background: none !important; border: 3px solid #fff;">SIGN UP</a>
</div>
<div class="clearfix"></div>
</form>

[仪表板页面]

<?php
session_start();
echo "<pre>";
print_r ($_SESSION);
echo "</pre>";


/*
if (!isset($_SESSION['serv_pid'])){// or !isset($_SESSION['providerName'])){
    die('<script type="text/javascript">alert("You do not have permission to access beyond the previous page.");window.location="../login/";</script>');
}else{
    $serv_pid = $_SESSION['serv_pid'];
    $pName = $_SESSION['providerName'];
}*/
?>

从登录页面,print_r返回的结果是:

数组 ( [serv_pid] => 1 [providerName] => 无名称 )

但是在进入登录页面时,就像会话被破坏了一样。 print_r 返回的结果是:

数组 ( )

请帮助我任何想法。 提前谢谢你。

【问题讨论】:

  • 您在用户登录后设置会话,然后将他重定向到仪表板。对?那么,如果他已经登录了,为什么还要再次进入登录页面呢?只有当他注销时,他才能返回登录页面,即会话被破坏。不确定您到底在哪里遇到问题。
  • 在仪表板页面上,服务器检查是否为该用户创建了会话。如果为 FALSE,则用户返回登录页面。问题是;在仪表板页面上,服务器甚至找不到会话。与此同时,有一个会议。就像登录页面后会话被破坏一样。如何在会话被编码销毁之前保持会话?

标签: php arrays session login


【解决方案1】:

当您在 PHP 中启动会话时,它会设置一个会话 cookie,当您在 php 括号外或您的第一个 echo 打印第一个字符时,它会发送到浏览器。 我认为问题在于当您尝试将用户重定向到仪表板页面时。您正在设置会话,向浏览器写入重定向到另一个页面的脚本,但同时服务器不会停止页面上的处理。

尝试在 PHP 中将 echo "&lt;script&gt;..." 替换为 header("Location: dashboard.php"),然后是 exit(0); 指令。 第一个实际上告诉浏览器重定向到 dashboard.php 页面(或任何页面),第二个告诉浏览器停止执行该页面。

此外,删除?&gt;&lt;?php 括号之间的空白行。该行实际上将标头连同 cookie 一起发送到浏览器,即使它是一个空白字符。

【讨论】:

  • 感谢您的指正。但是对于
  • 在我看来,只有登录成功才应该重定向。否则,您应该在不重定向的情况下打印登录表单以及错误消息,例如警报。好吧,我的建议是仅在成功登录时放置标题指令。如果你真的需要警报,你可以随时将它放在仪表板页面上,这样你就会在重定向后看到它;这还不错,因为用户不会看到真正的区别;)。
  • 是的,我明白你在说什么。谢谢。同时,就像我之前所说的,我一次一行地检查页面,并删除了多余的 session_start()。它现在工作得很好。我现在将上传网站。您可以在 servicehub.ng/home/ 上查看它
  • 这有点奇怪。调用 session_start 两次实际上并没有打开两个不同的会话:php.net/manual/en/function.session-start.php
  • 它不会而是取消另一个并破坏变量。不过这很奇怪。顺便问一下,你检查过网站吗? www.servicehub.ng/home/
【解决方案2】:

登录页面和发送页面上有多余的 session_start() 函数。每个 session_start() 取消另一个,变量在到达登录页面之前被销毁。

但是,我不得不删除整个页面并一次重新创建一行。所以,它现在可以工作了。

我真的很想感谢 Marco Todisco,他还提供了一些建议性的回复来帮助我编写代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多