【发布时间】:2020-08-11 09:14:33
【问题描述】:
我试图在 foreach 循环中获取所有行,但它没有按应有的方式工作。
<?php
foreach ($locations_loop as $row):
$lr_id = $row["id"];
$stmtlr = $pdo->prepare("SELECT * FROM locations_rating WHERE l_id = {$lr_id}");
$stmtlr->execute();
$stlr_loop = $stmtlr->fetchAll(PDO::FETCH_ASSOC);
if (empty($stlr_loop)) {
$loc_rate[] = "0";
} else {
foreach($stlr_loop as $rowlr):
$loc_rate[] = $rowlr["stars"];
endforeach;
}
$rating_array = array_values($loc_rate);
$rating_avg = array_sum($rating_array) / count($rating_array);
?>
<?=round($rating_avg, 1);?>
<?php endforeach; ?>
$rating_avg 每次脚本运行时都会输出其他内容。它在 foreach 循环之外工作正常。我试图加入这两个表,但没有运气,因为它只输出一行。
【问题讨论】:
-
1.不要在循环内准备 sql 语句。 整个想法是您准备一次,绑定一次,然后在循环中执行。 2. 使用带有绑定参数的占位符。 3. 如果您计划在代码的同一“层”中循环遍历结果集,请不要使用
fetchAll()。 4. 不要在已经被索引的数组上调用array_values()——它绝对不会改变。 -
@mickmackusa 为什么不准备内部循环。非常感谢您解释这样做的缺点
-
因为做一次事情比一次又一次做同样的事情容易得多。不是很明显吗?
-
5.经过仔细检查,我不明白为什么您需要多次访问数据库。将
WHERE l_id IN (...)与您的array_column($locations_loop, 'id')数组一起使用。 6.求和和计数是sql完全可以做的事情。将所有处理和逻辑移动到 sql 中。 7. 仅从 db 表中获取您打算使用的数据——将*替换为stars。 -
我得到你,但不是同时 :D 如果不是太多要求,你能按照你解释的方式修改我在上面发布的代码吗?