Webprofis is een Forum waarin je vragen kunt stellen die webgerelateerd zijn. Heb je vragen over of problemen met je Webpagina, HTML, CSS, Javascript, PHP of andere client of serverside scriptingtalen? Stel ze dan gerust op dit forum.
Op dit forum zijn een aantal vrijwilligers actief die u graag met uw vragen willen helpen en u waar mogelijk een passend antwoord aanbieden.
Hebt u zelf veel ervaring en kennis met betrekking tot het bovenstaande? U bent van harte welkom om uw kennis met anderen te delen!
We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.
Team Webprofis
We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.
Team Webprofis
gastenboek maken in php mbv database
Een simpel gastenboek maken met waarin de data in een database staat.
Stap 1
Als eerste maken we een database aan. Daarin voeren we de volgende query uit:
We hebben nu een database waarin we de naam, email, datum en tijd en het bericht kunnen opslaan.
Stap 2: form.html
We gaan de form maken waarin bezoekers kunnen schrijven:
Het bovenste anker geeft ons de mogelijkheid het gastenboek te bekijken voordat we zelf erin hebben geschreven.
De checkbox voor de submit is er om te vorkomen dat robots ons gastenboek invullen.
Merk ook op dat alle velden verplicht zijn door de required in de input te zetten.
Als we kijken wat de action is, dan zie we dat we doorverwezen worden naar verwerk.php. Dit is de volgende stap.
Stap 3: verwerk.php
In de bovenste 4 regels vullen we de naam van de host in, de gebruikernsaam van diegene die op de DB connecteert, het password en de naam van de DB.
Daarna connecteren we op de DB, en als dat niet goed gaat geven we een error.
Nu gaan we de inputwaardes toekennen aan variabelen. De datum wordt vermeld in dag-maand-jaar met erachter het tijdstip.
en als laatste gaan we de data in de DB zetten met wederom een echo als het fout gaat.
tot slot sluiten we de connectie met de DB en we verwijzen gelijk door naar bestand gastenboek.php. Dit is stap 4
Stap 4: gastenboek.php
De data staat in de DB. Nu nog ervoor zorgen dat we deze op het scherm krijgen.
Zoals je ziet moeten we ook hier weer eerste connecteren op de DB. Dit doen we weer direct aan het begin.Wederom een check of connectie is gelukt en zonodig een error weergeven.
Aand e variabele $result wordt nu de data gekoppeld van de 4 velden die we in de DB hebben staan; te weten: naam, email, datum en tijd en bericht
We doen nu eerst een check of er al iemand in het gastenboek geschreven heeft. Zonee, dan geven we de melding: "Schrijf als eerste..."
Staat er wel al data in, dan gaan we die outputten. Elk veld komt met een echo op het scherm. We zetten de echo's nog even in een div zodat we die straks op een nette manier kunnen opmaken met css. Als laatste sluiten we weer de connectie met de DB.
Het anker onderaan geeft ons de mogelijkheid om een nieuw bericht te schrijven en verwijst weer naar onze form.
Voor de opmaak heb ik deze style gebruikt:
Updated 1-4-2015: beveiliging op de input gezet en clean output
Dit hebben we gemaakt
Feedback welkom!!!
Stap 1
Als eerste maken we een database aan. Daarin voeren we de volgende query uit:
CREATE TABLE guestbook(
id int(5) NOT NULL auto_increment,
name varchar(60) NOT NULL default ' ',
email varchar(60) NOT NULL default ' ',
datetime varchar(60) NOT NULL default '',
message text NOT NULL,
Primary key(id)
);
We hebben nu een database waarin we de naam, email, datum en tijd en het bericht kunnen opslaan.
Stap 2: form.html
We gaan de form maken waarin bezoekers kunnen schrijven:
<a class="button" href="gastenboek.php">Bekijk Gastenboek</a>
<h2>Schrijf in Gastenboek</h2>
<form name="guest" method="post" action="verwerk.php">
Naam: <br />
<input type="text" name="name" required /><br /><br />
Email: <br />
<input type="text" name="email" required /><br /><br />
Bericht: <br /><textarea name="message" rows="10" cols="50" required></textarea> <br /><br />
<input type="checkbox" name="verplicht" required>Ik ben geen robot</input><br /><br />
<button class="button" name="submit" type="submit">Plaats bericht</button>
</form>
Het bovenste anker geeft ons de mogelijkheid het gastenboek te bekijken voordat we zelf erin hebben geschreven.
De checkbox voor de submit is er om te vorkomen dat robots ons gastenboek invullen.
Merk ook op dat alle velden verplicht zijn door de required in de input te zetten.
Als we kijken wat de action is, dan zie we dat we doorverwezen worden naar verwerk.php. Dit is de volgende stap.
Stap 3: verwerk.php
<?php
// connecteren op de database
$host="localhost"; //host, meestal localhost
$user="gebruikersnaam"; //user die op DB connecteert
$pass="vsBYdtFU7JLGNpwq"; //Password van de user die op DB connecteert
$dbname="guestbook"; // Naam Database
$con=mysqli_connect($host,$user,$pass,$dbname);
if (mysqli_connect_errno($con))
{
echo "<h1>Connectie Database mislukt: " . mysqli_connect_error() ."</h1>";
}
// uitlzen inputvelden en toekennen aan variabelen
$name = mysqli_real_escape_string($con, $_POST['name']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$message = mysqli_real_escape_string($con, $_POST['message']);
date_default_timezone_set('Europe/Amsterdam');
$datetime=date("d-m-y \o\m\ H:i:s"); //datum en tijd met "om" ertussen
$sql="INSERT INTO guestbook(name,email,message,datetime) VALUES('$name','$email','$message','$datetime')"; // data in de database zetten
if (!mysqli_query($con,$sql))
{
die('Fout: ' . mysqli_error($con)); // evt fout met error vermelden
}
else {
mysqli_close($con);
header('Location: gastenboek.php'); //gelijk doorsturen naar gastenboek
}
?>
In de bovenste 4 regels vullen we de naam van de host in, de gebruikernsaam van diegene die op de DB connecteert, het password en de naam van de DB.
Daarna connecteren we op de DB, en als dat niet goed gaat geven we een error.
Nu gaan we de inputwaardes toekennen aan variabelen. De datum wordt vermeld in dag-maand-jaar met erachter het tijdstip.
en als laatste gaan we de data in de DB zetten met wederom een echo als het fout gaat.
tot slot sluiten we de connectie met de DB en we verwijzen gelijk door naar bestand gastenboek.php. Dit is stap 4
Stap 4: gastenboek.php
De data staat in de DB. Nu nog ervoor zorgen dat we deze op het scherm krijgen.
<div class="gastenboek"><h2>Gastenboek</h2></div>
<?php
$host="localhost"; //host, meestal localhost
$user="gebruikersnaam"; //user die op DB connecteert
$pass="vsBYdtFU7JLGNpwq"; //Password van de user die op DB connecteert
$dbname="guestbook"; //Naam Database
$con=mysqli_connect($host,$user,$pass,$dbname);
if (mysqli_connect_errno($con))
{
echo "Connectie Database mislukt: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT name,message,email,datetime FROM guestbook");
if(mysqli_num_rows($result) == 0) { // gastenboek is nog leeg
echo 'Schrijf als eerste in het gastenboek!';
} else {
while($row = mysqli_fetch_array($result))
{ ?>
<div class="velden"> <!-- voor styling van alle echo's; zie CSS -->
<div class="header">
<div class="naam"><?php echo htmlspecialchars($row['name'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo naam-->
<div class="email"><?php echo htmlspecialchars($row['email'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo email-->
<div class="tijd"><?php echo $row['datetime']; ?></div> <!-- echo datum en tijd-->
</div>
<div class="bericht"><?php echo htmlspecialchars($row['message'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo bericht-->
</div>
<?php } ?>
<?php }
mysqli_close($con); // sluit connectie
?>
<div class="nieuw-bericht">
<a class="button" href="form.html">Plaats Nieuw Bericht</a> <!-- Nieuw bericht plaatsen -->
</div>
Zoals je ziet moeten we ook hier weer eerste connecteren op de DB. Dit doen we weer direct aan het begin.Wederom een check of connectie is gelukt en zonodig een error weergeven.
Aand e variabele $result wordt nu de data gekoppeld van de 4 velden die we in de DB hebben staan; te weten: naam, email, datum en tijd en bericht
We doen nu eerst een check of er al iemand in het gastenboek geschreven heeft. Zonee, dan geven we de melding: "Schrijf als eerste..."
Staat er wel al data in, dan gaan we die outputten. Elk veld komt met een echo op het scherm. We zetten de echo's nog even in een div zodat we die straks op een nette manier kunnen opmaken met css. Als laatste sluiten we weer de connectie met de DB.
Het anker onderaan geeft ons de mogelijkheid om een nieuw bericht te schrijven en verwijst weer naar onze form.
Voor de opmaak heb ik deze style gebruikt:
a.button, button[type=submit] {
background-color: #428bca;
padding: 10px;
color: #f6f6f6;
border-radius: 2px;
text-decoration: none;
cursor: pointer;
border: none;
font-size: 16px;
}
.velden {
width: 600px;
height: auto;
border: 1px solid #ccc;
border-radius: 2px;
background-color: #f6f6f6;
margin-bottom: 10px;
}
.header {
min-height: 30px;
height: auto;
background-color: #e5e5e5;
border-bottom: 1px solid #ccc;
}
.naam {
height: auto;
padding: 5px;
font-size: 16px;
float: left;
font-weight: bold;
}
.email {
height: auto;
padding: 5px 20px 5px 10px;
float: left;
}
.tijd {
height: auto;
padding: 5px 20px 5px 0;
float: right;
}
.bericht {
clear: both;
padding: 10px 5px 10px 5px;
}
a.button {
background-color: #428bca;
padding: 10px;
color: #f6f6f6;
border-radius: 2px;
text-decoration: none;
cursor: pointer;
}
.nieuw-bericht {
margin: 20px 0 20px 0;
}
Updated 1-4-2015: beveiliging op de input gezet en clean output
Dit hebben we gemaakt
Feedback welkom!!!
Getagd:
Login of Registreer om te reageren.
Reacties
Geen controle over de input noch output..
Gebruik sowieso real_escape_string bij de inserts en htmlentities oid bij de outputs.
Ikzelf gebruik eigenlijk altijd dit opzetje:
Vervolgens heb ik bij de echo's gebruik gemaakt van htmlspecialchars():
Is dit nu veilig genoeg?
Nu nog wat opmerkingen die evt ook wel van enig nut zijn.
De datum zou ik gewoon in een datetime of timestamp opslaan, dan kun je er meer mee doen dan nu. (al is dit voor het voor het gastenboek niet helemaal nodig en is het sneller zoals jij het nu doet)
Verder zou je ook moeten overwegen wat er gaat gebeuren als je een paar honderd records in de db hebt staan, dat wordt een lange pagina!! (en traag).
Hierbij kan de datum dan weer in het voordeel spelen, je kunt dan bijvoorbeeld de gastenboekrecords over "per jaar" pagina's verdelen.
En als laatste zou ik je gastenboek andersom sorteren, nu komt de laatste record onderaan,..
edit, nog wat getest in je voorbeeldje, maar lijkt niet te lukken met mijn skills
Er komt nog wel een html/css puntje aan het licht (te lange strings)
En pagination: helemaal gelijk; moet iets inbouwen dat om de bijv. 10 records een nieuwe page komt met een tab.
Ook het laaste geplaatse bericht bovenaan laten verschijnen.; meest logisch idd
Over die beveiliging; dit is voor mij ook echt de eerste keer dat ik me hierin echt verdiep.
enfin, weer wat werk aan de winkel...
Je moet eerst het aantal records weten, dan delen door het aantal gewilde records per pagina, dan pagina nummers opbouwen, en lieftst niet zoals in 1980 in deze trent [1][2][3][4][5][6][7][8][9][10 tm 1033
maar zoals het tegenwoordig gaat en je bv alleen zo iets ziet:
[<<] [<] [2] [3] <u>4 [5] [6] [>] [>>] van xxx
Het is geen wereld opgave, maar je moet er toch een beetje over nadenken ;-)
edit, bugje? als je mijn post edit zie je dat de 4 underlined moet zijn
En met dit weer ben je van de straat
Hier kun je het testen: http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/htmLawedTest.php
Hieronder staat de functie: ( heb deze niet zelf gemaakt hoor: -S )
Je hoeft niet alles te tellen, alleen de id's is voldoende en sneller.
Als je ?pagina=99 ingeeft mag je de eerste zijn die een bericht mag schrijven, daar zou je eigenlijk een 404 op moeten teruggeven.
Ik neem aan de je $_GET['page'] ook door real_escape_string haalt?
Verder ziet het er goed uit.
de connectie heb ik apart gezet:
connection.php: functions.php: staat al hierboven in vorige post
gastenboek.php:
gastenboek.php regel 7 veranderd in: in functions.php: regel 4 is nu: connectie niet global maken zit ik nog mee te klungelen:
Dit werkt in ieder geval niet: En dan de 404 nog erin verwerken
edit: die $_GET['page'] door real_escape_string halen; dan werkt de pagination niet meer
In dit geval hoef je die get dan ook niet verder te beveiligen.
Maar wel als je de function aanroept met die gegevens erin toch? Dus: toch?
Ik snap het ff niet. Bovendien, dit is toch de functie?
volgens mij moet dit gewoon werken.
Als je tijd en zin hebt, test het zelf even uit. Rechts boven gear-icon > upload > php-scripten > gastenboek. Download de bestandjes, edit ze , uploaden weer en kijken wat het doet
wat betreft die checkbox, ik dacht dat de meeste bot's zo'n beetje standaard alle velden probeert te voorzien van data.
Maar met zo'n simpele controle denk ik dat je vrij snel de pineut bent
mijn antwoorden duren heel lang, mijn arm ligt in de poejer, heel hard verzwikt/gescheurde spier of weet ik wat, dus ik typ weinig en traag vandaag (of de komende tijd)
of deze:
Deze laatste schijnt goed te werken. Heb hem nu actief
voorheen in functions.php: verbeterde versie:
in gastenboek.php voorheen: verbeterde versie: