IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête avec filtrage selon date


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut Requête avec filtrage selon date
    Bonjour, je me permet de vous contacter car je souhaite réaliser un requête sql qui me comptabilise comme unique des enregistrements (pour des stats) des opérations pour un même identifiant dans un laps de temps < à 20 secondes.
    Voici le plan de ma table :
    stat_id // stat_ref_qui // stat_type // stat_date // stat_operation // stat_ref_annexe // stat_login.
    Mon champs date étant construit tel que : AAAA-MM-JJ HH:MM:SS

    Voici le plan de ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT DISTINCT * FROM stats_table WHERE stat_date >= \'2010-01-01 00:00:00\' AND stat_date <= \'2010-01-31 23:59:59\' AND stat_operation = 10 ';
    Mais lors de ma requête je voudrait que toutes les opérations par exemple dont l'id opération est 10 que pour le même identifiant que ca me compte une seul fois une opération si elle est exécuté dans un laps de 10 secondes car si un client appuie 2 fois d'affilé sur un bouton valider d'un formulaire j'ai 2 enregistrement dans ma table stats, comment puis-je faire cela.
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    ton problème est qu'un utilisateur puisse envoyer deux fois le meme ordre.
    L'enregistrer quand même et chercher à ne pas le prendre en compte ensuite, c'est absurde.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Le soucis ne vient pas de moi, en fait le site est développé en externe et moi je dois m'occuper en interne d'en sortir des stats concrète, malheureusement les personnes qui développent notre site ne s'occupent pas de se problème qui vient du fait que si une personne clic 2 fois sur le bouton valider d'un formulaire car il charge pas assez rapidement pour lui alors il prendra en compte 2 clic donc 2 enregistrements qui correspondent en fait qu'à une seul opération si tu vois ce que je veux dire.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est quand même gênant de dissimuler des lignes ; ca ne peut qu'être source de confusions.
    Mais bon ...
    En SQL je ne vois pas comment on pourrait faire ; la seule solution qui me vient c'est de lire ligne par ligne en PHP et de comparer la date qu'on est en train de traiter avec celle qu'on a fait avant : si elles sont trop proches, on ne traite pas la ligne en cours.
    Ca implique evidemment qu'on fasse une requête triée par date.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Ok avec une boucle je suppose, merci quand même, et oui c'est sur que c'est embettant pour afin d'avoir des stats fiables il faut que je me dem...de lol car sinon ca va tout fausser mes résultats, sachant qu'il faudrait que l'utilisateur soit vachement rapide pour faire 2 opérations en remplissant des formulaires différénts à - de 20 secondes d'intervalle lol

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Mais je ne sais pas comment m'y prendre lol

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Qu'est ce qui te bloque ?
    Parcourir tes résultat avec une boucle tu dois savoir faire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Oui, cela je sais faire, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // On liste en boucle les enregistrement
    while ($data = mysql_fetch_array($req)) {
    // on affiche les résultats
    echo 'Référence : '.$data[stat_ref_qui].' // Date : '.$data[stat_date].' // Opération : '.$data[stat_operation].' // Opération : '.$data[stat_type].'<br>';
    }
    Mais mon soucis c'est de tester la dernière valeur d'un champ sur la ligne précédente et si l'enregistrement en cours et séparé de - 15 secondes par apport au dernier alors je le prend pas en compte.

    Cordialement

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Il serait peut-être plus efficace de nettoyer la table en cherchant les faux doublons.

    Comme tu fais un SELECT *, il est impossible de savoir quelle(s) colonne(s) permettrai(en)t de faire la distinction entre les vrai et les faux doublons.

    Le principe est de faire une auto-jointure de la table sur le même utilisateur et de pister deux lignes dont la colonne stat_date est distante de moins de X secondes (à toi de déterminer le X réaliste).
    Tu fais d'abord un test avec un SELECT et si le résultat te semble cohérent, tu DELETEs !
    Ensuite tu auras une table propre pour faire tes statistiques.

    Attention si cette table est référencée en clé étrangère dans d'autres tables !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    tu manques d'imagination :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $date_precedente = 0;
    while ($data = mysql_fetch_array($req)) {
    if ($date_precedente != 0 && strottime($data['stat_date']) - strtotime($date_precedente) > 20) {
        echo "c'est gagné";
    }
    $date_precedente = $data['stat_date'];
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Une idée comme ça, mais apparemment cela concerne une identification.
    Du coup, il n'est pas rare (à l'inverse : très courant) dans des cas comme celui ci qu'une gestion des sessions soient présente, ce qui sous entend qu'il y aurait peut être l'identifiant de chaque personne venant de s'identifier stockée dans la session.

    Dans ce cas présent une simple vérification sur la présence de cet identifiant pourrait peut être suffire avant de lancer une mise à jour des stats, non ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Oui tout a fait j'ai un id de session reconnu dans le champs "stat_login" de ma table mais lorsque celui ci clic 2 fois sur le bouton valider du formulaire parce que ce n'est pas assez rapide pour lui alors cela m'engendre 2 enregistrements dans la table stats alors qu'en fait ca ne correspond qu'à un seul enregistrement, voici un exemple pour une opération sous l'id 3 :

    stat_id // stat_ref_qui // stat_type // stat_date // stat_operation // stat_ref_annexe // stat_login
    470 // 4070 // A // 2010-01-29 12:01:08 // 3 // // 1254896
    471 // 4070 // A // 2010-01-29 11:59:41 // 3 // // 1254896
    472 // 1 // A // 2010-01-27 14:53:21 // 3 // // 124781

    En fait le 470 et 471 correspondent au même enregistrement mais 2 clic sur le bouton du formulaire donc c'est cela que je voudrait gérer

  13. #13
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par chouchouilloux Voir le message
    Oui tout a fait j'ai un id de session reconnu dans le champs "stat_login" de ma table
    D'accord, cela confirme au moins qu'il y a des sessions, mais l'id de session ce ne sera pas bon, faut autre chose qui ferait le distingo entre un internaute lambda qui navigue sur le site et une personne identifiée, loguée.

    Si j'ai bien compris, c'est cela dont il s'agit.


    La question est donc de savoir si dans cette session il y a un truc correspondant à une personne identifiée ?
    A mon avis ça devrait être le cas, ceci devrait être en relation avec une table genre "users", et l'élément pourrait avoir le nom de l'id de cette, du genre "users_id".

    Faudrait afficher le contenu complet (un var_dump) de la session entre ces 2 cas figure : personne lambda et personne identifiée.


    En admettant que tu parvienne à repérer un élément, et bien il suffit de le rajouter comme condition/alternative restrictive pour mettre à jour les stats.

    Ou alors, tu créé toi même cette donnée pour pouvoir t'appuyer dessus.
    Au moment ou tu mets à jour cette stat, tu créé cette variable de session.
    $_SESSION['is_logged'] = true;

    Suffit après de rajouter cette condition en vérifiant sont existance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (isset($_SESSION['is_logged]') && $_SESSION['is_logged'] === true) {
        // Personne déjà identifiée : Pas de mise à jour des stats.
    }
    else {
     
        // Personne pas encore identifié : Mise à jour des stats
        $_SESSION['is_logged'] = true;
    }
    S'il y a un mécanisme présent dans le site qui détruit les sessions, faut voir si cette variable sera détruite aussi ou pas, ça peu fausser le truc.


    C'est une idée

  14. #14
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Désolé je m'exprime peut être mal pis en plus je ne peux pas modifier le code c'est une société externe qui développe notre site mois je récupère juste en interne la table stats et la travail en local avec xampp.
    Il n'y a pas de problème sur l'identification des personnes, le soucis est juste que si le client clic 2 fois sur le bouton valider du formulaire de commande par exemple et bien ca me créé 2 enregistrements dans ma table stats avec une quinzaine de secondes d'intervalle maxi et c'est ca le problème, je voudrais pouvoir comptabiliser ces enregistrements en supprimant tout les doublons d'opérations du à un double clic, enfin après avoir cliqué 2 fois à quelques secondes d'intervalle sur ce même bouton alors qu'au final je n'ai qu'une seul commande.
    Je ne peux me baser que sur cette table là donc pas possible d'aller récupérer le nombre de commande et c'est plus compliqué que ca, la commande n'est qu'une illustration de mon problème.
    En fait quand je fais ma requête d'affichage des lignes de tableau puis du calcul du nombre de ligne, je voudrait qu'à chaque ligne ca test le date-time de la ligne précédente pour un même login et si la différence est inferieur à 20 secondes je le zappe sinon je l'ajoute si tu comprend mieux ce que je veux dire.

  15. #15
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Et bien comme je l'ai suggéré plus haut, il faut nettoyer la table.
    Voir mon message précédent.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  16. #16
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 161
    Par défaut
    Désolé Cinephil et Sabotage j'avais pas fait gaffe à vos réponse sorry je test et vous tient au courant

  17. #17
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par chouchouilloux
    Désolé je m'exprime peut être mal pis en plus je ne peux pas modifier le code c'est une société externe qui développe notre site mois je récupère juste en interne la table stats et la travail en local avec xampp.
    J'avais bien saisie, mais cela part tout de même d'un bug, et tout bug se corrige, sans compter qu'il peut se régler facilement.

    Maintenant, si c'est mission impossible de contacter cette société, reste à appliquer ce que les autres ont suggérés.

    Désolé pour le hors sujet

Discussions similaires

  1. requête avec WHERE A < Date < B de semaine en semaine
    Par cortex024 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/06/2007, 14h41
  2. Requètes avec comparaison de date
    Par phoque.r dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/04/2007, 16h01
  3. Réponses: 1
    Dernier message: 23/06/2006, 19h10
  4. Requête avec Expr1: Format([Date];"ee")
    Par grenet dans le forum Access
    Réponses: 6
    Dernier message: 06/03/2006, 16h02
  5. Création requête avec gestion de date
    Par MELINE dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo