2011-07-06 8 views
8

dönüştürmesi nasıl önlenir? Şu anda Doctrine 2 ve MySQL ile çalışıyorum. Ben PHP'de DateTime sırasıyla mysql datetime alanları ile çalışırken bazı sorunlarla karşılaşıyorum. Veritabanımda tarih değeri "0000-00-00" olduğunda, PHP'de bu değer -0001-11-30'a dönüştürülür. Bundan memnun olduğum için, tarihin "0000-00-00" değerini kontrol etmem gerekiyor. Bu konuda yardımcı olabilecek bir fikri olan var mı? Teşekkürler.PHP'nin DateTime nesnesini 0000-00-00 değeriyle -0001-11-30 arası

N.B. "0000-00-00" yerine "-0001-11-30" kontrolünü yapmak doğru olup olmadığını düşünüyorum.

+1

@domanokz - * yanlış bir adım olacaktır * yönü –

+0

Evet, unuttum, PHP'de değişkenler bu kadar değiştirir DataType, içeriğine bağlı olarak. – dpp

cevap

7

Tarih belirlenmediyse, durumu belirtmek için NULL kullanın. Bu sizin probleminizi çözer ve veritabanı şemasını çok daha net ve ayrıntılı hale getirir.

-4

de açıklandığı gibi Sen bunu kullanmaktan tarihi

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

Bu davranışı önlemek anda doğrulamak için bu pasajı kullanabilirsiniz, geçerli oturum için ayarlayabilirsiniz kodum boyunca işlev. Tarih-benzeri bir dize veya DateTime (Immutable) nesnesini iletin; PHP DateTime veya DateTimeImmutable nesnesini ya da girdinin "0000-00-00" benzeri bir dize olması durumunda false olacaktır. ikinci parametre ile aynı zamanda değişmez ya da olmamak sonucu zorlayabilirsiniz:

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; 
} 

Temelde bir "Ben ile başladı emin değilim, ama ben ne istediğimi biliyorum" fonksiyonu.

(Not: Burada PHP 7 sözdizimi Biraz ama kolayca PHP 5'e uyarlanmış)