11 votes

Comment empêcher PHP de convertir un objet DateTime avec la valeur 0000-00-00 en -0001-11-30

Je travaille actuellement avec Doctrine 2 et MySQL. Je rencontre quelques problèmes lorsque je travaille avec des champs datetime dans MySQL ou DateTime dans PHP. Lorsque dans ma base de données la valeur de la date est "0000-00-00", en PHP cette valeur est convertie en -0001-11-30. Je ne suis pas très content de cela, donc j'ai besoin de faire une vérification pour la valeur "0000-00-00" de la date. Est-ce que quelqu'un a une idée à ce sujet pour m'aider ? Je vous remercie.

N.B. Je me demande s'il est judicieux d'effectuer la vérification sur "-0001-11-30" au lieu de "0000-00-00".

8voto

Crozin Points 22346

Si la date n'est pas définie, utilisez NULL pour indiquer cet état. Cela résout votre problème et rend le schéma de la base de données beaucoup plus clair et verbeux.

5voto

Álvaro G. Vicario Points 57607

Une autre solution consiste à définir l'option NO_ZERO_DATE Mode SQL dans votre serveur MySQL. Vous pouvez le définir pour la session en cours comme expliqué à la page http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html

0voto

Stephen R Points 391

J'utilise cette fonction dans tout mon code. Passez-lui une chaîne de type date ou un objet DateTime(Immutable) ; elle recrachera un objet PHP DateTime ou DateTimeImmutable, ou false si l'entrée est une chaîne de type "0000-00-00". Avec le second paramètre, il est possible de forcer le résultat à être immuable ou non :

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

Il s'agit en fait d'une fonction "Je ne suis pas sûr de ce que j'ai commencé, mais je sais ce que je veux".

(Note : Un peu de syntaxe PHP 7 ici, mais facilement adaptable à PHP 5)

-4voto

nikoskip Points 1371

Si vous ne pouvez pas gérer cela dans votre base de données, vous pouvez utiliser cet extrait pour éviter ce comportement et valider la date.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X