2011-07-06 26 views
8

目前我正在使用Doctrine 2和MySQL。我在MySQL中分別使用datetime字段和PHP中的DateTime時遇到了一些問題。在我的數據庫中,日期值是「0000-00-00」,在PHP中,這個值被轉換爲-0001-11-30。我對此感到高興,所以我需要檢查日期的「0000-00-00」值。有人有這個想法幫助嗎?謝謝。如何防止PHP將具有0000-00-00值的DateTime對象轉換爲-0001-11-30

N.B.我在考慮是否正確地檢查「-0001-11-30」而不是「0000-00-00」。

+1

@domanokz - 這將是在*錯了一步*方向 –

+0

是啊,我忘了,在PHP變量的變化很數據類型取決於它的內容。 – dpp

回答

7

如果未設置日期,請使用NULL來指示該狀態。這解決了您的問題,並使數據庫模式更加清晰和詳細。

-4

解釋的。如果你不能處理這個數據庫,你可以使用這個片段,以避免此行爲安達驗證我用這個日期

$date = new DateTime('0000-00-00 00:00'); 
if (DateTime::createFromFormat('Y-m-d', $date->format('Y-m-d'))) { 
    // Valid 
} else { 
    // Not valid 
} 
0

函數遍及我的代碼。傳遞一個類似日期的字符串或DateTime(不可變)對象;它會吐出一個PHP DateTime或DateTimeImmutable對象,如果輸入是一個類似「0000-00-00」的字符串,則爲false。隨着第二個參數,也可以強制得到的結果是不可變的或不:

function ensureDateTime ($input, $immutable = NULL) { 
    if (! $input instanceof \DateTimeInterface) { 
     if (in_array($input, ['0000-00-00', '0000-00-00 00:00:00'], true)) { 
      $input = false; 
     } elseif ($immutable) { 
      $input = new \DateTimeImmutable($input); 
     } else { 
      $input = new \DateTime($input); 
     } 
    } elseif (true === $immutable && $input instanceof \DateTime) { 
     $input = new \DateTimeImmutable($input->format(TIMESTAMPFORMAT), $input->getTimezone()); 
    } elseif (false === $immutable && $input instanceof \DateTimeImmutable) { 
     $input = new \DateTime($input->format(TIMESTAMPFORMAT), $input->getTimezone()); 
    } 
    return $input; 
} 

基本上是「我不知道我開始,但我知道我想要什麼」,功能。

(注:PHP 7語法的位在這裏,但很容易地適應PHP 5)

相關問題