Général
- Présentation
- Les Symboles
- Les Métacaractères
- Les Ancres et Classes
- Les options
- Constantes prédéfinies
- Equivalences
- Créer un motif
- Les POSIX
- Les PCRE
- Les Plus des PCRE
- Les Assertions Part I
- Les Assertions Part II
- Motif conditionnel
- Mysql et les regex
- Url Rewriting
- Optimisation
- Aide mémoire
Les PCRE
Les POSIX
Pratique
Linux
Spécial php
- Conseils et Astuces
- Délimiteur PCRE
- Créer une bdd
- Utiliser du BBcode
- Le binaire
- Faire un panier
- Cases à cocher
- Citations imbriquées
- Colorateur syntaxique
- Les list-box ou combo-box
- Faire un diaporama
- Isset ou empty ?
- Une légende au survol
- Site en plusieurs langues
- Requêtes dynamiques
- Gestion des smiley
- Faire un moteur de template
- Timestamp php/mysql
- Timestamp mysql
- Matcher une adresse email
- Controler des données
Les billets de fred
- Les POSIX... mise en pratique !
- Limiter l'accès à un répertoire
- Alternance de couleurs
- Magic_quotes
- Désactiver les short_tags
- Require ou include : Bench
- Cohérence dans les chaines de caractères
- "echo" : lapin ou tortue ?
- Gérer un formulaire avec plusieurs boutons
- Le formulaire a t'il été soumis ?
- J'ai décidé de grossir
- La guerre des étoiles
- La guerre des boutons
- Headers already sent
- IP, IP, IP, houra !
- Créer un itérateur avec PHP5
- On vous conduit vers la lumière
- Comment utiliser MySQL avec PHP
- Non aux booléens !
- Php.ini : dist /recommended
- Include : gouffre ou fêlure ?
- Simple comme les sessions !
- Simplifier le traitement des erreurs
- Structurez vos applications
- Franchement, t'es trop for !
- Notice: Undefined variable (ou index)
- Proscrire les variables auto déclarées
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
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
