PHP网页计算器调试问题:错误提示残留与除数为0检测失效
网页计算器PHP错误修复方案
问题描述
- 修正错误后刷新页面,"请填写所有必填字段!"的提示仍持续显示
- 选择除法运算且第二个数为0时,"不能除以0!"的提示无法正常显示
问题原因
- 刷新后提示残留:刷新页面时浏览器会重复发送之前的POST请求,服务器会再次执行错误校验逻辑,导致提示重复出现。
- 除0提示不显示:从
$_POST获取的$number_2是字符串类型,用全等运算符===和整数0比较时,因类型不匹配导致条件不成立,提示无法触发。
修复办法
1. 解决刷新重复提示问题
采用Post/Redirect/Get(PRG)模式:处理完POST请求后重定向到当前页面,将POST请求转为GET请求,避免刷新时重复提交。同时通过Session保存错误信息和用户输入内容,显示后立即清除Session数据,防止再次触发提示。
2. 解决除0提示不显示问题
将$number_2转换为数字类型后再进行全等比较,或者直接使用非全等运算符==判断是否为0,确保类型和值的匹配。
修正后的完整代码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>网页计算器</title> </head> <body> <form action="revision.php" method="post"> <label>数字1 : </label> <input type="number" name="num1" placeholder="第一个数字" value="<?php echo isset($_SESSION['num1']) ? $_SESSION['num1'] : ''; ?>"> <br><br> <select name="operator" id="operator"> <option value="add" <?php echo isset($_SESSION['operator']) && $_SESSION['operator'] == 'add' ? 'selected' : ''; ?>>+</option> <option value="minus" <?php echo isset($_SESSION['operator']) && $_SESSION['operator'] == 'minus' ? 'selected' : ''; ?>>-</option> <option value="multiply" <?php echo isset($_SESSION['operator']) && $_SESSION['operator'] == 'multiply' ? 'selected' : ''; ?>>*</option> <option value="divide" <?php echo isset($_SESSION['operator']) && $_SESSION['operator'] == 'divide' ? 'selected' : ''; ?>>/</option> </select> <br><br> <label>数字2 : </label> <input type="number" name="num2" placeholder="第二个数字" value="<?php echo isset($_SESSION['num2']) ? $_SESSION['num2'] : ''; ?>"> <br><br> <button>计算</button> <br><br> </form> <?php session_start(); // 显示错误信息 if(isset($_SESSION['error_msg'])){ echo $_SESSION['error_msg']; // 显示后清除错误信息,避免刷新再次触发 unset($_SESSION['error_msg']); } // 显示计算结果 if(isset($_SESSION['result'])){ echo "计算结果:".$_SESSION['result']; unset($_SESSION['result']); } if($_SERVER["REQUEST_METHOD"]=="POST"){ // 获取表单变量 $number_1 = $_POST["num1"]; $number_2 = $_POST["num2"]; $operator = $_POST["operator"]; // 保存用户输入到Session,重定向后回显内容 $_SESSION['num1'] = $number_1; $_SESSION['num2'] = $number_2; $_SESSION['operator'] = $operator; // 错误校验逻辑 $errors = false; $error_msg = ''; if(empty($number_1) || empty($number_2) || empty($operator)){ $error_msg = "请填写所有必填字段!"; $errors = true; } // 将字符串转为整数后判断是否为0,确保条件匹配 elseif($operator === "divide" && (int)$number_2 === 0){ $error_msg = "不能除以0!"; $errors = true; } elseif(!is_numeric($number_1) || !is_numeric($number_2)){ $error_msg = "只能输入数字!"; $errors = true; } if(!$errors){ $result = 0; switch($operator){ case "add" : $result = $number_1 + $number_2; break; case "minus" : $result = $number_1 - $number_2; break; case "multiply" : $result = $number_1 * $number_2; break; case "divide" : $result = $number_1 / $number_2; break; default : $error_msg = "发生未知错误!"; $errors = true; break; } if(!$errors){ $_SESSION['result'] = $result; } } if($errors){ $_SESSION['error_msg'] = $error_msg; } // 重定向到当前页面,转为GET请求 header("Location: revision.php"); exit(); } ?> </body> </html>
重点修复说明
- PRG模式实现:通过Session暂存错误信息和用户输入,处理完POST请求后立即重定向,避免刷新时重复提交。
- 除0判断修复:将POST获取的字符串转为整数后再做全等比较,确保类型和值都匹配,触发提示逻辑。
- 输入回显优化:表单中保留用户之前的输入内容,提升使用体验。
内容的提问来源于stack exchange,提问作者Josheph
相关产品推荐
相关产品推荐

