[Réglé] Transmettre le résultat d'un script js à une var. php ?

Transmettre le résultat d'un script js à une var. php ? [Réglé] - PHP - Programmation

Marsh Posté le 25-06-2003 à 02:17:28    

J'ai une question importante pour gérer l'affichage de l'heure dans un contexte de site international.
 
La personne qui visionne un site peut se trouver n'importe ou dans le monde. Comment récupérer son fuseau horaire et l'info de savoir si son PC est en heure d'été ou non, le tout en php ?
 
Il existe des fonction Windows qui donnent ces infos mais comme récupérer ces données en php ?
 
P.S. : je ne veux pas récupérer l'heure du PC, car je me baserai sur des serveurs de temps pour récupérer l'heure GMT ce qui sera beaucoup plus juste que l'heure d'un PC qui peut être complètement à la rue.


Message édité par -ET- le 10-07-2003 à 15:47:36
Reply

Marsh Posté le 25-06-2003 à 02:17:28   

Reply

Marsh Posté le 25-06-2003 à 02:24:04    

php = serveur.

Reply

Marsh Posté le 25-06-2003 à 09:40:51    

Ca veut dire quoi ?
Qu'on ne peut rien récupérer d'autre que des infos sur le serveur ?
 
Et alors comment on fait pour récupérer l'OS du PC, la version du navigateur, etc.
Il y a bien des moyens de récupérer des infos sur le PC quand même, non ?

Reply

Marsh Posté le 25-06-2003 à 09:41:44    

Javascript...

Reply

Marsh Posté le 25-06-2003 à 10:50:01    

Et alors en Javascript quelqu'un a une idée de comment faire ?

Reply

Marsh Posté le 26-06-2003 à 12:17:32    

up :)

Reply

Marsh Posté le 26-06-2003 à 12:49:53    

Récupération du décalage par rapport à l'heure GMT en minutes :
Exemple de index.html

<HTML>
<HEAD></HEAD>
<BODY>
<FORM action="main.php" method="post" id="myForm">
<input type="hidden" name="time_offset" id="time_offset">
<input type="submit" value="Entrée">
</FORM>
<SCRIPT>
myDate = new Date();
myForm.time_offset.value = myDate.getTimezoneOffset();
</SCRIPT>
</BODY>
</HTML>


 
Dans main.php, tu récupère donc le décalage en minutes dans $_POST['time_offset']


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-06-2003 à 14:11:55    

Merci de ta réponse, mais juste une question : t'es sûr que la date/heure que tu récupères n'est pas celle du serveur ? :)

Reply

Marsh Posté le 26-06-2003 à 14:13:25    

-ET- a écrit :

Merci de ta réponse, mais juste une question : t'es sûr que la date/heure que tu récupères n'est pas celle du serveur ? :)  

Ben c'est du Javascript, donc CLIENT.

Reply

Marsh Posté le 27-06-2003 à 11:11:01    

-ET- a écrit :

Merci de ta réponse, mais juste une question : t'es sûr que la date/heure que tu récupères n'est pas celle du serveur ? :)  


Oui :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 27-06-2003 à 11:11:01   

Reply

Marsh Posté le 01-07-2003 à 02:44:07    

Mara's dad a écrit :

Récupération du décalage par rapport à l'heure GMT en minutes :
Exemple de index.html

<HTML>
<HEAD></HEAD>
<BODY>
<FORM action="main.php" method="post" id="myForm">
<input type="hidden" name="time_offset" id="time_offset">
<input type="submit" value="Entrée">
</FORM>
<SCRIPT>
myDate = new Date();
myForm.time_offset.value = myDate.getTimezoneOffset();
</SCRIPT>
</BODY>
</HTML>


 
Dans main.php, tu récupère donc le décalage en minutes dans $_POST['time_offset']


Merci de ton aide mais j'ai fait des essais et j'ai pas tout compris sur comment utiliser tes infos :(  
 
Alors... (parce un vrai newbie en html/php/js), concètement, comment j'implémente du JS dans du php ?
 
J'ai fichier .php (en fait un fichier du forum phpBB) qui regroupe des fonctions. Au sein de ce fichier on trouve la fonction create_date qui se charge créer les dates formatées pour qui n'en veut.
 
Le code est le suivant :

// Start - Daylight Saving Time MOD
switch ( $userdata['user_dst_mode'] )  
{  
 case 0:
  return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz));  
  break;
 case 1:
  $dst_sec = $userdata['user_dst_time_lag'] * 60;  
  return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz) + $dst_sec), $translate) : @gmdate($format, $gmepoch + (3600 * $tz) + $dst_sec);
  break;
 case 2:
  $dst_sec = date('I', $gmepoch) * $userdata['user_dst_time_lag'] * 60;  
  return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz) + $dst_sec), $translate) : @gmdate($format, $gmepoch + (3600 * $tz) + $dst_sec);
  break;
 case 3:
  // dév à suivre...
  break;
}  
// End - Daylight Saving Time MOD
 
}


Concrêtement le cas n°0 ne prend pas en compte l'heure d'été pour créer les dates, le cas n°1 les gère manuellement, le cas n°2 interroge le serveur pour savoir s'il est en heure d'été ou non, et enfin le cas n°3 est celui qui nous interresse où on devrait interroger le PC pour savoir si on est en heure d'été ou non.
 
