Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 01/02/2010, 13h37   #1
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
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 :
'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
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2010, 13h54   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2010, 15h17   #3
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
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.
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2010, 15h26   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2010, 15h31   #5
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
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
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2010, 16h47   #6
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
Mais je ne sais pas comment m'y prendre lol
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2010, 18h05   #7
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Qu'est ce qui te bloque ?
Parcourir tes résultat avec une boucle tu dois savoir faire.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 08h35   #8
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
Oui, cela je sais faire, voici mon code :
Code :
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
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 09h11   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 044
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 044
Points : 16 337
Points : 16 337
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 09h44   #10
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
tu manques d'imagination :
Code :
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'];
}
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 10h10   #11
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 238
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 238
Points : 2 591
Points : 2 591
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 ?
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 10h47   #12
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
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
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 11h41   #13
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 238
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 238
Points : 2 591
Points : 2 591
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 :
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
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 12h03   #14
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
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.
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 12h25   #15
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 044
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 044
Points : 16 337
Points : 16 337
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 12h36   #16
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2008
Messages : 103
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 103
Points : 32
Points : 32
Désolé Cinephil et Sabotage j'avais pas fait gaffe à vos réponse sorry je test et vous tient au courant
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2010, 13h53   #17
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 238
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 238
Points : 2 591
Points : 2 591
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
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 20h52.


 
 
 
 
Partenaires

Hébergement Web