php:页面导航后会话消失

php:页面导航后会话消失,php,session,Php,Session,我已经阅读了所有关于这个问题的帖子,但是,到目前为止,没有一个解决方案对我有效。显然,我忽略了一些重要的事情。我也不知道如何调试会话。我读了一篇文章,但写得太离谱了 因此,就像其他问题一样,当我在应用程序中导航到另一个页面时,无论是通过链接还是表单提交,我的会话都会消失。我不知道为什么我的会话消失了。如果有人有时间帮我调查,我将不胜感激 这些是我的php.ini设置 ; Name of the session (used as cookie name). session.name = PHP

我已经阅读了所有关于这个问题的帖子,但是,到目前为止,没有一个解决方案对我有效。显然,我忽略了一些重要的事情。我也不知道如何调试会话。我读了一篇文章,但写得太离谱了

因此,就像其他问题一样,当我在应用程序中导航到另一个页面时,无论是通过链接还是表单提交,我的会话都会消失。我不知道为什么我的会话消失了。如果有人有时间帮我调查,我将不胜感激

这些是我的php.ini设置

; Name of the session (used as cookie name).  
session.name = PHPSESSID  

; The path for which the cookie is valid.  
session.cookie_path = /
这是要显示的第一个视图

<?php
session_start();
if (!isset($_SESSION['session_id'])) {
    $_SESSION['session_id'] = session_id();
}
if (!isset($_SESSION['invoices'])) {
    $_SESSION['invoices'] = $invoices;
}

if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . " in invoiceList.<br />");
} else {
    echo 'No session ID set in invoiceList <br />';
}
?>
<div>

    <table>
        <tr>            
            <th>Customer Name</th>
            <th>Invoice Date</th>
            <th>Invoice Number</th>
        </tr>
        <tr>
            <?php
            include_once 'form/editInvoice.php';
            if (isset($invoices)) {

                foreach ($invoices as $invoice) {
                    ?>
                <tr>
                    <td><?php echo $invoice['customer_name'] ?></td>
                    <td><?php echo $invoice['invoice_date'] ?></td>
                    <td><?php echo $invoice['invoice_number'] ?></td>
                    <td><a href='<?php echo $_SERVER['SCRIPT_NAME']; ?>/retrieve?class=InvoiceLineItems&amp;id=<?php echo $invoice['invoice_id']; ?>'><?php echo $invoice['invoice_id']; ?></a></td>
                </tr>
                <?php
            }
        } else {
            echo 'No invoices retrieved.';
        }
        ?>
        </tr>
    </table>
</div>  
当我到达会话变量赋值时,我没有会话数据:

公共功能更新(){


}

每个PHP文件都应该以
session_start()开头无论是否设置了
$\u会话
。此函数将创建新会话或使用现有会话。

所有需要会话信息的代码都应以
session\u start()开头。
<代码>会话\u start()
需要在写入任何标题或其他输出之前进行。
然后为您处理安装和拆卸

我这样做:

session_start();
$s = &$_SESSION;
然后,您可以使用读/写
$s
,就像它是
$\u会话

如果您正在进行自引用图像下载或其他可能希望并行执行的代码,不启动会话或使用
session\u write\u close()
尽快关闭会话将显著提高性能。
如果没有这一点,会话基本上会使代码单线程运行

编辑:说单线程可能是一个糟糕的选择。
假设您有一个包含三个iFrame的页面,每个iFrame加载一个不同(或相同)的php脚本。如果您使用的是会话,那么结果将是iframe一次加载一个会话,而不是一次加载所有会话。每个人都会锁定会话,其他人会在
会话\u start()
处等待,直到会话再次可用。

$\u当您用第一个
if
检查会话时,会话开始。因此,它将永远失败。在使用
$\u session
变量执行任何操作之前,必须调用
session\u start()
。更正您的代码

第一页:

<?php
session_start();

/* Don't need this unless you really need the debugging
   Previously you where assigning variables that did not 
   exist to the the $_SESSION variables. Not what you want
   I imagine.

if (!isset($_SESSION)) {
    var_dump($_SESSION);

}
*/
...

您可以将所有会话处理简化为:在发送头之前,在脚本开始时:
session\u start()
。默认情况下,其余部分由您处理。当您使用第一个
if
检查会话时,不会启动任何
$\u会话。在使用
$会话执行任何操作之前,必须先调用
会话\u start()
@PenguinCoder我添加了错误检查,因为我不知道如何跟踪它。@Daren那么,如果我在index.php视图中添加session_start(),这是否意味着我的会话在整个应用程序中都处于活动状态?我不熟悉会话的用法。因此,我不知道当事情不起作用时要寻找什么。会话将在您第一次调用
session\u start()
时启动/创建。这使得它可用于此脚本调用。使用
/
的cookie\u路径意味着对整个站点使用相同的会话。因此,如果您有一个单独的
blah.php
页面,并且其中也有
session_start()
,那么您将返回与
index.php
相同的会话。访问会话信息的每次执行都必须调用
session\u start()
。是每个文件还是每个视图页?作为补充说明,我检查了临时目录,所有的会话都被写出来了。所以我知道我对那个文件夹有写权限。我删除了会话检查。我之所以拥有它,是因为我正在尝试调试它。我不是在尝试构建多线程应用程序,但感谢您的提示。我想做的就是保存多个db调用,因为我将在不同的地方使用相同的数据。我将合并所有建议。我非常感谢大家的帮助。有关更新,请参阅我的编辑。谢谢
//If form is posted, update line items with PO number and date.
if (isset($_POST['po_number'])) {
    $this->invoice->update();
}
$con = $this->_getLocalConn();


$invoices = $_SESSION['invoices'];

try {
    $sqlUpdate = $con->prepare("UPDATE invoices 
                                SET po_number = ?, po_issued_date = ?
                                WHERE invoice_id = ?");

    foreach ($invoices as $record) {
        $sqlUpdate->execute(array(
            $_POST['po_number'],
            getdate(),
            $record['invoice_id']
        ));
    }
} catch (PDOException $e) {
    print $e->getMessage();
}
//get the PO number being used to update the records
//perform db update where po_number = input
//notify user of success and display updated records.
session_start();
$s = &$_SESSION;
<?php
session_start();

/* Don't need this unless you really need the debugging
   Previously you where assigning variables that did not 
   exist to the the $_SESSION variables. Not what you want
   I imagine.

if (!isset($_SESSION)) {
    var_dump($_SESSION);

}
*/
...
<?php
session_start();

if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "in editForm<br />");
} else {
    echo 'No session ID set in editForm <br />';
}
...
<?php
session_start(); //Notice a pattern here??


if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "<br />");
} else {
    echo 'No session ID set invoice<br />';
}
?>