2011-07-06 4 views
8

Obecnie pracuję z Doctrine 2 i MySQL. Występują pewne problemy, gdy pracuję z pól datetime w mysql odpowiednio DateTime w PHP. Kiedy w mojej bazie danych wartość daty to "0000-00-00", w PHP ta wartość jest konwertowana na -0001-11-30. Cieszę się z tego, więc muszę sprawdzić datę "0000-00-00". Czy ktoś ma jakiś pomysł, aby pomóc? Dzięki.Jak uniemożliwić PHP konwersję obiektu DateTime z wartością 0000-00-00 na -0001-11-30

N.B. Zastanawiam się, czy warto wpisywać "-0001-11-30" zamiast "0000-00-00".

+1

@domanokz - to byłoby krokiem w * zła * kierunek –

+0

Tak, zapomniałem, zmienne w PHP zmienia to DataType w zależności od jego zawartości. – dpp

Odpowiedz

7

Jeśli data nie jest ustawiona, należy użyć NULL, aby wskazać ten stan. To rozwiązuje twój problem i sprawia, że ​​schemat bazy danych jest dużo bardziej przejrzysty i gadatliwy.

-4

Jeśli nie możesz sobie z tym poradzić na bazie danych, można użyć tego fragmentu kodu, aby uniknąć tego zachowania anda potwierdzić datę

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

Używam tego funkcja w całym moim kodzie. Przekaż mu ciąg znaków podobny do daty lub obiekt DateTime (Immutable); wypluje obiekt PHP DateTime lub DateTimeImmutable lub false, jeśli input jest łańcuchem "0000-00-00". Z drugiego parametru może również wymusić rezultat być niezmienna czy nie:

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

Zasadniczo „Nie jestem pewien, co zacząłem, ale wiem, czego chcę”, function.

(Uwaga: Trochę PHP 7 składni tutaj, ale łatwo dostosować do PHP 5)

Powiązane problemy