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

PHP中Undefined Array Key错误:按日期展示数据报错求助

问题解决:PHP数组未定义键警告(undefined array key)

问题背景

需要按日期在表格展示数据库数据,将数据存入数组后渲染表格时出现undefined array key警告,已确认SQL查询能获取到目标数据。

错误原因

  1. $Data初始化为null,虽然后续会自动转为数组,但每个日期对应的区间统计键(如0-30)未提前初始化,直接使用+=1递增时,PHP无法对不存在的数组元素进行操作,触发警告。
  2. 原SQL语句直接拼接$_GET参数,存在SQL注入风险。
  3. 表格渲染时未处理区间键不存在的情况,若某日期下某区间无数据,直接取值会触发警告。

修复方案

1. 修改数据存储代码(初始化数组+修复SQL注入)

include("db.php");

if(isset($_GET['from_date']) && isset($_GET['to_date'])){
    global $conn;
    $from_date = $_GET['from_date'];
    $to_date = $_GET['to_date'];

    // 使用预处理语句绑定参数,避免SQL注入
    $stmt = $connection->prepare("
        SELECT 
            date(datetime_entry_queue) AS Date,
            duration_wait
        FROM call_entry
        WHERE status='abandonada'
          AND date(datetime_entry_queue) BETWEEN ? AND ?
    ");
    $stmt->bind_param("ss", $from_date, $to_date);
    
    $stmt->execute();
    $result = $stmt->get_result();

    // 初始化$Data为空数组,而非null
    $Data = [];

    while($row = $result->fetch_assoc()) {
        $date = $row['Date'];
        $wait = $row['duration_wait'];

        // 提前初始化当前日期的所有统计区间为0
        if(!isset($Data[$date])){
            $Data[$date] = [
                '0-30' => 0,
                '31-60' => 0,
                '61-120' => 0,
                '>120' => 0
            ];
        }

        // 按区间统计数量
        if($wait >= 0 && $wait <= 30){
            $Data[$date]['0-30'] += 1;
        } else if($wait >= 31 && $wait <= 60){
            $Data[$date]['31-60'] += 1;
        } else if($wait >= 61 && $wait <= 120){
            $Data[$date]['61-120'] += 1;
        } else {
            $Data[$date]['>120'] += 1;
        }
    }

    echo "<pre>";
    print_r($Data);
    echo "</pre>";

    $stmt->close();
}

2. 修改表格渲染代码(处理不存在的键)

<?php
foreach($Data AS $Date => $Total)
{
?>
    <tr>
        <td><?php echo $Date;?></td>
        <!-- 使用??运算符设置默认值,避免键不存在时报错 -->
        <td><?php echo $Total["0-30"] ?? 0;?></td>
        <td><?php echo $Total['31-60'] ?? 0;?></td>
        <td><?php echo $Total['61-120'] ?? 0;?></td>
        <td><?php echo $Total['>120'] ?? 0;?></td>
    </tr>
<?php
}
?>

关键说明

  • 提前初始化每个日期的所有统计区间为0,确保后续递增操作时有合法的数组元素。
  • 使用预处理语句绑定参数彻底避免SQL注入,这是PHP操作数据库的标准安全做法。
  • 渲染表格时用?? 0为不存在的键设置默认值0,保证页面正常显示且无警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:55:38