82 votes

PDO::PARAM pour les dates ?

Est-ce que certains PDO::PARAM_??? existent qui peuvent être utilisés pour les dates ou les horodatages ?

Exemple de code :

$sql = "UPDATE my_table SET current_date = :date WHERE id = 43";
$statement = $pdo->prepare ($sql);
$statement->bindParam (":date", strtotime (date ("Y-m-d H:i:s")), PDO::PARAM_STR);
$statement->execute ();

115voto

Pascal MARTIN Points 195780

Lorsque vous écrivez une date dans une requête SQL, vous l'écrivez sous la forme d'une chaîne de caractères ; vous devez faire de même avec les instructions préparées, et utiliser PDO::PARAM_STR comme vous l'avez fait dans la partie du code que vous avez proposée.

Et pour le "timestamp", si par "timestamp" vous voulez dire :

  • Le type de données MySQL timestamp : c'est le même, vous le passerez comme un string
  • Le timestamp de PHP Unix, qui est un entier : vous lui passerez une valeur de int .

1 votes

Qu'en est-il en cas de précision ms ?

0 votes

@ManuelSchneid3r, pas pour les timestamps : "Le temps Unix (également connu sous le nom de temps POSIX ou temps d'époque UNIX) est un système permettant de décrire un point dans le temps. Il s'agit du nombre de secondes qui se sont écoulées depuis 00:00:00 Temps universel coordonné (UTC), le jeudi 1er janvier 1970, moins les secondes intercalaires". / fr.wikipedia.org/wiki/Unix_time

0 votes

C'est plus simple comme ça, il suffit de définir dans la base de données le fichier comme VARCHAR(size) et d'envoyer la variable avec la date("Y/m/d") avec votre fuseau horaire et si vous voulez l'heure la date("h:i:s").

19voto

Rolty Points 11

Il suffit de créer la date à l'aide de la fonction date de php pour résoudre ce problème.

$handle->execute(array(":date"=>date("Y-m-d H:i:s", strtotime($date)), PDO::PARAM_STR)) ;

7voto

Nope. Traitez la date comme une chaîne.

-2voto

Diego Andrade Points 101

Vous devez traiter la date comme une chaîne, mais vous pouvez créer une fonction pour vérifier si la date est valide avant de la passer comme paramètre. Comme ceci :

function checkValidDate($date, $format = "dd-mm-yyyy"){
            if($format === "dd-mm-yyyy"){
            $day = (int) substr($date,0,2);
            $month = (int) substr($date, 3,2);
            $year = (int) substr($date, 6,4);

        }else if($format === "yyyy-mm-dd"){
            $day = (int) substr($date,8,2);
            $month = (int) substr($date, 5,2);
            $year = (int) substr($date, 0,4);
        }

        return checkdate($month, $day, $year);
}

0 votes

Ce n'est pas la bonne solution, Diego. Il existe des fonctions de formatage de date dans tous les SGBDR que j'ai rencontrés. Regarde ça : mariadb.com/kb/fr/date_format

-2voto

theking2 Points 133

Une section complète pour stocker correctement une valeur DateTime (sous forme de chaîne) dans un SGBDR :

/** @const string app_date_format expected date format in the PHP domain (Swiss) */
define( 'app_date_format', 'd.m.Y' ); 

/** @var PDOConnection $db */
$db = new \PDO( $dsn, $db_user, $db_pass, $db_options );

/** @var DateTime $date */
$date = \DateTime::createFromFormat( app_date_format, '30.11.2020' );

$stmt = $db-> prepare(
    "UPDATE `test`
    SET `test_date` = STR_TO_DATE(:date, '%Y-%m-%d %H:%i:%s' )
    WHERE `test`.`test_id` = :id"
);

$id = 1;
$dateString = $date-> format( 'Y-m-d H:i:s' );

$stmt->bindValue( ':id', $id );
$stmt->bindParam( ':date', $dateString );
$stmt->execute() or die( $db-> error );

Comme bindParam nécessite la référence d'une variable, il n'est pas possible de faire quelque chose comme :

// gives an error
$stmt->bindParam( ':date', $date-> format( 'Y-m-d H:i:s'));

Testé avec PHP 7.4.1 ; MariaDB 10.4.10

0 votes

Le code est bogué et trompeur. Une constante en minuscule est contraire à la norme. Et la réponse n'aborde même pas la question posée.

0 votes

@YourCommonSense Où sont les insectes ? Où sont les normes ? Où sont les erreurs ? Vous devez élaborer votre bon sens.

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