Apparement (si j'ai bien compris), avec du php on peut pas le faire, mais avec du JS on peut interroger le PC mais on ne dispose que de cette fonction getTimezoneOffset.
 
Donc question : maintenant concrêtement comment on implémente du JS dans du php pour écrire mon cas n°3 ?
Je trouverai la formule de calcul, mais je ne sais pas comment utiliser du JS au milieu du code php  :(  
 
Merci de votre aide :)


Message édité par -ET- le 02-07-2003 à 16:11:01
Reply

Marsh Posté le 01-07-2003 à 15:18:34    

Si je veux juste afficher la valeur ça marche pas :(  

<?php
 
print("<SCRIPT>
DatePC = new Date();
TimeZoneOffset.value = DatePC.getTimezoneOffset();
</SCRIPT>" );
 
echo ( $_POST['TimeZoneOffset'] );
 
?>


Si j'arrive juste à faire ça, ensuite je me débrouille sans pb :)

Reply

Marsh Posté le 02-07-2003 à 01:44:10    

J'ai simplifié le problème et changer le titre du sujet pour avancer (l'ancien sujet est plus bas dans ce post).
 
La question est simple : j'ai besoin de récupérer le résultat de la fonction getTimezoneOffset() (Java Script) dans une variable php.
 
Le script est simple lui aussi (merci Mara's dad !) :  

<SCRIPT>  
DatePC = new Date();  
TimeZoneOffsetPC.value = DatePC.getTimezoneOffset();  
</SCRIPT>  


 
Maintenant il me faut tout simplement intégrer ce script dans un fichier .php et pouvoir utiliser le contenu de cette variable JS dans le code php du fichier :sarcastic:  
 
Donc, imaginons le code de mon fichier .php :
 

<?php
 
$VariablePHP =  
 
...suite du code avec l'utilisation de la variable PHP...
 
?>


 
Où et comment placer le script dans le fichier, et transmettre la valeur de TimeZoneOffsetPC à $VariablePHP ?
 
Apparement il y a un pb de séquençage pour que le code js soit exécuté avant le php. Donc on peut le mettre avant le <?php ?
 
Merci d'avance de votre aide :jap:

Reply

Marsh Posté le 02-07-2003 à 09:38:08    

Bon, on est d'accord, le code Javascript doit s'exécuter AVANT le code PHP et en plus il doit lui envoyer le résultat.
 
Il faut donc 2 pages (ou une seule qui se charge 2 fois!)
 
Exemple avec une seule page index.php :
 

<?php
 
if( ! isset( $_POST['time_offset'] ) )
{
 // On n'a pas reçu le décalage, donc on le demande...
 ?>
 <HTML>
 <HEAD>
 <SCRIPT>
 function sendTimeZoneOffset()
 {
     myDate = new Date();
     myForm.time_offset.value = myDate.getTimezoneOffset();
     myForm.submit();
 }
 </SCRIPT>
 </HEAD>
 <BODY onload="sendTimeZoneOffset();">
 <FORM action="index.php" method="post" id="myForm">
 <input type="hidden" name="time_offset" id="time_offset">
 </FORM>
 </BODY>
 </HTML>
 <?php
 // Fin du formulaire de demande du décalage.
 exit;
}
 
// Traitement si on a le décalage
    echo( "Le décalage est de {$_POST['time_offset']} minutes !" );
 
// Ton code ici ...
 
?>


 
Ce code à été testé et approuvé par moi sur mon serveur :D  
Il fonctionne tel-quel.
Essaye le ;)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-07-2003 à 11:00:32    

Mara's dad a écrit :

Ce code à été testé et approuvé par moi sur mon serveur :D  
Il fonctionne tel-quel.


Yesssssssss ! Ton code marche nickel :)  
J'ai pu vérifier grace à lui que cette fonction donne bien le décalage complet (y compris heure d'été), et non pas simplement le décallage dû au Timezone (fuseau horaire).
 
Maintenant reste à le mettre en oeuvre dans mon contexte précis.
 
Je t'explique : en fait je suis en train de terminer un MOD (une modification) pour le forum phpBB 2.0.x qui permette de gèrer l'heure d'été.  
Mon MOD permet donc d'utiliser plusieurs méthodes de gestion de cette heure d'été +/- automatiques qui sont toutes terminées sauf une : la syncronisation du décallage de temps par le PC en local.  
Cette méthode à de très nombreux avantages car autant les serveurs donnent souvent une heure GMT/UTC assez juste, autant il est impossible de se baser sur eux pour obtenir automaniquement (sans paramétrages manuels) l'heure local du lieu de consultation (le serveur peut être à Tokyo sans heure d'été et je consulte à Paris en heure d'été).  
D'où cette syncronisation de l'heure GMT/UTC prise en php sur le serveur avec le seul décalage utilisé en local par le PC de consultation.  
 
Donc le contexte : il existe une fonction phpBB placée dans un fichier functions.php qui formate toutes les dates. Cette fonction est appelée 38 fois par différentes pages php du forum, dont la page d'index.
 
Du coup, comment faire car cette exemple est valable pour un fichier php qui serait le même que celui utilisant la valeur trouvée. Or en fait les fichiers type index.php appellent functions.php dans lequel la fonctions formate la date et leur renvoi. C'est donc functions.php qui utilise cette valeur, mais ce n'est pas un fichier qui génère de l'affichage HTML.
 
On peut s'arranger quand même ?
 
P.S. : je pense que tu comprends mieux pourquoi je cherchais toutes les solutions pour appeler une fonction qui me donne ce décallage directement depuis le code php car je suis quasi obligé de placer cette modif 1x dans le fichier de fonctions pour ne pas modifier les 38 appels un peu partout dans les pages à afficher :cry:


Message édité par -ET- le 02-07-2003 à 11:12:13
Reply

Marsh Posté le 02-07-2003 à 14:47:22    

Je ne connais pas la structure de PHPBB, mais le principe est le suivant.
 
Il n'est pas question de récupérer le décalage à chaque requête HTTP. On le récupère à la première connexion de l'utilisateur.
 
Pour çà, il faut identifier les pages PHP que l'utilisateur est succeptible de demander. Par exemple sur le forum HFR, je peux avoir des bookmark sur pas mal de pages :
forum.php3
forum1.php3
forum2.php3
profilebdd.php3
...
 
Il faut donc, soit modifier toutes ces pages, soit mettre en place une page unique d'entrée qui sert d'aiguillage pour toutes les autres.
 
