【问题标题】:Why is my session_id() not being passed to next page?为什么我的 session_id() 没有被传递到下一页?
【发布时间】:2018-12-17 05:21:24
【问题描述】:

可能有更好的方法可以做到这一点,但我很确定我仍然应该将 session_id() 传递到第二页。相反,在第 2 页上调用它作为我的前几行会生成一个全新的 session_id(),而不是在第 1 页上创建的。

第 2 页开始:

<?php
error_reporting(E_ALL);ini_set('display_errors',1);
session_start();
echo session_id();
$sessionid = session_id();
echo "sessionNUM &nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp   = $sessionid\n";
echo "<br>";

echo '<pre>' .print_r($_SESSION, TRUE) . '</pre>';

第 1 页全部:

<?php
error_reporting(E_ALL);ini_set('display_errors',1);
session_start();
$sessionid = session_id();
$currentDate = date('Y-m-d');

//echo "sessionNUM &nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp   = $sessionid\n";
//echo "<br>";
//echo "<br>";
//echo '<pre>' .print_r($_SESSION, TRUE) . '</pre>';

session_unset();
$old_sessid = session_id();
session_regenerate_id();
$new_sessid = session_id();
session_id($old_sessid);
session_destroy();


session_regenerate_id(FALSE);


session_start();
echo session_id();
echo "<br>";
$sessionid = session_id();
$currentDate = date('Y-m-d');

echo "sessionNUM &nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp   = $sessionid\n";
echo "<br>";
echo "<br>";
echo '<pre>' .print_r($_SESSION, TRUE) . '</pre>';

//Connect to DB

        require_once 'configPOS.php';
        $conn = new mysqli($hn, $un, $pw, $db);
        if ($conn->connect_error) die($conn->connect_error);


//Enter Session ID and set Order ID
    //search for session info already exsiting

    $result=$conn->query("SELECT * FROM POS_HEADERS WHERE sessionid='$sessionid' AND date='$currentDate'");
    echo mysql_error();
    if(mysqli_num_rows($result) > 0){
    echo "session info already exists";
    }
     else{

        echo "test.";

/*
$sessionid = session_id();
*/




$sql="INSERT INTO POS_HEADERS (sessionid, date)
VALUES('$sessionid', '$currentDate')";

       if ($conn->query($sql) === TRUE) {
                  echo "New order started.<br>";
        } 
        else {
           echo "Error " . $sql . "<br>" . $conn->error;
        }
}
        $res=$conn->query("select ORDID from POS_HEADERS where sessionid='$sessionid'");
        list($ORDERNUM)= $res->fetch_row();
        //echo "<br>";        
        echo "<br>";
        echo "ORDERNUM &nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp   = $ORDERNUM\n";

        $_SESSION["OrderNum"] = $ORDERNUM;
        echo "<br>";        
        //echo "<br>";
        echo "Session variables are set.";


 $res=$conn->query("select ORDID from POS_HEADERS where sessionid='$sessionid'");
        list($ORDERNUM)= $res->fetch_row();
        echo "ORDERNUM= $ORDERNUM\n";

//echo "<br>";   

echo $_SESSION["OrderNum"];
$ordernum= $ORDERNUM;
echo $ordernum;
echo '<br>';
$LOCATION = $_POST["pickedlocation"];
echo $LOCATION;
echo "<br>";   
echo "<br>";   


echo "END Debugging Info";
echo "<br>";   
echo "<br>";   

echo '<pre>' .print_r($_SESSION, TRUE) . '</pre>';

echo "<br>";   
echo session_id();

echo "<br>";   
?>


<input type="button" value="Home" class="homebutton" id="btnHome" 
onClick="window.location = 'https://www.example.com/POS/home.php'" />

我原来的问题是

PAGE 2 having one session_id(), lets call it "A",   
PAGE 3 had a previous session(id), lets call it "B", 
PAGE 4 had session_id() "A" again, and 
PAGE 5 had session_id() "B" again.

第 2-5 页的所有页面都将数据插入到该 session_id() 的数据库中,但由于某种原因,第 2 页在第 1 页创建一个新的 session_id() 后不断创建一个新的 session_id(),这让我到了现在的位置。

我发现的东西 - session_save_path() 是可写的,url 路径与页面 (...) 相同。此外,在同一个 URL 上,不同目录中的非常相似的页面可以完美运行,所以我认为这是代码错误,而不是 php.ini 错误。

【问题讨论】:

  • 你能检查一下你的会话cookie是否在客户端持续存在并被发送回服务器吗?另外,检查服务器上是否启用了会话持久性。
  • 我的第 2-5 页现在可以正常工作,共享相同的 session_id。只是 PAGE 1 到 2 开关不起作用。我想它可以像这样工作,但是当它从第 1 页到第 2 页生成新 id 时,它会像这样跳过数据库中的订单号。一旦它在第 2 页上获得 session_id,它现在将 session_id 保留到第 5 页。
  • 您的代码似乎毫无意义。为什么在同一个脚本中同时调用 session_start 和 session_regenerate_id 多次次?

标签: php session sessionid


【解决方案1】:

首先,您的浏览器是否拒绝 cookie?在这种情况下,您可能总是会获得一个新的会话 ID。不同的浏览器有不同的选项/面板来接受 cookie。

其次,将php.ini中的以下字段编辑为合适的值。

session.use_cookies
session.save_path
session.use_trans_sid

【讨论】:

  • 我的第 2-5 页现在可以正常工作,共享相同的 session_id。只是 PAGE 1 到 2 开关不起作用。
  • 在 session_start() 之前不能有任何回显/输出。对于第 1 页和第 2 页,请确保文件是纯文本,而不是 unicode 文件。 stackoverflow.com/questions/32986445/… 将文件另存为 ANSI。
【解决方案2】:

两个页面有不同的session_start() 调用?如果您想为所有页面使用一个session_id,您应该只使用一个session_start() 调用这两个文件。

例如,创建第三个页面,我们将其命名为bootstrap.php,并将其包含在PAGE1PAGE2 的开头。在这个文件中,您可以开始您的会话。

希望我能正确理解您的问题。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多