
本文详解如何在 php 中正确使用 get 方法通过超链接按钮将食品名称、热量等变量从搜索结果页传递至添加页面,解决“undefined array key”错误,并提供结构化、可复用的实践方案。
本文详解如何在 php 中正确使用 get 方法通过超链接按钮将食品名称、热量等变量从搜索结果页传递至添加页面,解决“undefined array key”错误,并提供结构化、可复用的实践方案。
在 PHP Web 开发中,常需将前端展示的数据(如 API 返回的食品名称、热量值)通过用户交互(例如点击“添加食物”按钮)传递至后端处理页(如 addfood.php)。但若 URL 参数构造不当,极易触发 Undefined array key "name" 等常见错误——其根本原因在于:GET 参数必须以 key=value 形式显式声明,且需正确嵌入 HTML 属性中。
你原始代码中的问题在于这一行:
<button><a href="addfood.php?%24name">Add Food</a></button>
此处 ?$name 仅将变量值拼接到 URL 末尾(如 addfood.php?Apple),并未指定参数名,导致 $_GET['name'] 无法被识别。PHP 的 $_GET 是关联数组,键(key)必须明确声明。
✅ 正确做法是使用带键名的查询字符串格式:
<button><a href="addfood.php?name=<?=%20urlencode(%24name)%20?>&calories=<?=%20urlencode(%24cal)%20?>">Add Food</a></button>
注意两点关键优化:
- 使用
= $name ?>(即<?php echo $name; ?>的简写)输出变量值; - 对变量值调用
urlencode(),防止食品名含空格、&、/ 等特殊字符破坏 URL 结构(例如"Grilled Chicken Breast"会编码为Grilled%20Chicken%20Breast)。
同时,需确保变量在循环中被正确定义和作用域可控。你原代码中 $name 和 $cal 在 foreach 内多次赋值,最终只保留最后一个元素的值。若需为每个食品项生成独立按钮,应将 <button></button> 放入循环内,并绑定当前项数据:
<?php if (isset($data) && !empty($data['items'])): ?><?php foreach ($data['items'] as $item): ?><div class="card text-center" style="margin:auto; width:50%; margin-top:100px; min-height:200px">
<div class="card-header">
<strong>Food name:</strong> = htmlspecialchars($item['name']) ?><br>
</div>
<div class="card-body">
<p class="card-text">
Serving size: = $item['serving_size_g'] ?> gram<br>
Calories: = $item['calories'] ?><br>
Protein: = $item['protein_g'] ?> gram<br>
Carbohydrates: = $item['carbohydrates_total_g'] ?> gram<br>
Fat: = $item['fat_total_g'] ?> gram<br></p>
<!-- 每个食品对应独立按钮,携带自身数据 -->
<a href="addfood.php?name=<?=%20urlencode(%24item['name'])%20?>&calories=<?=%20urlencode(%24item['calories'])%20?>" class="btn btn-primary">Add to Day</a>
</div>
</div>
<?php endforeach; ?><?php else: ?><p>No food items found.</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a>
<p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<?php endif; ?>
在接收页 addfood.php 中,务必进行健壮性校验与安全过滤:
<?php // 检查参数是否存在,避免 Undefined index
$name = $_GET['name'] ?? '';
$calories = $_GET['calories'] ?? '';
// 过滤输出(防XSS)+ 验证数值(防恶意输入)
if (!empty($name)) {
$safe_name = htmlspecialchars(trim($name));
$safe_cal = filter_var($calories, FILTER_VALIDATE_FLOAT);
if ($safe_cal !== false && $safe_cal >= 0) {
echo "<h3>Added: {$safe_name} ({$safe_cal} kcal)</h3>";
// ✅ 此处可继续插入数据库、写入 session 或跳转回日志页
} else {
echo "<p>Error: Invalid calories value.</p>";
}
} else {
echo "<p>Error: Missing food name.</p>";
}
?>
? 重要注意事项:
- ❌ 避免直接暴露敏感数据(如用户ID、token)在 URL 中;
- ✅ 敏感操作(如增删改)建议改用 POST + 表单提交,配合 CSRF 保护;
- ✅ 始终对
$_GET输入做isset()或空合并操作(??); - ✅ 输出前使用
htmlspecialchars(),防止 XSS; - ✅ 数值型参数务必用
filter_var()验证类型与范围。
通过以上结构化实现,你不仅能解决当前的 Undefined array key 错误,更能构建出安全、可维护、符合 Web 最佳实践的数据传递流程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










