Ik maak een messageboard voor een groep vrijwilligers. Hierop kan men berichten plaatsen voor elkaar. Deze berichten kunnen per gebruiker gemarkeerd worden als gelezen. Onder ieder bericht komt een table met fotos van de leden. De URL van deze foto is opgeslagen in een tabel in een database. Als een gebruiker op zijn foto klikt, dan veranderd zijn foto in een andere foto, zodat hij weet dat hij dit bericht gelezen heeft. Deze functie werkt prima.

Maar, probleem is dat ik al die gebruikers nu handmatig moet invoeren. Dat betekent dat zodra er een nieuwe vrijwilliger bijkomt, ik een tabel voor hem moet aanmaken en de code moet aanpassen om hem toe te voegen onder een bericht.

Wat ik wil bereiken is dat nieuwe leden automatisch worden toegevoegd. Ik heb een tabel waar alle leden in staan, deze kan bewerkt en opgeroepen worden door een pagina. Ik wil dat, als ik op deze ledenpagina een gebruiker toevoeg, deze nieuwe persoon ook automatisch onder alle berichten wordt geplaatst. En zodra een vrijwilliger weggaat, hij niet meer gedisplayd wordt onder een bericht.

Als ik nu de gegevens van alle leden inlaad via een `mysql_fetch_array` functie direct onder ieder bericht, dan creƫer ik geen unieke. Dat wil zeggen dat als persoon A bericht 1 wil afvinken, hij op alle geplaatste berichten afgevinkt wordt en niet alleen voor bericht 1. Ik wil dus dat ieder bericht een unieke table krijgt met alle leden erin (welke dus uit de database gehaald wordt), waarbij alleen dat bericht de gebruiker afgevinkt wordt.

Hoe doe ik dit?

Wat ik tot nu toe heb:

<b>De tabel db_users</b>

    id (AI), primary
    naam (varchar), 255
    adres (varchar), 255
    email (varchar), 255
    isActief (varchar), 5 //als deze `value` op ja staat, dan wordt zijn foto wel zichtbaar onder ieder bericht. Als deze `value` op nee staat dan wordt hij niet meer getoond.


<b>De tabel db_messages</b>

     id (AI), primary
     naam (varchar), 255 //de naam van de persoon die het bericht plaatst
     bericht (varchar), 999 //het bericht zelf
     urlUserA // De url van de foto van vrijwilliger A
     urlUserB // De url van de foto van vrijwilliger B
     urlUserC // De url van de foto van vrijwilliger C

<b>mark_read.php</b>

    $sql2 = "SELECT * FROM $tbl_name WHERE id = ".$_GET['id']; //om het specifieke bericht te krijgen
    $result2 = mysql_query($sql2);
    $url = $_GET['url']; // De url van de MARKEER-GELEZEN foto				
    $recover = $_GET['recover']; // De url van de MARKEER-ONGELEZEN foto		
    $tabel = $_GET['tabel'];
    $id = $_GET['id'];
    $date = $_GET['date'];
    $row = mysql_fetch_assoc($result2);			
    $tabel_content = $row[$tabel];

    if ($tabel_content == $url){
    	$sql = "UPDATE " . mysql_real_escape_string($tbl_name) .
           " SET ".$_GET['tabel']." = '".$_GET['recover'].
           "' WHERE id = ".$_GET['id'];
      $result = mysql_query($sql);
    } 
    elseif ($tabel_content == $recover) {
    	$sql = "UPDATE " . mysql_real_escape_string($tbl_name) .
           " SET ".$_GET['tabel']." = '".$_GET['url'].
           "' WHERE id = ".$_GET['id'];
      $result = mysql_query($sql);
    }

Bovenstaande code is er om te kijken of een gebruiker het bericht al gelezen heeft of niet. Als hij gemarkeerd is wordt dit ongedaan gemaakt na klikken. Als dit bericht ongelezen is wordt hij gemarkeerd na klikken.

Zoals je kunt zien moet ik dus iedere keer een gebruiker toevoegen aan de code en aan de tabel, een hoop omslachtig werk. Ik wil dus dat als ik in `db_user` een gebruiker toevoeg, hij ook meteen zichtbaar is onder de berichten, zonder een nieuwe table `urlUserD` aan te hoeven maken.

Het bericht wordt geplaatst via deze pagina:

<b>addMSG.php</b>

    mysql_connect("$host", "$username", "$password")or die("cannot connect");
    mysql_select_db("$db_name")or die("cannot select DB");

    $onderwerp = $_POST['onderwerp'];
    $datum = $_POST['datum'];
    $bericht = $_POST['bericht'];
    $naam = $_POST['naam']; // de naam van de persoon die het bericht plaatst

    $sql="INSERT INTO $tbl_name(
    datum,
    archief,
    jaar, 
    bericht, 
    naam,
    onderwerp
    )
    VALUES(
    '$datum',
    'nee',
    '2014', 
    '$bericht', 
    '$naam',
    '$onderwerp'
    )";

    $result = mysql_query($sql);


