Gijs van Tulder

Een reactiesysteem met PHP en MySQL

De vraag 'hoe maak ik een reactiesysteem voor mijn site?' is niet heel moeilijk te beantwoorden. Hier een kort recept voor een, zij het simpel, reactiesysteem met PHP en MySQL.

Als je provider MySQL ondersteunt, heb je waarschijnlijk ook toegang tot phpMyAdmin. Ga daarheen, log in en klik op 'SQL'. Je kunt nu in dat vak de volgende tekst plakken:

CREATE TABLE paginas (
id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
url TINYTEXT NOT NULL );

CREATE TABLE reacties (
id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
pagina SMALLINT NOT NULL,
naam TINYTEXT NOT NULL,
email TINYTEXT NOT NULL,
reactie TEXT NOT NULL,
INDEX (pagina) ); 

Klik dan op 'OK' en je hebt twee tabellen: een tabel 'paginas' en een tabel 'reacties'. Ik heb deze code niet zelf bedacht, dat heeft phpMyAdmin voor mij gedaan. Via 'Create new table', ergens te vinden, kun je hetzelfde bereiken.

reacties.php

We gaan nu beginnen aan het eerste, en belangrijkste, script. Dit script doet eigenlijk het werk. Het laat een formulier zien, slaat ingevulde formulieren op in de database en laat een lijstje reacties zien. Je noemt het script 'reacties.php' en slaat het op in dezelfde directory als je artikelen. (Een andere plaats mag ook, maar daar komen we straks op.)

Het script begint met een algemene tekst, in dit voorbeeld een horizontale lijn en de kop 'Reacties'. Het resultaat van het script wordt in je artikelpagina geplakt, dus we hoeven niet te beginnen met <html> enz.

<hr>
<h1>Reacties</h1>

Tot zover was het vrij eenvoudig: gewone html-code. Nu begint het PHP-gedeelte. PHP staat altijd tussen <?php en ?>.

Het paginanummer

Om reacties aan een pagina te kunnen koppelen, willen we pagina's graag kunnen herkennen. We geven ze daarom eerst een nummer. Dat doen we door in de tabel 'paginas' een lijst te maken met de url van pagina's en hun nummers 'id'.

<?php
mysql_connect('host','user','pass');
mysql_select_db('database');

De eerste regels in een PHP-script met MySQL maken altijd verbinding met de database-server(mysql_connect) en kiezen vervolgens welke database wordt gebruikt (mysql_select_db). Hier vul je dus de gegevens die je van je provider krijgt in.

$result = mysql_query('SELECT id FROM paginas '.
            'WHERE url="'.
            mysql_escape_string($_SERVER['REQUEST_URI']).'";');

Deze regel wil zeggen: sla het resultaat van de MySQL-query (zoekopdracht) op in de variabele $result. De query vraagt alle regels uit de tabel 'paginas' op, die in het vak 'url' de url van de huidige pagina hebben. (Die url heeft PHP al voor ons in de variabele $_SERVER['REQUEST_URI'] gezet.) We willen bovendien niet de hele rij, maar alleen het veld 'id'.

if (mysql_num_rows($result)==1) {
    $row = mysql_fetch_array($result);
    $pagina_id = $row['id'];
} else {
    mysql_query('INSERT INTO paginas SET url="'.
                $_SERVER['REQUEST_URI'].'";');
    $pagina_id = mysql_insert_id();
}
?>

Nu kunnen we kijken wat het resultaat van de query is. Komt er één regel terug, dan is dat mooi. De url van de huidige pagina staat al in de database, en de pagina heeft dus een nummer. Dat nummer slaan we op in de variabele $pagina_id.

Is dat niet het geval, en is er geen regel gevonden, dan moeten we de url van de pagina eerst toevoegen aan de database. Dat doen we weer met een query. Omdat we dat bij het aanmaken van de tabel zo hebben ingesteld, geeft MySQL het veld 'id' automatisch een unieke waarde. Dat nummer kunnen we opvragen met de opdracht mysql_insert_id() en slaan we op in $pagina_id.

Nu hebben we dus in beide gevallen het nummer van de pagina. Een uniek nummer, iedere pagina heeft een ander nummer. We gaan dat nummer zo gebruiken om reacties aan een pagina/artikel te koppelen.

Het formulier

Eerst sturen we het reactieformulier naar de gebruiker.

<h2>Reageer zelf</h2>
<form method="post">
<p>
Naam: <input type="text" name="naam"><br>
E-mail: <input type="text" name="email"><br>
Reactie:<br>
<textarea cols="30" rows="4" name="reactie"></textarea><br>
<input type="submit" value="Versturen">
</p>
</form>

We vragen de gebruiker om de velden 'naam', 'email' en 'reactie'. PHP bewaart deze gegevens voor ons als $_POST['naam'], $_POST['email'] en $_POST['reactie']. Om te bekijken of er een formulier verzonden is, hoeven we alleen maar te kijken of één van deze velden bestaat. Dat kan met de PHP-opdracht isset().

<?php
if (isset($_POST['naam'])) {
    mysql_query('INSERT INTO reacties SET pagina="'.
                $pagina_id.'", naam="'.$_POST['naam'].
                '", email="'.$_POST['email'].'", '.
                'reactie="'.$_POST['reactie'].'";');
    echo '<p>Je bericht is opgeslagen.</p>';
}
?>

Bestaat de variabele $_POST['naam'], dan is het formulier verstuurd en kunnen we de reactie met een query opslaan in de tabel 'reacties'. Daarna sturen we met echo een boodschap naar de gebruiker.

De reacties

<h2>Reacties van anderen</h2>

Na het formulier kunnen we de reacties weergeven.

<?php
$result = mysql_query('SELECT * FROM reacties '.
                      'WHERE pagina="'.$pagina_id.'";');

We zoeken alle reacties die bij dit $pagina_id horen.

if (mysql_num_rows($result)==0) {
    echo 'Er zijn nog geen reacties.';

Zijn er geen reacties, dan melden we dat.

} else {
    while ($row = mysql_fetch_array($result)) {
        // deze reactie weergeven
        echo ''.$row['naam'].' - '.$row['email'].''.
             ''.$row['reactie'].'';
    }
}
?>

Zijn er wel reacties, dan gaan we met while() al die reacties langs en laten we de informatie zien.

Nu we formulier en reacties hebben laten zien, is ons script 'reacties.php' klaar. We kunnen het nu met de opdracht include() in een ander PHP-script gebruiken.

artikel.php

Stel: we hebben een normaal html-artikel. Het is opgeslagen als artikel.html. Op zich prima, maar als we er PHP-code in willen gebruiken, moeten we de extensie veranderen in .php. We hernoemen artikel.html dus als artikel.php.

Op de plaats waar we de reacties en het formulier willen hebben, plaatsen we de volgende opdracht:

<?php include('reacties.php'); ?>

Hier zeggen we tegen PHP: plak op deze plaats het bestand reactie.php in en voer het uit. Op de pagina artikel.php krijgen we nu dus een formulier en een lijst met reacties. Klaar.

Nog één opmerking: include('reacties.php'); zoekt naar het bestand reacties.php in dezelfde directory als artikel.php. Staat het script ergens anders, bijvoorbeeld één directory hoger, dan gebruik je include('../reacties.php');