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

PHP货币转换器elseif分支失效:仅显示欧元转换结果

货币转换网站始终显示欧元结果的问题解决

问题根源

你的代码存在几个关键错误,直接导致逻辑失效:

  1. 过滤器使用错误:对choice字段用了FILTER_SANITIZE_NUMBER_INT,但choice是字符串值(比如euro、yen),这个过滤器会移除所有非数字字符,导致$choice变成空字符串。同时你定义的$euro、$ca等变量都是从POST中读取不存在的字段,结果也都是空,所以$choice == $euro永远为真,第一个if分支始终执行。
  2. var_dump用法错误:var_dump()是用来输出变量信息的,它的返回值是void,用它和字符串比较永远不会成立,这部分调试代码完全无效。
  3. 金额处理错误:对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:32:56