0

我编写如下脚本,

session_start();
$employees = null;

if (isset($_SESSION['employees'])) {
    $employees= $_SESSION['employees'];

} else {

$con = new mysqli("localhost", "root", "test", "emp_db");
$employees = $con->query("SELECT * from employee");
$_SESSION['employees'] = $employees;
}

echo "<table>";

foreach ($employees as $row) {
   echo '<tr>';
   echo "<td>" . $row['emp_id'] . " </td>";
   echo "<td>" . $row['emp_name'] . " </td>";
   echo "<td>" . $row['emp_address'] . "</td>";
   echo "</tr>";
}

第一页访问顺利,即从db访问。但是当我尝试在第二页请求中从 $_SESSION 中获取时,它说...

"Warning: main(): Couldn't fetch mysqli_result in C:\xampp\htdocs\test\dbtemp.php on line 22". My line 22 is: foreach( $employees as $row) {

任何想法?

如果php返回的resultset是已连接的资源(如Java),为什么我们在关闭与DB的连接后仍然可以对其进行迭代?

当我打电话时get_resource_type($employees)......它说,它是一个对象,而不是一个资源。那么为什么一个对象没有被存储在会话中呢?

4

2 回答 2

3

引用自 SO question在会话变量中存储数据库连接

您不能在会话中存储数据库连接或结果集,因为它们是资源,并且:

某些类型的数据无法序列化,因此存储在会话中。它包括资源变量或具有循环引用的对象(即,将对自身的引用传递给另一个对象的对象)。

http://php.net/manual/en/intro.session.php

您可以将结果集提取到普通数组中,然后像任何其他变量一样将其存储在会话中。无论如何,这将是一个相当典型的会话用例。请注意不要在会话中存储太多数据,因为这比从数据库中获取数据更费力。

于 2013-04-22T09:17:13.977 回答
0

尝试替换:

$_SESSION['employees'] = $employees;

和:

$_SESSION['employees'] = $employees->fetch_all();

脚本不共享结果集,调用时间不同。换句话说,您无法在数据库连接关闭后正确保存活动mysqli_result$_SESSION使用它。但是,您可以保存array. mysqli_result::fetch_all()是你需要的。

不过,我认为这不是一个好方法。我建议你监督你的剧本。

于 2013-04-22T09:15:32.740 回答