Vérification d'une différence entre deux dates

Eléphant du PHP | 428 Messages

30 sept. 2009, 21:25

Bonjour,

je suis entrain de m'essayer à réaliser un compteur de visite à incrémentation.

Je me demandais si il était possible de vérifier concrètement une date de cette manière.
$datedujour = date("Y-m-d");
$date_publication = '2008-01-10';

if ($date_publication < $datedujour) {
echo '24h ou plus écoulees, on enregistre dans la base de donnée l\'incrémentation du compteur';
} else {
echo 'pas encore 24h écoulées, on enregistre pas dans la base de donnée l\'incrémentation du compteur';
}
Si ce procédé est correct et ne laisse planer aucun doute de bug, parfait !

Sinon, peut être dois-je jouer sur la transformation de la date en octal ou autre ? mais la, je dois avouer que je bloque.

Pouvez-vous donc me confirmer que ce code est correct ?

Merci

Eléphant du PHP | 72 Messages

30 sept. 2009, 21:31

Tiens voici une classe que j'ai ecrite la semaine derniere elle est compatible avec phpdocumentor
<?php
/** Classe finale de compteurs de visite a partir d'un fichier texte
* @package : Class
* @subpackage : CompteurDeVisite
* @category : Tools and Utilities
* @author : COLLARD charlie ([email protected])
* @created  : 13/08/2009
* @version : 1
* @copyright 2009
****************************************************************************************************************
* @example Utilisation en php 4, supprimer tous les attributs public et private devant toutes les methodes de la classe
*		$oCompteurVisite= new MyCompteurVisiteImplements (); ou $oCompteurVisite= new MyCompteurVisiteImplements ('toto.txt');
*   	if (is_object($oCompteurVisite)){
*			$sMessageAAfficher=$oCompteurVisite->mAfficheNbreVisiteur(); 
*			echo $sMessageAAfficher;
*		}
* @example Utilisation en php 5, il faut appeler la methode publique tel que :
*   	$oCompteurVisite= new CompteurVisiteImplements ();   ou $oCompteurVisite= new MyCompteurVisiteImplements ('toto.txt');
*       if ($oCompteurVisite instanceof CompteurVisiteImplements AND is_object($oCompteurVisite)===TRUE){
*			echo $oCompteurVisite->mAfficheNbreVisiteur();
*		}  		
*       echo $oCompteurVisite->mAfficheNbreVisiteur();     //aucune message erreur grace à la methode magique de php 5 __tostring()
************************************************************************************************à****************
* @contenu   Exemple affichage du fichier texte encodé avec serialize:
*a:4:{s:8:"Requetes";i:9;
*    s:7:"Visites";i:1;
* s:13:"DateConnexion";s:14:"20090813140235";
*	 s:9:"AdresseIp";s:9:"127.0.0.1";}
*	 
* @contenu   Exemple affichage : voir # 1 Requetes 8 Visites 1 DateConnexion 20090813140235 AdresseIp 127.0.0.1
*****************************************************************************************************************
* @todo gestion des erreurs par une classe exception
**/

/** prototypage des methodes publiques 
* les methodes privées ne doivents jamais apparaitre et sont en commentaires
**/

define ('REQUETES','Requetes');
define ('VISITES','Visites');
define ('DATECONNEXION','DateConnexion');
define ('ADRESSEIP','AdresseIp');


interface CompteurVisite
{
	//private function mAfficheInfoDuFichier ();
	//private function mAfficheInfoDuFichier ();
	//private function mEnregistreInfoDansFichier ();
	//private function mTraitementInfo () ;
	public function mAfficheNbreVisiteur();
}