Il faut aussi se débrouiller pour ne pas avoir à redemander le décalage. Il faut donc soit le conserver en session, soit l'ajouter systématiquement à toutes les urls ou à tous les formulaires, soit le mettre dans un cookie.
 
La solution la plus simple s'il n'y a pas de session, c'est le cookie. Un cookie sans date d'expiration genre cookie de session.
 
La ou les pages php capable(s) de demander un décalage doivent donc tester s'il y a un cookie, sinon tester le champs de formulaire, enfin demander envoyer le formulaire.
 
En parlant de cookie, je vient de penser que les cookies peuvent aussi être positionnés en Javascript. Une solution simple serait de se passer du formulaire.
 
Chaque page php commence par un include genre head.php qui contiendrait un truc du genre :
 


<html...>
<head>
<script>
myDate = new Date();  
document.cookie = "time_offset=" + myDate.getTimezoneOffset();
</script>


 
Le </head> est à la charge des scripts PHP. Ils peuvent très bien avoir envie d'y mettre autre chose...
 
Comme çà dans ton script de gestion de l'heure, tu utilise directement $_COOKIE['time_offset']
 
Bon, ben là, je crois que j'ai tout dit.
A toi de choisir la solution qui te semble la plus adaptée à PHPBB.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-07-2003 à 15:37:47    

Tout d'abord un grand merci pour ton aide ultra précieuse ! :jap:  
J'ai posé cette question sur plusieurs forums et il n'y a qu'ici qu'actuellement ça avance, alors merci :)  
 

Mara's dad a écrit :

Je ne connais pas la structure de PHPBB, mais le principe est le suivant.
 
Il n'est pas question de récupérer le décalage à chaque requête HTTP. On le récupère à la première connexion de l'utilisateur.
 
Pour çà, il faut identifier les pages PHP que l'utilisateur est succeptible de demander. Par exemple sur le forum HFR, je peux avoir des bookmark sur pas mal de pages :
forum.php3
forum1.php3
forum2.php3
profilebdd.php3
...
 
Il faut donc, soit modifier toutes ces pages, soit mettre en place une page unique d'entrée qui sert d'aiguillage pour toutes les autres.
 
Il faut aussi se débrouiller pour ne pas avoir à redemander le décalage. Il faut donc soit le conserver en session, soit l'ajouter systématiquement à toutes les urls ou à tous les formulaires, soit le mettre dans un cookie.


Sur le principe on est d'accord. Quand c'est une fonction php ça reste sur le serveur, ça va plus vite mais là si on peut éviter le script js à chaque interrogation de la fonction c'est pas plus mal (surtout si ça doit générer des rafraichissement de page).
Donc on stock.
 
Sur phpBB il y a bien un système de cession mais 2 possibilités : soit on est connecté et on pourra stocker l'info dans la BD sur le profil, soit un ne l'ai pas et il ne reste qu'un cookie (tu m'arrêtes si je me trompe).
 
Enfin, les fichiers php regroupent en fait le code de gestion des pages mais tous utilisent ensuite des fichiers templates qui contiennent les tableaux/styles HTML pour l'affichage.
Dans ce contexte (enfin un truc simple), toutes les pages bookmarkables utilisent le template overall_header.tpl qui contient donc en un endroit unique le <head> </head> de toutes les pages générées.
 
Ensuite ça se corse...

Mara's dad a écrit :

La solution la plus simple s'il n'y a pas de session, c'est le cookie. Un cookie sans date d'expiration genre cookie de session.
 
La ou les pages php capable(s) de demander un décalage doivent donc tester s'il y a un cookie, sinon tester le champs de formulaire, enfin demander envoyer le formulaire.


- Qu'entends tu par cession comme alternative aux cookie ? Un stockage en BD, en mémoire ou autre chose ?
 
- Si on part sur les cookie car on aura pas toujours accès à une BD (visiteur anonymes non connectés), phpBB gère déjà un cookie, on va utiliser le même ou un autre ?
 

Mara's dad a écrit :

En parlant de cookie, je vient de penser que les cookies peuvent aussi être positionnés en Javascript. Une solution simple serait de se passer du formulaire.
 
Chaque page php commence par un include genre head.php qui contiendrait un truc du genre :
 


<html...>
<head>
<script>
myDate = new Date();  
document.cookie = "time_offset=" + myDate.getTimezoneOffset();
</script>


 
Le </head> est à la charge des scripts PHP. Ils peuvent très bien avoir envie d'y mettre autre chose...
 
Comme çà dans ton script de gestion de l'heure, tu utilise directement $_COOKIE['time_offset']


- "les cookies peuvent aussi être positionnés en Javascript" ?
Ca veut dire que tu peut aussi l'adresser directement depuis le script js ?
 
- "Le </head> est à la charge des scripts PHP". Pas sur phpBB. Il est dans le fichier overall_header.tpl comme le <head>
 
- Donc pour résumer, je n'aurai qu'à mettre  


<script>
myDate = new Date();  
document.cookie = "time_offset=" + myDate.getTimezoneOffset();
</script>


Dans mon head du fichier overall_header.tpl, à utiliser $_COOKIE['time_offset'] dans la fonction et on oublie le formulaire, le rafraichissement et les tests de présence de la valeur ?
 
Je suis pas sûr d'avoir tout compris mais je vais faire un essai... :(


Message édité par -ET- le 02-07-2003 à 15:41:46
Reply

Marsh Posté le 02-07-2003 à 15:46:18    

Tain alors toi t'es trop fort !!!!!!!!!!!!!! :ouch:  
Ca marche !!!!!!!!!!!! :bounce:  :pt1cable:  :D
 
Je vais te coller en remerciement dans le MOD parce que là tu m'as filé un sacré coup de main :jap:  
 
Merci BEAUCOUP !
Je te tiens au courant... dès que j'ai tout finalisé ;)  
 
A+ :hello:


Message édité par -ET- le 02-07-2003 à 15:47:36
Reply

Marsh Posté le 02-07-2003 à 19:45:30    

