【问题标题】:PHP Fetch data twicePHP 两次获取数据
【发布时间】:2012-07-16 15:10:30
【问题描述】:

我的函数看起来像这样。

 private function generateTree($courseID) {
        $q = "SELECT l.id, l.name AS lesson_name, c.name AS course_name FROM lessons AS l, courses AS c WHERE l.course_id=c.id AND c.id=?";
        $stmt = $this->db->prepare($q);
        $stmt->bind_param("i", $courseID);
        $stmt->execute();
        $stmt->store_result();
        if ($stmt->num_rows > 0) {
            $stmt->bind_result($id, $lName, $cName);
            echo "<li> <a href='#'>$cName</a> <ul>";
            while ($stmt->fetch()) <====HERE!!!
                echo "<li> <a href='?course=$courseID&lesson=$id'> $lName </a></li>";
            echo "</ul> </li>";
        }
    }

问题是我开始在一段时间内获取数据,但在一段时间之前我也需要它。我可以获取两次数据吗?还有其他建议吗?

【问题讨论】:

    标签: php mysql mysqli prepared-statement fetch


    【解决方案1】:

    已经四年了,但如果有人像我一样偶然发现这个问题:

    while ($stmt->fetch()) {
      // do your thing
    }
    
    $stmt->data_seek(0);
    
    while ($stmt->fetch()) {
      // do something other
    }
    

    你可以read documentation here

    【讨论】:

    • 2019 并且运行良好。请问data_seek(0)是什么意思?
    • @questionbank,每次调用 fetch 时,它都会用 当前 行的数据填充变量,并将 当前行指针 增加 1 . 当你做while($stmt-&gt;fetch()) - 循环的每次迭代你都在逐行行走。在最后一行之后,指针保存了 last row +1 的 id,但没有具有这种 id 的行,因此fetch 返回false,然后您退出 while 循环。但是指针仍然持有那个id。您不能通过另一个循环,因为fetch 仍将返回falsedata_seek 会将指针设置为您喜欢的任何内容。它是从零开始的,所以 0 = 第一行
    • 感谢您的解释。现在我明白了。
    【解决方案2】:

    您可以使用fetchAll() 获取所有数据并根据需要对其进行多次迭代。

    $result = $stmt->fetchAll(); // PDO
    $result = $stmt->fetch_all(); // MySQLi
    
    foreach($result as $row) { print $row['lesson_name']; }
    foreach($result as $row) { print $row['lesson_name']; }
    foreach($result as $row) { print $row['lesson_name']; }
    etc...
    

    更新:我不完全确定您在做什么,因为您的代码中似乎混入了几个想法。也许你想要这样的东西?

    $q = "SELECT l.id, l.name AS lesson_name, c.name AS course_name FROM lessons AS l, courses AS c WHERE l.course_id=c.id AND c.id=?";
    $stmt = $this->db->prepare($q);
    $stmt->bind_param("i", $courseID);
    $stmt->execute();
    
    if ($stmt->num_rows > 0)
    {
        $results = $stmt->fetch_all();
    
        foreach($results as $row)
        {
            print_r($row);
        }
    }
    

    【讨论】:

    • 这不是 PDO 而是预先准备好的语句。另外,我怎样才能像目前一样使用 fetchal 循环?
    • @epic_syntax 这里是mysqli版本:php.net/manual/en/mysqli-result.fetch-all.php
    • 我正在使用准备好的声明
    • @epic_syntax,prepared statements 与您用于获取查询结果的方法无关。我认为您对某些事情感到困惑。
    • @epic_syntax,print_r() 只是一个示例行,向您展示了此时您必须使用的值。
    【解决方案3】:

    我认为你可以让你的数据库查询类返回一个数据库结果数组。您可以根据需要多次使用数据。

    你可以像这样创建一个数据库结果集的数组:

    while($row = mysql_fetch_assoc($result))
    {
       $results[] = $row;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2021-03-28
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多