PHP使用FILTER_SANITIZE_NUMBER_FLOAT处理小数存储SQL异常怎么解决
问题根因
FILTER_SANITIZE_NUMBER_FLOAT过滤器默认仅保留数字、正负号,会自动移除小数点字符,你的输入-2.5经过过滤后会变成-25,强制转换为float后就是-25.0,入库后就出现了异常结果。而你表单里的整数值(比如-10、0、5等)本身没有小数点,过滤后数值不变,所以存储正常。
修复方案
- 给过滤器添加
FILTER_FLAG_ALLOW_FRAGMENT标志,允许保留小数点:
修改后的PHP代码如下:
$Goal_howmch = (float) filter_input(INPUT_POST, 'How_much', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRAGMENT);
- 可选补充校验逻辑,避免非法输入导致异常:
$sanitized_value = filter_input(INPUT_POST, 'How_much', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRAGMENT); // 校验清洗后的值是否为合法浮点数 if (filter_var($sanitized_value, FILTER_VALIDATE_FLOAT) === false) { // 自定义非法输入处理逻辑,比如设置默认值、返回表单报错 $Goal_howmch = 0.0; } else { $Goal_howmch = (float) $sanitized_value; }
- 附加优化建议:HTML表单的option属性值建议加上双引号,符合HTML规范,避免部分老旧浏览器解析异常:
<option value="-2.5">-2.5%</option>
- 入库建议:操作数据库时建议使用PDO/MySQLi的参数绑定功能传入数值,不要直接拼接SQL字符串,既可以避免类型转换误差,也能防范SQL注入风险。
内容的提问来源于stack exchange,提问作者Arun Kukreja
相关产品推荐
相关产品推荐

