Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

Timestamp PHP vs Timestamp Mysql

Trop souvent je vois dans vos scripts des requêtes pour insérer un timestamp PHP obtenu avec time() dans un champ INT, quand ce n'est pas dans un champ varchar, même pire, un float !!!!

Voici une image de la structure d'une table tirée d'un tuto que j'ai trouvé sur le web.
Je vous préviens tout de suite, c'est l'exemple parfait de :

Ce qu'il ne faut surtout pas faire !



Affolant quand on y pense ! Et puis ce type float pour un entier, c'est dingue !
Généralement on trouve plus facilement des INT(15) ou BIGINT(20) et autres trucs assez farfelus il faut l'admettre.

Et pour le code, on trouve des trucs comme ça :
<?php
// une requête et un timestamp php

$requete = mysql_query("INSERT INTO table VALUES('', '" . $val1 . "', '" . $val2 . "', '" . time() . "')");

// et pour l'affichage, pon trouve ça :
echo 'Le ',date('d/m/Y à H\hi', $donnees['champ_time']),';
?>

Je vous le dit immédiatement, je déteste ça ! C'est totalement idiot de procéder de la sorte et cela prouve que ceux qui préconise cela ne connaissent pas leur sujet.
La fonction time() ne devrait utilisée que pour afficher la date courante et rien d'autre.
Mysql dispose de champ typiquement réservés aux dates et temps. En plus avoir ce type de champ permet de bénéficier de toutes les options et fonctions de calcule qu'autorise Mysql.

Quelle est la différence entre les deux TIMESTAMP ?

Le timestamp UNIX (Php) représente le temps écoulé en secondes depuis le 01/01/1970.
La notation est libellée sous la forme d'un nombre : 123456789

Le timestamp Mysql par contre est un format écrit sur un maximum de 14 chiffres représentant une date ou l'instant présent via la commande Mysql NOW()
La notation du timestamp Mysql est sous la forme AAAA-MM-DD HH:MM:SS ou AAAAMMJJHHMMSS. En chiffres cela donne par exemple 2006-08-07 11:23:37 ou 20060807112337

Donc en résumé :
  • timestamp UNIX (php) = nombre de secondes depuis 1/1/1970
  • timestamp type Mysql = une date, un moment, une référence dans le temps
Voilà, avec ça vous êtes paré !

Je vous montre maintenant la bonne manière de procéder :

Premièrement, on remplace le champ timestamp en lui donnant un autre nom que celui d'un mot réservé à Mysql.
Bien que certains mots soient acceptés parfaitement, comme action, date, time, timestamp, etc... il convient de savoir que leur emploi nécessite l'emploi de caractères déchappement : `date`

Mon conseil afin d'éviter le moindre risque : ne pas les utiliser !
Le vocabulaire français est suffisament riche que pour éviter ces mots anglais, même si date et action, par exemple, s'écrivent de la même manière en en français.

Pour rappel, vous pouvez consulter la liste complète là : Cas des mots réservés MySQL

On y va et on remplace ce fumeux timestamp type FLOAT avec le bon type de champ :
- on va l'appeler simplement temps et on lui donne le type DATETIME

Plus simple on ne peut pas et votre requête pour enregistrer le moment de votre insertion devient :
<?php
$requete = mysql_query("INSERT INTO table (id,titre,contenu,temps)
VALUES('', '" . $titre . "', '" . $contenu . "', NOW())");
?>

Et voilà, le moment de la mise en ligne de votre news par exemple est enregistré grâce à NOW() au format DATETIME qui est une chaine formatée comme suit : 'AAAA-MM-JJ HH:MM:SS'

Vous pourrez maintenant faire une requête de ce type par exemple :
<?php
$req= "SELECT titre, DATE_FORMAT(temps,'%d-%m-%Y') as temps FROM table WHERE id=1";
$res=mysql_query($req);
$data=mysql_fetch_assoc($res);

echo 'La news ',$data['titre'],' a été postée le ',$data['temps'];
?>

Et voilà, toute la facilité d'un choix judicieux !

Avec ce type DATETIME (ou DATE ou TIMESTAMP) et cette chaine, il vous est maintenant possible de bénéficier de toutes les fonctions et calculs de temps fourni par Mysql. Les 3 types de champs cités au-dessus sont consultables là :
Cf Doc Mysql -> Les types DATETIME, DATE, et TIMESTAMP

La liste des fonctionnalités, assez impressionnante, se trouve là :
Cf Doc Mysql -> Fonctions de dates et d'heures

A vous de jouer, je vous laisse le plaisir de découvrir BETWEEN, YEAR, MONTH, DAY et autres fonctions tout aussi pratiques.

Ya pu ka, comme dirait l'autre !


Allez chui sympa, je vous donne encore quelques exemples d'utilisation :
<?php
// Une requête avec sélection sur un mois
$req="SELECT titre FROM latable WHERE MONTH(temps)=12";

// une requête avec un interval sur deux années
$req="SELECT titre FROM latable WHERE YEAR(temps) BETWEEN 2004 AND 2006";

// une autre requête avec un interval
$req="SELECT titre FROM latable WHERE NOW()-INTERVAL 3 DAY = temps";
?>

Une petite dernière pour la route. En voici une qui va retourner toutes les dates comprises entre 10 et 20 jours avant la date d'aujourd'hui.
<?php
$req="SELECT titre FROM latable WHERE temps BETWEEN DATE_SUB(NOW(),INTERVAL 10 DAY)
AND DATE_SUB(NOW(),INTERVAL 20 DAY)";
?>

Un second article sur le TIMESTAMP, c'est par là : Timestamp Mysql - Partie II
ADAM Benjamin 2008 | Admin