C'est bon, j'ai finalisé mon MOD que du coup j'ai passé en RC1 ici...
http://www.phpbb.com/phpBB/viewtopic.php?t=115692
 
J'ai aussi collé dans l'en-tête complète...

##################################################################  
## Title:              Daylight Saving Time management
## Author:             -=ET=- < bobemail@ifrance.com >
## Version:            0.2.0
## Compatibility:      2.0.5 (prior release not tested)
##
## Description:        This MOD will allow each users to manage
##                     Daylight Saving Time. They will be able to:
##                     - set the DST time lag of their country
##                     - enable/disable manualy DTS
##                     - let the host server enable/disable DST
##                     - let their PC manage their local time lag
##                       (time zone + DST)
##
## Installation Level: Easy
## Installation Time:  10 Minutes  
## Files To Edit:      7
##      admin/admin_users.php
##      includes/functions.php
##      includes/usercp_avatar.php  
##      includes/usercp_register.php
##      templates/subsilver/overall_header.tpl
##      templates/subsilver/profile_add_body.tpl
##      templates/subsilver/admin/user_edit_body.tpl
##
## Included Files:     3
##      dst_db_update.php
##      language/lang_english/lang_dst.php  
##      language/lang_french/lang_dst.php
##
## History:
##      0.2.0 - Release candicate 1
##          Add DST time lag validity control
##          Add PC synchro mode
##
##      0.1.0 - Initial beta release
##          No DST time lag validity control
##          No PC synchro mode
##
##################################################################  
## For Security Purposes, Please Check: http://www.phpbb-fr.org
## for the latest version of this MOD. Downloading this MOD from
## other sites could cause malicious code to enter into your phpBB
## Forum.
##################################################################  
## Authors Notes:  
##  
## If you have errors or any problem with the dst_db_update.php
## file, you can apply manualy this SQL queries...
##
## ALTER TABLE users ADD user_dst_mode TINYINT not null DEFAULT "0"
## ALTER TABLE users ADD user_dst_time_lag TINYINT not null DEFAULT "0"
##  
##################################################################  
## Special thanks:  
##
## A very big thank you to Mara's dad for its advices in javascript!
## He prevents me from becoming crazy with the PC synchro mode! lol ;-)
##  
##################################################################  
## Before Adding This MOD To Your Forum, You Should Back Up All
## Files Related To This MOD  
##################################################################


Voilà :D  
 
Quesques précisions : ça ne marche qu'avec les users enregistrées car les non enregistrés n'utilisent pas de cookie. Par ailleurs, est-ce que je risque pas d'avoir des pb avec les invalidations des javascripts ? Je supposes que ces fonctions date/time ne doivent pas être les plus visées mais bon... :sarcastic:  
 
A+


Message édité par -ET- le 03-07-2003 à 01:26:48
Reply

Marsh Posté le 03-07-2003 à 15:58:45    

