添加Submitted_Date字段后MySQL表单提交报错求助
问题分析与解决方案
核心问题总结
- 输入仅年份(如
2022)时,strtotime无法解析为有效日期,生成错误格式值触发MySQL日期校验报错 - 空输入时,
strtotime('')返回0,对应date('Y-m-d')生成1970-01-01,不符合存储NULL的需求 - 参数绑定类型错误:
Submitted_Date是日期字符串,却用了整数类型i,导致字段不匹配错误 - 空值处理逻辑顺序颠倒,且错误传入字符串
"NULL",而非PHP原生null值
修正步骤
- 调整日期处理顺序:先判断输入是否为空,为空直接设为
null,否则再做格式转换 - 修正参数绑定类型:将绑定类型从
"ssii"改为"sssi"(Submitted_Date对应字符串类型s) - 增加日期有效性校验:过滤无效日期输入,避免触发数据库错误
修正后的代码
<?php if (isset($_POST['submit'])) { $sql = $conn->prepare("UPDATE orders SET Publisher_Email=? , Client_Name=? , Submitted_Date=? WHERE PC_Job_Number=?"); $Publisher_Email = $_POST['Publisher_Email']; $Client_Name = $_POST['Client_Name']; // 处理日期字段:空输入设为null,否则解析并校验有效性 $Submitted_Date = null; if (!empty($_POST['Submitted_Date'])) { $timestamp = strtotime($_POST['Submitted_Date']); if ($timestamp !== false) { $Submitted_Date = date('Y-m-d', $timestamp); } else { $error_message = "请输入有效的日期格式"; goto end_update; } } // 绑定参数:类型对应字符串、字符串、字符串/NULL、整数 $sql->bind_param("sssi", $Publisher_Email, $Client_Name, $Submitted_Date, $_GET["PC_Job_Number"]); if($sql->execute()) { $success_message = "Edited Successfully"; } else { $error_message = "Problem in Editing Record: " . $conn->error; } end_update: } $sql = $conn->prepare("SELECT * FROM orders WHERE PC_Job_Number=?"); $sql->bind_param("i",$_GET["PC_Job_Number"]); $sql->execute(); $result = $sql->get_result(); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); } $conn->close(); ?>
额外说明
- MySQL的
DATE类型严格要求YYYY-MM-DD格式,确保转换后的值符合规范 - 传入PHP原生
null时,mysqli会自动映射为MySQL的NULL,无需手动传入字符串"NULL" - 日期有效性校验可拦截无效输入(如单独年份、乱码字符),避免数据库报错
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

