[RESOLU] srtotime impossible ?

Avatar du membre
Eléphant du PHP | 224 Messages

14 févr. 2015, 05:18

Hello :)

Je souhaite faire une comparaison de la date et heure du serveur avec celle du client au chargement d'une page.

Pour cela, après plusieurs heures de recherche et de tests je suis parvenu à faire afficher la date et l'heure du client obtenue au moment du chargement.
Voici le code que j'ai dégotté puis adapté :
$local = '
<script type="text/javascript">
<!--
var currentDate = new Date();
var twoDigitMonth=((currentDate.getMonth()+1)>=10)? (currentDate.getMonth()+1) : \'0\' + (currentDate.getMonth()+1);  
var twoDigitDate=((currentDate.getDate())>=10)? (currentDate.getDate()) : \'0\' + (currentDate.getDate());
var twoDigitHours=((currentDate.getHours())>=10)? (currentDate.getHours()) : \'0\' + (currentDate.getHours());
var twoDigitMinutes=((currentDate.getMinutes())>=10)? (currentDate.getMinutes()) : \'0\' + (currentDate.getMinutes());
var twoDigitSeconds=((currentDate.getSeconds())>=10)? (currentDate.getSeconds()) : \'0\' + (currentDate.getSeconds());
document.write(currentDate.getFullYear() + "-" + twoDigitMonth + "-" + twoDigitDate + " " + twoDigitHours + ":" + twoDigitMinutes + ":" + twoDigitSeconds); 
//-->
</script>
';
echo $local;
Pour la date et l'heure du serveur :
$server = date('Y-m-d H:i:s');
echo $server;
Le résultat s'affiche bien comem ceci :
Local 2015-02-14 04:07:24
Server 2015-02-14 04:07:53

Là où ca se complique, c'est pour déterminer la différence.

Je pense qu'en faisait un strtotime sur chacune des date et heure, puis en faisant une soustraction, j'aurais la différence, en secondes.

Pour le serveur, pas de soucis , j'obtiens 1423883273 (pour l'exemple de date et heure ci dessus). La valeur change si je recharge la page, ce qui est logique.

En revanche, pour $local, strtotime refuse de me convertir quoi que ce soit.
La commande que j'utile est :
$local = strtotime($local);
J'ai cherché à comparer le format d'écriture obtenu par le javascript qui me donne la partie client.

En faisant la commande suivante :
$local = 'AVANT'.$local.'APRES';
echo $local;
Je constate qu'il ya un espace qui se met avant et après la date et heure, comme ceci :
AVANT 2015-02-14 04:12:30 APRES
alors que je devrais obtenir
AVANT2015-02-14 04:12:30APRES

A noter que si je défini une valeur fixe à $local, par la ligne $local = 'POUET'; j'obtiens bien la ligne sans espace :
AVANTPOUETAPRES

Je pense que le script permettant d'obtenir la date et l'heure du client, ajoute un espace avant et après le résultat, et que surement cet espace empeche strtotime de focntionner.

Je me dis "Ok, bah je vais virer les espaces sur le résultat obtenu", et donc je rajoute la ligne :
$local = trim($local, " ");
Mais rien n'y fait, les espaces sons toujours présents :twisted:
Alors j'ai essayé des repalce, et autres formules glannées sur le net, mais rien à faire, cesz espaces ne veulent pas se barrer, et j'en arrive à un point que c'est en train de me rendre fou :(

Je m'en remets donc à votre aide, si vous avez une idée, elle serait vraiment la bienvenue :oops:

Désolé pour le roman mais pas facile à expliquer sans bien détailler ce que j'ai testé.

M'ci et bon ouiK !
Le Couin

Edition :
J'ai continué à cherché mais là je sature. J'ai modifié le code du script, je n'ai plus les espaces. Mais le problème n'est toujours pas résolu.
Mais le plus étrange c'est que si je tente d'explotier la valeur $local en tant que valeur d'un input, ca affiche le script au lieu de la valeur.

