PHP货币转换器elseif分支失效:仅显示欧元转换结果
货币转换网站始终显示欧元结果的问题解决
问题根源
你的代码存在几个关键错误,直接导致逻辑失效:
- 过滤器使用错误:对
choice字段用了FILTER_SANITIZE_NUMBER_INT,但choice是字符串值(比如euro、yen),这个过滤器会移除所有非数字字符,导致$choice变成空字符串。同时你定义的$euro、$ca等变量都是从POST中读取不存在的字段,结果也都是空,所以$choice == $euro永远为真,第一个if分支始终执行。 - var_dump用法错误:
var_dump()是用来输出变量信息的,它的返回值是void,用它和字符串比较永远不会成立,这部分调试代码完全无效。 - 金额处理错误:对
usdollar用FILTER_SANITIZE_NUMBER_INT会移除小数点,导致金额丢失小数部分,再用substr截取前2位还会截断大额数值。
修正后的PHP代码
<html lang="en"> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Currency Converter</title> <meta name="keywords" content="Currency Converter"> <meta name="description" content="Currency Converter"> <meta name="author" content="Currency Converter"> <link rel="stylesheet" href="convert.css"> </head> <body class="host_version"> <h1>Currency Converter</h1> <p><img src="images/currency.jpg" /></p> <?php // 正确获取并过滤用户输入 $choice = filter_input(INPUT_POST, 'choice', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // 用FILTER_VALIDATE_FLOAT确保是合法的金额 $usdollar = filter_input(INPUT_POST, 'usdollar', FILTER_VALIDATE_FLOAT); // 定义汇率数组,简化代码逻辑 $exchangeRates = [ 'euro' => ['rate' => 0.91, 'name' => 'Euros'], 'ca' => ['rate' => 1.35, 'name' => 'Canadian Dollars'], 'yen' => ['rate' => 134.42, 'name' => 'Japanese Yen'], 'riyal' => ['rate' => 3.64, 'name' => 'Qatari Riyal'], 'rupee' => ['rate' => 82.08, 'name' => 'Indian Rupees'] ]; // 验证输入合法性并执行转换 if ($usdollar && isset($exchangeRates[$choice])) { $converted = $usdollar * $exchangeRates[$choice]['rate']; echo "<p>$" . number_format($usdollar, 2) . " USD is equal to " . number_format($converted, 2) . " " . $exchangeRates[$choice]['name'] . ".</p>"; } else { echo "<p>请输入有效的金额并选择目标货币</p>"; } ?> <input type="button" value="Another Conversion" onclick="window.history.back()" /> </body> </html>
关键修正点
- 对
choice使用FILTER_SANITIZE_FULL_SPECIAL_CHARS过滤,保留字符串的同时防止XSS攻击。 - 对
usdollar使用FILTER_VALIDATE_FLOAT确保是合法的浮点数金额,避免截断小数或无效值。 - 用数组存储汇率和货币名称,替代冗余的if/elseif判断,代码更简洁易维护。
- 添加输入合法性验证,处理用户未输入金额或选择无效货币的异常情况。
额外建议
- HTML表单里的
radio按钮可以默认选中一个,避免用户未选择货币就提交。 - 可以添加前端验证,在提交前检查用户是否填写了金额和选择了货币,提升用户体验。
内容的提问来源于stack exchange,提问作者Scorch
相关产品推荐
相关产品推荐

