【问题标题】:Session variables not available in a started session across pages会话变量在跨页面启动的会话中不可用
【发布时间】:2019-02-17 10:42:35
【问题描述】:

目标是当用户使用 session_start() 从页面上的 6 个选择下拉框中选择数据库搜索过滤条件并且 SESSION 变量设置为 6 个选择框值时,刷新后在页面之间保留一些数据用户选择,因为单击搜索按钮调用 Laravel 控制器操作,其中 SESSION 是 session_start() 正在开始,并且正在为 SESSION 设置 6 个选择框变量。

目标是从单击搜索按钮时填充的会话变量中重置选择框,保留用户选择的选择框选择条件,这样他们就不必再次重新选择 6 个选择框。这些选择框选择值存储在会话变量中;

在返回成功搜索后刷新时,会在 masterlayout.blade html 部分中读取 SESSION 变量,以便以编程方式重新选择用户在使用 masterlayout.blade 呈现重新运行页面时输入的先前搜索过滤器选择,包括导航刀片。

在 Laravel 模板系统的 masterlayout.blade(包括具有选择框的 nav.blade)中,我在刷新用户搜索时读取这些 SESSION 变量,然后从控制器设置 SESSION 变量从按钮单击调用将选择框重置为 SESSION 变量中的值。

但是,masterlayout.blade 模板是从其他页面调用的,因为它和 search-nav 出现在可能用于搜索或不用于搜索的其他页面上,在用户进行过滤搜索之前或之后。

问题是当请求其他页面时,即使在搜索之后,SESSION 变量似乎也不可用,重置为空或其他什么---我无法弄清楚,因为我没有破坏会话,它们应该可以从设置后的任何页面。

但是当请求其他页面时,我得到了 _SESSION 变量不可用错误。

  1. 如果您知道如何解决此问题,请告诉我。

  2. 如果您知道如何以更好的方式在页面之间保留选择框值,请告诉我。我不想让 db 执行此操作,但也许有一种 javascript 方法可以跨页面保留变量。

谢谢

【问题讨论】:

  • 听起来你正在覆盖你的值或没有调用 session_write_close()
  • 您没有向我们展示任何代码,因此任何答案充其量只是猜测。请编辑您的问题并提供Minimal, Complete, and Verifiable example,以便我们尝试帮助您。
  • “也许有一种 javascript 方法可以跨页面保留变量”——是的,与跨页面存储会话密钥的方式相同:cookie。现代浏览器还提供 Web Storage API 用于访问 localStorage 和 sessionStorage 客户端。

标签: php session


【解决方案1】:

这是在控制器中通过单击调用控制器的按钮访问发布数据

//colvals
session_start();
        $bidded=$_GET["bidded"];
        $_SESSION["bidded"] = $bidded;

        $state=$_GET["state"];
        $_SESSION["state"] = $state;

        $city=$_GET["city"];
        $_SESSION["city"] = $city;

        $biddertype=$_GET["biddertype"];
        $_SESSION["biddertype"] = $biddertype;

        $job=$_GET["job"];
        $_SESSION["job"] = $job;

        $subjob=$_GET["subjob"];
        $_SESSION["subjob"] = $subjob;

在搜索过滤器导航页面中,来自先前用户搜索的选择框值(存储在控制器的上述代码中)由以下设置:

<script> 
    document.getElementById("bidded").addEventListener("load", mySelect());
    document.getElementById("state").addEventListener("load", mySelect());
    document.getElementById("city").addEventListener("load", mySelect());
    document.getElementById("biddertype").addEventListener("load", mySelect());
    document.getElementById("job").addEventListener("load", mySelect());
    document.getElementById("subjob").addEventListener("load", mySelect());

    function mySelect() { 
    document.getElementById("<?php echo $_SESSION['bidded'];?>").selected = "true";
    document.getElementById("<?php echo $_SESSION['state'];?>").selected = "true";
    document.getElementById("<?php echo $_SESSION['city'];?>").selected = "true";
    document.getElementById("<?php echo $_SESSION['biddertype'];?>").selected = "true";
    document.getElementById("<?php echo $_SESSION['job'];?>").selected = "true";
    document.getElementById("<?php echo $_SESSION['subjob'];?>").selected = "true";
    }

</script> 

在这种情况下,Javascript 会话和局部变量没有任何用处,因为当页面刷新时,它会读取选择框的默认状态并覆盖在搜索输入提交之前存储的状态。

问题是当我没有销毁会话时,其他页面会使用相同的模板并抱怨没有定义 _SESSION 变量,但我猜只有一个脚本可以访问它,即使这些页面没有。它需要一个表单提交来再次设置会话过滤器选择值。

因为这是一个独特的功能,它最终可能会拥有自己的模板,因为担心 100 个其他页面的会话变量更像是 PITA,而不是第二个模板。我会试试 cookie,但不想在用户端公开查询数据。

感谢您的意见...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多