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>';
问题根源
- 查询变量错误:执行训练信息查询时,误用了之前获取训练ID的
$query变量,而非定义好的$infoquery,导致返回的结果集没有campus、place等字段,触发未定义数组键警告。 - 变量名冲突:循环中
foreach ($trainingid as $trainingid)的迭代变量和原数组变量同名,会覆盖原数组,导致后续循环逻辑异常。 - SQL注入风险:直接将变量拼接进SQL语句,存在安全隐患。
- 无空值判断:未处理查询结果为空的情况,会进一步引发报错。
修复后的代码
// 获取球队关联的训练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
相关产品推荐
相关产品推荐

