PHP:页面导航后会话消失



我已经阅读了我能找到的关于这个问题的所有帖子,但是到目前为止,没有一个解决方案对我有用。显然,我忽略了一些重要的事情。我也不知道如何调试会话。我读了一篇文章,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();
if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "in editForm<br />");
} else {
    echo 'No session ID set in editForm <br />';
}
if (!$_POST) {
    ?>
<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post">
        <fieldset>
            <legend>Enter Updated PO Number</legend>
            <li>PO Number: <input type="text" name="po_number"/></li>
        </fieldset>
        <input type="submit" value="Submit" />
        <input type="button" onclick="alert('Changes Canceled.')" value="Cancel"/>
    </form>
<?php }
?>

最后是用户单击主页中链接时的详细信息页面。

<?php
session_start();
if (isset($_SESSION['session_id'])) {
    print_r($_SESSION['session_id'] . "<br />");
} else {
    echo 'No session ID set invoice<br />';
}
?>
<h1>Invoice Detail</h1>
<div>
<?php
foreach ($partnerInfo as $info) {
    switch ($info['role_indicator']) {
        case 'remit_to':
            ?>
            <div id="remit">
                <ul>
                    <li>PLEASE REMIT TO:</li>
                    <li><?php echo $info['partner_name']; ?></li>
                    <li><?php echo $info['street_name']; ?></li>
                    <li><?php echo $info['city_name']; ?>, <?php echo $info['state']; ?> <?php echo $info['postal_code']; ?></li>
                </ul>
            </div>
            <?php break; ?>
        <?php case 'seller': ?>
            <div id = "seller" >
                <ul>
                    <li>Service Site:</li>
                    <li><?php echo $info['partner_name']; ?></li>
                    <?php
                    if ($info['partner_aux_info'] !== NULL) {
                        ?><li><?php echo $info['partner_aux_info']; ?>
                        <?php }
                        ?>
                    </li>
                    <li><?php echo $info['street_name']; ?></li>
                    <li><?php echo $info['city_name']; ?>, <?php echo $info['state']; ?> <?php echo $info['postal_code']; ?></li>
                    <li>(405)677-0221</li>
                </ul>        
            </div>
            <?php break; ?>
        <?php case 'sold_to': ?>
            <div id="buyer">
                <ul>
                    <li>Bill To: </li>
                    <li><?php echo $info['partner_name']; ?></li>
                    <li><?php echo $info['street_name']; ?></li>
                    <?php
                    if ($info['suite_info'] !== NULL) {
                        ?><li><?php echo $info['suite_info']; ?>
                        <?php }
                        ?>
                    </li>
                    <li><?php echo $info['city_name']; ?>, <?php echo $info['state']; ?> <?php echo $info['postal_code']; ?></li>
                </ul> 
            </div>   
            <?php break; ?>
        <?php
    }
}
?>
<h1>Line Items</h1>
<table>
    <th>PO Number</th>
    <th>PO Issued Date</th>
    <th>Description</th>
    <th>Service Start Date</th>
    <th>Service End Date</th>
    <th>Shipped Date</th>
    <?php foreach ($invoiceLineItems as $lineItem) { ?>
        <tr>
            <td><?php echo $lineItem['po_number']; ?></td>
            <td><?php echo $lineItem['po_issued_date']; ?></td>
            <td><?php echo $lineItem['line_item_name']; ?></td>
            <td><?php echo $lineItem['service_period_start']; ?></td>
            <td><?php echo $lineItem['service_period_end']; ?></td>
            <td><?php echo $lineItem['request_for_delivery']; ?></td>
        </tr>       
        <?php
    }
    ?>
</table>

</div>

编辑:我已经删除了会话检查并更新了代码示例。我在 index.php 中的 <head> 标签之前添加了 session_start()。我已经验证我可以写入会话临时文件夹。

当我在控制器中执行此代码以使用新的 PO 编号更新发票时,我到达了模型的功能,但会话已消失。

//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.

}

每个 PHP 文件都应该以 session_start(); 开头,无论是否设置$_SESSION。此函数将创建一个新会话或占用现有会话。

当您

用第一个if检查它时,没有开始$_SESSION。因此,它将始终失败。在使用 $_SESSION 变量执行任何操作之前,必须调用 session_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);
}
*/
...

包括表单:

<?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 />';
}
?>

所有需要会话信息的代码都应以 session_start() 开头。 session_start()需要在写入任何标头或其他输出之前发生。
然后为您处理设置和拆卸。

我这样做:

session_start();
$s = &$_SESSION;

然后,您可以像使用$_SESSION一样使用读/写$s

如果您正在执行自引用图像下载或其他可能最终想要并行执行的代码,则不启动会话或使用session_write_close()尽快关闭会话将显着提高性能。
如果没有这个,会话基本上会使你的代码单线程运行。

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

最新更新