DATE_ADD sql in PHP PDO


DATE_ADD sql in PHP PDO

我正在尝试在我的数据库中插入一个新行,其中包含日期和相同的日期加上 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列是必需的,但用户不需要输入它。