我正在尝试在我的数据库中插入一个新行,其中包含日期和相同的日期加上 1 周。
我在php中使用PDO,不知道它是否相关。
这是失败的代码:
$stmtEncInsert = $db->prepare("INSERT INTO test
(id_Event, NIF, name , description, image, start_date, end_date)
VALUES (:idOfEvent, :NIF, :name, :description, :image, :startDate, DATE_ADD(:date_end,INTERVAL 1 WEEK)
)");
$stmtEncInsert->execute(array(':idOfEvent' => $idOfEvent, ':NIF'=> $NIF, ':name' => $resEnc['name'], ':description' => $resEnc['description'],
':image' => $resEnc['image'], ':startDate' => $date_end, ':date_end' => $date_end));
我从其他查询中获取一些数据(例如:$resEnc['..']),但所有数据都可以。我尝试在一个文件中打印所有数据,并且所有数据都可以,它们存在。
问题是最后一个字段 (end_date) 总是给出错误,总是说:你不能把这个字段留空......
我认为这是DATE_ADD左右的问题,但我还没有找到与此相关的任何内容。
我测试了删除DATE_ADD并仅使用current_date并且它可以工作,所以我想这就是问题所在。
知道吗?
我使用MySQL作为引擎
这是给定异常的输出:
Integrity constraint violation: 1048 Column 'end_date' cannot be null
$date_end 包含 0000-00-00,它是一个有效的日期,字段是从另一个查询的数据库中获取的 DATE 类型
0000-00-00
不是有效的日期。MySQL可以配置为存储无效或不完整的日期,但这并不能使它们有效。因此,尝试添加一周不会返回有效日期,但NULL
:
mysql> SELECT DATE_ADD('0000-00-00', INTERVAL 1 WEEK);
+-----------------------------------------+
| DATE_ADD('0000-00-00', INTERVAL 1 WEEK) |
+-----------------------------------------+
| NULL |
+-----------------------------------------+
1 row in set, 1 warning (0.03 sec)
总而言之:正如错误消息所解释的那样,如果您将end_date
设计为必需的,则它不能为空。要么为其分配适当的值,要么允许它被NULL
。
编辑#1:如果您想强制'0000-00-00'
加1周等于'0000-00-00'
您可以这样做:
COALESCE(DATE_ADD('0000-00-00', INTERVAL 1 WEEK), '0000-00-00')
恕我直言,处理"0000-00-00"日期不会提供任何好处,并且会使一切变得更加复杂,但无论如何这是您的代码;-)
编辑 #2:用户不在字段日期中键入零。您的 PHP 代码需要检测空日期并插入NULL
:
if( is_valid_date($_POST['start_date']) ){
$start_date = $_POST['start_date'];
}else{
$start_date = NULL;
}
$stmtEncInsert = $db->prepare("INSERT INTO test (start_date) VALUES (:start_date)");
$stmtEncInsert->execute(
array('test_date' => $start_date),
);
但是您有一个数据库设计问题:end_date
列是必需的,但用户不需要输入它。