为什么结果集不能在php中进入会话

时间:2013-04-22 09:13:06

标签: php session

我按如下方式编写脚本,

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返回的结果集是连接资源(如Java),为什么我们仍然可以在关闭与DB的连接后迭代它?

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

2 个答案:

答案 0 :(得分:3)

引自SO问题Storing database connection in a session variable

您无法在会话中存储数据库连接或结果集,因为这些是资源,并且:

  

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

     

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

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

答案 1 :(得分:0)

尝试替换:

$_SESSION['employees'] = $employees;

使用:

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

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

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