Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/09/2013, à 14:56

jean-luc5629

Probleme timezone php mysql

Bonjour;
Le script suivant qui est light, et que j'utilise pour compter les visites sur un site hébergé aux US (HOSTINGER), il fonctionne très bien mis à part que dans le tableau sql les  heures sont à - 6 heures / la France. Après plusieures recherches sur google;
J'ai modifié le script en rajoutant ligne 3:

date_default_timezone_set('Europe/Paris');

et ligne 55

$dbc->query("SET SESSION time_zone = 'Europe/Paris'");

après l'ouverture de la bdd. Mais rien n'y fait, toujours l'heure US dans le tableau mysql
Voici le script :


<?php
/**
date_default_timezone_set('Europe/Paris'); 
 * counter.php

 *

 * @package 3en1compteur

 * @version 3.0

 * @author NotoOn (http://www.notoon.com/)

 * @url http://www.petit-kiwi.com/

 *

 * Ce code est publié sous contrat Creative Commons.

 * Cela signifie que vous pouvez le copier, le modifier, le distribuer gratuitement

 * à condition de citer l'auteur original et garder cette licence.

 */

	/************************************

	 * Récupération de la configuration *

	 ************************************/



// Chemin absolu

if ( !defined('ABSPATH') ) {

	define('ABSPATH', dirname(__FILE__) . '/');

}



// Existence du fichier config.inc.php

if (file_exists(ABSPATH . 'config.inc.php')) {

	require_once(ABSPATH . 'config.inc.php');



	// Connexion BDD

	$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
       $dbc->query("SET SESSION time_zone = 'Europe/Paris'");

	if (!$dbc) {

		trigger_error('Connexion à la BDD impossible : ' . mysqli_connect_error() );

		exit();

	}



	// Récupération des données témoins

	$qry = "SELECT DATE_FORMAT(c_lastvisit, '%Y-%m-%d') AS c_lastvisit, c_total

			FROM $db_table

			WHERE c_host = 'temoin'";

	$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

	$data = mysqli_fetch_array($res, MYSQLI_ASSOC);



	// Nombre de visites total

	$total = $data['c_total'];



	// Dernier jour traité

	$saved_date = $data['c_lastvisit'];



	// Aujourd'hui et maintenant
       
	$today = date('Y-m-d');

	$now = time();
       


	// Si changement de jour

	if ( ($today != $saved_date) ) {

		// Le nombre de visites de chaque visiteur de la base est remis à 0

		$qry = "UPDATE $db_table SET c_total = 0 WHERE c_host != 'temoin'";

		$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));



		// La date stockée est mise à jour à la date d'aujourd'hui

              
		$qry = "UPDATE $db_table SET c_lastvisit = CURDATE() WHERE c_host = 'temoin'";

		$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));



		// On vide les lignes obsolètes

		$exceed = $now - ($keep*60*60);

		$qry = "DELETE FROM $db_table WHERE c_host != 'temoin' AND UNIX_TIMESTAMP(c_lastvisit) < $exceed";

		$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

	}





	/***********************************

	 * Fonction de vérification des IP *

	 ***********************************/



	// Fonction qui vérifie si l'IP est exclue du comptage ou pas

	function ipcheck($ip_to_match, $ip_array) {

		if (is_array($ip_array)) {

			foreach ($ip_array as $ip) {

				if (strpos($ip_to_match, $ip)===0)

				return true;

			}

		}

		return false;

	}





	/**************************

	 * Traitement des visites *

	 **************************/



	$ip = $_SERVER['REMOTE_ADDR'];

	

	// Si l'IP n'est pas dans la liste de celles à exclure

	if ( ipcheck($ip, $exclude) != true) {

		// On compte le nombre d'entrées correspondant à l'IP de notre visiteur

		$res = @mysqli_query($dbc, "SELECT COUNT(*) FROM $db_table WHERE c_ip = '$ip'") or die(mysqli_error($dbc));

		$row = mysqli_fetch_row($res);

		$match = $row[0];



		// Si aucune IP ne correspond, le visiteur est nouveau dans la base de données

		if ($match == 0) {

			$iphost = gethostbyaddr($ip);

			// Alors on ajoute son heure de connexion, son IP, et on initialise son nombre de visites à 1

			$qry = "INSERT INTO $db_table (c_firstvisit, c_lastvisit, c_total, c_ip, c_host) VALUES (NOW(), NOW(), 1, '$ip', '$iphost')";

			$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

			// Et on incrémente le nombre de visiteurs

			$qry = "UPDATE $db_table SET c_total = c_total+1 WHERE c_host = 'temoin'";

			$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

		}

		// Si il est déjà dans la base, alors :

		// - soit la période est dépassée, alors le visiteur est considéré comme nouveau

		// - soit il est déjà venu dans la même période d'unicité d'un visiteur

		else {

			// On récupère toutes les données qui lui correspondent

			$qry = "SELECT UNIX_TIMESTAMP(c_firstvisit) AS c_firstvisit FROM $db_table WHERE c_ip = '$ip'";

			$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

			$data = mysqli_fetch_array($res, MYSQLI_ASSOC);



			// On récupère la date de ses première et dernière visites

			
			$firstvisit = $data['c_firstvisit'];



			// Si la période est dépassée

			if ( ($now - $firstvisit) > ($unique * 60 * 60) ) {

				// Incrémentation du compteur total

				$qry = "UPDATE $db_table SET c_total = c_total+1 WHERE c_host = 'temoin'";

				$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

				// On compte le visiteur comme nouveau, même si c'est dans la même journée

				$qry = "UPDATE $db_table SET c_firstvisit = NOW(), c_lastvisit = NOW(), c_total = c_total+1 WHERE c_ip = '$ip'";

				$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

			}

			// Sinon on est dans la même période d'unicité

			else {

				// On met uniquement à jour l'heure de son dernier passage

				$qry = "UPDATE $db_table SET c_lastvisit = NOW() WHERE c_ip = '$ip'";

				$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

			}

		}

	}





	/************************

	 * Stockage des données *

	 ************************/



	// Nombre de visites total
	
	$qry = "SELECT c_total FROM $db_table WHERE c_host = 'temoin'";

	$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

	$alltime = mysqli_fetch_array($res, MYSQLI_ASSOC);

		$c_alltime = $alltime['c_total'];



	// Nombres de visiteurs quotidiens
	
	$qry = "SELECT SUM(c_total) AS c_total FROM $db_table WHERE c_host != 'temoin'";

	$res = @mysqli_query($dbc,$qry) or die(mysqli_error($dbc));

	$today = mysqli_fetch_array($res, MYSQLI_ASSOC);

		$c_today = $today['c_total'];



	// Nombre de visiteurs en ligne
	
	$lastmin = $now - ($interval*60);

	$res = @mysqli_query($dbc,"SELECT COUNT(*) FROM $db_table WHERE (c_host != 'temoin') AND (UNIX_TIMESTAMP(c_lastvisit) >= $lastmin)") or die(mysqli_error($dbc));

	$row = mysqli_fetch_row($res);

		$c_online = $row[0];



	// On ferme la connexion à la base de données

	mysqli_free_result($res);

	mysqli_close($dbc);

} else {

	echo '<strong>Le fichier config.inc.php manque à l\'appel !</strong>';

	exit();

}

