Pages : 1
#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();
}
?>
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
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
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
Pages : 1