Arf... c'était trop beau...Mara's dad ou les autres je vais encore avoir besoin de vous svp ! :(  
 
La solution de Mara's dad par les cookie marche nickel mais donc nécessite un cookie. Or sur phpBB on peut avoir un compte et être connecté même sans autoriser les cookies.
 
Du coup, il faudrait basculer sur une autre voie pour faire sauter cette limitation.
Il reste :
- les infos de sessions stockées dans la BD (table phpbb_sessions, champ session_time_offset à créer)
- un formulaire avec un champ caché
- les url, mais cette dernière solution ne me plait pas.
 
Ce qu'il faut modifier est ce code JavaScript qui est actuellement <head></head> du fichier overall_header.tpl qui contient la première partie du code HTML de toutes les pages bookmarquables générées par le forum :

<script>  
myDate = new Date();  
document.cookie = "time_offset=" + myDate.getTimezoneOffset();  
</script>


 
Alors, pour avancer...
Une personne sur http://forum.2037.biz m'a proposé une manière de faire exécuter le code JS depuis le code php mais je ne suis pas convaincu. A mon avis il oublie des trucs, vous en pensez quoi ?

<?  
if (empty($mavariable))  
{  
echo "<SCRIPT LANGUAGE=\"javascript\">";  
echo "DatePC = new Date();";  
echo "TimeZoneOffsetPC = DatePC.getTimezoneOffset();";  
echo "</SCRIPT>";
}  
?>


http://forum.2037.biz/viewtopic.ph [...] c&start=30
 
Si ce type d'envoi de code JS par du php marche il doit quand même bien falloir une méthode pour récupérer la valeur obtenue ; peut être créer avant un <input type="hidden" name="TimeZoneOffsetPC" id="TimeZoneOffsetPC">, adresser correctement ce champ dans la seconde ligne du code JS et récupérer la valeur par $mavariable = $_POST['TimeZoneOffsetPC'] en php ?
 
Par contre, si ça ne doit pas être suffisant et nécessiter l'utilisation d'un formulaire <form>, il faudrait faire attention à éviter (ou solutionner) le pb de la désignation nominative du fichier .php car la fonction qui contiendra le code (ou le template overall_header lui même) servent tous les 2 la génération de toutes les pages php, qui ont toutes un nom différent évidement (c'est tout l'intérêt de ne faire la modif qu'à un seul endroit pour les 38 accès à cette fonction quelque soit la page qui la demande) :sarcastic:
 
Côté stockage dans la base de données sessions maintenant.
Ptirhiik m'as aussi donné des infos ici, mais c'est insufisant...
http://forums.phpbb-fr.org/viewtopic.php?t=17107
 
Je sais pas comment coder en JS l'envoi dans la BD (à condition que l'idée même de mettre le code dans ce fichier session.php soit valide :sarcastic:
 
Help please ! :jap:


Message édité par -ET- le 03-07-2003 à 16:04:31
Reply

Marsh Posté le 03-07-2003 à 16:13:43    

-ET- a écrit :


Quesques précisions : ça ne marche qu'avec les users enregistrées car les non enregistrés n'utilisent pas de cookie. Par ailleurs, est-ce que je risque pas d'avoir des pb avec les invalidations des javascripts ? Je supposes que ces fonctions date/time ne doivent pas être les plus visées mais bon... :sarcastic:  
A+


 
Bon, pour le code javascript des cookies et des dates, c'est assez standard, donc y'a peu de chance que çà change.
 
Je viens d'essayer avec MON IE6.0 et je n'arrive pas à désactiver les cookies "De session". Mais c'est en effet possible avec mozilla par exemple.
 
Précision à propos de Cookie de session.
 
Du point de vue du navigateur, il y a 2 sortes de cookies.
1- Ceux qui persistent après fermeture du navigateur. Ceux là sont enregistrés sur disque.
2- Ceux dont la durée de vie est limitée à celle de la fenêtre du navigateur. Ils ne sont pas enregistrés sur disque.
 
Les premiers sont utilisée pour stocker des informations qui permettent par exemple à un site de reconnaitre le visiteur automatiquement à chaque visite. C'est le cas du forum HFR où deux cookies au moins sont stokées sur le client : Le user et le mot de passe.
 
Les 2éme sont utiliser pour suivre un utilisateur de page en page lors d'une session de navigation. A la connexion, le site envoie un Identifiant de session dans un cookie 'éphémère'. Cet ID est utilisé par le site pour stocker des infos sur la navigation du client, un caddie par exemple. Quand on parle de cookie de session, en fait çà veux dire cookie à durée de vie limitée à la session, mais comme généralement ce genre de cookie n'est utilisé que pour l'ID de session ( ce n'est pas la peine d'avoir d'autres cookie, vu que l'ID est la clef qui permet de récupérer toutes les infos que le serveur stocke le temps de la navigation ) l'appelation cookie de session à tendance à ce restreindre à ce seule ID. Mais bien sûr, rien interdit d'en avoir d'autres, et comme on l'a vu, même sans gestion de session par un site, un cookie de session peut être utile pour connaitre l'heure du client, la résolution de son écran,..., bref tout ce que javascript est capable de lire.
 

Citation :

Or sur phpBB on peut avoir un compte et être connecté même sans autoriser les cookies
Par contre, il y a bien des infos de sessions qui sont stockées dans la base MySQL dans une table session (mais peut-on écrire dans la BD depuis le script JS dans le <head> ?), sinon il reste la solution des url, ou en repasser par un formulaire maintenant qu'on sait qu'on peut utiliser overall_header.tpl pour toutes les pages php


 
"Peut-on écrire dans la BD depuis le script JS dans le <head> ?" NON bien sûr, pas directement en tout cas. Là, il faut obligatoirement passer par l'url ou par un formulaire.
 

Citation :

Je sais pas comment coder en JS l'envoi dans la BD (à condition que l'idée même de mettre le code dans ce fichier session.php soit valide


 
Je ne sais pas comment fonctionnent les sessions avec PHPBB.
Soit il utilise le fonctionnement standard de PHP, soit c'est un truc perso...
Si c'est du standard PHP, (même en utilisant la BD pour stocker les infos de session) il est très simple de mettre une variable en session. En PHP 4.1x, utilise la variable $_SESSION['time_zone']. Dès que tu écris dedans, cette variable devient accessible à tous les scripts PHP de la session de l'utilisateur.
Si, c'est pas du standard, ben, je peux rien dire. Faut regarder le code PHPBB ! Ce que je ne ferais pas. Désolé, mais je n'ai pas le temps pour çà ;)
 
Mais pour moi, la solution des cookies est la meilleure.
Il n'y a aucun intéres pour un utilisateur de désactiver les cookies de session ! Point de vue sécurité, si çà passe pas par cookie, çà passe par l'URL ou par POST. C'est pareil !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 03-07-2003 à 17:00:19    

Merci sincèrement une fois de plus de m'aider :jap:  
 
Mais j'ai peur que ces dernières infos ne soient pas suffisante pour règler le pb :cry:  
 
Alors... je vais essayer de te simplifier les réponses :
 
Sur la première partie...
1/ Avec le code JS actuel, on est d'accord que la seconde ligne du code JS envoi l'info dans un cookie de session (non enregistré sur le disque) ?
 
2/ On est aussi d'accord que même ces cookies de session peuvent être désactivés, au moins sur certains navigateurs ?
 
3/ Enfin on est aussi d'accord que ces cookies de session sont créés par phpBB quand il y a session, pas par le script JS, et qu'on vient juste le mettre à jour s'il existe ?
 
4/ Pour ce qui est de JavaScript, on est aussi d'accord qu'on peut le désactiver TOTALEMENT, donc y compris les fonctions date/time ?
Il faut donc qu'un minimum de JS soit activé pour que cette manip fonctionne ?
 
Pour ce qui est de l'écriture dans la BD maintenant...
5/ Tu n'as pas été très clair sur la possibilité via le code JS d'envoyer la donnée directement dans la BD (comme on le fait avec le cookie).
Q : C'est totalement impossible quelque soit l'emplacement du code JS (dans le <head> ou dans un fichier php), où suivant cet emplacement ça peut être possible ?
Car Ptirhiik me propose de déplacer ce code dans le fichier sessions.php, ça changerait quelque chose ou non ?
http://forums.phpbb-fr.org/viewtopic.php?t=17107
 
6/ Enfin, du coup on a pas parlé du fond du pb, comment récupérer la valeur de DatePC.getTimezoneOffset() puisque qu'on va essayer d'éviter les cookie et que tu me confirmes qu'il faut donc passer par un formulaire ou l'url (mais l'url ça me dit rien car mettre une date dedans va géner les bookmarks).
 
Donc on revient à ce script qu'il faut adapter si j'ai bien compris ?

<?php
 
if( ! isset( $_POST['time_offset'] ) )
{
 // On n'a pas reçu le décalage, donc on le demande...
 ?>
 <HTML>
 <HEAD>
 <SCRIPT>
 function sendTimeZoneOffset()
 {
     myDate = new Date();
     myForm.time_offset.value = myDate.getTimezoneOffset();
     myForm.submit();
 }
 </SCRIPT>
 </HEAD>
 <BODY onload="sendTimeZoneOffset();">
 <FORM action="index.php" method="post" id="myForm">
 <input type="hidden" name="time_offset" id="time_offset">
 </FORM>
 </BODY>
 </HTML>
 <?php
 // Fin du formulaire de demande du décalage.
 exit;
}
 
// Traitement si on a le décalage
    echo( "Le décalage est de {$_POST['time_offset']} minutes !" );
 
// Ton code ici ...
 
?>


Dans ce cas, on a toujours ce pb de nom de la page php fixée en dur et qui empêche de l'utiliser avec toutes les solutions ne nécessitant qu'une seule modif au lieu d'une par page : overall_header.tpl, sessions.php ou functions.php :(  
Bref je sais toujours pas comment faire concrêtement :sweat:  
 
7/ Enfin tu penses quoi de cette idée ?
http://forum.2037.biz/viewtopic.ph [...] c&start=30


Message édité par -ET- le 03-07-2003 à 17:04:07
Reply

Marsh Posté le 03-07-2003 à 19:18:07    

-ET- a écrit :

1/ Avec le code JS actuel, on est d'accord que la seconde ligne du code JS envoi l'info dans un cookie de session (non enregistré sur le disque) ?


 
Oui session !
Oui pas sur disque !
Mais on peut aussi le faire en une seule ligne ;) :  

<SCRIPT>document.cookie = "time_offset=" + new Date().getTimezoneOffset();</SCRIPT>


 

-ET- a écrit :

2/ On est aussi d'accord que même ces cookies de session peuvent être désactivés, au moins sur certains navigateurs ?


 
Oui, c'est possible, même si celà ne sert à rien !
 

-ET- a écrit :

3/ Enfin on est aussi d'accord que ces cookies de session sont créés par phpBB quand il y a session, pas par le script JS, et qu'on vient juste le mettre à jour s'il existe ?


 
NON, NON, NON !
Le cookie "time_offset" est créé par JavasCript !
Pour que le cookie soit créé par PHPBB, il faudrait quelque-part dans le code PHP, un truc du genre setcookie( "time_offset", ...)
 

-ET- a écrit :

4/ Pour ce qui est de JavaScript, on est aussi d'accord qu'on peut le désactiver TOTALEMENT, donc y compris les fonctions date/time ?
Il faut donc qu'un minimum de JS soit activé pour que cette manip fonctionne ?


 
Heu.... Oui !
 

-ET- a écrit :

Pour ce qui est de l'écriture dans la BD maintenant...
5/ Tu n'as pas été très clair sur la possibilité via le code JS d'envoyer la donnée directement dans la BD (comme on le fait avec le cookie).
Q : C'est totalement impossible quelque soit l'emplacement du code JS (dans le <head> ou dans un fichier php), où suivant cet emplacement ça peut être possible ?
Car Ptirhiik me propose de déplacer ce code dans le fichier sessions.php, ça changerait quelque chose ou non ?
http://forums.phpbb-fr.org/viewtopic.php?t=17107


 
Je ne suis pas allé voir http://forums.phpbb-fr.org/viewtopic.php?t=17107 !
Mais il faut parler clairement :
Dire "la possibilité via le code JS d'envoyer la donnée directement dans la BD (comme on le fait avec le cookie)" est une hérésie ! :o
Soit c'est un raccourci malencontreux, soit tu ne comprends rien au fonctionnement HTTP,JS, PHP, Client, Serveur...
 
Pour être clair :
 
- L'info dont on parle, c'est "time_offset" !
- Cette info est disponible sur le Client. Le Serveur ne la connait pas, et pourtant c'est là qu'on en a besoin.
- Cette info ne peut être récupérée automatiquement QUE PAR JAVASCRIPT.
  Les seules autres solutions sont :
  La demander à l'utilisateur. Pourquoi pas ? S'il désactive les cookies et javascript y'a qu'à le faire bosser un peu !
  Utiliser l'adresse IP de l'utilisateur pour essayer d'en déduire sa zone géographique. Mais bien sûr pour les paranos qui désactivent JS et les cookies, ben on peut être sûr qu'ils passent par des anonymiseurs. . . ;)
 
