PHP会话变量在脚本执行到一半时被删除


PHP Session variable being dropped halfway through script

我正试图在我的一个脚本中保存一个会话变量,它似乎对脚本的一部分运行良好,但它在我的代码的第二部分中被删除了。我重复了每一句话,不明白为什么会发生这种事。此外,这个代码以前运行得很好,但自从我切换服务器后,它似乎出现了故障。我不认为这是会话保存路径,因为代码的第一部分工作得很好。以下是我的代码的基本外部结构(为了节省空间,我删除了所有不相关的部分):

<!--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-->

EDIT:我已经注释掉了unset语句,并尝试将它们放在if语句中,而不对代码的行为进行更改。

每次运行代码时,您都在调用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
?>

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

这里有一个简单的会话脚本,您对此有问题吗?如果是这样,那么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);
}
?>

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

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

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

希望它有意义。