final Class CompteurVisiteImplements implements CompteurVisite{

     //ne marche toujours pas
	//const _REQUETTES_ = 'Requetes';
	//const _VISITES_ = 'Visites';
	//const _DATECONNEXION_ = 'DateConnexion';
	//const _ADRESSEIP_ = 'AdresseIp';

	private $sFichier='FichierStockageCompteurVisite.txt';            /**@access private
																		*@var string Nom par defaut du fichier texte de sauvegarde du nbre de visiteurs etc, si jamais aucun nom de fichier n'est passé au constructeur**/
	private $iIp;                                                     /**@access private
																		*@var integer adresse ip du visiteur en cours**/
	private $iTime;                                                   /** @access private
																		* @var integer date de la connexion du visiteur en cours**/
	
	private $aDonneesDuFichier;                                       /** @access private
																		* @var array variable de type tableau ou sont stockées les informations du compteur de visite **/
	
	/** il faudra penser à utiliser des constantes par la suite pour les clefs du tableau car leurs valeurs ne bouge pas **/
   /** intuile depuis les define si suppression des define utiliserdans le code les $this->sRequetes ,etc pour les trois autres 
   //private $sRequetes = 'Requetes';                                  /** @access private
																		/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
	//private $sVisite= 'Visites';                                      /** @access private
																		/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
	//private $sDateConnexion='DateConnexion';                           /** @access private
																		/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/                                  
	//private $sAdresseIp='AdresseIp';                                  /** @access private
																		/* @var string Nom d'une clef du tableau $aDonneesDuFichier **/
	
	
	private $iNbreVisiteurAujourdhui;                                  /** @access private
																		 * @var integer variable de stovkage du nombre de visiteur connecté le jour meme **/
	private $iNbreVisiteurTotal;                                       /** @access private
																		 * @var integer variable de stockage du nombre de visiteur total du site ; **/
	private $iNbrePagesVisitees;                                       /** @access private
																		 * @var integer variable de stockage du nombre de pages total visitées **/
	
	//private $aNomMethodeAInvoquer=array ( "mAfficheInfoDuFichier","mTraitementInfo","mEnregistreInfoDansFichier");
	
/** Constructeur de la classe
* à renommer en function CompteurVisite pour php 4
* @access public
* @param string $sFichierInfo le nom du fichier de sauvegarde des informations (facultatif)
* @return void ou null
**/
	public function __construct ($sFichierInfo=NULL)
	{
		$this->iIp = $_SERVER['REMOTE_ADDR'];                           /**On recupere l'adresse ip en utilisant la variable superglobale £_SERVER ... **/
		$this->iTime = date('YmdGis');                                  /**On recupere la date actuel au format 2009(année) 08(mois) 06(jour)17 (heure) 34 (min) 34 (secondes) **/
		
		
		if( $sFichierInfo != NULL AND is_string($sFichierInfo)===TRUE ){   /**Si un parametre est passé au constructeur et que celui-ci est bien une chaine de caracetere **/
			$this->sFichier=$sFichierInfo;                                 /** on ecrase le nom de fichier d'enregsitrement par defaut defini au debut de la classe **/
		}
		
		/* Si le fichier où l'on stocke les données n'existe pas encore,on le crée.*/
		if( file_exists($this->sFichier) === FALSE ) {                   /** <=> à ancienne version !file_exists($this->sFichier) **/
			$fp = fopen($this->sFichier, "w");
			
			/** on ecrit un tableau vide afin que la premiere lecture de celui-ci ne nous crée pas des messages d'alertes type "Notice: Undefined index: AdresseIp" en nous disant que les clefs du tableau n'existe pas voir test  #2 #3 #4  #5 **/
			fwrite($fp, serialize(array('REQUETES'=>'',                         /**clef Requetes (page visitees) independante de  l'ip et de la date de connexion **/
										'VISITES'=>'',                           /** clef **/
										'DATECONNEXION'=>'',
										'ADRESSEIP'=>''
										)
									)
					);
			fclose($fp);                                                   /** on ferme le fichier en lui precisant le pointeur de fichier **/
			unset($fp);                                                    /** on libere les ressources  pour une variable desomrais inutile **/
		}
	}
	
/** methode privée mAfficheInfoDuFichier ()
*   permet de recuperer les informations  issus du fichier
*  @access private 
*  @param void ou null
*  @return void ou null
**/
	private function mAfficheInfoDuFichier ()
	{
		static $aNbreDeLignesDuFichier;                                                       /** variable de type static donc utilisable dans cette fontion uniquement **/
	    $aNbreDeLignesDuFichier = file($this->sFichier);
		$this->aDonneesDuFichier = unserialize($aNbreDeLignesDuFichier[0]);
		unset ($aNbreDeLignesDuFichier);                                                       /** on libere les ressources  pour une variable desomrais inutile **/
	}
	
/** methode privée mEnregistreInfoDansFichier ()
 * On stocke le tableau dans le fichier de données
 * en écrasant sa valeur précédente.
 * @access private  
 * @param void ou null
 * @return void ou null
 **/
	private function mEnregistreInfoDansFichier ()
	{
		$fp = fopen($this->sFichier,"w");
		fwrite($fp, serialize($this->aDonneesDuFichier));
		fclose($fp);
		unset($fp);     																	 /** on libere les ressources  pour une variable desomrais inutile **/                                                                      
	}
	
/** methode privée mTraitementInfo ()
* @access private
* @param void ou null
* @return void ou null
*/
	private function mTraitementInfo () 
	{
		
		if (is_array($this->aDonneesDuFichier)===TRUE){                   /** on verifie que nous sommes bien en presence d'un tableau avant de le parcourir afin d'eviter une erreur **/
			foreach( $this->aDonneesDuFichier as $cle => $valeur )        /** on parcourt le tableau à deux dimensions **/
			{
			    //echo $cle.' '.$valeur.'<br/>';                               #1  pour le debug
				/** explication succinte, si la date de connexion actuelle est postérieur à celle contenue dans le fichier, c'est que nous sommes potentiollement en face d'un nouveau visiteur
				* pour eviter d'ajouter un nouveau visiteur qui serait le meme que le precedent , il suffit de tester son adresse ip
				**/
				
				if( substr($valeur, 0, 8) != substr($this->iTime, 0, 8) && $cle == "DATECONNEXION") {  #2/**on verifie si la date de connexion contenue dans le fichier est antérieur à celle du visiteur **/
					if( $this->aDonneesDuFichier["ADRESSEIP"] != $this->iIp) {                         #3 /** Si l'ip du fichier est differente de celle du visiteur , c'est que nous sommes en presence d'un nouveau visiteur**/
						$this->aDonneesDuFichier["VISITES"]++;                                          #4 /** on incrémente la valeur du nombre de visites**/
						$this->aDonneesDuFichier["DATECONNEXION"]= $this->iTime;                          /** on enregistre la valeur de la connexion actuelle au sein de la clef DateConnexion du tableau **/
						//ligne inutile car on va tout simplement ecraser la valeur par une nouvelle lors de la ligne de code suivanteunset($this->aDonneesDuFichier[$this->sAdresseIp]);               /** on supprime l'ip du visiteur au sein du tableau **/
						$this->aDonneesDuFichier["ADRESSEIP"] = $this->iIp;                               /** on  enregistre la valeur de l'ip actuelle au sein de la clef AdresseIp de notre tableau **/
					}
				}
			}
		}
		
		$this->aDonneesDuFichier["REQUETES"]++;                                                          #5 /** On incrémente ( ajoute +1 ) la valeur du nombre de requetes (nbre de pages visitées ).**/
		
		/** On effectue un petit report de variable en vue de leur affichage **/
		$this->iNbreVisiteurTotal= $this->aDonneesDuFichier["VISITES"];
		$this->iNbreVisiteurAujourdhui = count($this->aDonneesDuFichier)-3;             /** le nombre de visiteurs = **/
		$this->iNbrePagesVisitees = $this->aDonneesDuFichier["REQUETES"];

	}
	
	
/** methode publique  (string) mAfficheNbreVisiteur () 
* donc accessible à l'exterieur de la classe qui permet d'afficher le nombres de visiteurs depuis la création du site
* et le nombre de visiteur de la journée
*@access public
*@param void ou null
*@return string qui correpond au message à afficher => on passera par l'emploi de la methode magique php5 __tostring pour l'afficher
**/
	public function mAfficheNbreVisiteur()
	{
		static $sMessageAffiche='';
		
		
	/**	if (is_array($this->aNomMethodeAInvoquer)===TRUE){
			foreach ($aNomMethodeAInvoquer as $sValue){                     /** on parcourt un tableau à une dimension donc nous n'avons pas besoin des clefs pour acceder aux valeurs
				$fonction='$this->'.$sValue.'()';
				echo $fonction;
				}else{
				echo 'la classe '.$sValue.' est manquante ou inacessible)';
				}
			}//fin du foreach de parcours du tableau
			unset ($this->aNomMethodeAInvoquer);
		}//fin du if de test**/
		
		
		$this->mAfficheInfoDuFichier ();
		$this->mTraitementInfo ();
		$this->mEnregistreInfoDansFichier ();
		$sMessageAffiche.='Vous êtes le '.$this->iNbreVisiteurAujourdhui.' visiteur(s) aujourd\'hui sur un total de '.$this->iNbreVisiteurTotal.'.';        /** possiblite d'afficher  également le nombre de pages chargées en utilisant la variable $this->iNbrePagesVisitees**/
		return (string) $sMessageAffiche;
		unset ($sMessageAffiche);	 	                                                                                                                    /** on libere les ressources désormais inutile **/																	                                                /** on libere les ressources  pour une variable desomrais inutile **/
	
	}

	
/**La méthode magique __toString() est simple à utiliser et permet d'afficher un objet en faisant juste un echo d'une variable qui contient cet objet.
*@exemple  echo $oCompteurVisite->mAfficheNbreVisiteur();
*@access public
*@param void ou null
*@return void ou null
**/
	public function __tostring(){}
/** Destructeur de la classe 
*@access public
*@param void ou null
*@return void ou null
**/
	public function __destruct(){}
}
?>