Code :
<script type="text/javascript">
var currentDate = new Date();
var twoDigitMonth=((currentDate.getMonth()+1)>=10)? (currentDate.getMonth()+1) : '0' + (currentDate.getMonth()+1);  
var twoDigitDate=((currentDate.getDate())>=10)? (currentDate.getDate()) : '0' + (currentDate.getDate());
var twoDigitHours=((currentDate.getHours())>=10)? (currentDate.getHours()) : '0' + (currentDate.getHours());
var twoDigitMinutes=((currentDate.getMinutes())>=10)? (currentDate.getMinutes()) : '0' + (currentDate.getMinutes());
var twoDigitSeconds=((currentDate.getSeconds())>=10)? (currentDate.getSeconds()) : '0' + (currentDate.getSeconds());
var local=(currentDate.getFullYear()+"-"+twoDigitMonth+"-"+twoDigitDate+" "+twoDigitHours+":"+twoDigitMinutes+":"+twoDigitSeconds);
</script>

</head>
<body>
<?
$local = '<script>document.write(local);</script>';
echo $local;
$server = date('Y-m-d H:i:s');
// echo '<br>';
// echo 'Server : '.$server;
// $server = strtotime($server);
// echo '<br>';
// echo 'str server '.$server;
// echo '<br>';
// echo 'str local '.$local;
// $offset = $server - $local;
// echo '<br>';
// echo 'Offset = '.$offset;
?>
<form name="test" action="test.php" method="POST">
<input type="text" name="local" value="<?php echo $local;?>">
<br>
<input class="body" name="submit" type="submit" value="Go">
</form>
Résultat :
J'ai une premier ligne qui affiche bien la date et l'heure du client mais la deuxième ligne, qui est une zone de texte, affiche
<script>document.write(local);</script>

Je pense que le strtotime essaye d'interpreter strtotime(<script>document.write(local);</script>) , ce qui forcément ,ne peut pas fonctionner.

Mais ca ne me dit pas pourquoi je n'obtiens pas la même chose sur les deux lignes selon commen j'exploite echo $local; .

Si vous avez des idées, car moi je sais plus où chercher là :(

M'ci :)
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Eléphanteau du PHP | 42 Messages

14 févr. 2015, 14:25

Bonjour,

Ce qu'il faut que vous compreniez est que votre code javascript s'execute au sein de votre navigateur alors que le script PHP s'execute au niveau du serveur. Ainsi, la fonction srtotime lorsque vous y mettez $local interprete le code javascript qui y est et non ce que javascript retourne.

Ainsi, il est normal que SRTOTIME renvoye une erreure car il ne comprend pas tout ce code.

première solution : Dans la logique, si vous souhaitez comparer l'heure du serveur avec celle du naviguateur internet, il faudrait que vous envoyez au serveur la date et l'heure du navigateur afin que le serveur fasse la comparaison et retourne une réponse grâce à PHP. Il faut pour cela utiliser AJAX et JQUERY qui envoyeront les paramètres du navigateur (date et heure) au serveur. Un script php fera la comparaison entre ces variables et celles du serveur et retournera une réponse.

deuxième solution (je pense la mieux) : FAIRE LA COMPARAISON DES DATE ET HEURE EN JAVASCRIPT : lors de l'affichage de la page, vous intégrez les informations de date et heure du serveur dans un code javascript. Ce code javascript effectue la comparaison entre la date/heure du serveur et la date/heure du navigateur et retourne le résultat (il y a toute les fonctions javascript qu'il faut pour faire ce processus).

je peux vous aider à faire ce travail suivant mon temps libre.

bien à vous! :D

Mammouth du PHP | 2278 Messages

14 févr. 2015, 15:23

Il est bien plus simple de lire la doc php: http://php.net/manual/fr/reserved.variables.server.php
et d'utiliser _SERVER['REQUEST_TIME] comme ceci:
<?PHP
$local = $_SERVER['REQUEST_TIME'];
print "$local";
?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 42 Messages

