PHP查询无对应日期数据时报错,添加else语句无法正常运行
问题解决与代码修正
核心问题分析
- 除以零报错:当没有匹配日期的问卷数据时,
$say为0,执行round(intval($mem) * 100/intval($say))会触发除以零错误。 - 逻辑错误:第二个判断
if(strval($row['tarih']) == ...)写在了foreach($bilgilercek as $row2)循环外面,导致只会用最后一条问卷数据的$row2和$a值进行判断,统计结果完全错误。 - 性能冗余:每次遍历菜品时都全量查询问卷表,效率极低,应该通过SQL直接按日期统计数据。
修正后的代码
优化版(用SQL直接统计,性能更优)
<?php // 一次性查询所有日期的统计数据,避免循环内重复查询 $statsQuery = $conn->query(" SELECT DATE(tarih) as tarih, COUNT(*) as toplam, SUM(CASE WHEN memnuniyet_durumu = '1' THEN 1 ELSE 0 END) as memnun FROM yemekhane_anket GROUP BY DATE(tarih) "); $stats = []; foreach ($statsQuery->fetchAll(PDO::FETCH_ASSOC) as $stat) { $stats[$stat['tarih']] = [ 'toplam' => $stat['toplam'], 'memnun' => $stat['memnun'] ]; } // 查询菜品列表 $Sor = $conn->query("SELECT * FROM yemeklistesi"); $rows = $Sor->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { $tarih = $row['tarih']; ?> <tr> <td><?php echo $row['id']; ?></td> <td><?php echo $row['yemek']; ?></td> <td><?php echo $row['tarih']; ?></td> <td style="background-color: green; color:#fff; font-size:20px;"> <?php // 检查当前日期是否有统计数据 if (isset($stats[$tarih]) && $stats[$tarih]['toplam'] > 0) { $oran = round($stats[$tarih]['memnun'] * 100 / $stats[$tarih]['toplam']); echo $oran; } else { // 没有数据时显示默认值,比如0或"无数据" echo "0"; } ?> %</td> </tr> <?php } ?>
基础修复版(保留原PHP循环逻辑,修正错误)
<?php $Sor = $conn->query("SELECT * FROM yemeklistesi"); $rows = $Sor->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { ?> <tr> <td><?php echo $row['id']; ?></td> <td><?php echo $row['yemek']; ?></td> <td><?php echo $row['tarih']; ?></td> <td style="background-color: green; color:#fff; font-size:20px;"> <?php $bilgiler = $conn->query("SELECT * FROM yemekhane_anket"); $bilgilercek = $bilgiler->fetchAll(PDO::FETCH_ASSOC); $say = 0; $mem = 0; foreach ($bilgilercek as $row2) { $a = strtotime($row2['tarih']); $anketTarih = date('Y-m-d', $a); // 将两个判断都放到循环内部 if ($row['tarih'] == $anketTarih) { $say++; // 同时判断满意度 if ($row2['memnuniyet_durumu'] == '1') { $mem++; } } } // 处理除以零的情况 if ($say > 0) { echo round($mem * 100 / $say); } else { echo "0"; // 或者显示"无数据" } ?> %</td> </tr> <?php } ?>
关键修正点说明
- 把满意度判断移到
foreach循环内部,确保每条匹配日期的问卷数据都被统计。 - 在计算百分比前先判断
$say是否大于0,避免除以零错误。 - 优化版通过SQL预统计所有日期的数据,减少数据库查询次数,大幅提升性能,推荐使用。
内容的提问来源于stack exchange,提问作者Jagger
相关产品推荐
相关产品推荐

