【问题标题】:PHP $_SESSION working in some browsers, not othersPHP $_SESSION 在某些浏览器中工作,而不是在其他浏览器中
【发布时间】:2015-11-20 23:30:14
【问题描述】:

我有一个使用 PHP $_SESSION 变量的网页。它在我使用 Google Chrome(版本44.0.2403.157(64 位))的计算机上运行良好,但不适用于其他浏览器或其他版本的 Chrome。

我能做些什么来解决这个问题?如果我可以继续使用$SESSION 变量,我会更喜欢这样我不必重新编码我的所有网页,但如果我必须,还有什么替代方法?

对于上下文:我使用$_SESSION 变量来存储信息,例如谁“登录”到我的网站和用户“购物车”中的产品的身份。

代码:我开始这样的会话:

function sec_session_start() {
    $session_name = 'sec_session_id';   // Set a custom session name
    $secure = false;
    // This stops JavaScript being able to access the session id.
    $httponly = true;
    // Forces sessions to only use cookies.
    if (ini_set('session.use_only_cookies', 1) === FALSE) {
        header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
        exit();
    }
    // Gets current cookies params.
    $cookieParams = session_get_cookie_params();
    session_set_cookie_params($cookieParams["lifetime"],
        $cookieParams["path"], 
        $cookieParams["domain"], 
        $secure,
        $httponly);
    // Sets the session name to the one set above.
    session_name($session_name);
    session_start();            // Start the PHP session 
    session_regenerate_id(true);    // regenerated the session, delete the old one. 
}

就像我之前说的,它在某些浏览器中运行良好。有些东西阻止它在其他人身上工作。

“工作”是指浏览器允许使用$SESSION 变量。我确实不是指跨浏览器保存的变量。

当我检查浏览器不工作的 cookie 时,它​​说它正在为我的网站存储缓存、cookie 和本地存储。

这是我的代码的一个小例子。在这里,当按下登录按钮时,它会检查登录凭据。

<?php
/**
* 
*
*/


                        include_once 'db-credentials.php';  //get database credentials 
                        $mydb2= logindb(); //login to database

                        sec_session_start(); //start session




//process form data                        
if(isset($_POST['btn-login'])) //if login button was pressed
{

 $email = $_POST['email'];
 $upass = $_POST['pwd'];
 $row = $mydb2->get_row($mydb2->prepare( 
        "select * from users WHERE email='$email'"), ARRAY_A
        );
 if($row['password']==$upass)
 {
  $_SESSION['user'] = $row['user_id'];
  $_SESSION['name'] = $row['username'];
  echo "<script>window.location = 'http://mywebsite.ca/order/'</script>";
 }
 else
 {
  ?>
        <script>alert('Invalid login. Please check your email and password and try again');</script>
        <?php
 }

}

现在,该代码运行良好。使用正确的用户名和密码,程序进入内部if 语句并运行echo "&lt;script&gt;window.location = 'http://mywebsite.ca/order/'&lt;/script&gt;"; 语句。

但是,当它到达http://mywebsite.ca/order/ 时,它不再保存会话变量!

【问题讨论】:

  • 我不知道你为什么要重新发明或重写 session_start() 函数。
  • 它有什么好处?
  • @CharlotteDunois 出于安全原因,我使用修改后的 session_start()。同样,将其更改为 session_start() 并不能解决我的问题。还是不行。
  • 为什么不在 php.ini 中设置会话 cookie 参数?这意味着您可以从头开始,只需使用 session_start(); session_regenerate_id(true);
  • @Script47 不,我不是这个意思。我的意思是变量确实有效。例如,如果我执行$_SESSION["name"] = Mel,然后执行echo $_SESSION["name"] .... 它应该输出“Mel”。

标签: php session cross-browser


【解决方案1】:

我想通了。之前,我在调用session_start() 函数之前调用了get_header() 函数。这在某些浏览器上运行良好,但在其他浏览器上却不行。

我改变了它,所以session_start() 是我的第一个声明。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2019-09-28
    • 2012-12-31
    • 2012-10-06
    • 2012-10-12
    • 2014-10-09
    • 1970-01-01
    • 2014-09-26
    • 2015-08-22
    相关资源
    最近更新 更多