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