demande de l'aide en php

Statut
N'est pas ouverte pour d'autres réponses.
S

sitti

ex membre
bonjour à tous!
j'ai une application en php qui existe déjà.
j'utilise des sessions avec php4 et easyphp1.7 dans windows XP avec le navigateur Mozila firefox.
je veux developer un code qui me permettra de caculer la durée ou autrement dit le temps_passe entre la connexion et la deconexion de chaque utilisateur par jour.
j'ai déjà une table
conges_users(u_login(id), u_password,................) dans l'application.

j'ai crée une nouvelle table
conges_users_log(id_log(id), u_login(id), start_date, ,time, temps_passe)

je mets ce code au tout debut de la page session:

session_start();
$_SESSION['start_date'] = time();

je mets ce code au tout debut de la page deconnexin:

$temps_passe = time() - $_SESSION['start_date'];

et pour stocker cette valeur de temps_passe dans la base et lamettre à jour j'execute cette requete:

$sql = 'INSERT INTO ' . $conges_users_log . ' (u_login, temps_passe) ON DUPLICATE KEY UPDATE temps_passe=temps_passe+' . $temps_passe;

pour detruire la session:

session_destroy();

mais malgrés tout ça marche pas.
ça vous dit de jeter un coup d'oeil pour m'aider, c'est trés important.
car je suis perdu, je ne sais pas si cen'est plus là où je devais placer les ou si les codes sont mal faits, perdu!!!!!!
au secours!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 

II phl II

Touriste
Quand exécutes-tu l'UPDATE du tps de connexion ?

idéalement il faudrait MySQL 5 avec un trigger.
c'est-à-dire qu'à chaque fois qu'une requête est effectuée, un UPDATE de la durée de connexion est faîte.

Par ailleurs, que se passe-t-il si un utilisateur quitte le navigateur se déconnecter ?
Je pense que la session est détruite => plus d'UPDATE... mais après combien de tps ?
 

SkYlEsS

Elite
'pour cela, faut s'aider de onunload ;)
 

II phl II

Touriste
Apres qq recherches, le OnUnload s'exécute à chaque changement de page mais pas à la fermeture du navigateur.

Pour avoir qqch qui se déclenche à la fermeture il existe le OnBeforeUnload

exemple :
Code:
<html>
<head>
<title></title>
</head>
<body OnBeforeUnload="return window_onbeforeunload()">
<script language="javascript">
window.onbeforeunload = function() {
alert ('test1');
}
</script>
</body>
</html>
 
1er
OP
S

sitti

ex membre
bonjour
merci beaucoup
mais le problème c'est que, c'est ce code qui me permet de calculer et mettre à jour le temps_passe:
$temps_passe=time()-$_SESSION['date_start'];
$sql='INSERT INTO' .conges_users_log.'(ulogin, temps_passe) ON DUPLICATE KEY UPDATE temps_passe=temps_passe+'$temps_passe;

et ça , c'est un code php.
et je pense que , d'aprés ce tu m'as posté, on doit faire ceci:

<html:colere:head:colere:title:colere:/title:colere:/head>
<body OnBeforeUnload="return window_onbeforeunload()">
<script langage="javascript">
window.Onbeforeunload=function(){
mon code php à la place de
alert ('test1'); dans ton code , je pense car
je m'y connais pas du tout en javascript

mais j'ai regardé les cours du net.
}
</script>
</body:colere:/html>

mais d'aprés ce que j'ai vu sur le net je doute
de cette insertion du php dans javascript.
peux avancer d'avantage tes idées.?
merci!
 

Calvin80

Respect is key
ton code est "bon" sur le principe, mais y'a peut etre des erreur de syntaxe ou autre..

qu'est ce qui fait que tu dis que ca ne vas pas ? tu as un message d'erreur ?
 

Calvin80

Respect is key
sitti a dit:
bonjour à tous!


$sql = 'INSERT INTO ' . $conges_users_log . ' (u_login, temps_passe) ON DUPLICATE KEY UPDATE temps_passe=temps_passe+' . $temps_passe;
c'est quoi cette variable $conges_users_log ? tu n'aurais pas oublié de mettre les values :D ?
 

Bartdude

Touriste
Euh il va y avoir comme un problème pour foutre du PhP dans du Javascript quand-même. C'est que le PhP s'exécute sur le serveur... et le Javascript chez le client.

