salut,
la solution simple est une table de liaison dont chaque ligne correspond à l'identifiant d'un utilisateur et celui d'un post lu avec par exemple les tables:
- posts_lus(id,iduser,idpost)
- posts(id,sujet,texte)
- utilisateurs(id,pseudo)
quels sont les posts non lus par l'utilisateur "machin"?
1 2 3 4 5 6 7 8 9
| select sujet
from posts
where id not in
(select idpost
from posts_lus
where iduser=
(select id
from utilisateurs
where pseudo='machin')) |
il sera bon de tout mettre dans des procédures stockées ça permet d'avoir quasiment de code sql dans ton php...
la même requête version procédure, code de création:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| delimiter $$
drop procedure if exists post_lus$$
create procedure post_lus(in pseudo_u varchar(64))
begin
select sujet
from posts
where id not in
(select idpost
from posts_lus
where iduser=
(select id
from utilisateurs
where pseudo=pseudo_u));
end$$
delemiter ; |
et pour l'appel:
call posts_lus('machin');
avantages :
- ça rend plus compacts tes appels dans php...
- tu cache la structure de tes tables
- quand tu testes ou modifies une procédures tant que le résultat à la même forme tu ne retouches pas ton code php (comme la séparation css/html)
- si tu veux aller plus loin tu peux aussi augmenter la sécurité en créant un utilisateur mysql qui n'a que "grant execute" sur la bd de ton forum... du coup, il ne peut qu'exécuter des procédures stockée et rien faire d'autre quand tu te connectes avec lui... tu peux même ne pas lui donner de mot de passe... si un mec arrive à hacker ton php il pourra pas pourrir ta bd avec l'identifiant et le mot de pas de cet utilisateur mysql...
et, bien entendu, arrêtes d'utiliser les connecteurs mysql et mysqli pour te connecter à mysql mais utilises PDO car les 2 autres ne sont plus maintenus et peuvent disparaitre à n'importe quelle future version de php
Partager