【问题标题】:PHP Session variable being dropped halfway through scriptPHP Session 变量在脚本中途被删除
【发布时间】:2012-08-24 06:35:51
【问题描述】:

我正在尝试在我的一个脚本中保存一个会话变量,它似乎对于脚本的一部分工作正常,但是,它在我的代码的第二部分中被删除了。我已经回应了每一行,但无法弄清楚为什么会发生这种情况。此外,这段代码之前运行良好,但自从我切换服务器后,它似乎出现了故障。我不认为这是会话保存路径,因为代码的第一部分工作正常。这是我的代码的基本外部结构(我已经删除了所有不相关的部分以节省空间):

<!--raw-->
<?php 

session_start(); 
include 'config.php'; 

?>
<html>
<body>

<form id="driver_record" method="post" action="<?php echo htmlentities($PHP_SELF); ?>">
Enter Driver Number: <input type="text" name="driver" />
<input type="submit" value="Submit" name="user_submit" />
</form>

<?php

if(isset($_POST['user_submit']))
{
if(username_exists($_POST['driver'])){

$ulog = $_POST['driver'];
$_SESSION['user_id'] = $ulog;
echo $_SESSION['user_id']; //Session echos fine here
$tablename_cc = "cc_".$ulog;
$tablename_db = "db_".$ulog;
$tablename_misc = "misc_".$ulog;
$tablename_cash = "cash_".$ulog;

?>

<form id="expenses_update" method="post" action="<?php echo htmlentities($PHP_SELF); ?>">
<input type="submit" value="Approve" name="record_approve" />

<?php
}
}
?>

<?php

    if(isset($_POST['record_approve']))
    {
        echo $_SESSION['user_id']; //Session does not echo here
        $ulog = $_SESSION['user_id'];
        $tablename_cc = "cc_".$ulog;
        $tablename_db = "db_".$ulog;
        $tablename_misc = "misc_".$ulog;
        $tablename_cash = "cash_".$ulog;

    }

    //unset($_SESSION['user_id']);
    //session_destroy();
?>

</body>
</html>
<!--/raw-->

编辑:我已经注释掉了 unset 语句,并且还尝试将它们放在 if 语句中,而不改变代码的行为。

【问题讨论】:

  • 你能把php版本和ini配置去掉吗,因为你的代码在我的服务器上运行良好,还要检查你在config.php中做了什么
  • 我从代码中删除了配置,但行为仍然相同。放弃 PHP 版本是什么意思?

标签: php session session-variables


【解决方案1】:

每次运行代码时,您都会调用 unset($_SESSION['user_id']);这是因为它不在您的 IF 语句中,您的花括号放错了位置。

<?php

    if(isset($_POST['record_approve']))
    {
        echo $_SESSION['user_id']; //Session does not echo here
        $ulog = $_SESSION['user_id'];
        $tablename_cc = "cc_".$ulog;
        $tablename_db = "db_".$ulog;
        $tablename_misc = "misc_".$ulog;
        $tablename_cash = "cash_".$ulog;

    unset($_SESSION['user_id']);
    session_destroy();

    } //moved curly brace here

?>

编辑:代码对我来说运行良好,我不得不注释掉包含行和使用的函数,错误必须在 config.php 内。你在那个文件的顶部有一个 session_start() 并且没有使用 unsets 吗?

【讨论】:

  • 对不起,我应该提到unset已经放在了if语句中,并且也被注释掉了,但是代码的行为仍然完全一样。
  • 不,我没有针对该文件的会话。有必要吗?
  • 我刚刚删除了配置文件,行为是一样的。除非它与我不知道的主机有关,否则我真的不知道。任何服务器端都会影响会话行为吗?
  • 你在本地运行时得到相同的结果吗?
  • 我没有在本地设置 PHP。这一切都在虚拟服务器上运行。
【解决方案2】:

这是一个简单的会话脚本,你有这个问题吗? 如果是这样,则php有问题。

<?php
session_start();

$_SESSION['testing'] = "boo";
echo "Session 1=" . $_SESSION['testing'];
?>

<form action="session1.php" method="post">
<input type="text" name="input"
<input type="submit" />
</form>
<pre>

<?php

if (isset($_POST['input']))
{
   print_r ($_SESSION);
   print_r ($_POST);
}

?>

【讨论】:

    【解决方案3】:

    似乎我或这里的其他任何人都无法为正在发生的事情找到合乎逻辑的解决方案。我决定简单地删除会话变量并包含一个“隐藏”输入字段,该字段仅通过 POST 变量发送变量。这似乎解决了我所有的问题,而不必担心会话变量的行为。

    【讨论】:

      【解决方案4】:

      您仅在提交第一个表单时设置会话值 (isset($_POST['user_submit']))。当脚本处理第二个表单提交 (isset($_POST['record_approve'])) 时,没有设置会话值。因此没有输出。

      您确实意识到,即使脚本在一个 PHP 文件中,它也会被两个互斥的表单提交触发,对吧?所以会话值只有在isset($_POST['user_submit'] 之后才可用。因此,如果您在提交第一个表单后提交第二个表单,您将拥有一个会话变量'user_id',前提是您已注释掉取消设置和销毁会话的行。

      希望它有意义。

      【讨论】:

      • 会话变量的目的不就是要一直保存到销毁吗?我应该提到的一件事是,我取消设置变量并销毁会话的最后两行已被注释掉,并且行为仍然相同。
      • 另外,这个确切的结构以前是有效的,所以对我来说没有意义。
      • 脚本的处理方式,第二种形式只能在第一种形式之后触发,所以'user_id'应该可用,因为会话变量在销毁之前不应该消失(至少据我了解) .
      • 但是你的unsetsession_destroy在表单处理循环之外,所以每次调用脚本都会触发。
      • 我已经将这些注释掉了。行为完全相同。我也将它们放在循环中,并且仍然相同。
      猜你喜欢
      • 2012-05-30
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2020-02-08
      • 2018-12-11
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多