会话变量影响 PHP 中其他会话变量的问题

Posted

技术标签:

【中文标题】会话变量影响 PHP 中其他会话变量的问题【英文标题】:Problem with a session variable affecting other session variables in PHP 【发布时间】:2021-12-30 13:04:13 【问题描述】:

当我尝试使用$_SESSION['pageNumbers'] 时,它会禁用其他持有值的会话变量:

与:

如果我注释掉$_SESSION['pageNumbers'],其他会话变量工作正常 (“sixdigitpass”和“注销”按钮):

没有:

我在 header.php 中有session_start();,但我不明白为什么它不允许我在不影响其他会话的情况下使用$_SESSION['pageNumbers']

谁能帮帮我?

代码

要获得每页的有限行数:

public function fetchAllStudents()

    $outputPerPage = 20;
    $sqlQuery = 'SELECT * FROM students';
    $statement = $this->_dbHandle->prepare($sqlQuery);
    $statement->execute(); // execute the PDO statement
    $resultNumber =  $statement->rowCount();
    $_SESSION['pageNumbers'] = ceil($resultNumber/$outputPerPage); // ERROR DETECTED 
    if(!isset($_GET['page']))
    
        $page = 1;
    
    else
    
        $page = $_GET['page'];
    
    $currentFirstOutput = ($page-1)*$outputPerPage;
    $sqlNewQuery = "SELECT * FROM students LIMIT " . $currentFirstOutput . ',' . $outputPerPage;
    $statementNew = $this->_dbHandle->prepare($sqlNewQuery); // prepare a PDO statement
    $statementNew->execute(); // execute the PDO statement
    $statementNew->rowCount();
    while ($row = $statementNew->fetch()) 
        $dataSet[] = new StudentData($row);

    
        return $dataSet;

显示分页:

<?php
if(isset($_SESSION['pageNumbers']))

    for ($page = 1; $page <= $_SESSION['pageNumbers']; $page++)
    
        echo '<a href="index.php?page=' . $page . '">' . $page . '</a> ';
    

?>

如果我使用$_SESSION['pageNumbers'],下面有一些片段会受到影响

在登录时显示用户名:

Welcome,  <?php if(isset($_SESSION['user_ID']))
            echo explode(" ", $_SESSION['full_name'])[0];
         else 
            echo " Guest";
        ?>

如果已登录,则从“登录”更改为“注销”:

    <?php if(!isset($_SESSION['user_ID'])) : ?>
    <a class="bb text-decoration-none" href="../../login.php">Login</a>
    <?php else: ?>
    <a class="bb" href="../../Models/Core.php?exit=logout">Logout</a>
    <?php endif; ?>

【问题讨论】:

请粘贴代码,不要截图。 好的,我会的。 @MarkusZeller 我已将代码添加到问题中。 欢迎来到 Stack Overflow!请将您的代码直接复制并粘贴到帖子中,而不是链接或插入它的图像。要了解有关格式化的更多信息,请阅读:How do I format my posts using Markdown or html? 【参考方案1】:

经过3个小时的手动调试,我找到了解决方案,显然在行前添加了session_start();

session_start(); // solution :)
$_SESSION['pageNumbers'] = ceil($resultNumber/$outputPerPage); // ERROR FIXED

我从不需要在任何函数中使用session_start();。如果哪位专家能指出原因,我将不胜感激。

【讨论】:

参见 php 的 session_start() 文档。 php.net/manual/en/function.session-start.php 当 session_start() 被调用或会话自动启动时,PHP 将调用打开和读取会话保存处理程序。这些将是默认提供的内置保存处理程序或由 PHP 扩展(例如 SQLite 或 Memcached)提供;或者可以是 session_set_save_handler() 定义的自定义处理程序。读取回调将检索任何现有的会话数据(以特殊的序列化格式存储)并将被反序列化并用于在读取回调将保存的会话数据返回给 PHP 会话处理时自动填充 $_SESSION 超全局变量。 由于您从未初始化会话,因此您的代码无法使用现有的会话信息。

以上是关于会话变量影响 PHP 中其他会话变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 啥是会话变量的替代品

如何使用 JQUERY 读取 SESSION 变量

PHP:会话变量

php会话变量不一致

如何使用 php 在不同页面中访问我的会话变量?

查看php会话变量