PHP生成带前导零的日期ID插入SQL时丢失前导零问题求助
问题根源
你在拼接SQL语句时,未将格式化后的日期字符串用引号包裹,SQL会将其解析为数值类型,数值类型的前导零会被自动丢弃,哪怕后续插入字符串类型的列,也会使用丢弃前导零后的数值转字符串的结果,这就是你修改列类型仍无法解决问题的原因。
修复方案
方案1:直接补全引号(临时解决方案,仅适用于当前完全可控的日期生成场景,存在SQL注入风险)
将SQL语句中的变量部分用单引号包裹:
$addQuery = "INSERT INTO nodes (id) VALUES ('$date')";
方案2:使用参数化查询(推荐,安全且能避免类型解析问题)
sqlsrv扩展支持参数绑定,无需手动处理引号和类型转换,示例代码如下:
$date = new DateTime(); $date = $date->format("dmYHisu"); $addQuery = "INSERT INTO nodes (id) VALUES (?)"; $params = [$date]; if (sqlsrv_query($connection, $addQuery, $params)) { echo "Node added."; } else { die (print_r(sqlsrv_errors(), true)); }
额外说明
如果你将ID列设置为int类型,本身数值类型就不支持存储前导零,要保留前导零必须使用char/varchar类的字符串类型,配合上面的传参方式即可正常存储。
内容的提问来源于stack exchange,提问作者ICoded
相关产品推荐
相关产品推荐

