Page 1 sur 1

Liste des membres par dernier MP posté

Posté : 13 nov. 2020, 17:44
par Couin
Couin Couiiiiin :D

Je butte sur une requête :(

Sur un module de tchat, les membres peuvent s'envoyer des MP entre eux. Par exemple A discute avec B .
Seulement, quand B n'est pas connecté, A ne peut plus accéder à sa conversation avec B.
J'ai donc fait un petit truc permettant au membre de visualiser les archives MP avec les autres membres.

Dans un premier temps, la liste de membres avec lesquels A a échangé des MP est affiché par ordre alphabétique, par la requête suivante :

Code : Tout sélectionner

SELECT DISTINCT tousername, touserid FROM blabax_messages WHERE userid = '$uid' AND touserid NOT LIKE 0 AND touserid NOT LIKE '$uid' ORDER BY tousername ASC
Dans laquelle :
- $uid est l'id du membre qui veut voir la liste des autres membres avec qui il a échangé les MP.
- touserid et tousername sont l'id et le nom des membres avec qui $uid a échangé.
- 0 correspond à aucun id membre, ce sont les messages postés dans le salon de tchat.

Je voudrais que la liste des membres avec qui A a discuté en MP, soit ordonnée par dernier MP.

Par exemple, A a discuté avec B et a discuté plus récemment avec D puis encore plus récemment avec C, je voudrais qu'il voit sa liste de cette manière :
C
D
B

J'ai bien sur tenté en rajoutant un ORDER BY timestamp DESC mais ca ne fonctionne pas, l'ordre est un peu n'importe comment.

Code : Tout sélectionner

SELECT * FROM blabax_messages WHERE userid = '$uid' AND touserid NOT LIKE 0 GROUP BY tousername ORDER BY timestamp DESC
ne fonctionne pas non plus :(

QUi qu'aurait une tite idééée ?
Merkouin ! :D
Couin

Re: Liste des membres par dernier MP posté

Posté : 14 nov. 2020, 07:47
par Couin
Pic Poc !

J'ai en attendant, fait un peu de bricolage, en fait je fais une requête triées par date descendante, et à chaque résultat je remplis un array si celui ci ne contient pas déjà ce résultat :

Code : Tout sélectionner

$tousername_arr = array(); $query = "SELECT tousername FROM blabax_messages WHERE (( userid = '$uid' AND touserid NOT LIKE 0) OR ( touserid = '$uid' AND userid NOT LIKE 0)) AND touserid NOT LIKE '$uid' ORDER BY timestamp DESC"; $requete = mysqli_query( $dbwrite, $query ) ; while( $result = mysqli_fetch_object( $requete ) ) { $tousername = $result->tousername; $tusrn = str_replace(" ","_", $tousername); if ( !in_array( $tousername , $tousername_arr ) ) { $tousername_arr[] = $tousername; echo "$tousername<br>"; } }
Je sais pas si il est possible de faire plus propre (une requête qui sorte directement les bons résultats voulus sans passer par un array), mais pour le coup le temps d'exécution est plutôt rapide.

A défaut de mieux je garderais cette solution .

Merkouin pour vos idées :D

Re: Liste des membres par dernier MP posté

Posté : 04 déc. 2020, 23:31
par two3d
Salut,

mysqli_fetch_object est obsolète, on utilise plus souvent mysqli_fetch_assoc ou array (perso j'utilise le assoc)

Ensuite pour ton champ timestamp, la règle est de ne jamais utiliser de mot qui peut causer des problème, par exemple; on nomme pas un champ "date" ce qui peut porter à confusion mais aussi être interprété par MySQL

Renomme timestamp en "quand" (je renomme mes champs en français au moins pas de souci et on comprends!)

Met "quand" en DATETIME et choisi de le préremplir avec CURRENT_TIMESTAMP

Tu verra ensuite que la gestion des dates en MySQL/PHP est un jeu d'enfant ;)

En espérant d'avoir aidé

Re: Liste des membres par dernier MP posté

Posté : 05 déc. 2020, 15:45
par Couin
Bonjour,

Je ne trouve pas d'info sur l'obsolescence de mysqli_fetch_object ?
De toute façon entre assoc, oject, array, c'est tellement flou :(

Pour le champs timestamp, je ne puis le changer, c'est un module de tchat déjà existant, ca m'imposerait de modifier toutes les pages se référant à ce champs, à chaque mise à jour.

Ceci dit, même avec un nom de champs différent et un assoc au lieu d'object, je ne vois toujours pas quelle requête SQL permettrait d'obtenir (dans phpmyadmin par exemple, où là php et ses fetchs n'interviennent pas) me permettrait d'obtenir le résultat voulu :(

Re: Liste des membres par dernier MP posté

Posté : 05 déc. 2020, 17:38
par two3d
La DOC PHP: https://www.php.net/manual/en/function. ... object.php

entre array et assoc: array permet d'avoir les résultat soit via le nom de la colonne (id, nom, prenom,...) ou soit par id (0,1,2,...) je préfère assoc car il sort les résultat par nom de colonne seulement: (nom, prenom,etc) ça fait moins de ressource utilisé, du moins je penses...

Quel format est le "timestamp" dans ta table ?

Re: Liste des membres par dernier MP posté

Posté : 06 déc. 2020, 03:26
par Couin
La doc est celle de mysql_fetch_object , pas mysqli_fetch_object qui n'indique pas que ce soit obsolète.

Dans la table, timestamp est un int(11) , les données sont de forme 1548298607 .

Re: Liste des membres par dernier MP posté

Posté : 06 déc. 2020, 09:38
par two3d
Au temps pour moi, désolé, c'est la version mysql et non mysqli qui est obsolète.

Comment est inséré le timestamp en PHP ? est il bien renseigné dans la BDD ?

Re: Liste des membres par dernier MP posté

Posté : 06 déc. 2020, 14:07
par Couin
Je ne comprends pas trop vers où on va ? Le tchat fonctionne bien, je veux juste utiliser les données déjà enregistrées pour sortir une liste de membres dans un certain ordre.

Re: Liste des membres par dernier MP posté

Posté : 06 déc. 2020, 17:12
par two3d
"J'ai bien sur tenté en rajoutant un ORDER BY timestamp DESC mais ca ne fonctionne pas, l'ordre est un peu n'importe comment."

Je tente de savoir pourquoi, c'est peut être du a l'insertion des données, je sais pas...

si tu fait order by timestamp sur un seul ID, ça fonctionne bien ? c'est quand tu essaye de rassemble plusieurs ID que tu a un résultat bizarre ?

Re: Liste des membres par dernier MP posté

Posté : 16 déc. 2020, 19:38
par Ryle
Hello !

Je plussois le fait de ne pas utiliser des mots clés réserver au langage SQL comme nom de table ou de colonne et t'invite si ce n'est déjà fait, à renommer ta colonne "timestamp" en "message_timestamp" ou autre (pas "date", c'est aussi réservé ;)). Au pire tu peux utiliser les `quotes` spéciale de protection de mysql, mais c'est s'embêter pour rien et ça ne fonctionne de toute façon qu'avec mysql, autant prendre l'habitude de nommer ton champ correctement :)

Pour l'ordre aléatoire, c'est lié au fait que tu utilises un order by sur une colonne qui n'est pas présente dans le résultat de ta requête (ce qui d'ordinaire n'est pas problématique, sauf que tu utilises group by :)). Ton timestamp étant différent pour chaque enregistrement et n'étant pas inclus dans ton group by, MySQL est incapable de savoir lequel utiliser pour trier les résultats.

Pour contourner le problème, tu peux procéder en deux temps avec une sous requête :
SELECT DISTINCT tousername, touserid FROM ( 
    SELECT tousername, touserid, `timestamp`
    FROM blabax_messages  
    WHERE userid = '$uid' AND touserid != 0 AND touserid != userid
    ORDER BY `timestamp` DESC
)
(à tester, mais ça devrait faire l'affaire :))

Pas sûr pour autant que les conditions touserid != 0 AND touserid != userid aient un réel intérêt, à toi de voir si on peut poster un message à personne ou à soi-même :)

A noter qu'il vaut mieux remplacer tes LIKE par un simple = ou != quand tu n'utilises pas de "%" (soit la valeur est égale à, soit elle ne l'est pas, l'instruction like permet de rechercher des chaines partielles avec des jokers). Outre le fait que ça sera plus facile à lire, ça améliorera les performances ;)

Re: Liste des membres par dernier MP posté

Posté : 28 déc. 2020, 22:47
par Couin
Coucoutte :)

Je ne peux pas renommer les colonnes, ou alors qu'il faudrait que je fasse les modifs dans totues les pages du modules de tchat, un turc à rendre dingue surtout si faut les refaire à chaque MAJ :(

Je vais voir ASAP avec la requête proposée :)
Et aussi pour les =/ !/ vs LIKE/NOT LIKE , c’est bon à savoir !

Re: Liste des membres par dernier MP posté

Posté : 04 janv. 2021, 13:34
par Ryle
Ah ben non l'idée est de renommer tes colonnes pour avoir une base de données propre une fois pour toute :)

Donc oui, ça implique les renommer également dans ton code (ce qui peut être fastidieux si cela n'est pas centralisé), mais tu ne le fais qu'une fois. Et les éditeurs de code ont des outils de recherche et remplacement assez évolués pour te faciliter la tâche ;)

Après, pour savoir si ça vaut la peine ou pas, c'est toujours une question de contexte et d'investissement... si c'est un projet perso sans conséquence et que tu sais que ton code ne sera jamais maintenu par un dangereux psychopathe qui connait ton adresse, pas besoin de se prendre la tête :)
Mais ça restera néanmoins une bonne habitude à prendre et à avoir pour tes futurs projets :)

Ps : des fois le dangereux psychopathe, ça peut même être toi... je me suis déjà collé des baffes en galérant à reprendre un ancien code que j'avais moi même réalisé ;)

Re: Liste des membres par dernier MP posté

Posté : 27 janv. 2021, 16:28
par Couin
Je pense que nous dévions du sujet de plus en plus. Le nom de colonne n'est pas en cause (testé en dupliquant la table et en changeant le nom de la colonne, ça ne change rien). Le tchat en question n'est pas ma création, j’ai déjà apporté quelques modifications pour le customiser, ce qui m'impose à chaque nouvelle version, de reporter ces modification (donc comparer 3 dossiers : celui de la version actuelle modifiée, celui de version actuelle d’origine, et celui de la nouvelle version d'origine, pour savoir ce qui a changé et où, c’est déjà un boulot de ouf).

La requête suggérée ne fonctionnait pas, en fait il fallait que je rajoute AS tbl1 après la parenthèse :)
Le résultat semble déjà très correcte, je vais travailler autour de cette requête car j'ai aussi la couleur d'écriture dernièrement utilisée (pour mettre les pseudos en couleur dans la liste).