Hoe (en waar) maak ik een code om alles aan elkaar te koppelen?
Gelieve code tussen [code] en [/code] tags plaatsen.
Rechts bovenin je bericht kun je deze wijzigen. Alvast bedankt.
Jeffrey van Zwam op 14/05/2014 10:37:02

Maar, probleem is dat ik al die gebruikers nu handmatig moet invoeren. Dat betekent dat zodra er een nieuwe vrijwilliger bijkomt, ik een database voor hem moet aanmaken en de code moet aanpassen om hem toe te voegen onder een bericht.

Wat ik wil bereiken is dat nieuwe leden automatisch worden toegevoegd. Ik heb een database waar alle leden in staan, deze kan bewerkt en opgeroepen worden door een pagina. Ik wil dat, als ik op deze ledenpagina een gebruiker toevoeg, deze nieuwe persoon ook automatisch onder alle berichten wordt geplaatst. En zodra een vrijwilliger weggaat, hij niet meer gedisplayd wordt onder een bericht.

Ten eerste: weet waar je het over hebt. Overal waar je zegt 'database' hierboven bedoel je tabel. Per site werk je over het algemeen met 1 database, niet met meerdere. Laat staan dat je voor elke gebruiker een eigen database gaat aanmaken!

Tevens ga je ook niet voor elke nieuwe gebruiker een tabel aanmaken, hooguit een record in de users tabel. Vervolgens heb je en tabel met de berichten en die berichten moeten aan gebruikers worden gekoppeld. Dat is een zogenaamde many-to-many relatie. Elk bericht kan door meerdere gebruikers gelezen worden en elke gebruiker kan meerdere berichten lezen. Om deze relatie op te slaan maak je een koppeltabel aan in de database. Die koppeltabel koppelt de berichten aan de gebruiker. Elke keer dat een gebruiker een bericht leest, plaats je een nieuw record in die koppeltabel met het id van het bericht en het id van de gebruiker. Mocht een gebruiker het bericht weer willen terugzetten naar 'ongelezen' dan haal je dat record gewoon weer weg.
Als je dan voor een bepaald bericht wilt zien welke gebruiker het bericht hebben gelezen, dan kan je met een simpele query alle records voor dat bericht uit de koppeltabel ophalen.

maar hoe kom ik aan die ID? Ik heb al iets gelezen over de mysql_insert_id() functie, maar krijg dit niet goed werkend
Hoe bedoel je 'hoe kom ik aan het id'?
Erwin H op 14/05/2014 11:02:07

Om deze relatie op te slaan maak je een koppeltabel aan in de database. Die koppeltabel koppelt de berichten aan de gebruiker. Elke keer dat een gebruiker een bericht leest, plaats je een nieuw record in die koppeltabel met het id van het bericht en het id van de gebruiker.


het id van het bericht & het id van de gebruiker bedoel ik
Het id van de gebruiker heb je als het goed is in een session staan (want je wil toch weten wie ingelogd is en iets doet), het id van het bericht heb je op het moment dat je de pagina aanmaakt om naar de browser te sturen. Dat staat waarschijnlijk in een $_GET variabele, en dat zeg je zelf al:

$sql2 = "SELECT * FROM $tbl_name WHERE id = ".$_GET['id']; //om het specifieke bericht te krijgen
ik werk niet met sessions voor de gebruikers. Het is vrij toegankelijk, iedere gebruiker komt op dezelfde pagina uit.
Dan kan je nooit weten wie iets heeft gedaan en heeft deze hele functie geen zin. Op de een of andere manier moet je bijhouden wie de pagina bekijkt.
Jawel, dat werkt nu ook. Iedereen kan van elkaar zien wie het bericht gelezen heeft. Als ik bijvoorbeeld op de pagina kom en ik lees bericht 1, dan klik ik op mijn foto onder bericht 1. De pagina markRead.php zorgt ervoor dat de src van de afbeelding veranderd. Deze wordt namelijk op deze manier gedisplayed:


<img src='user_".$value.".png' />


Ik kan hierdoor bijvoorbeeld ook op de foto's van andere gebruikers klikken zodat deze veranderen, maar dat is niet erg, dat mag juist.

Alle gebruikers staan in een tabel en hebben allen een uniek ID, alle berichten staan in een andere tabel en hebben ook allen een uniek ID, deze moeten op de een of andere manier aan elkaar gekoppeld worden.

Jeffrey van Zwam op 14/05/2014 18:06:37

Ik kan hierdoor bijvoorbeeld ook op de foto's van andere gebruikers klikken zodat deze veranderen, maar dat is niet erg, dat mag juist.

Dus elke boerel*l kan op een foto klikken zodat die persoon opeens een bericht niet meer heeft gelezen, of juist wel. Nou, lekkere site dan....

Reageren