- Une navigation type avec cookie et javascript actifs se passe comme çà (Sans gestion de session coté serveur):
1- Le client envoie une requête HTTP au serveur. Cette requête est généralement un simple GET + URL.
2- Le serveur reçois la requêtte HTTP. Tout ce qu'il sait du client à ce moment là, c'est l'adresse IP et le port où il doit envoyer la réponse. A ce moment là, il n'a pas l'info "time_offset" ! Une fois cette réponse envoyée, le serveur ne connait plus le client !
3- Le client reçois une page HTML. Cette page contient un bout de script qui lui demande de générer un cookie "time_offset". Le client prépare le cookie, mais il ne l'envoie pas. Il le garde en mémoire avec une référence au serveur qui lui à fournis la page.
4- L'utilisateur clique sur un lien ou sur un boutton de formulaire (ou bien c'est Javascript qui le fait, comme dans la première solution que je t'avais proposé : "myForm.submit();" ).
5- Le client envoie une requête HTTP au serveur. Mais comme il à un cookie pour ce serveur, il l'envoie dans la requête.
6- Le serveur reçois la requêtte HTTP. Cette requête contient l'info "time_offset" dans un cookie, il peut donc l'utiliser. Il prépare la réponse, et l'envoie au client.
7- Retour à l'étape 3
8- L'utilisateur ferme son navigateur, le cookie qui était conservé en mémoire est perdu.
Note : Le cookie reste en mémoire tant que le navigateur reste ouvert, même si l'utilisateur va visiter un autre site. Le cookie est associé au serveur (celui qui lui avait envoyé la page ayant servi à le créer), il ne sera pas envoyé à un autre serveur.
 
