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

PHP查询无对应日期数据时报错,添加else语句无法正常运行

问题解决与代码修正

核心问题分析

  1. 除以零报错:当没有匹配日期的问卷数据时,$say为0,执行round(intval($mem) * 100/intval($say))会触发除以零错误。
  2. 逻辑错误:第二个判断if(strval($row['tarih']) == ...)写在了foreach($bilgilercek as $row2)循环外面,导致只会用最后一条问卷数据的$row2和$a值进行判断,统计结果完全错误。
  3. 性能冗余:每次遍历菜品时都全量查询问卷表,效率极低,应该通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:45:36