Gelezen of niet?
Iedereen kent het wel, als je een mail ontvangt, en je hebt die nog niet gelezen, dan staat die in een ander kleur/vetjes (etc.)
Nu heb ik niet met een mail gewerkt, maar met mededelingen.
Een mededeling kan door iedereen gelezen worden.
Ik wil, als je de mededeling gelezen hebt, dat de mededeling niet meer in een ander kleur komt te staan.
Hoe pak ik dit het best aan?
Diov
Daarna moet je kijken hoe je de situatie gaat aanpakken: Heb je AJAX nodig of kan het allemaal server-side?
Me vraag is eigenlijk, zet ik dan de gebruiker_id in een aparte tabel samen met het topic-id?
& hoe controleer ik dan eigenlijk of het id daar bevind?
Is dat dan gewoon met mysqli_num_rows ?
Diov
Dan kun je een koppeltabel aanmaken tussen de berichten-tabel en de user-tabel:
user_id
mededeling_id
Als iemand een mededeling leest, zet je dit in de koppeltabel.
Als de combi van user en mededeling in de tabel bestaat (mysql_num_rows > 0), dan moet de gewone kleur weergegeven worden
Gewijzigd op 12/05/2013 16:52:44 door Wouter J
@Wouter: wat bedoel je daarmee?
users
id
name
...
notifications
id
...
user_id
En dan kun je queries als SELECT ... FROM notifications WHERE user_id = ... gebruiken. Het gebruik van een koppeltabel is dan naar mijn mening veel te ingewikkeld en onnodig.
Moet je dan niet een heleboel kolommen user_id aanmaken? Of berichten dubbel plaatsen met verschillende user-id's?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$sql_select_berichten = "SELECT m.id, m.onderwerp, m.plaatser, m.datum, g.id, g.user_id, g.topic_id
FROM mededelingen As m
LEFT JOIN mededelingen_gelezen As g
ON m.plaatser = g.topic_id
ORDER BY datum ASC
";
FROM mededelingen As m
LEFT JOIN mededelingen_gelezen As g
ON m.plaatser = g.topic_id
ORDER BY datum ASC
";
Dus, nu wil ik controleren of g.user_id (of g.topic_id) bestaat.
Is dat dan gewoon zoiets:
Code (php)
Edit: verkeerde ON . Even aangepast
Gewijzigd op 12/05/2013 17:12:08 door - Diov -
Als het zo is dat elke notificatie meerdere users kan hebben, en dus een n-n of ManyToMany relatie hebben, dan moet je inderdaad wel een koppeltabel hebben.
Nu vraag ik me af hoe ik controleer of de mededeling gelezen is.
een tabel met ongelezen meldingen noem je mededelingen_gelezen?
Ik dacht dat je het volgende bedoelde:
-> Gebruiker drukt op de ongelezen mededeling : er komt een record in de database (mededelingen_gelezen)
Dus, jij zou het anders doen:
Telkens je een nieuwe mededeling komt, per gebruiker een record toevoegen in de database?
een voorbeeldje gemaakt, omdat je het volgens mij nog niet helemaal door hebt.
Even Gewijzigd op 12/05/2013 17:29:13 door Wouter J
Maar Ger, is een koppeltabel niet veel te lastig voor zoiets? (maw, wat zou je zelf doen?)
Als ik Diov goed begrijp heeft hij dezelfde mededelingen voor alle gebruikers, en dan kan je niet zonder koppeltabel.
Zoals bij phpBB waar een mededeling een bericht is voor ALLE gebruikers die echt belangrijk is?
Of meer zoals Facebook, waar het meer een 'persoonlijk bericht' is?
In geval phpBB: koppeltabel: 1 bericht moet door alle leden gelezen worden >> user leest bericht = rij toevoegen
In geval Facebook: geen koppeltabel, maar zoals Wouter J omschrijft.
Inderdaad, het moet voor alle gebruikers zichtbaar zijn.
Alleen snap ik dit niet van Ger in de query:
IF(g.mededeling_id IS NULL, 0, 1) gelezen
Een id zal toch nooit NULL, 0 of 1 bevatten (bijna nooit)
Je leest die functie verkeerd, het is IF(conditie, waarde-bij-true, waarde-bij-false)
- Diov - op 12/05/2013 21:25:34:
Alleen snap ik dit niet van Ger in de query:
IF(g.mededeling_id IS NULL, 0, 1) gelezen
Een id zal toch nooit NULL, 0 of 1 bevatten (bijna nooit)
IF(g.mededeling_id IS NULL, 0, 1) gelezen
Een id zal toch nooit NULL, 0 of 1 bevatten (bijna nooit)
Dit is een if-then-else-constructie. Als een gebruiker een bericht nog niet gelezen heeft, zal de gejoinde kolom g.mededeling_id de waarde NULL bevatten. De kolom 'gelezen' krijgt in dat geval de waarde 0. Als het bericht wel gelezen is, is g.mededeling_id niet NULL en krijgt gelezen de waarde 1.
Voor het mooie zou je het eigenlijk moeten herschrijven als:
IF(g.mededeling_id IS NULL, 0, 1) AS gelezen
zodat het duidelijker is dat de return-waarde van het IF-statement wordt toegekend aan de kolom 'gelezen'.
Gewijzigd op 12/05/2013 23:11:35 door Willem vp