Donc le canard repassera pour mettre en résolu (ou questionner, le cas échéant lol )..
M'ci :)

Re: Liste des membres par dernier MP posté

Posté : 28 janv. 2021, 01:26
par Couin
Reu !

Bon, je ne m'en sors pas du tout....

J'ai fais tout un tas d'essais pour d'abord avoir la liste des dernières couleurs d'écriture autre que blanc de chaque membre, ca c'est ok, mais pour sortir la liste des membres par discussion de la plus récente à la moins récente, la requête (dans PhPMyAdmin) :

Code : Tout sélectionner

SELECT DISTINCT username, tousername FROM ( SELECT username,tousername FROM blabax_messages2 WHERE ( userid = '1' OR touserid = '1') AND touserid != 0 AND touserid != userid ORDER BY `heuremessage` DESC ) As tablebidon
ne me donne pas le même ordre sur mon (vieux - MySQL 5.5.22) serveur (qui me donne le bon ordre) que sur le serveur (plus récent - MySQL 5.7.30) de l'hébergeur (qui me donne un ordre incorrect).
Qu'est-ce que c'est c'est qu'cette blague encore ? pfffff ... Incroyable de m'faire ch.... comme ca pour un truc qui devrait être SIMPLE :(

Une tite nidée ?

Merkouin