2011-05-22 93 views
2

我在這裏和其他地方看到一些問題,在某些情況下解決這個問題,但不是我所需要的。插入空的日期/時間到MySQL與PHP導致0000-00-00/00:00:00

我正在使用一個腳本,它存儲一個值的數組來做插入或更新的基礎上的變化。

某些日期/時間已設置,有些爲空。我試圖用$ var = NULL,然後插入插入...('{$ var}'),如果時間設置爲null和時間爲00:00:00。

用$ var =「NULL」插入並插入...('{$ var}'),如果時間設置爲null,則返回00:00:00。

如果我刪除插入...({$ var})的引號,如果它爲空,但是如果日期不爲空,它當然會失敗。

我有另一個VARCHAR字段,我正在做同樣的事情,它工作正常。即如果有一個字符串它作爲一個字符串傳遞,如果它是空的,我設置該var = null。我在插入查詢中使用了引號,如果它爲空,它將作爲空值進入,如果不爲空,則插入字符串。

使用條件語句將需要一個相當大的重寫,所以我希望能夠避免這種情況。

有關如何使這項工作沒有IF語句(如果可能)的任何建議,將有所幫助。

謝謝。


我已經測試這幾種方式,我不能夠得到想要的結果未做日期/時間字段VARCHAR,這是我不想做的事。這裏是db結構,插入查詢和結果。

id int(11)   No None AUTO_INCREMENT       
event_new_date_start date   Yes NULL         
event_new_time_start time   Yes NULL         
event_link varchar(150) latin1_swedish_ci  Yes NULL  




    $event_new_date_start1 = 'NULL'; 
    $event_new_time_start1 = 'NULL'; 
    $event_link1 = 'NULL'; 
    $event_new_date_start2 = '2011-04-04'; 
    $event_new_time_start2 = '13:13'; 
    $event_link2 = 'http://abc.com'; 
    $event_new_date_start3 = NULL; 
    $event_new_time_start3 = NULL; 
    $event_link3 = NULL; 

    mysql_query(" 
    insert into test_dates (event_new_date_start, event_new_time_start, event_link) values 
    ('{$event_new_date_start1}', '{$event_new_time_start1}', '{$event_link1}') 
    "); 

    mysql_query(" 
    insert into test_dates (event_new_date_start, event_new_time_start, event_link) values 
    ('{$event_new_date_start2}', '{$event_new_time_start2}', '{$event_link2}') 
    "); 

    mysql_query(" 
    insert into test_dates (event_new_date_start, event_new_time_start, event_link) values 
    ('{$event_new_date_start3}', '{$event_new_time_start3}', '{$event_link3}') 
    ");       


     1 0000-00-00 00:00:00 NULL 
     2 2011-04-04 13:13:00 http://abc.com 
     3 0000-00-00 00:00:00 

當我將日期/時間字段更改爲CHAR時,它按預期在查詢中使用引號工作。

 4 NULL NULL NULL 
     5 2011-04-04 13:13 http://abc.com 
     6    

回答

5

如果您使用引號,則表示您希望日期爲字符串'NULL'。 MySQL無法將其解析爲有效日期,因此它會回落到0

當設置的$var值時,它設置爲只NULL或引用字符串,如果它不爲空,那麼只需在查詢,而不是('{$var}')使用({$var})

+0

賓果。爲你+1。 – ceejayoz 2011-05-22 01:36:18

+0

我也測試了這個,不幸的是,有些日期爲空,有些不是,沒有引號,非空日期正確,但空值爲0。沒有引號時,非空日期會引發錯誤。我猜測解決這個問題的唯一方法是做IF來查看該值是否爲空並動態創建查詢。 – Jazzy 2011-05-23 01:08:28

+0

如果您使用PDO並準備好語句,您的生活將會變得更加輕鬆;它會將NULL作爲NULL並將日期包含在引號中。這也將使SQL注入預防變得更容易。 – 2011-05-23 05:35:30

1

rdineiu是對的,問題是你插入單詞「null」。 MySQL不理解這一點,所以不是給出一個錯誤(像許多數據庫一樣),而是插入一個全零的時間。這在Java中特別有趣,因爲試圖讀取該值會導致異常被拋出。

要做的最好的事情就是轉移到使用DBO的參數化SQL查詢。你可以找到更多,並與this question and answer on SO一些鏈接。這不僅可以解決您的問題,還可以解決插入和讀回其他值時可能發生的SQL注入問題。你可以做不帶引號的插入(「({$ var})」),然後通過一個函數運行日期,該函數追加了必要的引號如果不爲空。但是,如果您直接從用戶那裏獲得日期值,這將無法保護您,並且如果您希望可以爲空的字符串字段,則會遇到同樣的問題。

0

MySQL經常做這樣的事情,完全愚蠢的東西;看到這個有用的列表MySQL "gotchas"。在這種情況下,我期望你的日期字段不是NULL,你的SQL合規模式不是很嚴格;這會導致MySQL輸入默認日期0而不是實際要求它執行的NULL。改變你的模式,讓你的日期字段DEFAULT NULL,這應該消失。

請注意,如果您進行其他人建議的更改(例如,插入NULL不是引用的'NULL'。

+0

對於日期字段,默認值爲NULL,如果您看到上述代碼,則會在var設置爲NULL時插入「'',如果var設置爲'NULL',則插入0。感謝您的鏈接。 – Jazzy 2011-05-23 18:17:11