Gastenboek probleem

Status
Niet open voor verdere reacties.

Naughtygirl

Gebruiker
Lid geworden
17 jan 2009
Berichten
174
Hallo,

Ik heb een gastenboek gemaakt in php via een simpele tutorial, maar krijg hem niet werkend.

Het gastenboek.html, ziet er zo uit:
<h2><i>Plaats een reactie:</i></h2>
<form name="gastenboek" method="post" action="verwerk.php">
<label for="voornaam">Voornaam:</label>
<input type="text" id="voornaam" name="voornaam" /><br />
<label for="achternaam">Achternaam:</label>
<input type="text" id="achternaam" name="achternaam" /><br />
<label for="bericht">Bericht:</label><br />
<textarea id="bericht" name="bericht" rows="10" cols="30"></textarea><br /><br />

<input type="submit" value="Verzenden" name="submit" />
</form><br />
<hr>
<?php include('reacties.txt');?>

Het verwerk.php ziet er zo uit:
<?php
$name = $_POST['voornaam'] . ' ' . $_POST['achternaam'];
$bericht = $_POST['bericht'];

$data = 'reacties.txt';
$file = fopen($data, "a");
$tijd = time();
$datum = strftime("%d-%m-%y %H:%M", $tijd);

fputs($file, "<h3>Geschreven door:</h3>$name<br><br><h3>Tijd:</h3>
$datum<br><br>
<h3>Bericht:</h3>$bericht<br><br><hr>");
fclose($file);
?>

<?php include("Gastenboek.html");?>

Als je een bericht invult en je drukt op verzenden, komt het bericht er te staan, maar ga je even naar een andere pagina en daarna weer terug naar het gastenboek, staat er niets meer. Als je dan vervolgens weer een bericht invoert, komen de andere berichten opeens ook weer tevoorschijn, maar ze verdwijnen net zo hard zodra je naar een andere pagina gaat.
 
Laatst bewerkt:
Hoi Naughtygirl,

zo vlug door de code gescand, volgens mij klopt dat.
Ik denk dat je gastenboek.html gastenboek.php moet noemen, dat daarom je reacties.txt niet wordt ingeclude.

Let trouwens wel op dat mensen met deze code html, javascript, etc in je gastenboek kunnen zetten. Dit kan je voorkomen door:

PHP:
$bericht = htmlentities($_POST['bericht']); //hetzelfde kan je doen voor voor en achternaam

Succes!
 
Hoi Naughtygirl,

zo vlug door de code gescand, volgens mij klopt dat.
Ik denk dat je gastenboek.html gastenboek.php moet noemen, dat daarom je reacties.txt niet wordt ingeclude.

Let trouwens wel op dat mensen met deze code html, javascript, etc in je gastenboek kunnen zetten. Dit kan je voorkomen door:

PHP:
$bericht = htmlentities($_POST['bericht']); //hetzelfde kan je doen voor voor en achternaam

Succes!

Ik heb gastenboek.html verandert naar .php
Dit gaat nu goed.
Het volgende probleem. Ik kan ook lege berichten toevoegen, hoe kan ik dit voorkomen?
en als ik een bericht toevoeg, en ik druk op f5, komt hetzelfde bericht er nog een keer te staan, hoe kan ik dit oplossen?
 
lege berichten:

PHP:
<?php
if(strlen($bericht) == 0) {
   echo 'Je fout melding';
   die(); //zorgt dat het script niet verder gaat.
}
?>

F5 probleem:

PHP:
<?php
fclose($file); //vanaf hier:
header('Location: gastenboek.php'); //laad de pagina gastenboek.php zodat de pagina met de $_POST global niet meer actief is
die(); //einde script
?>
 
lege berichten:

PHP:
<?php
if(strlen($bericht) == 0) {
   echo 'Je fout melding';
   die(); //zorgt dat het script niet verder gaat.
}
?>

F5 probleem:

PHP:
<?php
fclose($file); //vanaf hier:
header('Location: gastenboek.php'); //laad de pagina gastenboek.php zodat de pagina met de $_POST global niet meer actief is
die(); //einde script
?>

Ik heb de if statement na de fputs ingevoegd, is dat correct? Die if geldt nu alleen voor $bericht, moet ook voor de voornaam en achternaam gelden, kan ik dan dit doen:
PHP:
if(strlen($bericht, $name) == 0){
echo 'Je hebt niets ingevuld';
die();
}

Die foutmelding, dat er niets is ingevuld wordt in een nieuwe lege pagina getoond, kan i.p. daarvan deze foutmelding ook in een soort van pop-up schermpje komen?
 
Laatst bewerkt:
maak hier van:
if(strlen($bericht, $name) == 0){
Dit:
if(empty($bericht) && empty($name)) {

Maar doe ervoor eerst nog wel, $bericht = trim($bericht) en doe dit ook voor $name
Hiermee zorg je dat met niet alleen een spatie invoeren kan. want dat is ook een karakter!
 
Laatst bewerkt:
De if moet voor fputs staan, want met fputs verwerk je je gegevens in het text bestand, dit mag alleen als hij door de controle van de if heen komt.

en het controleren van naam en bericht wat phobia hierboven noemt. Als je trim gebruikt wil je die in de if gebruiken op deze manier:

PHP:
if(empty(trim($bericht)) && empty(trim($name))) {
  echo '<script>alert("foutmelding");</script>';
  die();
}
?>

als je foutmelding in een pop up wil geven kun je javascript gebruiken zoals hierboven.
 
Ik zou trim niet in de empty functie gaan gebruiken. Dat gaat een error geven!!!
 
Ik zou trim niet in de empty functie gaan gebruiken. Dat gaat een error geven!!!

Ja krijg een foutmelding:
Fatal error: Can't use function return value in write context in /home/reseller/domains/slotraceclub.nl/public_html/verwerk.php on line 15
 
$bericht = trim($_POST['bericht']);
$bericht = htmlentities($bericht); //hetzelfde kan je doen voor voor en achternaam
 
$bericht = trim($_POST['bericht']);
$bericht = htmlentities($bericht); //hetzelfde kan je doen voor voor en achternaam

Moet ik $bericht = htmlentities($bericht); dit nog voor de if statement plaatsen of erna?
maar als ik dit ook voor de voornaam en achternaam doe kan ik nog steeds html codes enzo toevoegen, dat heb ik ff getest nl.
 
PHP:
<?php
$name = trim($_POST['voornaam']) . ' ' . trim($_POST['achternaam']);
$bericht = trim($_POST['bericht']);

if(!empty($name) && !empty($bericht) ) {
$name = htmlentities($name);
$bericht = htmlentities($bericht);

$data = 'reacties.txt';
$file = fopen($data, "a");
$tijd = time();
$datum = strftime("%d-%m-%y %H:%M", $tijd);

fputs($file, "<h3>Geschreven door:</h3>$name<br><br><h3>Tijd:</h3>
$datum<br><br>
<h3>Bericht:</h3>$bericht<br><br><hr>");
fclose($file);
header('Location: gastenboek.php');
} else {
   echo "Naam of bericht is niet ingevuld!";
}
?>

dit is een voorbeeld, maar je kunt het nog uitbreiden.
Vooral een captcha en beter uitgewerkte error afhandeling
 
Laatst bewerkt:
htmlentities veranders een < in zijn htmlentitie &lt;
Daardoor wordt <script> in &lt;script&gt; het wordt op het scherm hetzelfde weergegeven, maar <script> zal door de browser wel worden uit gevoerd
Als je helemaal geen tags in je berichten wilt hebben, dan zou je ook nog striptags() erbij kunnen gebruiken.
 
PHP:
<?php
$name = trim($_POST['voornaam']) . ' ' . trim($_POST['achternaam']);
$bericht = trim($_POST['bericht']);

if(!empty($name) && !empty($bericht) ) {
$name = htmlentities($name);
$bericht = htmlentities($bericht);

$data = 'reacties.txt';
$file = fopen($data, "a");
$tijd = time();
$datum = strftime("%d-%m-%y %H:%M", $tijd);

fputs($file, "<h3>Geschreven door:</h3>$name<br><br><h3>Tijd:</h3>
$datum<br><br>
<h3>Bericht:</h3>$bericht<br><br><hr>");
fclose($file);
header('Location: gastenboek.php');
} else {
   echo "Naam of bericht is niet ingevuld!";
}
?>

dit is een voorbeeld, maar je kunt het nog uitbreiden.
Vooral een captcha en beter uitgewerkte error afhandeling

Ik heb je code precies zo overgenomen, maar dan verandert hij mijn hele gastenboek.php
 
weet wel dat een spambot heel gemakkelijk misbruik van je gastboek gaat maken.
Want je gebruikt geen captcha of andere vorm van controller of de form door een mens of bots is
ingevoerd.
 
Ik heb je code precies zo overgenomen, maar dan verandert hij mijn hele gastenboek.php

Maar wat veranderd er dan? Ik heb het script ook niet getest.
 
Maar wat veranderd er dan? Ik heb het script ook niet getest.

De schaduw achter de container is weg, sommige menu namen staan in het rood en de container is niet meer gecentreerd.
Hoe kan ik voorkomen dat een spambot het formulier invult?
 
Laatst bewerkt:
Nou dat wat ik gemaakt heb zou nix veranderen aan een layout.
Ik denk ze dat tijdens het copy past er iets teveel is verwijderd.
 
Nou dat wat ik gemaakt heb zou nix veranderen aan een layout.
Ik denk ze dat tijdens het copy past er iets teveel is verwijderd.

Ik heb het ff een stukje terug gezet, nl.:

PHP:
<?php
    $name = $_POST['voornaam'] . ' ' . $_POST['achternaam'];
    $bericht = $_POST['bericht'];
	$voornaam = $_POST['voornaam'];
	$achternaam = $_POST['achternaam'];
	
	$bericht = htmlentities($_POST['bericht']);
	$voornaam = htmlentities($_POST['voornaam']);
	$achternaam = htmlentities($_POST['achternaam']);
    
    $data = 'reacties.txt';
    $file = fopen($data, "a");
    $tijd = time();
    $datum = strftime("%d-%m-%y %H:%M", $tijd);
    if(!empty($bericht) && !empty($name) == 0){
		echo '<script>alert("Je hebt niet alles ingevuld");</script>';
		die();
	}
	fputs($file, "<h4>Geschreven door:</h4>$name<br><br><h4>Tijd:</h4>$datum<br><br>
          <h4>Bericht:</h4>$bericht<br><br><hr>");
    fclose($file);
	header('Location: Gastenboek.php');
	die();
?>

<?php include("Gastenboek.php");?>

maar nu kan ik nog steeds lege berichten plaatsen.
 
dat komt omdat je geen check doet of $name en $bericht leeg zijn....empty()
Voor je htmlentities() doet moet je de $_POST ontdoen van eventuele whitespaces...trim()
De trim moet je ook gedaan hebben voor je de empty() controle doet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan