会话变量 - mysqli_query结果

时间:2017-06-09 23:44:45

标签: php mysql session

我遇到了将结果对象保存在会话变量中的问题。我想知道是否有一种方法可以在会话变量中保存结果对象(而不是实际结果),这样我就可以在我的站点的其他区域使用它,而无需再次访问数据库。理论上,我试图做到以下几点:

$formQ2 = mysqli_query($dbconnection, $formQuery3); 
$_SESSION['test'] = $formQ2;

然后我想使用会话变量:

while ($rows = mysqli_fetch_assoc($_SESSION['test'])){...}

当我运行它时,它会返回一个空对象而不是结果对象。同样,我不是试图将实际结果保存到会话而是结果对象,以便我可以在其他页面上循环它。谢谢。

只是为了让你知道我是否遵循了它,它运作正常。只是为了让你知道我的其余代码是正确的。while ($rows = mysqli_fetch_assoc($formQ2)){...}它几乎就像会话没有设置一样,因为当我使用硬编码变量时它工作正常。感谢。

编辑 - 我的整个代码。因此,当我第一次运行它时(当会话为空并且第一次设置时)它运行正常。所以它持有会话供一次使用。当我刷新页面(同一页面没有更改)时,我得到错误,好像刷新页面是取消我的会话var。我的整个代码:

if (empty($_SESSION['test'])) {
    $formQuery = "SELECT * FROM 'testTable'";
    $_SESSION['test'] = mysqli_query($dbconnection, $formQuery);
    echo "new sess";
   } else {
       $_SESSION['test'] = $_SESSION['test'];
       echo "old sess";
   }

 while ($rows = mysqli_fetch_assoc($_SESSION['test'] )){...}

正如我所说的那样,它首次运行if语句它工作正常,但是当它触发else语句(页面刷新)时,它返回一个空的会话变量,即使它之前设置并且工作正常。我正在刷新的错误是:

Warning: mysqli_fetch_assoc(): Couldn't fetch mysqli_result in xxx on line 
362

我很奇怪,在第一次加载时它会设置会话并且工作得很好。但是,当我只是按下刷新按钮时,它会抛出并出错。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

  

我想知道是否有办法在会话变量中保存结果对象(而不是实际结果)

不,没有。为了能够以文本形式存储值,PHP需要"序列化"它们,以及与serialize函数几乎相同的会话环境,以及您找到的值参数的描述:

  

要序列化的值。 serialize()处理除resource类型之外的所有类型。

mysql_query的返回值恰好是mysql结果类型的资源。

但是你可以在会话中存储mysqli_fetch_assoc的结果,因为那只是一个数组,并且可以很好地序列化。但mysqli_fetch_assoc只从结果集中取出一行 - 因此,当您实际查询数据库时,或者首次使用mysqli_fetch_all时,您仍需要使用循环将所有值放入会话中

答案 1 :(得分:0)

检查以下代码。我有一个适合你的例子。在做任何事情之前确保你已经开始了会话。

<?php
    session_start();

    $dbconnection = mysqli_connect("localhost","root","root","myDB");

    $formQuery3 = "SELECT * FROM myTable";
    $formQ2 = mysqli_query($dbconnection,$formQuery3);

    $_SESSION['test'] = $formQ2;

    while ($rows = mysqli_fetch_row($_SESSION['test'])){
        print_r($rows);
    }
?>

答案 2 :(得分:0)

以下是我使用的内容:

import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase
WsdlTestCase.metaClass.myObject = new Expando(myList: [1,2,3,4,5])
log.info "list initialized: ${context.testCase.myObject.myList}"
WsdlTestCase.metaClass.myObject = new Expando(myList: [1,2,3,4,5,6,7])
log.info "list updated: ${context.testCase.myObject.myList}"