如何在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
相关产品推荐
相关产品推荐

