You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP网页计算器调试问题:错误提示残留与除数为0检测失效

网页计算器PHP错误修复方案

问题描述

  • 修正错误后刷新页面,"请填写所有必填字段!"的提示仍持续显示
  • 选择除法运算且第二个数为0时,"不能除以0!"的提示无法正常显示

问题原因

  1. 刷新后提示残留:刷新页面时浏览器会重复发送之前的POST请求,服务器会再次执行错误校验逻辑,导致提示重复出现。
  2. 除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:48:10