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 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
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
Vieux 01/02/2010, 13h54   #2 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 10 053
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.
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 01/02/2010, 15h17   #3 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
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.
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 01/02/2010, 15h26   #4 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 10 053
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.
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 01/02/2010, 15h31   #5 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
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
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 01/02/2010, 16h47   #6 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
Par défaut

Mais je ne sais pas comment m'y prendre lol
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 01/02/2010, 18h05   #7 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 10 053
Par défaut

Qu'est ce qui te bloque ?
Parcourir tes résultat avec une boucle tu dois savoir faire.
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 02/02/2010, 08h35   #8 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
Par défaut

Oui, cela je sais faire, voici mon code :
Code :
// 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
Vieux 02/02/2010, 09h11   #9 (permalink)
Modérateur
 
Avatar de CinePhil
 
Nom : Philippe Leménager
Date d'inscription: août 2006
Localisation: Toulouse
Âge: 46
Messages: 4 798
Envoyer un message via MSN à CinePhil
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.
Futur ingénieur CNAM, ingénieur d'étude à l'École Nationale de Formation Agronomique.

« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ».
(Nicolas Boileau)
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 02/02/2010, 09h44   #10 (permalink)
Modérateur
 
Avatar de sabotage
 
Date d'inscription: juillet 2005
Messages: 10 053
Par défaut

tu manques d'imagination :
Code :
 
$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 actuellement connecté   Envoyer un message privé Réponse avec citation
Vieux 02/02/2010, 10h10   #11 (permalink)
Membre éclairé
 
Avatar de RunCodePhp
 
Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 393
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 ?
__________________
Win XP | WampServer 2.0 | Apache 2.2.11 | Php 5.3.0 | MySQL 5.1.36
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
Vieux 02/02/2010, 10h47   #12 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
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
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/02/2010, 11h41   #13 (permalink)
Membre éclairé
 
Avatar de RunCodePhp
 
Date d'inscription: janvier 2010
Localisation: Ile De La Réunion
Messages: 393
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 :
 
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.0 | Apache 2.2.11 | Php 5.3.0 | MySQL 5.1.36
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
Vieux 02/02/2010, 12h03   #14 (permalink)
Nouveau membre du Club
 
Date d'inscription: juin 2008
Localisation: Là où il y a du calvados
Âge: 25
Messages: 55
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.
chouchouilloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/02/2010, 12h25   #15 (permalink)
Modérateur
 
Avatar de CinePhil
 
Nom : Philippe Leménager
Date d'inscription: août 2006
Localisation: Toulouse
Âge: 46
Messages: 4 798
Envoyer un message via MSN à CinePhil
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.
Futur ingénieur CNAM, ingénieur d'étude à l'École Nationale de Formation Agronomique.

« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ».
(Nicolas Boileau)
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation
NEWS PHPFAQ PHPCours PHPSources PHPLivres PHPScripts PHPOutils PHPComparatifsZend Framework

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 16h07.


Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.