PHP switch/条件判断总执行最后分支,选中对应选项不生效如何解决
问题原因
你的条件判断逻辑被写在了遍历套餐选项的foreach循环内部,每次循环生成一个option的同时,都会执行一次POST提交校验。循环执行到最后一个套餐时,变量$package_id已经被覆盖为最后一个套餐的ID,此时触发的判断逻辑自然只会匹配最后一个套餐的分支,和你实际提交的选中值完全无关。
另外还有一个隐性问题:wp_redirect执行后没有加exit终止代码执行,即使跳转逻辑触发,后续代码依然会继续运行,可能导致跳转失效。
修复方案
将提交校验逻辑从foreach循环中移出,单独放到页面逻辑的最顶部,直接读取用户提交的auto-listings-package参数作为判断依据,不要使用循环中的$package_id变量。
修改后的代码示例
<?php // 提交校验逻辑放页面最顶部,不要放在option渲染的循环里 if(isset($_POST['auto-listings-purchase'])) { // 直接读取用户提交的选中套餐ID $selected_package_id = $_POST['auto-listings-package']; if($selected_package_id == '2823') { wp_redirect('https://www.google.com'); exit; // 跳转后必须终止执行 } elseif ($selected_package_id == '2633') { wp_redirect('https://www.helemaaldebom.nl'); exit; } else { echo 'Something went wrong. Please contact our staff.'; exit; } } ?> <!-- 下拉框渲染逻辑,只做视图渲染,不处理提交判断 --> <select name='auto-listings-package' id='auto-listings-package' class='auto-listings-package'> <?php foreach ( $packages as $package_id => $package ) : ?> <option value="<?php echo esc_attr( $package_id ); ?>" data-price="<?php echo esc_attr( auto_listings_raw_price( $package['price'] ) ); ?>"><?php echo wp_kses_post( $package['label'] ) ?></option> <?php endforeach; ?> </select>
注意事项
- 请确认你的下拉框外层包裹了
form标签,且提交按钮name属性为auto-listings-purchase,否则POST参数不会正常提交。 - 如果有安全校验需求,建议对提交的
$selected_package_id做合法性校验,避免传入恶意参数。
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

