2016-01-20 48 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注入攻擊。

相關問題