[RESOLU] Affichage anticipé

Eléphant du PHP | 256 Messages

30 mai 2016, 15:37

Je viens de constater un autre problème.
Certains utilisateurs sont parvenus à s'enregistrer plusieurs fois, j'ai donc par exemple 2 lignes dans la 2ème table avec le même Userid.
J'ai l'impression que INNER JOIN RVRTusers as rusers ON rlog.Userid = rusers.Userid génère alors 2 records pour le même record rlog.
Comment l'éviter ?

Mammouth du PHP | 1029 Messages

30 mai 2016, 15:55

Si il y a deux lignes, c'est que le problème se pose en amont, la question est de savoir comment ils ont pu s'inscrire deux fois avec le même Usrerid, puisque celui-ci est censé être unique.
Il n'est pas possible d'éviter d'afficher ces deux lignes, la seule façon est des les retrouver et de les supprimer.
Il faut revoir l'insertion pour éviter les doublons.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

30 mai 2016, 16:33

la question est de savoir comment ils ont pu s'inscrire deux fois avec le même Usrerid
Ce n'est pas compliqué : l'inscription a lieu en VB6; je n'ai pas trouvé comment insérer un enregistrement MySQL en VB6; alors le programme VB6 crée un fichier sur mon serveur; "de temps en temps" un script php récupère les fichiers et injecte les enregistrement en MySQL.
VB6 ne peut pas vérifier qu'il y a des doublons et MySQL ne le fait pas puisqu'il n'est pas maître (il est trop tard pour dire à l'utilisateur que le Userid existe déjà); en fait ça m'est égal qu'il y ait des doublons de Userid parce que
  • si c'est un vrai doublon (même userid, même nom, même prénom, même mail) peu importe qu'il soit inscrit 2 fois
  • si c'est un faux doublon (même userid mais au moins un des autres champs différents) alors ce sont vraiment 2 personnes différentes même si elles ont le même userid.
La seule chose qui me dérange est que le script de statistique compte que tel module a été utilisé 2 fois au même moment par le même userid alors qu'il n'a été utilisé qu'une fois.

Mammouth du PHP | 1029 Messages

30 mai 2016, 16:38

Ton truc me semble un peu compliqué..soit.
Dans ton script php, tu pourrais d'avoir faire une requête pour voir si le userid existe, si oui tu passes, sinon tu insères.

Tu peux ouvrir un autre post avec cette problématique et fournir le code.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

30 mai 2016, 16:44

Tu peux ouvrir un autre post avec cette problématique et fournir le code.
Le code est celui auquel on est finalement arrivé pour réduire le temps d'affichage, objet de ce post, à savoir

Code : Tout sélectionner

$results = mysql_query(" SELECT rlog.Userid as 'Userid',DATE_FORMAT(rlog.Timestamp , '%d/%m/%Y') as 'date_jour', DATE_FORMAT(rlog.Timestamp , '%T') as 'heure_jour',rlog.Version,rlog.Module,rusers.Prenom,rusers.Nom,rusers.Email FROM RVRTlog as rlog INNER JOIN RVRTusers as rusers ON rlog.Userid = rusers.Userid ORDER BY rlog.Timestamp DESC "); while ($result = mysql_fetch_array($results)) { echo "<tr><td>" . $result['date_jour'] . "</td><td>" . $result['heure_jour'] . "</td><td>" . $result['Version'] . "</td><td>" . $result['Module'] . "</td>"; echo "<td>" . $result['Userid']. "</td><td>" . $result['Prenom'] . "</td><td>" . $result['Nom'] . "</td><td>" . $result['Email'] . "</td></tr>";

Mammouth du PHP | 1029 Messages

30 mai 2016, 16:48

Non, je parlais celui de l'enregistrement en db
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

30 mai 2016, 17:01

Ce sont des fichiers texte .pwd
qui contiennent un seul record date;userid;prenom;nom;email

Code : Tout sélectionner

$dir = opendir("Users"); while($file = readdir($dir)) { if(substr($file,-3)=="pwd") { $myfile = fopen("Users/".$file, "r") or die("Unable to open file!"); $Record = fgets($myfile); $Sep1=strpos($Record,";"); $Sep2=strpos($Record,";",$Sep1+1); $Sep3=strpos($Record,";",$Sep2+1); $Sep4=strpos($Record,";",$Sep3+1); $Date = substr($Record,0,$Sep1); $Userid = substr($Record,$Sep1+1,$Sep2-$Sep1-1); $Prenom = substr($Record,$Sep2+1,$Sep3-$Sep2-1); $Nom = substr($Record,$Sep3+1,$Sep4-$Sep3-1); $Email = trim(substr($Record,$Sep4+1)); mysql_query("INSERT INTO RVRTusers (Dates, Userid, Prenom, Nom, Email) VALUES ('$Date', '$Userid', '$Prenom', '$Nom', '$Email')") or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); fclose($myfile); unlink("Users/".$file); echo "<br>Enregistré : ".$Date." ".$Userid; } }
Remarque que j'ai ajoute "trim" à la ligne $Email = trim(substr($Record,$Sep4+1));
afin de supprimer lf/cr.

