2016-01-20 49 views
-1

我有可选的日期和时间表单字段,它们组合形成一个DATETIME友好的字符串,然后将其发送到MySQL数据库。相关的MySQL列数据类型为DATETIME,默认值为NULL。当日期和时间字段完成时,它可以正确保存;但是,当这些可选的表单域为空时,日期时间将被存储为0000-00-00 00:00:00而不是NULL。它需要被存储为NULL,我不知道它为什么不是。这里是我的代码:空的DATETIME值在MySQL中存储为0000-00-00 00:00:00而不是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有关;但是没有它们,查询就会失败。

+0

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

回答

2

所以,如果你看看你的查询,你试图将日期列设置为字符串' '这显然不会让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注入攻击。

相关问题