-1

我正在尝试在我的数据库中插入一个新行,其中包含一个日期和相同的日期加上 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 它是一个有效的日期,并且字段是从另一个查询中从 DB 获取的 DATE 类型

4

1 回答 1

1

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列是强制性的,但用户不需要输入它。

于 2013-11-12T11:41:26.043 回答