?>

393481compteur.jpg

Merci d'avance pour m'éclairer, je patauge...NOW() renvoie toujours l'heure US...

Hors ligne

#2 Le 17/09/2013, à 16:16

bruno

Re : Probleme timezone php mysql

Lire : https://dev.mysql.com/doc/refman/5.0/fr … pport.html

« Les valeurs de timezone peuvent être fournies sous forme de chaînes de caractères, indiquant un décalage par rapport au temps UTC, comme '+10:00' ou '-6:00'. Si la table de fuseau horaire de la base mysql a été créée et remplie, vous pouvez aussi utiliser les noms de fuseaux, comme 'Europe/Paris' ou …»

Or les tables timezone et timezone_name de la base mysql sont rarement remplies. Il vaut donc mieux utiliser '+02:00' que 'Europe/Paris (avec le problème de l'heure d'été)

Si tu as un access ssh au serveur tu peux remplir ces tables avec mysql-tzinfo-to-sql

#3 Le 17/09/2013, à 19:54

jean-luc5629

Re : Probleme timezone php mysql

Bonsoir;
Merci bruno; mais j'ai déjà essayé par exemple :

$dbc->query("SET SESSION time_zone = '+6:00′'");

Sans plus de résultats; et je n'ai pas accès ssh au serveur.
Je ne vois vraiment pas quoi modifier dans ce fichier php !!! et j'avoue ne pas être très doué en scripts.

Merci.

Dernière modification par jean-luc5629 (Le 17/09/2013, à 19:55)

Hors ligne

#4 Le 17/09/2013, à 20:11

bruno

Re : Probleme timezone php mysql

Et avec cette syntaxe ?

$dbc->query("SET time_zone = '+2:00′'");

Dernière modification par bruno (Le 17/09/2013, à 20:11)

#5 Le 17/09/2013, à 20:42

jean-luc5629

Re : Probleme timezone php mysql

bruno a écrit :

Et avec cette syntaxe ?

$dbc->query("SET time_zone = '+2:00′'");

Hélas non, j'obtiens "2013-09-17 15:35:51" à cette heure ci ...
j'avais mis le session time zone, mais il me semblait avoir déjà essayé le set time zone => même résultat.

merci quand même...et pourtant il doit bien y avoir une solution...

Hors ligne

#6 Le 17/09/2013, à 21:32

bruno

Re : Probleme timezone php mysql

Pourtant je viens de tester ce bout de code et cela marche parfaitement sur mon serveur (apache 2.4, php 5.5, mysql 5.5) :

$dbc = mysqli_connect('machine', 'test', 'motdepasse', 'test');
$dbc->query("SET time_zone = '-01:00'");
$res=$dbc->query('SELECT NOW()');
$row = mysqli_fetch_row($res);
echo $row[0];

J'obtiens bien l'heure du fuseau GMT-1

#7 Le 17/09/2013, à 21:55

jean-luc5629

Re : Probleme timezone php mysql

bruno a écrit :

Pourtant je viens de tester ce bout de code et cela marche parfaitement sur mon serveur (apache 2.4, php 5.5, mysql 5.5) :

$dbc = mysqli_connect('machine', 'test', 'motdepasse', 'test');
$dbc->query("SET time_zone = '-01:00'");
$res=$dbc->query('SELECT NOW()');
$row = mysqli_fetch_row($res);
echo $row[0];


J'obtiens bien l'heure du fuseau GMT-1

re;

Normalement ça devrai être ça pour mon script plus haut, mais hélas que je mette :

$dbc->query("SET time_zone = '+2:00′'");

ou

$dbc->query("SET time_zone = '+6:00′'");

ou Europe/Paris; j'ai toujours l'heure US dans mysql

php 5.4 MySQL Version 5.1 : http://www.hostinger.fr/hebergement-gratuit

Mais je ne pense pas que la version y soit pour quelque chose dans ce cas ci !!!

$qry = "INSERT INTO $db_table (c_firstvisit, c_lastvisit, c_total, c_ip, c_host) VALUES (NOW(), NOW(), 1, '$ip', '$iphost')";

Malgré les lignes ci dessus, NOW() renvoie toujours sur l'heure locale du serveur.

Bonne nuit & merci

Hors ligne