Ceci étant je ne vois pas pourquoi il faudrait modifier ce script.

Eléphant du PHP | 256 Messages

01 juin 2016, 12:23

Il n'est pas possible d'éviter d'afficher ces deux lignes, la seule façon est des les retrouver et de les supprimer.
Il suffit de vérifier si 2 lignes successives sont identiques (même timestamp, même userid).
Plus précisément n'afficher une ligne que si timestamp ou userid est différent de la ligne précédente.

Mammouth du PHP | 1029 Messages

02 juin 2016, 10:21

Si j'ai un Userid identique mais un timestamp différents alors il faut afficher les deux lignes ?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

02 juin 2016, 10:24

Si j'ai un Userid identique mais un timestamp différents alors il faut afficher les deux lignes ?
Ben oui, c'est un log d'utilisation du logiciel, ce cas signifie qu'un même utilisateur a utilisé le logiciel à 2 moments différents, donc on compte 2 utilisations.

Code : Tout sélectionner

$PrevDate=""; $PrevTime=""; $PrevUser=""; while ($result = mysql_fetch_array($results)) { $Date=$result['date_jour']; if($PrevDate <> "" AND $Date <> $PrevDate) { echo "<tr><td colspan=8></td></tr>"; // Une ligne de tableau vide quand on change de date } $PrevDate=$Date; if($PrevTime<>$result['heure_jour'] OR $PrevUser<>$result['Userid']) // Evite les doublons de la table Users { echo "<tr><td>" . $Date . "</td><td>" . $result['heure_jour'] . "</td><td>" . $result['Version'] . "</td><td>" . $result['Module'] . "</td>"; echo "<td>" . $result['Userid']."</td><td>" . $result['Prenom'] . "</td><td>" . $result['Nom'] . "</td><td>" . $result['Email'] . "</td></tr>"; } $PrevTime=$result['heure_jour']; $PrevUser=$result['Userid']; }

Mammouth du PHP | 1029 Messages

02 juin 2016, 10:37

Ok, donc ceci devrais correspondre, a vérifier ,

Code : Tout sélectionner

SELECT DISTINCT(DATE_FORMAT(rlog.Timestamp , '%d/%m/%Y')) as 'date_jour', rlog.Userid as 'Userid', DATE_FORMAT(rlog.Timestamp , '%T') as 'heure_jour',rlog.Version,rlog.Module,rusers.Prenom,rusers.Nom,rusers.Email FROM RVRTlog as rlog INNER JOIN RVRTusers as rusers ON rlog.Userid = rusers.Userid ORDER BY rlog.Timestamp DESC
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

02 juin 2016, 10:44

Non parce que tu ne sélectionnes que les dates différentes.
Si plusieurs utilisateurs utilisent le logiciel le même jour tu n'auras qu'une ligne.
Il faudrait quelque chose comme
SELECT DISTINCT(DATE_FORMAT(rlog.Timestamp , '%T') as 'heure_jour' AND rlog.Userid as 'Userid')

Mammouth du PHP | 1029 Messages

02 juin 2016, 10:59

Nop, après tests sur mes propres données en faisant un distinct sur la date j'ai bien les utilisateurs différents aux même dates;

2008-10-02 2
2008-10-02 15
2008-10-02 19
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

26 juin 2016, 17:22

Bonjour,
Je suppose que le Select est devenu trop volumineux car j'ai l'erreur suivante
The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay

Pouvez-vous me dire comment et où je dois ajouter cette instruction SET SQL_BIG_SELECTS=1 ?
J'ai essayé mais j'ai une erreur de syntaxe.
Merci

Eléphant du PHP | 256 Messages

01 août 2016, 17:15

Bonjour,
Tout fonctionne toujours bien mais le listing devient inutilement long, je voudrais le limiter au dernier mois.
Je vous rappelle le select

Code : Tout sélectionner

$results = mysql_query("SELECT rlog.Userid as 'Userid', DATE_FORMAT(rlog.Timestamp , '%d/%m/%Y') as 'date_jour', DATE_FORMAT(rlog.Timestamp , '%T') as 'heure_jour', rlog.Version, rlog.Module, rusers.Prenom, rusers.Nom, rusers.Email FROM RVRTlog as rlog INNER JOIN RVRTusers as rusers ON rlog.Userid = rusers.Userid ORDER BY rlog.Timestamp DESC ");
j'ai ajouté avant le JOIN
WHERE rlog.Timestamp > (NOW() - INTERVAL 1 MONTH)
mais je reçois cette erreur que je ne comprends pas
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INNER JOIN RVRTusers as rusers ON rlog.Userid = rusers.Userid ORDER BY rlog.Time' at line 5

Merci d'avance pour votre aide.