如何使每个php脚本实例的会话变量唯一?

时间:2012-12-30 18:28:32

标签: php session

好吧,假设我有一个php脚本,它有一些选择框,我想将所选值存储在会话数组中。直到现在我使用以下构造将值分配给会话数组:

$_SESSION[SCRIPT_NAME]['filter_data']

SCRIPT_NAME是一个常量,我放置脚本名称,这是为了使每个php脚本的会话变量唯一。一切都很好,直到用户在两个或多个选项卡中打开相同的脚本以同时工作。在这种情况下,变量混合,事情出错......

您是否有任何想法如何使每个脚本实例的会话变量绝对唯一?或者任何建议如何以不同的方式实现功能?

我现在,我可以在URL中传递我的变量,但我不喜欢这个选项。我想使用会话,我希望我的网络应用程序的每个脚本都记住用户在整个用户登录会话期间的选择

6 个答案:

答案 0 :(得分:2)

“......如何使每个脚本实例的会话变量绝对唯一?”

基本上答案是,“你做不到。”这是因为浏览器的所有实例(窗口和选项卡)共享相同的cookie jar。因此,两个实例都返回相同的cookie,并且它们连接到同一个会话。它在“现实生活”中很少出现问题,但正如您现在所看到的那样,它会让开发人员感到疯狂; - )

答案 1 :(得分:0)

 <?php
        //Start session
        session_start();
        //Check whether the session variable SESS_MEMBER_ID is present or not
        if (!isset($_SESSION['id']) || ($_SESSION['id'] == '')) {
            header("location: index.php");
            exit();
        }

        $session_id=$_SESSION['id'];
        ?>

和文件连接

 <?php

 class DbConnector {

 var $theQuery;
 var $link;

 function DbConnector(){

    // Get the main settings from the array we just loaded
    $host = 'localhost';
    $db = '';
    $user = 'root';
    $pass = '';

    // Connect to the database
    $this->link = mysql_connect($host, $user, $pass);
    mysql_select_db($db);
    register_shutdown_function(array(&$this, 'close'));

}

   //*** Function: query, Purpose: Execute a database query ***
function query($query) {

    $this->theQuery = $query;
    return mysql_query($query, $this->link);

}

//*** Function: fetchArray, Purpose: Get array of query results ***
function fetchArray($result) {

    return mysql_fetch_array($result);

}

//*** Function: close, Purpose: Close the connection ***
function close() {

    mysql_close($this->link);

}

}

?>

答案 2 :(得分:0)

  • 为每个打开的页面生成唯一ID
  • 通过get方法
  • 将该唯一ID传递给脚本
  • 使用该唯一ID而不是脚本的名称

此方法的问题

使用这种方法,如果您不清除未使用的会话变量并且用户在会话到期之前大量打开您的网站,则存储的会话变量可能会占用非常大的空间

解决这些问题

  • 为生成的每个唯一ID存储时间戳
  • 每次用户在使用该唯一ID的页面上执行操作*时,将该时间戳更改为当前时间戳
  • 如果用户在具有其他唯一ID的页面中执行操作*,请检查自上次操作以来是否已经过了每个唯一ID的时间,如果是,则将其删除

*:可以在页面上执行的操作和页面刷新

答案 3 :(得分:0)

您可以使用session_name($unique_script_instance_name)-https://www.php.net/manual/en/function.session-name.php

您需要做的就是为脚本的每个实例定义一个唯一的名称,例如,如果您在共享服务器上安装了2个独立的应用程序安装,则为一个提供名称A,为第二个提供B您可以将该值存储为$unique_script_instance_name

然后,在致电session_start()之前,您需要致电session_name()

// One script
$unique_script_instance_name "A";
session_name($unique_script_instance_name);
session_start();

...

// Second script
$unique_script_instance_name "B";
session_name($unique_script_instance_name);
session_start();

...

这样,两个脚本将拥有自己的会话“域”,并且将彼此隔离。 那样

答案 4 :(得分:0)

请记住,会话只是一个变量。您绝对可以为每个页面创建一个唯一的会话变量。对于每个获取请求,将创建一个新的唯一会话变量。您要做的就是创建唯一的会话名称。

<?php
 session_start();
 $_SESSION[$_GET['pid'].'_p1'] = "a session value";
 $_SESSION[$_GET['pid'].'_p2'] = "a session value";
 $_SESSION[$_GET['pid'].'_p3'] = "a session value";
?>

例如,如果您访问http://example.com/?pid=1232

会话名称类似于$_SESSION['1232_p1'];

对于每个获取请求,将创建一个新的唯一会话。

要查看所有会话变量,请在页面末尾使用以下代码:

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

答案 5 :(得分:0)

这是一个非常老的问题,但是我正在编写此代码供其他程序员或新手朋友使用。

只需为客户端的每个请求设置一个验证页面即可检查会话变量。 例如:valid_ref.php 或将参考页用于源代码中的所有页面,并根据参考页中的客户请求调用其他页面。例如:index.php or home.php or ref.php 在valid_ref.php中检查$_SESSION[SCRIPT_NAME]['filter_data']是否在会话中,当客户端打开新选项卡时,您的Web应用使用$_SESSION[SCRIPT_NAME]['filter_data']中的以前的数据,通过这种方式,您不会对浏览器中的新选项卡产生任何问题客户。