【问题标题】:Empty DATETIME value stored as 0000-00-00 00:00:00 instead of NULL in MySQL [duplicate]空的 DATETIME 值存储为 0000-00-00 00:00:00 而不是 MySQL 中的 NULL [重复]
【发布时间】:2016-04-26 15:15:18
【问题描述】:

我有可选的日期和时间表单字段,它们组合成一个DATETIME-friendly 字符串,然后发送到 MySQL 数据库。相关的 MySQL 列数据类型为DATETIME,默认值为NULL。完成日期和时间字段后,它会正确保存;但是,当这些可选表单字段为空时,日期时间将存储为0000-00-00 00:00:00 而不是NULL。它需要存储为NULL,我不知道为什么不是。这是我的代码:

$Date_Query_Received1   = mysqli_real_escape_string($conn, $_POST['Date_Query_Received']);
$Date_Query_Received2   = implode("-", array_reverse(explode("/", $Date_Query_Received1)));
$Time_Query_Received1   = mysqli_real_escape_string($conn, $_POST['Time_Query_Received']);
$Time_Query_Received2   = $Time_Query_Received1.':00';

if (empty($_POST['Date_Query_Received']) || empty($_POST['Time_Query_Received'])) {
    $Date_Query_Received = NULL;
    $Time_Query_Received = NULL;
} else {
    $Date_Query_Received = $Date_Query_Received2;
    $Time_Query_Received = $Time_Query_Received2
}

$Date_Time_Query_Received = $Date_Query_Received.' '.$Time_Query_Received;

mysqli_query($conn, "INSERT INTO log (Date_Time_Query_Received) VALUES ('$Date_Time_Query_Received')";

表单日期采用 DD/MM/YYYY 格式,因此 implode(...array_reverse(...)) 转换为 MySQL 友好的 DATETIME YYYY-MM-DD 格式。这同样适用于将 ':00' 附加到时间值,因为表单字段 jQuery timepicker 仅设置为 hh:mm - 不需要秒。

可能与SQL语句中$Date_Time_Query_Received周围的引号有关;但是没有它们查询会失败。

【问题讨论】:

  • 这可能是一个重复的问题;但是答案对我没有帮助。我已经知道 MySQL DATETIME 接受 NULL 值,我的问题是 PHP 似乎将 null 表单字段条目转换为空字符串,然后在我的数据库中不转换为 NULL 条目,尽管我已将列设置为 NULL默认。如果我错过了这一点,希望我是,请提出建议。我试过这个例子 $sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (empty($col2) ? NULL : “$col2”). ')';但数据库字段仍显示 0000-00-00 00:00:00 而不是 NULL。

标签: php mysql datetime null


【解决方案1】:

因此,如果您查看查询,您会尝试将日期列设置为字符串' ',这显然不会让 MySQL 满意。不过,这是一个非常宽容的数据库,defaults to its fallback for a DATETIME column,即0000-00-00 00:00:00

那么,如何将空值从 PHP 传递到数据库?尝试使用准备好的语句,如下所示:

if (empty($_POST['Date_Query_Received']) || empty($_POST['Time_Query_Received'])) {
    $Date_Time_Query_Received = NULL;
} else {
    $Date_Query_Received2 = implode("-", array_reverse(explode("/", $_POST['Date_Query_Received'])));
    $Time_Query_Received2 = "$_POST[Time_Query_Received]:00";
    $Date_Time_Query_Received = "$Date_Query_Received2 $Time_Query_Received2";
}
$stmt = $conn->prepare("INSERT INTO log (Date_Time_Query_Received) VALUES (?)");
$stmt->bind_param("s", $Date_Time_Query_Received);
$stmt->execute();

除了使传递空值更容易之外,您还可以比mysqli_real_escape_string() 更有效地保护自己免受 SQL 注入攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多