You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在while循环中多次遍历数据库?及网店同作者书籍报错修复

技术咨询:如何在while循环中实现对数据库的多次遍历?
  • 重新执行查询:每次需要遍历前,重新调用查询语句的execute()方法重置结果集指针,之后即可再次通过fetch()循环读取数据。
  • 预存结果到数组:使用fetchAll(PDO::FETCH_ASSOC)一次性将所有查询结果存入数组,后续可直接多次遍历该数组,无需重复操作数据库。
  • 重置结果集指针:部分数据库驱动支持通过结果集对象的rewind()方法重置指针位置,实现再次遍历(需注意兼容性)。

开发问题分析与修复方案

问题根源

你的代码逻辑存在核心错误:循环中同步推进商品表和作者表的结果集指针(每次循环同时执行$product = $query->fetch(...)和$auteur = $query2->fetch(...))。当同一作者有多本书时,第二本书循环时作者指针已移动到下一条记录(甚至超出结果集),导致无法匹配正确的作者,或直接出现未定义索引错误。同时,这种分开查询再手动匹配的方式效率极低。

修复方案

最优方案:使用SQL JOIN关联查询

直接在数据库层面关联商品表和作者表,一次性获取关联数据,避免PHP层面的手动匹配:

require_once '../connect.php';

// 关联查询,一次性获取商品及对应作者信息
$query = $conn->prepare("
    SELECT p.*, a.Naam AS AuteurNaam
    FROM `product` p
    INNER JOIN `auteur` a ON p.AuteurID = a.AuteurID
");
$query->execute();

// 循环遍历关联结果
while ($product = $query->fetch(PDO::FETCH_ASSOC)) {
    $id = $product['productID'];
    echo "<div class='card'>";
    echo "<p><button class='wishlist' onclick='window.location.href=\"wishlist.php\"'><i class='fa-sharp fa-solid fa-heart'></i></button></p>";
    echo "<img src='../fotos/$id.jpg' alt='geen foto'>";
    echo "<div class='container'>";
    echo "<h1>" . $product['naam'] . "</h1>";
    echo "<p class='price'>" . '€ ' . $product['prijs'] . "</p>";
    // 直接输出关联好的作者名称
    echo "<p class='auteur'>" . $product['AuteurNaam'] . "</p>";
    
    echo "<div class='prod_buy'>";
    echo "<p><button onclick='window.location.href=\"product_page.php?id=$id\"'>meer info</button></p>";
    echo "<p><button class='buy' onclick='window.location.href=\"wishlist.php\"'><i class='fa-sharp fa-solid fa-cart-plus'></i></button></p>";
    echo "</div>";
    echo "</div>";
    echo "</div>";
}

备选方案:预存作者数据到数组

若坚持分开查询,可先将所有作者数据存入数组,再在商品循环中通过AuteurID匹配:

require_once '../connect.php';

$query = $conn->prepare("SELECT * FROM `product`");
$query->execute();

// 预存所有作者数据到以AuteurID为键的数组
$query2 = $conn->prepare("SELECT * FROM `auteur`");
$query2->execute();
$auteurs = [];
while ($auteur = $query2->fetch(PDO::FETCH_ASSOC)) {
    $auteurs[$auteur['AuteurID']] = $auteur['Naam'];
}

// 循环处理商品
while ($product = $query->fetch(PDO::FETCH_ASSOC)) {
    $id = $product['productID'];
    echo "<div class='card'>";
    echo "<p><button class='wishlist' onclick='window.location.href=\"wishlist.php\"'><i class='fa-sharp fa-solid fa-heart'></i></button></p>";
    echo "<img src='../fotos/$id.jpg' alt='geen foto'>";
    echo "<div class='container'>";
    echo "<h1>" . $product['naam'] . "</h1>";
    echo "<p class='price'>" . '€ ' . $product['prijs'] . "</p>";
    // 通过AuteurID从数组中匹配作者
    if (isset($auteurs[$product['AuteurID']])) {
        echo "<p class='auteur'>" . $auteurs[$product['AuteurID']] . "</p>";
    }
    
    echo "<div class='prod_buy'>";
    echo "<p><button onclick='window.location.href=\"product_page.php?id=$id\"'>meer info</button></p>";
    echo "<p><button class='buy' onclick='window.location.href=\"wishlist.php\"'><i class='fa-sharp fa-solid fa-cart-plus'></i></button></p>";
    echo "</div>";
    echo "</div>";
    echo "</div>";
}

额外说明

  • 原代码中onclick属性内的反引号已替换为双引号,避免语法冲突。
  • SQL JOIN查询是数据库层面的关联操作,性能远高于PHP层面的手动匹配,优先推荐使用。

内容的提问来源于stack exchange,提问作者yarne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:18:10