4

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

$_SESSION[SCRIPT_NAME]['filter_data']

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

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

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

4

6 回答 6

3

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

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

于 2012-12-30T18:35:58.793 回答
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);

}

}

?>
于 2017-12-07T18:27:31.057 回答
0
  • 为每个打开的页面生成一个唯一的 id
  • 通过 get 方法将该唯一 ID 传递给脚本
  • 使用该唯一 ID 而不是脚本名称

这种方法的问题

使用这种方法,如果您不清除未使用的变量并且用户在会话到期之前打开您的网站很多,那么存储的会话变量可能会随着时间的推移占用非常多的空间

这些问题的解决方案

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

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

于 2017-12-22T16:26:00.530 回答
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();

...

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

于 2019-05-21T11:38:02.697 回答
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>';
?>
于 2019-05-23T09:18:16.347 回答
0

这是一个很老的问题,但我是写给其他程序员或新手朋友使用的。

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

于 2020-09-22T13:15:25.953 回答