【问题标题】:DATE_ADD sql in PHP PDOPHP PDO 中的 DATE_ADD sql
【发布时间】:2013-11-12 11:26:54
【问题描述】:

我正在尝试在我的数据库中插入一个新行,其中包含一个日期和相同的日期加上 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 类型

【问题讨论】:

  • 你需要学会调试你的代码
  • 作为一般建议:始终发布实际的错误消息(您可以使用剪贴板,这样您就不需要输入)而不是您对它们的解释。此外,如果DATE_ADD(:date_end,INTERVAL 1 WEEK) 有问题,如果我们不知道:date_end 包含什么,我们如何诊断?如果$date_end"Dog",那么它失败的原因就很明显了。
  • 我已经添加了更多信息
  • stackoverflow.com/questions/10067782/… 读一读,它基本上无法接受 DATE_ADD 作为准备的一部分。所以在 bind_value 中这样做。
  • 准备时不需要:date_end。只需使用:startDate

标签: php sql pdo dateadd


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

【讨论】:

  • 如果我在 heidiSQL 中尝试同样的方法,只需使用 '0000-00-00' 就可以了。所以,也许日期是错误的,但它在 php 之外有效。我现在尝试在 php 中创建一个日期作为这样的参数: date(...) 但也失败了
  • 无意冒犯,但你需要停止尝试随机的东西,并用模糊的描述你所做的事情来报告。确保你理解你得到的答案,如果你不明白,请要求澄清。不管怎样,请看我的编辑。
  • 没有冒犯,别担心。我是来学习的。我尝试用其他日期创建另一行:2013-03-05,它可以工作。您是说 0000-00-00 是因为数字不正确的日期吗?我虽然是因为形式。我阅读的大多数行都是由其他用户创建的,他们没有设置日期,所以需要 0000-00-00 所以我也必须处理它。
  • 是的,我必须检查用户的零,但在这个查询中,用户没有插入日期,它是从其他用户查询的数据库中获取的。但我现在会处理零。非常感谢
  • 我认为你误读了我的建议。我建议根本不要使用零,所以你不需要照顾它们。 “空”的标准 SQL 值是 NULL——PHP 也支持它。
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多