PHP expert |
|
Als het zo zit...
Ten eerste heb ik een opmerking over hoe je de POST-waarden uit je formulier aanroept. Jij doet namelijk dit:
In principe is er in deze context niets mis met deze schrijfwijze. Maar toch is het niet helemaal correct: PHP kent namelijk "constanten", deze kan je zien als variabelen die eens ze een waarde hebben gekregen, die waarde niet meer kan veranderd worden.
Nu, omdat je in je code géén aanhalingstekens (single quotes) hebt gebruikt rond "Naam", om aan te tonen dat het een string is, gaat PHP eerst kijken of er een constante "Naam" bestaat, indien deze niet bestaat gaat PHP het hier pas als een string interpreteren. Daarom: gebruik dus altijd quotes rond je strings! Je code wordt dan:
Idem dito voor je andere POST waarden.
Vervolgens, de manier en de functie die jij gebruikt om een bestand te openen is verouderd. Indien er PHP5 draait op je server kan je genieten van de mogelijkheden van de kant en klare functies van PHP, namelijk file_get_contents() en file_put_contents(), die ik al eens eerder heb vermeld. Jouw probleem is dat de nieuwe berichten onderaan erbij komen, dit kunnen we makkelijk oplossen door eerst de inhoud van dat bestand op te halen met file_get_contents(), vervolgens voegen we deze inhoud toe aan de tekst die we uit het bericht-veld van je formulier hebben gehaald. Uiteindelijk zetten we dit geheel weer terug in je bestand met de functie file_put_contents();. Je script wordt dan:
<?php
$Naam = $_POST['Naam'];
$Email = $_POST['Email'];
$url = $_POST['url'];
$Bericht = $_POST['bericht'];
$data = 'reacties.txt';
$inhoudBestand = file_get_contents($data);
$tijd = time();
$datum = strftime('%d-%m-%y %H:%M', $tijd);
file_put_contents($data, '<h5>Geschreven door: <a href="mailto:' . $Email . '">' . $Naam . '</a> - Tijd: <i>' . $datum . '</i></h5>
<br><hr>
<i>' . $Bericht . '</i>
<br><br><hr><br>' . $inhoudBestand);
?>
<?php include('view.php'); ?>
<?php $Naam = $_POST['Naam']; $Email = $_POST['Email']; $url = $_POST['url']; $Bericht = $_POST['bericht']; $data = 'reacties.txt'; $datum = strftime('%d-%m-%y %H:%M', $tijd); file_put_contents($data, '<h5>Geschreven door: <a href="mailto:' . $Email . '">' . $Naam . '</a> - Tijd: <i>' . $datum . '</i></h5> <br><hr> <i>' . $Bericht . '</i> <br><br><hr><br>' . $inhoudBestand); ?> <?php include('view.php'); ?>
Zoals je ziet heb ik ook een paar wijzigingen aangebracht in het gebruik van aanhalingstekens rond je strings. Ik gebruik altijd enkele aanhalingstekens ('), omdat je code hiermee gemakkelijker en sneller wordt geïnterpreteerd door de PHP parser omdat alles letterlijk wordt geïnterpreteerd (echo '$variabele'; zal $variabele printen, en niet de verwachtte waarde van die variabele). Om diezelfde reden heb ik ook je variabelen buiten de quotes gehaald, dit gebeurt op de volgende manier:
echo '<a href="mailto:' . $Email . '">' . $Naam . '</a>';
echo '<a href="mailto:' . $Email . '">' . $Naam . '</a>';
Omwille van snelheid en overzichtelijkheid is dit een must
Tenslotte heb ik nog een opmerking over het zomaar klakkeloos includen van een text bestandje in je pagina (<?php include("reacties.txt"); ?>). Zoals je code nu is, kan elke kwaadwillende PHP code in zijn bericht zetten en deze zal dan ook worden uitgevoerd, evenals HTML code. Om dit te voorkomen zou ik allereerst het bestand niet includen, maar de inhoud ervan ophalen met file_get_contents(), en daarna er bijvoorbeeld de functie htmlspecialchars() doorhalen, deze functie zorgt ervoor dat ingevoerde HTML code onschadelijk wordt gemaakt. (< wordt bijvoorbeeld <)
Dus:
<?php include("reacties.txt"); ?>
// vervangen we door deze code:
<?php echo htmlspecialchars(file_get_contents('reacties.txt')); ?>
<?php include("reacties.txt"); ?> // vervangen we door deze code:
Dit was het dan, ik zou zeggen lees mijn post eens rustig door en dan kom je er wel!
Veel succes |