[RESOLU] Affichage anticipé

Eléphant du PHP | 256 Messages

26 mai 2016, 10:22

Quel-sont les champs de la table RVRTusers ? est-ce que Userid est nommé de cette façon ?
Comme déjà dit ceci fonctionne

Code : Tout sélectionner

$users = mysql_query("SELECT * FROM RVRTusers where Userid like '%".$Userid."%' order by Dates desc"); if (!$users) die(mysql_error()); $user = mysql_fetch_array($users); echo "<td>".$Userid."</td><td>".$user['Prenom']."</td><td>".$user['Nom']."</td><td>".$user['Email']."</td></tr>";

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 mai 2016, 12:53

Bonjour,

Un Mysql_fetch_assoc sera un chouille plus performant que fetch_array

Sinon côté optimisation, pourquoi faire recalculer à mysql la date et heure du jour à chaque enregistrement retourné ?
Calcul le directement en php une seule fois avant de faire ta requête :)


Édit : et au lieu de faire une nouvelle requête dans ton while (et donc faire executer autant de requêtes que tu as d'enregistrements), tu dois pouvoir faire une jointure entre tes deux tables et ainsi n'avoir qu'une requête a exécuter.

Un "=" pour comparer les ids sera plus efficace qu'un like.

Enfin, assure toi que les types de champs en base sont bons et ajoutes au besoin des index ou des clés unique sur les champs que tu sollicites dans tes clauses where. Cela augmentera aussi les performances et temps de réponse ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 256 Messages

26 mai 2016, 16:32

pourquoi faire recalculer à mysql la date et heure du jour à chaque enregistrement retourné ?
Calcul le directement en php une seule fois avant de faire ta requête
Parce qu'il s'agit d'une zone qui contient la date et l'heure auxquelles l'enregistrement a été enregistré; je ne peux donc pas la connaître avant de faire la requête.
Le contenu est en format texte sous la forme yymmddhhmmss; je ne calcule rien, j'ajoute seulement les / et les : pour avoir dd/mm/yy hh:mm:ss
au lieu de faire une nouvelle requête dans ton while (et donc faire executer autant de requêtes que tu as d'enregistrements), tu dois pouvoir faire une jointure entre tes deux tables et ainsi n'avoir qu'une requête a exécuter.
Je comprends ce que tu veux dire; peux-tu m'expliquer comment on fait ?
Un "=" pour comparer les ids sera plus efficace qu'un like.
Je ne sais pas pourquoi ça ne fonctionne pas; si je fais
$users = mysql_query("SELECT * FROM RVRTusers where Userid = '%".$Userid."%' order by Dates desc");
if (!$users) die(mysql_error());
$user = mysql_fetch_array($users);
il ne trouve pas d'enregistrement pour cet userid alors qu'avec like il trouve !?!
assure toi que les types de champs en base sont bons et ajoutes au besoin des index ou des clés unique sur les champs que tu sollicites dans tes clauses where. Cela augmentera aussi les performances et temps de réponse
Le problème est que je n'ai pas de clé unique, userid mis à part.

Mammouth du PHP | 1967 Messages

26 mai 2016, 16:49

Je ne sais pas pourquoi ça ne fonctionne pas; si je fais
$users = mysql_query("SELECT * FROM RVRTusers where Userid = '%".$Userid."%' order by Dates desc");
if (!$users) die(mysql_error());
$user = mysql_fetch_array($users);
il ne trouve pas d'enregistrement pour cet userid alors qu'avec like il trouve !?!
avec un =, il ne faut pas mettre tes %
$users = mysql_query("SELECT * FROM RVRTusers where Userid = '".$Userid."' order by Dates desc");
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 1029 Messages

26 mai 2016, 17:11

au lieu de faire une nouvelle requête dans ton while (et donc faire executer autant de requêtes que tu as d'enregistrements), tu dois pouvoir faire une jointure entre tes deux tables et ainsi n'avoir qu'une requête a exécuter.
Je comprends ce que tu veux dire; peux-tu m'expliquer comment on fait ?
Ce que te propose Ryle c'est de transformer en ceci :

Code : Tout sélectionner

$results = mysql_query(" SELECT trim(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>"; }
Maintenant on se base, sur les infos qu'on reçoit, faudra peut-être affiner.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

26 mai 2016, 17:14

avec un =, il ne faut pas mettre tes %
$users = mysql_query("SELECT * FROM RVRTusers where Userid = '".$Userid."' order by Dates desc");
Effectivement, ça fonctionne et c'est un poil plus rapide (15 secondes au lieu de 17 pour 8675 records dans la première table).
Ce que te propose Ryle c'est de transformer en ceci :
Il y a manifestement deux ; en trop
echo "<tr><td>" . $result['date_jour'];
. "</td><td>" . $result['heure_jour'];
. "</td><td>" . $result['Version'] . "</td><td>" . $result['Module'] . "</td>";
je les ai donc supprimés mais le résultat est vide (le while ne trouve aucun enregistrement).

Mammouth du PHP | 1029 Messages

26 mai 2016, 17:53

Et si tu prends juste la requête dans PhpMyAdmin, cela retourne rien ?

Car potentiellement en allant vers ce cas, tu feras une requête au lieu de 8675.
Donc ceci dans un ide SQL :

Code : Tout sélectionner

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
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

26 mai 2016, 18:10

Et si tu prends juste la requête dans PhpMyAdmin, cela retourne rien ?
MySQL returned an empty result set (i.e. zero rows).

Mammouth du PHP | 1029 Messages

27 mai 2016, 09:22

Et si tu remplaces le INNER JOIN par un LEFT JOIN ?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

27 mai 2016, 09:38

Et si tu remplaces le INNER JOIN par un LEFT JOIN ?
Là ça donne un résultat mais incomplet, par exemple la première ligne :
Userid : ok
date_jour : 27/05/2016
heure_jour : 09:05:18
version : 160520
Module : Verre
Prenom : NULL
Nom : NULL
Email : NULL
Il ne trouve donc toujours pas le userid dans la seconde table.

Mammouth du PHP | 1029 Messages

27 mai 2016, 09:45

Ok on avance, peux tu maintenant vérifier que le Userid que tu me montres dans RVTLog se trouve dans RVTusers ?
Peux-tu aussi confirmer que Userid est écrit de la même façon dans les deux tables ?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

27 mai 2016, 10:21

peux tu maintenant vérifier que le Userid que tu me montres dans RVTLog se trouve dans RVTusers ?
Peux-tu aussi confirmer que Userid est écrit de la même façon dans les deux tables ?
Ben oui puisque ceci fonctionne

Code : Tout sélectionner

$users = mysql_query("SELECT * FROM RVRTusers where Userid = '".$Userid."' order by Dates desc"); $user = mysql_fetch_array($users); echo "<td>".$Userid."</td><td>".$user['Prenom']."</td><td>".$user['Nom']."</td><td>".$user['Email']."</td></tr>";
$Userid provient de la première table et il trouve bien Prenom, Nom et Email dans la seconde.

Mon userid par exemple "Hervé-PRD" apparaît bien ainsi dans les 2 tables (vérifié avec phpMyAdmin).

Mammouth du PHP | 1029 Messages

27 mai 2016, 10:40

Ok, je comprend mieux certain point, peux tester en remplaçant la vérification de la jointure.

ON trim(rlog.Userid)=trim(rusers.Usierid)

Normalement on devrais avoir plus de résultats.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 256 Messages

27 mai 2016, 10:53

Voici le select complet, avec LEFT JOIN et TRIM sur le Userid

Code : Tout sélectionner

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 LEFT JOIN RVRTusers as rusers ON trim(rlog.Userid) = trim(rusers.Userid) ORDER BY rlog.Timestamp DESC
J'ai toujours NULL pour Prenom, Nom et Email.

Avatar du membre
Mammouth du PHP | 1609 Messages

27 mai 2016, 11:43

Bonjour Herve_be, il y a visiblement un problème entre les colonnes Userid de tes 2 tables. Plus le coup des trim qui suggère qu'il y a peut être des espaces en trop devant ou derrière...

Si tu fais un SELECT * FROM RVRTusers WHERE Userid = 'Hervé-PRD'; obtiens tu une ligne en retour ?
Pareil avec la table des logs, un SELECT * FROM RVRTlog WHERE Userid = 'Hervé-PRD'; retourne bien des lignes ?
Modifié en dernier par Saian le 27 mai 2016, 16:30, modifié 1 fois.
Développeur web depuis + de 20 ans