【问题标题】:Why resultset can't be put into session in php为什么结果集不能放入 php 中的会话
【发布时间】:2013-04-15 03:11:38
【问题描述】:

我的脚本如下,

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) ...它说,它是一个对象,而不是一个资源。那么为什么一个对象没有被存储在会话中呢?

【问题讨论】:

    标签: php session


    【解决方案1】:

    尝试替换:

    $_SESSION['employees'] = $employees;
    

    与:

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

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

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

    【讨论】:

    • @STT LCU,我刚刚申请了空间。 :) 已修复。
    • 通过在 fetch_all() 中传递 MYSQLI_ASSOC 效果很好,默认为 MYSQLI_NUM
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2011-03-26
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多