Alors bon, les event onunload et compagnie, c'est bien, mais ca sert à déclencher des actions javascript (genre le alert de l'exemple).

Si tu mets ton code PhP là où tu prévois de le mettre, il va simplement s'exécuter avant même de renvoyer la page vers le client, et quand tu regarderas la source html de ta page, ta fonction javascript sera vide.

Et bon indépendament de ca la syntaxe javascript ne m'a pas l'air bonne non plus, mais même parfaite ca ne pourrait pas marcher...
 

II phl II

Touriste
En effet, après quelques recherches, j'en viens au meme constat : on ne peut pas include de php dans du code Javascript ...

Que faire alors ... l'inverse :-D

:arrow: Demander au PHP de générer le code Javascript

<html:colere:head:colere:title:colere:/title:colere:/head>
<body OnBeforeUnload="return window_onbeforeunload()">
<?php
echo [
<script langage="javascript">
window.Onbeforeunload=function(){
TON CODE PHP
}
</script>
]
?>
</body:colere:/html>

J'ai simplifié la syntaxe en mettant un echo [ ] ... évidemment il faudra jouer avec les quote pour que le JS soit généré pour le navigateur avec le PHP qui aura été interprété. (=> JS Pur pour le navigateur)
Avec un peu d'habilité, il doit y avoir moyen :p
 

Bartdude

Touriste
Générer du javascript en PhP est effectivement le seul sens qui marche. Comprendre la succession des étapes entre la requête d'une page web par le client et l'affichage de cette page est très utile pour résoudre ses erreurs, ou éviter de les faire ;)

Maintenant pour intervenir sur tes sessions, tu vas bien devoir envoyer un signal du client vers le serveur, et donc appeler un script PhP, car en Javascript ca n'est pas faisable. Si je devais faire cela, je pense que j'explorerais cette piste:


<head:colere:script langage="javascript">
function updateSession(mySID)
{ myDummyImage=new Image();
myDummyImage.src="http://tonurl.be/closeSession.php?SID="+mySID;
}
</script>
</head>
<body OnBeforeUnload="return updateSession('<?php echo SessionId ?>')">

et dans closeSession.php, tu gère la récupération de la valeur de la sessionID et le close de la session. Tu peux évidemment passer d'autres valeurs, c'est un exemple.
Je dis que c'est une piste car je n'ai pas testé, y'a peut-être l'une ou l'autre coquille dans la syntaxe, mais le principe c'est de détourner le load d'image en javascript pour lancer une requête HTTP vers un script PhP.
 
1er
OP
S

sitti

ex membre
bonjour à tous vous etes si courageux!

tu pourais etre un peu claire car moi avec le javascript ça colle pas mais je regarde descours, sur le net et surtout je meurs de la fatigue morale je regrette d'exister.
ça fait un mois de plus que je cherche et que je ne trouve pas pour ce problème.

comme vous lesavez avant de faire quoi que ce soit je doit stocket aprés qu'un utilisateur s'est connecté, son nom d'utilisateur(u_login), la date du jour(datejour), son heure de connexion(cotime), son heure de deconnexion(decotime) dans la table conges_users_log(id_log, u_login, dtaejour, cotime, decotime, elapsed(elapsed=decotime-cotime)).

j'ai fait ce code , j'arrive maintenant à me connectr , il y'a pas des erreurs, mais le code ne stocke rien dans la table conges_users_log.
ce code je l'ai inseré dansla page de session comme, suit:

-------------------------------------------------------------
voilà le code de ma page de session et ce qui est entouré par //-----------sitti //------------sitti , c'est mon code.

<?php

//
// MAIN
//

/*** initialisation des variables ***/
$session_username="";
$session_password="";
/************************************/

//
// recup du num de session (mais on ne sais pas s'il est passé en GET ou POST
$session=(isset($_GET['session']) ? $_GET['session'] : ((isset($_POST['session'])) ? $_POST['session'] : "") ) ;
/*******************sitti
******************************************/
$DEBUG=FALSE;
//$DEBUG=TRUE;

if($DEBUG==TRUE) { print_r($_SESSION); echo "<br:colere:br>\n"; }

if ($session != "")
{
if(session_is_valid($session) == TRUE)
{
session_update($session);
//--------------------------------sitti
if($session=(isset($_GET['session']) ? $_GET['session'] : ((isset($_POST['session'])) ? $_POST['session'] : "")))
{
//connexion mysql
$db = mysql_connect('localhost', 'dbconges','motdepasse') or die('Erreur de connexion '.mysql_error());
//selection de la base
mysql_select_db('db_conges', $db) or die('Erreur deselection '.mysql_error());
//code
$cotime = time();
$u_login = "session_username";
$_SESSION['cotime']="cotime";
$_SESSION['u_login']="u_login";
$datejour = date("Y-m-d");
$sql = "INSERT INTO conges_users_log(u_login,datejour,cotime)";
//$sql .=
$sql .="VALUES('$u_login','$cotime','$datejour')";
}
//---------------------------------------- sitti

}
else
{
session_delete($session);
$session="";
$session_username="";
$session_password="";
$_SESSION['config']=init_config_tab(); // on recrée le tableau de config pour l'url du lien

echo "<center>\n";
echo "Pas de session ouverte<br>\n";
echo "Veuillez <a href='".$_SESSION['config']['URL_ACCUEIL_CONGES']."/index.php' target='_top'> vous authentifier</a>\n";
echo "</center>\n";

exit;
}
}
else // $session == ""
{
if(isset($_POST['session_username'])) { $session_username=$_POST['session_username']; }
if(isset($_POST['session_password'])) { $session_password=$_POST['session_password']; }

if ( ($_SESSION['config']['how_to_connect_user'] == "CAS") && ($session_username != "admin") )
{
$usernameCAS = authentification_passwd_conges_CAS();
if($usernameCAS != "")
{
if(session_id()!="")
session_destroy();

// on initialise la nouvelle session
session_create($usernameCAS);

}
else //dans ce cas l'utilisateur n'a pas encore été enregistré dans la base de données db_conges
{
echo "<center>\n";
echo "Il n'existe pas de compte correspondant à votre login dans la base de données de PHP_CONGES<br>\n";
echo "Contactez l'administrateur de php_conges";
echo "</center>\n";
}
}
else
{
if (($session_username == "") || ($session_password == "")) // si login et passwd non saisis
{
// SAISIE LOGIN / PASSWORD :
session_saisie_user_password("", "", ""); // appel du formulaire d'intentification (login/password)
exit;
}
else
{
// AUTHENTIFICATION :

// le user doit etre authentifié dans la table conges (login + passwd) ou dans le ldap.
// si on a trouve personne qui correspond au couple user/password

if ( ($_SESSION['config']['how_to_connect_user'] == "ldap") && ($session_username != "admin") )
{
if(session_id()!="")
session_destroy();

if (authentification_ldap_conges($session_username,$session_password) != $session_username)
{
$session="";
$session_username="";
$session_password="";

$erreur="login_passwd_incorrect";
session_saisie_user_password($erreur, $session_username, $session_password); // appel du formulaire d'intentification (login/password)
exit;
}

if ((authentification_ldap_conges($session_username,$session_password) == $session_username) && ($session_username != ""))
{
if (valid_ldap_user($session_username)==TRUE) // LDAP ok, on vérifie ici que le compte existe dans la base de données des congés.
{
// on initialise la nouvelle session
session_create($session_username);
}
else//dans ce cas l'utilisateur n'a pas encore été enregistré dans la base de données db_conges
{
$erreur="login_non_connu";
session_saisie_user_password($erreur, $session_username,$session_password); // appel du formulaire d'intentification (login/password)
exit;
}
}
} // fin du if test avec ldap
elseif ($_SESSION['config']['how_to_connect_user'] == "dbconges")
{
if(session_id()!="")
session_destroy();

if (autentification_passwd_conges($session_username,$session_password) != $session_username)
{
$session="";
$session_username="";
$session_password="";

$erreur="login_passwd_incorrect";
session_saisie_user_password($erreur, $session_username,$session_password); // appel du formulaire d'intentification (login/password)
exit;
}

if ((autentification_passwd_conges($session_username,$session_password) == $session_username) && ($session_username != ""))
{
// on initialise la nouvelle session
session_create($session_username);
}
}
}
}

}

?>

ayez vous unesur l'emplacement , car aucune erreur ne s'affiche je suppose que peut c pas là où je dois placer lecode.
merci de votre aide.
 

SkYlEsS

Elite
... ton code est aussi vide que ton orthographe et ta ponctuation ... :eek:

Si tu veux qu'on t'aide, respectes nous en écrivant de manière lisible stp. Avec des explications concises. ;)

Edit : Et mets ton code entre les balises [ CODE ] Rondidju !
 

SkYlEsS

Elite
... Bon j'ai copié-collé ton code dans NotePad++ pour y voir plus clair mais rien n'y fait, ton code est du gruyère. Tu initialises des variables qui n'ont pas lieu d'être, tu fais appel à des fonctions inconnus, tu parses ton code à tout va.

Par contre, je veux bien en savoir plus sur toutes les fonctions que tu appelles et dont je ne trouve aucune réponse via Google, telles que "session_is_valid", "init_config_tab", "session_saisie_user_password", ...

Il est où ton Javascript dans tout ça ? Un conseil, fais un tour sur http://www.siteduzero.com/ ;) (Pour les sessions : http://www.siteduzero.com/tuto-3-176-1-les-variables-superglobales.html#ss_part_2)
 

SkYlEsS

Elite
Enfin bon, j'ai relis depuis l'début et j'avoue que c'est n'importe quoi :0)

Code:
$sql = 'INSERT INTO ' . $conges_users_log . ' (u_login, temps_passe) ON DUPLICATE KEY UPDATE temps_passe=temps_passe+' . $temps_passe;
Ce que tu voulais faire est (ayant signaler ce qu'étaient les variables $u_loggin et $temps_passe auparavant !) :

Code:
mysql_query("INSERT INTO conges_users_log (u_login, temps_passe) VALUES ($u_login, $temps_passe) ON DUPLICATE KEY UPDATE temps_passe = temps_passe + '.$temps_passe");
Si j'n'm'abuse ...
 
1er
OP
S

sitti

ex membre
bonjour
merci beaucoup
mais je n'ai pas compris pourquoi, tu fais directement l'insert into de u_login et temps_passe seulement, tu n'insert pas le cotime et decotime

et pourtant pour avoir temps passe on a besoin de cotime et decotime?

je pense ke j'avais enlevé le $ devant la table conges_users_log.

est ce que au mois c'est bien là où je devais inserer mon code dans ma page de session?
en fait bien l'endroit precise?
merci!
 

SkYlEsS

Elite
... Pffff. Perso, j'n'aide plus ce gugus là et je ne m'étonnerais pô que d'autres fassent de même :[]

(En plus, tu ne reconnais même pô ton propre code ! Tu fais n'importe quoi ... 'Faudrait mieux tout recommencer à zéro 'tit gars !)
 

Bartdude

Touriste
SkYlEsS a dit:
... Pffff. Perso, j'n'aide plus ce gugus là et je ne m'étonnerais pô que d'autres fassent de même :[]

(En plus, tu ne reconnais même pô ton propre code ! Tu fais n'importe quoi ... 'Faudrait mieux tout recommencer à zéro 'tit gars !)
+1. Quand il faut déjà se creuser la tête pour comprendre le problème, on n'a plus envie d'essayer de le résoudre ni même de voir si c'est possible...
 
1er
OP
S

sitti

ex membre
bonjour
t'es pas obligé d'aider mais t'es obligé de ne pas insulter
pourquoi tu dis que je ne reconnais pas mon code, si mais juste t'as proposé un truk et je t'ai demandé une question puis c'est tout.
et de plus moi je travaille de temps en temps en php, mais c'est la 1ere fois que je travaille avec des sessions. sinon je te remercie des liens que tu m'as envoyé.
je te rappelle aussi que le problème posé est plus claire mais si tu ne le vois pas ça arrive.
merci!
 

Bartdude

Touriste
sitti a dit:
bonjour
je te rappelle aussi que le problème posé est plus claire mais si tu ne le vois pas ça arrive.
merci!
Je trouve pas ca clair non plus, et on peut pas dire que tu croules sous les réponses donc je dirais que nous ne sommes pas les 2 seuls à ne pas comprendre le problème.

Quel est le souci exactement ? Un insert qui foire ? Recois-tu un message d'erreur et si oui lequel ? Je dirais qu'à priori ton problème n'est pas tant un problème de sessions qu'un problème avec la syntaxe de ta requête...
 

SkYlEsS

Elite
sitti a dit:
bonjour
t'es pas obligé d'aider mais t'es obligé de ne pas insulter
Alors je peux ? ... Ah nan je dois !

Iconoclaste va :)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut