簡體   English   中英

用php將空日期/時間插入到mysql中,導致0000-00-00 / 00:00:00

[英]insert null date / time into mysql with php causing 0000-00-00 / 00:00:00

我在這里和其他地方看到了一些在某些情況下可以解決此問題的問題,但並不是我所需要的。

我正在使用一個腳本,該腳本存儲一個值數組,以便根據更改進行插入或更新。

設置了一些日期/時間,有些則為null。 我正在嘗試$ var = NULL,然后使用insert插入到...('{$ var}')中,如果為null,則時間為00:00:00,如果設置了時間,則為00:00:00。

用$ var =“ NULL”插入並插入到...('{$ var}')中,如果為null,則返回00:00:00;如果設置了時間,則返回time。

如果我刪除了插入...({$ var})的引號,則它可以為null,但如果日期不為null,則它當然會失敗。

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

使用條件語句將需要很大的重寫,所以我希望避免這種情況。

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

謝謝。


我已經測試了這幾種方法,並且不將日期/時間字段設為VARCHAR,就無法獲得所需的結果,而我不想這樣做。 這是數據庫結構,插入查詢和結果。

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            

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

設置$var的值時,將其設置為NULL或帶引號的字符串(如果不為null),則只需在查詢中使用({$var})而不是('{$var}')

rdineiu是正確的,問題是您要插入單詞“ null”。 MySQL不理解這一點,因此它沒有給出錯誤(就像許多數據庫一樣),而是插入了一個全零的時間。 這在Java中特別有趣,因為嘗試讀取該值將引發異常。

最好的辦法是使用DBO轉到參數化的SQL查詢。 您可以在SO上找到更多和一些與此問題和答案相關的鏈接。 這不僅可以解決您的問題,而且可以解決由於插入和讀取其他值而可能發生的(某些)SQL注入問題。

無需這樣做(同樣,您應該並且也是正確的答案),則可以執行不帶引號(“({{$ var})”)的插入操作,並通過附加必要引號的函數運行日期(如果有)不為空。 但是,如果您直接從用戶那里獲取日期值,那么這將不會為您提供保護,如果您有一個想要為空的字符串字段,那么您將遇到同樣的問題。

MySQL通常會做完全愚蠢的事情,例如: 請參閱此有用的MySQL“陷阱”列表。 在這種情況下,我希望您的日期字段不是NULL,並且您的SQL遵從模式不是很嚴格。 這會導致MySQL輸入默認日期0,而不是您實際要求的NULL。 更改您的架構以使您的日期字段為DEFAULT NULL,這應該會消失。

請注意,如果您進行了其他建議的更改,例如插入NULL而不是帶引號的“ NULL”,這將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM