首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空日期时间值存储为0000-00- 00 :00:00 :00,而不是MySQL中的NULL

问空日期时间值存储为0000-00- 00 :00:00 :00,而不是MySQL中的NULL
EN

Stack Overflow用户
提问于 2016-01-20 16:46:42
回答 1查看 6.9K关注 0票数 0

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

代码语言:javascript
复制
$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时间选择器是为hh:mm设置的--不需要秒。

也许这与SQL语句中围绕$Date_Time_Query_Received的引号有关;但是,如果没有这些引号,查询就会失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 20:19:25

因此,如果您查看您的查询,您将尝试将date列设置为字符串' ',这显然不会使MySQL高兴。不过,这是一个非常宽容的数据库, column,也就是0000-00-00 00:00:00。

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

代码语言:javascript
复制
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注入攻击。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34905747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档