15 févr. 2015, 19:56

Salut sirakawa,
_SERVER['REQUEST_TIME] va retourner l'heure du serveur. Mais ce que souhaite avoir notre ami Couin, c'est de pouvoir faire une comparaison entre l'heure et la date du serveur et l'heure et la date de l'utilisateur (soit de son navigateur).

[javascript]

<script>
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
var timeserver= <?php echo $_SERVER['REQUEST_TIME'] ?>;
var timebrowser=Math.floor(Date.now() / 1000);


</script>

[/javascript]

Avatar du membre
Eléphant du PHP | 224 Messages

16 févr. 2015, 16:22

Bonjour à tous

Merci pour vos réponses.

En fait, quand je clique sur le bouton LOG IN (qui est dnas une partie header) de la page que j'ai fais, cela affiche les champs Nom et Mot de passe, dans une frame.
Etant donné que cette partie de mon site est utilisé sur des tablettes, si la tablette a été totalement déchargée (par exemple, son utilisateur est partie en congés), quand dans les page où on saisi l'heure de mise à quai d'un contenant à décharger, via un bouton qui envoie la date et l'heure dans le c hamp, cela met une date et une heure totalement incohérente.

Ce que je voudrais c'est que si la date et heure de la tablette différent de plus de x secondes, ne s'affichent pas la frame Utilisateur et Mot fde passe, mais "Votre tablette n'est pas à la bonne date et heure, veuillez cotnacter la maintenance".

Alors si effectivement, php ne peut être traité que sur le serveur, il faudrait que j'envoie un champ de type hidden avec la date et l'heure du client, pour que le serveur puisse faire la comparaison.

Le problème c'est que je ne maitrise absolument pas javascript et je ne sais pas comment envoyer la valeur dans le champ hidden, étant donné que ca ne fait qu'envoyer "<script>document.write(local);</script>" au lieu de la date et l'heure obtenue.

Sans non plus me macher le travail (j'aime quand meme comprendre plus que recopier betement), si quelqu'un peut m'aiguiller par une esquisse de code, ca me serait vraiment d'une grande aide :oops:

Merci :)


Edition :

J'ai tested autre chose, en reprenant le script permettant à l'utilisateur de remplir un champ avec la date et l'heure actuelle (de la tablette) en cliquant sur une icone d'horloge.
Je me dis qu'exploitant ce code et en le faisaint s'excacturer au chargement de la page, puis en faisant un submit automatique poru que le serveur puisse récuperer l'info, ca serait une solution.

Soit, voici le code :
  	<script type="text/javascript">
/****************************** 
* Date au dans la langue du navigateur
*  By SpaceFrog © Aout 2010.
*  (Patche le bug de chrome)
******************************/
function TD(n){
//formartage du leading 0
return n.toString().replace(/^(\d)$/,'0$1')
}
function DateLocale(d){
//Les traductions des jours en mois (ici juste fr et en mais on peut completer)
var tabJours={'fr':['', '', '', '', '', '','']
				}
var tabMois={'fr':['01', '02', '03', '04', '05', '06','07','08','09','10','11','12']
				}
//recupération du le langue du navigateur              
var SysLang=(navigator.userLanguage)?navigator.userLanguage:navigator.language;
//par defaut la langue sera en (mais on peut modifier)
switch (SysLang){
 case ('fr'): DateLang='fr'
              break;
 default:		DateLang='fr';
 		}
var Mois=tabMois[DateLang][d.getMonth()]
return d.getFullYear()+"-"+ Mois +"-"+d.getDate()+" "+TD(d.getHours())+":"+TD(d.getMinutes())+":"+TD(d.getSeconds())
}
</script>
</head>
<body onload="document.getElementById('arrivee_r').value = (DateLocale(new Date()))" />
<form name="test" action="test.php" method="POST">
<input type="text" id="arrivee_r" name="arrivee_r" value="">
	<script>
document.test.submit();
</script>
Si je mets le submit en remarque, j'ai bien la date et l'heure qui se mettent totue seule dans le champ au moment du chargement de la page.
Si je réactive le submit, et que le fichier test.php contient le code suivant :
<?php    $local = $_POST["arrivee_r"] ;  
echo 'Date et heure tablette : '.$local;   ?>
J'obtiens alors un résutlat vide :
Date et heure tablette :
Je n'arrive pas à comprendre et je m'en sors pas du tout là :tir2:
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Eléphanteau du PHP | 42 Messages

16 févr. 2015, 18:33

Salut,

Personnellement pour le problème d'affichage de la frame, j'utiliserais :


[javascript]
<script>
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
var timeserver= <?php echo $_SERVER['REQUEST_TIME'] ?>;
var timebrowser=Math.floor(Date.now() / 1000);
var diff= Math.abs(timeserver-timebrowser);
if((diff>x secondes)
{
document.write('message erreur');
}
else
{
document.write( formulaire);
}


</script>
[/javascript]
pour le problème du remplissage de formulaire, commencez déjà à voir si le formulaire se remplit avec la date et l'heure sans faire l'envoie automatique du formulaire avec document.test.submit();

bien à vous #-o

Avatar du membre
Eléphant du PHP | 224 Messages

16 févr. 2015, 22:12

Hello :)

J'aiu testé votre code en remplacant "x secodnes" par 10 par exemple, mais rien n'y fait , pas d'erreur qui s'affiche :( En fait il ne se passe rien du tout.

Pour le formulaire, oui, la valeur se rempli bien dans le champ si je désactive le submit.
D'ailleurs, si je mets un bouton submit, la date et l'heure sont bien envoyées car le test.php l'affiche bien.
En fait, c'est comme si le submit automatique se lancait avant que le chanmps n'ait eu le temps de se remplir.

M'ci :)
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Eléphant du PHP | 224 Messages

17 févr. 2015, 20:53

Plop !!

Bon, je n'ai pas réussi à trovuer pour ce problème là, alors je l'ai contourné.

J'ai utilisé le submit de mon fumulaire de login, pour envoyer la date et l'heure, et c'est la page php qui fait le résultat qui fait le calcul.

Voici le script que j'utilise dans d'autres pages, et dont j'ai midifié pour que ce soit lancé au chargement de la page et non en cliquant sur une icone.
<script type="text/javascript">
/****************************** 
* Date au dans la langue du navigateur
*  By SpaceFrog © Aout 2010.
*  (Patche le bug de chrome)
******************************/
function TD(n){
//formartage du leading 0
return n.toString().replace(/^(\d)$/,'0$1')
}
function DateLocale(d){
//Les traductions des jours en mois (ici juste fr et en mais on peut completer)
var tabJours={'fr':['', '', '', '', '', '','']
				}
var tabMois={'fr':['01', '02', '03', '04', '05', '06','07','08','09','10','11','12']
				}
//recupération du le langue du navigateur              
var SysLang=(navigator.userLanguage)?navigator.userLanguage:navigator.language;
//par defaut la langue sera en (mais on peut modifier)
switch (SysLang){
 case ('fr'): DateLang='fr'
              break;
 default:		DateLang='fr';
 		}
var Mois=tabMois[DateLang][d.getMonth()]
return d.getFullYear()+"-"+ Mois +"-"+d.getDate()+" "+TD(d.getHours())+":"+TD(d.getMinutes())+":"+TD(d.getSeconds())
}
</script>
<body onload="document.getElementById('local').value = (DateLocale(new Date()))" />
et le champ input:
<input type="hidden" id="local" name="local" value="">
Avec cette méthode , la date et heure était écrite dnas un champ hidden au chargement du forumlaire, mais si l'utilisateur met trop de temps à remplir login et mdp avant de valdier, la date et heure remplie automatiquement est donc plus bonne pour la comparaison.

J'ai donc cherché à afficher la date et l'heure en temps réel (donc dynamique quoi) dans un champ input.

J'ai dégotté deux scripts que voici et que j'ai adapté :
	<script type="text/javascript">
/* Renvoie la date courante */
function keljoureton()
{
	/* 'now' contient "Tue Feb 17 2015 19:08:01 GMT+0100" */
	var now = new Date();

	/* On récupère les différents composants de la date */
	var year = now.getFullYear();
	var month = now.getMonth();
	var date = now.getDate();
	var day = now.getDay();

	/* JavaScript renvoie le numéro du jour */
	var jour = new Array(7);
	jour[0] = "Dimanche ";
	jour[1] = "Lundi ";
	jour[2] = "Mardi ";
	jour[3] = "Mercredi ";
	jour[4] = "Jeudi ";
	jour[5] = "Vendredi ";
	jour[6] = "Samedi ";

	/* JavaScript renvoie le numéro du mois */
	var mois = new Array(12);
	mois[0] = "01";
	mois[1] = "02";
	mois[2] = "03";
	mois[3] = "04";
	mois[4] = "05";
	mois[5] = "06";
	mois[6] = "07";
	mois[7] = "08";
	mois[8] = "09";
	mois[9] = "10";
	mois[10] = "11";
	mois[11] = "12";

	/* Composition de la chaîne de caractère */
	document.login.date.value =  year + '-' + mois[month] + '-' + date;
}

/* Gère l'horloge JavaScript */
function lancerHorloge()
{
	var now = new Date();
	var hr = now.getHours();
	var min = now.getMinutes();
	var sec = now.getSeconds();

	/* Ecriture dans le champ affich du formulaire heure */
	document.login.heure.value = (hr<10)? " 0"+hr+":":" "+hr+":";
	document.login.heure.value += (min<10)? "0"+min+":":min+":";
	document.login.heure.value += (sec<10)? "0"+sec:sec;

	/* Rappel dans 1000 millisecondes de la fonction */
	window.setTimeout( "lancerHorloge()", 1000 );
}
</script>
Et dans le form :
	<form name="login" action="login.php" method="post">
	<INPUT TYPE="hidden" NAME="date" VALUE="">
	<SCRIPT TYPE="text/javascript">keljoureton();</SCRIPT>
	<INPUT TYPE="hidden" NAME="heure" VALUE="">
	<SCRIPT TYPE="text/javascript">lancerHorloge();</SCRIPT>
J'ai fais deux champs car je n'ai pas voulu perdre encore du temps pour tout mettre dnas le même champ unique. Pas grave, car on fusionne après au niveau de la page php de résultat, dont voici ce qui nous interesse :
	$date = $_POST['date'];
	$heure = $_POST['heure'];
	$local = $date.' '.$heure;
	$now = date("Y-m-d H:i:s");
	$now = strtotime ($now);
	$local = strtotime($local);
	$offset = $now - $local;
	if ($offset < 0) { $offset = $offset * -1 ; }

    if ($offset > 60)
{
echo ("<center>Problème avec la date et l'heure de cette tablette. Veuillez contactez la maintenance.<br><input type=button class='body' onclick='history.go(-1)' value=Retour /></center> ");
exit();
}	
Voilà, au cas où ça pourrait servir à d'autres.
En tout cas merci pour vos réponses , je marque en résolu .

Le Couin
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Mammouth du PHP | 2278 Messages

18 févr. 2015, 10:22

Tu pourrais essayer d'activer ton javascript non pas au chargement de la page, mais par exemple avec onmouseover ou onfocus sur le bouton envoyer
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Eléphant du PHP | 224 Messages

18 févr. 2015, 13:48

J'aurais effectivement pu essayer cela, je n'y ai pas pensé. Merci pour l'astuce :)
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Eléphanteau du PHP | 42 Messages

19 févr. 2015, 16:22

Heureux que votre problème soit résolu... :wink: