Demande de l'aide en php(important)

cs_sittimo Messages postés 4 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 11 mai 2007 - 4 mai 2007 à 12:05
cs_sittimo Messages postés 4 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 11 mai 2007 - 11 mai 2007 à 17:52
bonjour
j'ai un grave problème, et je n'arrive pas à m'en sortir et j'aurais aimé avoir votre aide.
j'ai une application php qui existe déjà et qui fonctionne en intranet, je veux rajouter une fonction dans mon application qui me permettra de comptabiliser les heures de travail de chacun de mes utilisateurs.
j'ai fait tout ce que j'ai pu et je ne trouve que des erreurs. je suis tombée maintenant dans ce code de calcul de durée,je pense que ça peut me servir mais j'ai besoin d'aide d'avantage, car je ne sais exactement pour ce que j'ai fait n'a pas marché, peut mon code n'est bon ou peut etre j'ai mal placé mon.
en fait j'ai crée une tabe(id_log, u_login, t_log_debut_log, t_log_fin); j'ai fait fichier point_in.php qui ce code
(
<?php
session_start();
//connexion mysql
mysql_connect("localhost", "dbconges", "motdepasse");
mysql_select_db("db_conges");
//pour l'heure de connexion
$sql="INSERT INTO $conges_users_log(u_login, date_log, t_log_deb)VALUES($rowUser['id'], date("Y-m-d"), date("H:i:s"))";
mysql_query($sql);
mysql_close();
?>
)  et un autre point_off.php qui a ce code
(
<?php
session_start();
//connexion mysql
mysql_connect("localhost", "dbconges", "motdepasse");
mysql_select_db("db_conges");
//pour mettre à jour la tps de deconnexion
$sql="UPDATE $conges_users_log SET t_log_fin='".date("H:i:s")."' WHERE id='".$_SESSION['log_id']."'";
mysql_query($sql,$link)or die(mysql_error());
?>
)

j'ai mis la fonction(session_start(); dans tous mes pages comme on le conseille et j'ai appeler (include("point_in.php"); dans tous les pages au tout debut et include("point_off"); dans la page de deconnexion au tout debut. peut etre que ce n'est pas comme ça comment je devais les placer ou que lecode est mal fait.
en pensant rajouter aprés la difference pour trouver la durée mais déjà celane m'affiche que des erreurs.

donc j'aurais aimé que vous m'accordiez une aide, regarder ce que j'ai fait me dire ce que vous en pensez ou me conseillez ce que je peux faire pour utiliser votre code s'il peut correspondre à mon objectif.
je vous signale que je suis une etudiante.
j'utilise windows xp, php4, easyphp1.7, et mon navigateur est mozilla firfox . je vous remercie d'avance et que vous ayez le courage de m'aider.

5 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
4 mai 2007 à 23:04
Salut,

Avant toute chose, je dois avouer que j'ai eu du mal à comprendre tout ce que tu dis. D'ailleurs, je n'ai pas tout compris : il manque des mots. Des erreurs de syntaxe, du sms, on peut décoder. Mais avec des données manquantes, sans RAID, c'est pas facile de reconstituer tout ce que tu veux transmettre...

Bref.

En gro, tu veux compter le temps qui s'écoule entre la connexion et la déconnexion d'un utilisateur.

La ligne sur laquelle se trouve la première requête SQL est mal écrite. Elle ne peut que générer des erreurs.

$sql="INSERT INTO $conges_users_log(u_login, date_log, t_log_deb)VALUES($rowUser['id'], date("Y-m-d"), date("H:i:s"))";

dans la chaine de caractères, tu ne peux pas utiliser :
- de variable de type array (ici, $rowUser)
- de fonction php
Puisque tu utilises des doubles quotes, tu peux placer dans la chaine des variables pour qu'elles soient directement remplacées par leur valeur.
Dans le cas de tableaux il faut entourer la variable d'accolades :
$exemple = "Bonjour {$user['Nom']} ! Comment ça va ?";

Pour les fonctions php, pas moyen : il faut soit les sortir de la chaine et concaténer avec l'opérateur de concaténation de chaines, le point (.)
$exemple = "Nous sommes le " . date("Y-m-d") . " et il est " . date("H:i:s");

Par ailleurs, la fonction date() retourne une chaine. Il faut donc l'entourer de guillemets simples dans la requete SQL. D'ailleurs, idem pour le user_id si c'est une chaine de caractères.

Ca donne :
$sql="INSERT INTO $conges_users_log (u_login, date_log, t_log_deb) VALUES ('{$rowUser['id']}', '" . date("Y-m-d") . "', '" . date("H:i:s") ."')";

Bon, mais ton problème ne doit pas être ici...
Puisque tu utilises les Sessions, tu peux stocker la date de début de session dans une variable de session :

session_start();
$_SESSION['start_date'] = time();
Il n'y a besoin de rien d'autre, PHP gère tout seul cette variable de session.

Quand l'utilisateur se déconnecte, il suffit de faire une soustraction :

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

time() retourne un entier correspondant au nombre de secondes écoulées depuis l'époque UNIX, c'est à dire le 1er janvier 1970. La soustraction te donne donc le nombre de secondes de connexion de l'utilisateur.

Tu peux alors stocker cette valeur dans ta base de données.
Si on considère que dans ta table, le champ u_login est une clé (primaire ou au moins index) alors on peut exécuter une requête comme ça :

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

Cette requête insert le temps passé pour l'utilisateur si l'utilisateur n'est pas encore présent dans la table. Si un temps a déjà été enregistré pour cet utilisateur, alors au lieu d'insérer à nouveau un enregistrement on modifie une valeur pour cet enregistrement (c'est à ça que sert ON DUPLICATE KEY) en incrémentant le temps passé : on y ajoute le temps passé pendant la session.

Ensuite, tu peux déconnecter l'utilisateur en détruisant la session.

C'est, je pense, plus simple que d'enregistrer tous les temps de connexion de chaque utilisateur et à chaque fois, d'extraire tous les enregistrement pour un utilisateur et d'ajouter toutes les valeurs... Là, tu as une seule requête pour insérer ou mettre à jour. Tu ne stockes qu'une seule valeur que tu peux lire directement : c'est quand même plus rapide à l'exécution...
0
cs_sittimo Messages postés 4 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 11 mai 2007
7 mai 2007 à 10:26
merci beaucoup d'avoir eu le courage de repondre à ma question.
d'aprés tes explications, j'ai voulu faire ce ci:
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();
apparemment c'est lors de la deconnexion qu'on calcule et enregistre le temps_passe,   je me suis donc demandé ceci:

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 ?
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
7 mai 2007 à 12:07
Salut,

Ca dépend de la configuration du serveur.
http://ch2.php.net/manual/fr/ref.session.php

Par ailleurs, la destruction d'une session (même si l'utilisateur clique sur "déconnexion") ne calcule pas le temps et ne met pas à jour la table.
C'est une opération qu'il faut faire manuellement (je veux dire coder manuellement).

Le calcul du temps passé pour les utilisateurs qui ne cliquent pas sur déconnexion pose problème.

Tu dois vérifier régulièrement les sessions qui sont encore "en cours" (pas de clic sur "déconnexion") et calculer le temps de connexion (en comptabilisant ou non la durée de vie de la session). En gros, il te faut intégrer dans ta table si la session est en cours ou pas.

La gestion des sessions, c'est vraiment pas quelque chose de si simple que ça, dès qu'on veut stocker des informations dans une base de données.
0
cs_sittimo Messages postés 4 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 11 mai 2007
7 mai 2007 à 13:46
merci
n'est ce pas cecode qui calcule le temps?
$temps_passe = time() - $_SESSION['start_date'];

n'est ce pas ce code qui met à jour la table?
$sql = 'INSERT INTO ' . $conges_users_log . ' (u_login, temps_passe) ON
DUPLICATE KEY UPDATE temps_passe=temps_passe+' . $temps_passe;

est ce je ne peux pas avec tous ces bouts de code constituer une page php puis l'appeler dans la page de connexion?

d'autre part, ils tjs cliquer sur deconexion pour se deconnecter mais pas sur le croix.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sittimo Messages postés 4 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 11 mai 2007
11 mai 2007 à 17:52
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 "

\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
\n";

        echo "Veuillez vous authentifier\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
\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.
0
Rejoignez-nous