日期差值计算函数结果无法更新至SQL数据库的问题求助
解决日期差值更新SQL字段为0的问题
嘿,我之前也碰到过一模一样的坑!你这个情况大概率是日期计算出来的$foo看着是数字,但实际藏了小细节——比如空格、换行符这类看不见的字符,或者变量类型不对,导致数据库把它当成无效值直接转成0了。下面给你一步步排查和解决的办法:
1. 先扒开$foo的真实面目
别只靠echo $foo判断,用更细致的方式看看变量到底是什么:
var_dump($foo); // 再看看每个字符的ASCII码,排查隐藏字符 echo "长度:" . strlen($foo) . "<br>"; foreach(str_split($foo) as $char) { echo ord($char) . " "; // 数字32是空格,10是换行 }
如果var_dump显示是字符串但长度比数字本身长,或者ASCII码里有32、10这类字符,那就是问题根源——这些字符会让SQL把整个值判定为无效数字,最终存成0。
2. 检查日期计算逻辑的坑
你用来算日期差的函数(比如date_diff或者自己用strtotime写的逻辑)可能返回的不是纯整数。举两个常见的坑:
- 如果用
strtotime解析日期,要是用户传的格式不是YYYY-MM-DD这种标准格式(比如DD/MM/YYYY),strtotime可能返回false,计算出来的差值就是无效值; - 要是用
DateInterval的days属性,偶尔会因为日期跨时区或者解析问题,返回带符号或者其他格式的内容?
比如正确解析非标准日期的写法应该是:
// 假设用户传的是DD/MM/YYYY格式 $startDate = DateTime::createFromFormat('d/m/Y', $startingDate); $endDate = DateTime::createFromFormat('d/m/Y', $endingDate); $interval = $startDate->diff($endDate); $foo = $interval->days; // 这里得到的是纯整数天数
3. 强制把$foo转成纯整数
不管变量里有没有隐藏字符,直接强制转成整数再写入数据库:
$foo = (int)$foo; // 或者用intval,效果一样 $foo = intval($foo);
这样哪怕有少量非数字的前缀/后缀,都会被过滤掉,得到干净的整数。
4. 改用预处理语句(既解决问题又更安全)
直接拼接SQL字符串不仅容易碰到这类类型问题,还存在SQL注入风险。换成预处理语句,数据库会帮你处理类型转换:
// 替换成你的表名和条件 $stmt = $con->prepare("UPDATE your_table SET total = ? WHERE id = ?"); $stmt->bind_param("ii", $foo, $recordId); // "i"表示整数类型 $stmt->execute();
这样不管$foo是数字还是数字字符串,都会被正确识别成整数传入数据库。
最后再确认下日期格式
确保$startingDate和$endingDate是合法的日期格式,要是格式不对,日期计算函数根本得不到正确的差值,自然写入数据库就是0了。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