pour l'utiliser :

juste :

$oCompteurVisite= new CompteurVisiteImplements ();
	if ($oCompteurVisite instanceof CompteurVisiteImplements AND is_object($oCompteurVisite)===TRUE){
		echo $oCompteurVisite->mAfficheNbreVisiteur();
	}
seul bemol je voulais utiliser des constantes tel que

CONST REQUETES='Requetes';

mais je n'ai jamais reussit je suis donc resté avec mes trois variables , je suis decue ..si tu pouvais trouver la solution ce serait bien

Eléphant du PHP | 428 Messages

30 sept. 2009, 22:42

Merci pour ta réponse.

Mais concrètement, le fait de vérifier les dates de cette manière est correcte ou pas ?
if ($date_publication < $datedujour) {}

Eléphant du PHP | 428 Messages

01 oct. 2009, 19:49

Après avoir torturé mon code dans tous les sens, il apparaît qu'il fonctionne en l'état.
Je vérifie donc simplement les dates de cette manière :
$datedujour = date("Y-m-d");
$date_publication = '2008-01-10';
if ($date_publication < $datedujour) {}
Et ca a l'air de fonctionner...

Toutefois, pour ceux que ca intéresse et d'après un autre forum, il serait préférable d'utiliser un timestamp pour vérifier les dates.

infos ICI : http://www.vulgarisation-informatique.com/dates-php.php

un code timestamp pour mieux comprendre :
<?php
// le 5 mai 2004 à 12H14mn 30secondes
$date1 = mktime(12,14,30,5,5,2004);
// le 21 mai 2004 à 18H21mn 0seconde
$date2 = mktime(18,21,0,5,21,2004);

$diff_date = $date2-$date1;
$diff['heures'] = (int)($diff_date/(60*60));
$diff['jours'] = (int)($diff_date/(60*60*24));
print_r ($diff);

/*
 * retourne $diff = 
 * Array
 * (
 *   [heures] => 390
 *   [jours] => 16
 * )
 */
?>