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

PHP+MySQL展示球队训练信息报错:未定义数组键问题求助

解决PHP中Undefined array key报错问题

我是PHP和MySQL新手,正在搭建一个追踪球员训练考勤的网站。希望在球员仪表盘展示其所属球队的即将到来的训练,已知teamid变量设置正常,但代码运行出现如下警告:

Warning: Undefined array key "campus" in /Applications/XAMPP/xamppfiles/htdocs/ia2/player.php on line 88
Warning: Undefined array key "place" in /Applications/XAMPP/xamppfiles/htdocs/ia2/player.php on line 88
Warning: Undefined array key "startdt" in /Applications/XAMPP/xamppfiles/htdocs/ia2/player.php on line 90
Warning: Undefined array key "finishdt" in /Applications/XAMPP/xamppfiles/htdocs/ia2/player.php on line 90

相关代码如下:

//find trainings for the team
$query = 'select trainingid from teamtrain where teamid = "'.$teamid.'"';
$trainingid = DB::query($query);


//display training info
echo '<table><tr><th>Start</th><th>Finish</th><th>Location</th></tr>';
foreach ($trainingid as $trainingid) {

    $infoquery = 'select * from training where id = "'.$trainingid['trainingid'].'" order by startdt asc';
    $training = DB::queryFirstRow($query);

    $location = $training['campus'].' - '.$training['place'];

    printf('<tr><td>%s</td><td>%s</td><td>%s</td></tr>',$training['startdt'],$training['finishdt'],$location);

}
echo '</table>';

问题根源

  1. 查询变量错误:执行训练信息查询时,误用了之前获取训练ID的$query变量,而非定义好的$infoquery,导致返回的结果集没有campus、place等字段,触发未定义数组键警告。
  2. 变量名冲突:循环中foreach ($trainingid as $trainingid)的迭代变量和原数组变量同名,会覆盖原数组,导致后续循环逻辑异常。
  3. SQL注入风险:直接将变量拼接进SQL语句,存在安全隐患。
  4. 无空值判断:未处理查询结果为空的情况,会进一步引发报错。

修复后的代码

// 获取球队关联的训练ID(参数化查询防注入)
$query = 'select trainingid from teamtrain where teamid = ?';
$trainingIds = DB::query($query, [$teamid]);

// 展示训练信息
echo '<table><tr><th>Start</th><th>Finish</th><th>Location</th></tr>';
foreach ($trainingIds as $item) {
    $trainingId = $item['trainingid'];
    // 参数化查询训练详情
    $infoQuery = 'select * from training where id = ? order by startdt asc';
    $training = DB::queryFirstRow($infoQuery, [$trainingId]);

    // 跳过无数据的训练
    if (!$training) {
        continue;
    }

    // 处理空字段,避免拼接出错
    $campus = $training['campus'] ?? '未指定';
    $place = $training['place'] ?? '未指定';
    $location = $campus . ' - ' . $place;

    // 格式化时间(可选,根据需求调整格式)
    $startDt = isset($training['startdt']) ? date('Y-m-d H:i', strtotime($training['startdt'])) : '';
    $finishDt = isset($training['finishdt']) ? date('Y-m-d H:i', strtotime($training['finishdt'])) : '';

    printf('<tr><td>%s</td><td>%s</td><td>%s</td></tr>', $startDt, $finishDt, $location);
}
echo '</table>';

关键优化点

  • 替换错误的查询变量,确保获取正确的训练详情数据。
  • 修改循环变量名,避免覆盖原数组。
  • 使用参数化查询,彻底规避SQL注入风险。
  • 增加空值判断和默认值处理,防止字段不存在时触发警告。
  • 可选的时间格式化,提升页面展示可读性。

内容的提问来源于stack exchange,提问作者j.vertullo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:32:51