Donc, pour qu'une donnée générée par JS soit enregistrée en BD, il faut :
- Que cette donnée soit mise par JS dans un cookie, dans l'url, dans un champs de formulaire.
- Le serveur recoit l'info à la requête suivante. c'est un script PHP qui la récupère et qui la met en BD.
 

-ET- a écrit :

6/ Enfin, du coup on a pas parlé du fond du pb, comment récupérer la valeur de DatePC.getTimezoneOffset() puisque qu'on va essayer d'éviter les cookie et que tu me confirmes qu'il faut donc passer par un formulaire ou l'url (mais l'url ça me dit rien car mettre une date dedans va géner les bookmarks).
 
Donc on revient à ce script qu'il faut adapter si j'ai bien compris ?

<?php
 
if( ! isset( $_POST['time_offset'] ) )
{
 // On n'a pas reçu le décalage, donc on le demande...
 ?>
 <HTML>
 <HEAD>
 <SCRIPT>
 function sendTimeZoneOffset()
 {
     myDate = new Date();
     myForm.time_offset.value = myDate.getTimezoneOffset();
     myForm.submit();
 }
 </SCRIPT>
 </HEAD>
 <BODY onload="sendTimeZoneOffset();">
 <FORM action="index.php" method="post" id="myForm">
 <input type="hidden" name="time_offset" id="time_offset">
 </FORM>
 </BODY>
 </HTML>
 <?php
 // Fin du formulaire de demande du décalage.
 exit;
}
 
// Traitement si on a le décalage
    echo( "Le décalage est de {$_POST['time_offset']} minutes !" );
 
// Ton code ici ...
 
?>


Dans ce cas, on a toujours ce pb de nom de la page php fixée en dur et qui empêche de l'utiliser avec toutes les solutions ne nécessitant qu'une seule modif au lieu d'une par page : overall_header.tpl, sessions.php ou functions.php :(  
Bref je sais toujours pas comment faire concrêtement :sweat:  
 
7/ Enfin tu penses quoi de cette idée ?
http://forum.2037.biz/viewtopic.ph [...] c&start=30


 
Ben c'est l'adaptation à PHPBB de ce que je proposais au début.
 
Tu as une page standard qui génère le <head></head>. C'est donc de çà qu'il faut se servir (si tu n'aime pas la solution cookie).
 
Dans ton script qui génère <HEAD>
 

<?php  
if( ! isset( $_GET['NoScript'] ) )
{
 if( ! isset( $_POST['time_offset'] ) )  
 {  
  // On n'a pas reçu le décalage, donc on le demande...  
  ?>  
  <HTML>  
  <HEAD>  
  <SCRIPT>  
  <!--
  function sendTimeZoneOffset()  
  {  
   myDate = new Date();  
   myForm.time_offset.value = myDate.getTimezoneOffset();  
   myForm.submit();  
  }  
  -->
  </SCRIPT>  
  <NOSCRIPT>
  <META HTTP-EQUIV=Refresh CONTENT="1; URL=<?php
  // Ici, on met l'URL qu'avait demandé l'utilisateur au début :
  echo( $_SERVER['REQUEST_URI'] . "?NoScript" );
  ?>">
  </NOSCRIPT>
  </HEAD>  
  <BODY onload="sendTimeZoneOffset();">  
  <FORM action="<?php
  // Ici, on met l'URL qu'avait demandé l'utilisateur au début :
  echo( $_SERVER['REQUEST_URI'] );
  ?>" method="post" id="myForm">  
  <input type="hidden" name="time_offset" id="time_offset">  
  </FORM>  
  </BODY>  
  </HTML>  
  <?php  
  // Fin du formulaire de demande du décalage.  
  // Le formulaire sera automatiquement renvoyé à la même URL que celle qu'avait demandé l'utilisateur.
 exit;  
 }  
 else
 {
  $time_offset = $_POST['time_offset'];
 }
}
else
{
 $time_offset = 0;
}
 
echo( "\$time_offset = $time_offset<br>\n" );
 
// Traitement Normal, le décalage est dans $time_offset.
// S'il n'a pas été possible de récupérer le décallage, $time_offset vaut 0.  
//
// Ton code ici ...  
// Par exemple la génération du <head></head> normal
?>


J'espère que tu comprends ce que çà fait !


Message édité par Mara's dad le 03-07-2003 à 19:19:24

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 04-07-2003 à 00:13:36    

Pour les 1, 2 & 4 oki, j'avais donc bien compris :)  
 
Pour le 3, là effectivement j'avais pas saisi qu'il y a en fait 2 cookies de session : un créé par des setcookie() dans le fichier sessions.php de phpBB, + celui que le script JS crée et qui est indépendant.
 
Pour le 5, en fait j'étais quasi certain que c'était impossible pour le script d'adresser directement la BD sur le serveur, mais comme j'aime bien être certain des choses et qu'en matière de requêtes sur des BD beaucoup de choses sont possibles, j'ai préféré poser la question ;)  
 
Pour ce qui est de demander le décalage manuellement à l'utilisateur c'est évidemement prévu. Comme tu as peut être pu le lire, mon développement comprend 3 modes de gestion de l'heure d'été, dont 1 manuel pour ceux qui auraient précisement désactivé les JS et dont le serveur de l'hébergeur du forum ne gère pas l'heure d'été.
Actuellement ici on ne discute que du 3ème mode (récup de l'offset local en JS) :)  
 
En tout cas, merci beaucoup pour ton explication TRES claire :jap:  
J'avais bien compris une bonne partie du mécanisme mais ça m'a permis de compléter et valider définitivement par une explication argumentée claire ce que j'avais +/- déjà compris par des lectures de-ci de-là ;)  
 
Enfin pour les 6 & 7, il y a un mal entendu : le <head></head> de toutes les pages n'est pas généré par un script php, mais préformaté dans un template, le fichier overall_header.tpl (qui ne contient pas de php mais essentiellement du HTML).
On trouve dans ce fichier le début de toutes les pages du forum avec :

<HTML ...>
<HEAD>
<STYLE ...>
...définitions des styles...
</STYLE>
...fin du head...
</HEAD>
<BOBY>
...début du body...


 
C'était si on avait déplacé le script JS dans les fichiers sessions.php ou functions.php qu'on se serait retrouvé dans un fichier php (mais ces fichiers php ne génèrement pas véritablement le head des pages - au mieux ils envoient des infos pour remplir la structure fixée dans le template par des variables entre { } : libellés, liens, etc.).
D'ailleurs actuellement avec les cookies, on a simplement...

<script>
document.cookie = "pc_time_offset=" + new Date().getTimezoneOffset();
</script>


...directement dans le template HTML, juste avant la fin du </head>.
Ensuite, une fonction php récupère la valeur du cookie, mais ça c'est une autre histoire...
 
Du coup, il va falloir adapter ta proposition car le code est à mettre directement dans le code HTML du template.
Là je sais pas bien comment faire car comme tu utilises des portions en php...
Peut être qu'il faudra générer ce morceau du <head> en php et le faire intégrer dans le <head> préformaté des pages (dans <head> du fichier overall_header.tpl)
 
Enfin au passage comme tu me poses la question, oui j'ai compris tout son mécanisme sauf le système du NOSCRIPT que tu as rajouté, avec le test sur le GET au début. Je vois pas bien comment ça marche :sarcastic:  
 
Voilà.
On se rapproche de la solution ;)


Message édité par -ET- le 04-07-2003 à 01:09:59
Reply

Marsh Posté le 08-07-2003 à 15:45:24    

Maintenant pour travailler sur l'adaptation, j'ai fait des essais...
 
Si on met tout ce code directement dans la fonction create_date de functions.php :

<?php  
if( ! isset( $_GET['NoScript'] ) )  
{  
if( ! isset( $_POST['time_offset'] ) )  
{  
 // On n'a pas reçu le décalage, donc on le demande...  
 ?>  
 <HTML>  
 <HEAD>  
 <SCRIPT>  
 <!--  
 function sendTimeZoneOffset()  
 {  
  myDate = new Date();  
  myForm.time_offset.value = myDate.getTimezoneOffset();  
  myForm.submit();  
 }  
 -->  
 </SCRIPT>  
 <NOSCRIPT>  
 <META HTTP-EQUIV=Refresh CONTENT="1; URL=<?php  
 // Ici, on met l'URL qu'avait demandé l'utilisateur au début :  
 echo( $_SERVER['REQUEST_URI'] . "?NoScript" );  
 ?>">  
 </NOSCRIPT>  
 </HEAD>  
 <BODY onload="sendTimeZoneOffset();">  
 <FORM action="<?php  
 // Ici, on met l'URL qu'avait demandé l'utilisateur au début :  
 echo( $_SERVER['REQUEST_URI'] );  
 ?>" method="post" id="myForm">  
 <input type="hidden" name="time_offset" id="time_offset">  
 </FORM>  
 </BODY>  
 </HTML>  
 <?php  
 // Fin du formulaire de demande du décalage.  
 // Le formulaire sera automatiquement renvoyé à la même URL que celle qu'avait demandé l'utilisateur.  
exit;  
}  
else  
{  
 $time_offset = $_POST['time_offset'];  
}  
}  
else  
{  
$time_offset = 0;  
}  
 
echo( "\$time_offset = $time_offset<br>\n" );  
 
// Traitement Normal, le décalage est dans $time_offset.  
// S'il n'a pas été possible de récupérer le décallage, $time_offset vaut 0.    
//  
// Ton code ici ...  
// Par exemple la génération du <head></head> normal  
?>


...ça marche presque : la date est bien mise à jour sans nécessiter de cookie, mais on passe systématiquement par une page blanche à chaque rafraichissement ou clic sur un lien !
Le 1er test n'a pas l'air de bien fonctionner et rien n'est mémorisé pour éviter d'avoir à re-récupérer l'offset à chaque fois :(
Par ailleurs, le simple principe qu'une page blanche s'intercale entre chaque page du forum (y compris la première) est pas terrible.
 
Du coup, comme je te l'ai dit phpBB utilise en fait un fichier template HTML pour créer toutes les en-têtes de toutes les pages.
J'ai donc fait un essai en découpant le coeur de ton code pour l'inclure directement dans le fichier overall_header.tpl
 
J'ai donc mis dans le <head></head> du template et...

<SCRIPT>    
<!--  
function sendTimeZoneOffset()    
{    
 myDate = new Date();    
 myForm.time_offset.value = myDate.getTimezoneOffset();    
 myForm.submit();    
}    
-->  
</SCRIPT>


 
...et cette partie à la place de la ligne <BODY ... > :

<BODY ... onload="sendTimeZoneOffset();">  
<FORM method="post" id="myForm">  
<input type="hidden" name="time_offset" id="time_offset">  
</FORM>


Là ça marche aussi pour la mise à jour, on ne passe plus par une page blanche puisque le champ est créé directement dans la page à ouvrir mais il n'y a plus de test ; et donc on tourne en boucle.
 
Donc, partant de cette seconde solution, il ne reste plus qu'à rétablir les tests pour ne plus tourner en boucle.
Or là aussi j'ai fait des essais, et j'arrive au même point que toi : à chaque rafraichissement on a droit au submit (donc 2 affichages) :(  
 
Pour ce qui est du stockage de l'info, je passe par une variable de session mais doit-on ajouter "session_start();" avant ou pas ?
Parce que j'ai l'impression qu'en fait la donnée n'est pas stockée entre les rafraichissements et c'est pour ça qu'à chaque fois il re-récupère l'info :sarcastic:


Message édité par -ET- le 08-07-2003 à 18:05:30
Reply

Marsh Posté le 10-07-2003 à 15:46:56    

Bon, c'est bon j'ai fini par trouver :sarcastic:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed