XML文件Total值±1美分验证及JS-PHP传值问题排查
XML上传校验与前后端传值异常处理
一、XML文件Total值±0.01校验逻辑失效
问题场景
上传XML文件时,需要允许其Total属性值与目标值存在±0.01的差异(例如目标值9840.00时,允许9839.99或9840.01)。当前获取XML Total值的代码:
$xml = new SimpleXMlElement( $_FILES['XmlToUpload']['tmp_name'], 0, true ); $total = (float)$xml['Total'];
尝试添加的校验逻辑如下,但测试±0.01差异的XML时,始终提示It doesn't fit!:
$totalMgS = $total + "0.01"; $totalMgI = $total - "0.01"; if($total <= $totalMgS && $total >= $totalMgI){ if(move_uploaded_file( $_FILES['XmlToUpload']['tmp_name'], $pathXML . $fileXML)){ echo 'Success Upload File'; } }else{ echo "It doesn't fit!"; }
错误原因
- 逻辑方向错误:当前代码是拿XML的
$total和自身加减0.01后的范围对比,这永远成立(除非浮点数精度极端问题),但实际需求是将XML的$total与目标值(数据库存储的Total)的±0.01范围对比。 - 浮点数精度隐患:直接用float进行加减和比较,可能因二进制存储精度问题导致判断误差(例如
9840.00 + 0.01可能存储为9840.009999999999)。
修正方案
先获取数据库中的目标Total值(后续问题中为$TotalReal),再计算允许的上下限,同时通过保留两位小数避免精度问题:
// 假设已正确获取数据库目标值$TotalReal(float类型) $allowedMin = round($TotalReal - 0.01, 2); $allowedMax = round($TotalReal + 0.01, 2); $xmlTotal = round((float)$xml['Total'], 2); if($xmlTotal >= $allowedMin && $xmlTotal <= $allowedMax){ if(move_uploaded_file( $_FILES['XmlToUpload']['tmp_name'], $pathXML . $fileXML)){ echo 'Success Upload File'; } }else{ echo "It doesn't fit!"; }
如果需要更高精度,可使用PHP的bcmath扩展:
$allowedMin = bcsub($TotalReal, '0.01', 2); $allowedMax = bcadd($TotalReal, '0.01', 2); $xmlTotal = number_format((float)$xml['Total'], 2, '.', ''); if(bccomp($xmlTotal, $allowedMin, 2) >= 0 && bccomp($xmlTotal, $allowedMax, 2) <= 0){ // 上传逻辑 }
二、JS传递Total值到PHP后仅返回1
问题场景
数据库存储的Total值展示在禁用的HTML输入框中:
<div class="form-group row" > <label for="lblName" class="col-sm-3 col-form-label">Total:</label> <div class="col-sm-8"> <input type="text" name="txtTotal" class="form-control" id="txtTotal" disabled> </div> </div>
通过JS获取值并传递给PHP:
var TotalTable = $("#txtTotal").val(); datosForm.append("TotalTable", $("#txTotal").val());
PHP接收代码:
$TotalReal = (isset($_POST["TotalTable"]));
但echo $TotalReal仅返回1。
错误原因
- JS选择器ID错误:代码中
$("#txTotal")应为$("#txtTotal"),ID拼写错误导致传递的是空值。 - PHP接收逻辑错误:
isset($_POST["TotalTable"])仅判断变量是否存在,返回布尔值(存在则为true,输出时转为1),并未获取实际的数值。
修正方案
1. 修正JS代码的ID拼写
var TotalTable = $("#txtTotal").val(); datosForm.append("TotalTable", TotalTable); // 直接使用已获取的变量,避免重复选择
2. 修正PHP接收代码
// 先判断是否存在,再获取值并转换为float类型 $TotalReal = isset($_POST["TotalTable"]) ? (float)$_POST["TotalTable"] : 0.00;
此时echo $TotalReal会输出实际的数值,而非布尔值的1。
内容的提问来源于stack exchange,提问作者user15500092
相关产品推荐
相关产品推荐

