如何通过self.location传递多变量?下拉框重载传参问题解决
问题分析与解决方案
你的核心问题出在JavaScript的URL参数拼接错误,还有PHP代码里的一处变量拼写失误,我来一步步帮你修复:
1. 修复JavaScript中的URL参数分隔符
在你的reload函数里,URL拼接用了&——这是HTML的转义字符,但在JavaScript字符串中,应该直接使用&作为参数分隔符。如果用&,会导致URL变成类似dd-mysqli.php?cat=1&subcat=2,PHP解析时会把第二个参数识别为amp;subcat,自然拿不到$_GET['subcat']的值。
修改后的reload函数:
function reload(form) { var val = form.cat.options[form.cat.options.selectedIndex].value; var val2 = form.subcat.options[form.subcat.options.selectedIndex].value; // 把 & 替换成 & self.location='dd-mysqli.php?cat=' + val + '&subcat=' + val2; }
2. 修复PHP中的变量拼写错误
在渲染subcat下拉框的选中状态时,你写了@subcat,这里漏掉了$符号,应该是@$subcat,否则PHP会把它当作常量处理,导致无法正确匹配选中项。
修改这部分代码:
// 原代码 if($row1['id']==@subcat){ // 修改为 if($row1['id']==@$subcat){
3. 额外优化建议
- 去掉
@错误抑制符:@会掩盖错误,不利于调试,建议你在开发阶段替换成更安全的写法,比如:
// 替换原有的@$cat和@$subcat $cat = isset($_GET['cat']) ? $_GET['cat'] : ''; $subcat = isset($_GET['subcat']) ? $_GET['subcat'] : '';
- 新增subcat的合法性验证:和cat一样,对
$subcat做数字校验,避免非法数据传入:
if(strlen($subcat) > 0 and !is_numeric($subcat)){ echo "Data Error"; exit; }
测试验证
完成以上修改后,当你选择cat或者subcat时,URL会正确拼接成dd-mysqli.php?cat=xxx&subcat=yyy,PHP端就能通过$_GET['cat']和$_GET['subcat']同时获取到两个参数的值了。
内容的提问来源于stack exchange,提问作者Ananthu S




