Scripts

MySQL gastenboek + installer

Dit is een gastenboek script dat ik vandaag gemaakt heb, simpel maar effectief. Users kunnen eens per sessie posten en er is spam protectie dmv md5 hashes. Tevens wordt input altijd gecontroleerd voordat het de database ingaat. Er zit een installer script bij waardoor je zelf helemaal niets hoeft te doen qua mysql databases

mysql-gastenboek-installer
installer.php

[code]
<html>

<head>

<style type="text/css">

.body
	{
	font-family:Verdana, Arial, Helvetica, sans-serif;
	font-size:11px;
	}

</style>

<title>

Guestbook Installer

</title>

</head>

<body class="body">

Welkom bij de guestbook installer, vul hier onder uw gegevens in en klik op zend om de configuratie aan te passen en de nodige databases en tabellen te creeeren:<br><br>

<form action="<?PHP echo $_SERVER['PHP_SELF']; ?>" method="post">

<table class="body">
	<tr>
		<td>
		MySQL server adres:
		</td>
		<td>
		<input type="text" name="host"><br><br>
		</td>
	</tr>
		
	<tr>
		<td>
		MySQL username: 
		</td>
		<td>
		<input type="text" name="user"><br><br>
		</td>
	</tr>
		
	<tr>
		<td>
		MySQL wachtwoord: 
		</td>
		<td>
		<input type="password" name="pass"><br><br>
		</td>
	</tr>
	
	<tr>
		<td>
		Maximum aantal posts per pagina:
		</td>
		<td>
		<input type="text" name="posts_per_page"><br><br>
		</td>
	</tr>
	
	<tr>
		<td>
		Maximum aantal paginas met posts:
		</td>
		<td>
		<input type="text" name="maximum_paginas"><br><br>
		</td>
	</tr>
				
	<tr>
		<td>
		<input type="submit" name="submit" value="zend"><br><br>
		</td>
	</tr>
</table>
	
</form>

<?PHP

if(isset($_POST["submit"]))
	{
	
	$mysql = mysql_connect($_POST["host"],$_POST["user"],$_POST["pass"]) or die("De door u ingegeven gegevens waren niet correct!");
	
	$sql = "
	CREATE DATABASE IF NOT EXISTS guestbook;
	";
	
	$result = mysql_query($sql);
	
	if($result == 1)
		{
		echo "De database is succesvol gemaakt of bestond al....<br><br>";
		
		mysql_select_db("guestbook",$mysql);
		
		$sql = "
		CREATE TABLE IF NOT EXISTS berichten (
		`id` INT( 4 ) NOT NULL AUTO_INCREMENT ,
		`time` VARCHAR( 20 ) NOT NULL ,
		`name` VARCHAR( 50 ) NOT NULL ,
		`email` VARCHAR( 50 ) NOT NULL ,
		`bericht` VARCHAR( 50 ) NOT NULL ,
		`md5` VARCHAR( 250 ) NOT NULL ,
		PRIMARY KEY ( `id` )
		) ENGINE = InnoDB
		";
		
		$result = mysql_query($sql);
		
		if($result == 1)
			{
			echo "De tabel is succesvol gemaakt of bestond al....<br><br>";
			
			edit_config();
			}
		
		else
			{
			echo "Er ging iets fout bij het creeeren van de tabel, bent u gemachtigd?<br><br>";
			echo mysql_error();
			}
		}
	else
		{
		echo "Er ging iets fout bij het creeeren van de database, bent u gemachtigd?<br><br>";
		}
	
	}
	
function edit_config()
	{
	$pointer = fopen("index.php","r+");
	
	$inhoud = fread($pointer,filesize("index.php"));
	
	$old = array(
	"\$host = \"x\";",
	"\$user = \"x\";",
	"\$pass = \"x\";",
	"\$db = \"x\";",
	"\$posts_per_page = \"x\";",
	"\$maximum_paginas = \"x\";"
	);
	
	$new = array(
	"\$host = \"".$_POST["host"]."\";",
	"\$user = \"".$_POST["user"]."\";",
	"\$pass = \"".$_POST["pass"]."\";",
	"\$db = \"guestbook\";",
	"\$posts_per_page = \"".$_POST["posts_per_page"]."\";",
	"\$maximum_paginas = \"".$_POST["maximum_paginas"]."\";",
	);
	
	$inhoud_nieuw = str_replace($old, $new, $inhoud);
	
	rewind($pointer);
	
	fwrite($pointer,$inhoud_nieuw);
	
	fclose($pointer);
	
	echo "Variabelen aangepast in index.php, als u in het vervolg configuratie veranderingen wilt doorvoeren moet u dit handmatig doen in index.php!";
	
	}

?>


</body>

</html>
[/code]

index.php

[code]
<?PHP

//Het adres van de mysql server, bijna altijd localhost
$host = "x";

//De mysql username
$user = "x";

//Het mysql wachtwoord
$pass = "x";

//De gewenste database
$db = "x";

//Het maximale aantal posts dat je per pagina wilt laten zien
$posts_per_page = "x";

//Het maximale aantal paginas dat je bereikbaar wilt maken
$maximum_paginas = "x";

if($host == "x" || $user == "x" || $pass == "x" || $db == "x" || $posts_per_page == "x" || $maximum_paginas == "x")
	{
	die("Niet alle configuratie instellingen zijn juist geset, draai installer.php of voer ze handmatig in aan de bovenkant van index.php!");
	}

?>

<?PHP

//Start een sessie om bijvoorbeeld flooding te voorkomen
session_start();

//Legt een verbinding met mysql
$mysql = mysql_connect($host,$user,$pass) or die("Error connecting to mysql!");

//Verbind met de database
mysql_select_db($db) or die("Error selecting database!");

?>

<html>

<head>

<style type="text/css">

.body
	{
	font-family:Verdana, Arial, Helvetica, sans-serif;
	font-size:11px;
	}

</style>

<title>
Guestbook
</title>

</head>

<body class="body" link="#000000" alink="#000000" vlink="#000000">

<?PHP

//Als de sessie variabele post niet bestaat of false is, includeer dan het formulier
if(!isset($_SESSION["post"]) || $_SESSION["post"] = false)
	{
	//Includeer het formulier
	?>
	
	<form action="<?PHP echo $_SERVER['PHP_SELF']; ?>" method="post">

	<table class="body">
		<tr>
			<td>
			Name: 
			</td>
			<td>
			<input type="text" name="name"><br><br>
			</td>
		</tr>
		
		<tr>
			<td>
			Email: 
			</td>
			<td>
			<input type="text" name="email"><br><br>
			</td>
		</tr>
		
		<tr>
			<td>
			Bericht: 
			</td>
			<td>
			<textarea name="bericht" cols="30" rows="5"></textarea><br><br>
			</td>
		</tr>
		
		<tr>
			<td>
			<input type="submit" name="submit" value="zend"><br><br>
			</td>
		</tr>
	</table>
	
	</form>
	
	<?php
	}

//Controleer of de submit knop is ingedrukt
if(isset($_POST["submit"]))
	{
	//Controleer of alle velden zijn ingevuld
	if(isset($_POST["name"]) && !empty($_POST["name"])
	&& isset($_POST["email"]) && !empty($_POST["email"])
	&& isset($_POST["bericht"]) && !empty($_POST["bericht"]))
		{
		//Checkt of er niet al gepost is dmv de sessie variabele
		if(!isset($_SESSION["post"]) || $_SESSION["post"] = false)
			{
			if(validate() == true)
				{
				//Checkt of ditzelfde bericht niet al eens gepost is dmv hash
				if(check_hash() == true)
					{
					//Voeg de post in via de insert_post() functie en sla de return waarde op in $result
					$result = insert_post();
					
					//Als de return waarde 1 was, en het dus goed gegaan is
					if($result == 1)
						{
						//Echo het bericht dat alles is goed gegaan
						echo "Het bericht is toegevoegd!<br><br>";
						
						//Stelt de sessie variabele in die er voor zorgt dat er maar 1 keer gepost kan worden
						$_SESSION["post"] = true;
						}
					
					//Als de return waarde iets anders dan 1 was, en er dus iets fout ging
					else
						{
						//Echo het bericht dat er iets fout ging
						echo "Het bericht is niet toegevoegd!<br><br>";
						
						//En echo de eventuele mysql query error
						echo mysql_error();
						}
					}
				
				//Als het wel al gepost is
				elseif(check_hash() == false)
					{
					//Laat de gebruiker weten dat het bericht al bestaat
					echo "Exact ditzelfde bericht is al eens gepost, het is dus niet meer nodig!<br><br>";
					}
				}
				
			else
				{
				echo "Het door u ingevulde email adres was niet correct!<br><br>";
				}
			}
		
		//Als er al gepost is
		else
			{
			//Echo dat er al gepost is
			echo "U heeft al gepost in deze sessie, dit is een gastenboek, geen spamboek!<br><br>";
			}
		}
	
	//Als niet alle velden waren ingevuld	
	else
		{
		//Echo dat niet alle velden waren ingevuld
		echo "Niet alle velden waren ingevuld!<br><br>";
		}
	}

//Roep de functie aan die hyperlinks naar beschikbare paginas zal tonen
show_pages();

//Roep de functie aan die er voor zorgt dat de posts van de huidige pagina getoond worden
show_posts();

mysql_close($mysql);

function show_posts()
	{
	//Deze functie laat de posts van de huidige pagina zien
	
	//Includeer de benodigde configuratie variabelen
	global $posts_per_page, $maximum_paginas;
	
	//Als de page variabele in de url niet is geset
	if(!isset($_GET["page"]))
		{
		//Geef $page de default waarde 1
		$page = 1;
		}
	
	//Als de page variabele in de url wel is geset
	else
		{
		//Verkort de variabele
		$page = $_GET["page"];
		}
	
	//Als de waarde van page kleiner is of gelijk is aan het maximum aantal toegestane paginas wordt de rest  uitgevoerd
	if($page <= $maximum_paginas)
		{
		//Vermenigvuldigt de gewenste pagina met het gewenste aantal posts om de limit waarden vast te stellen
		$limit_start = ($page - 1) * $posts_per_page;
		$limit = $limit_start.", ".$posts_per_page;
		
		//Declareert de mysql query die nodig is om de juiste berichten uit de database te selecteren
		$sql = "
		SELECT time, name, email, bericht FROM berichten ORDER BY time DESC LIMIT ".$limit.";
		";
		
		//Slaat de return waarde van de mysql quer op in result
		$result = mysql_query($sql);
		
		//Echot de eventuele mysql error
		echo mysql_error();
		
		//Ga rij voor rij de query uitvoeren en sla de waarden op in de array $row
		while($row = mysql_fetch_row($result))
			{
			//Verkort de variabelen om te verduidelijken wat wat is
			$time = $row['0'];
			$name = $row['1'];
			$email = $row['2']; 
			$bericht = $row['3'];
			
			//Echo een tabel voor iedere rij			
			echo "<table class=\"body\" cellspacing=\"0\">";
			
				echo "<tr>";
					echo "<td bgcolor=\"#CCCCCC\" width=\"300\">";
					//Zorg er voor dat men kan mailen naar de poster door op de naam te klikken
					echo "<a href=\"mailto:".$email."\">".$name."</a> schreef op ".$time; 
					echo "</td>";
				echo "</tr>";
			
				echo "<tr>";
					echo "<td bgcolor=\"edecec\">";
					//Echo het in deze rij opgehaalde bericht
					echo $bericht; 
					echo "</td>";
				echo "</tr>";
			
			echo "<table>";
			
			echo "<br>";
			}
		}
	
	//Als blijkt dat de waarde van page hoger is dan die van het maximum toegestane paginas
	elseif($page > $maximum_paginas)
		{
		//Echo dat dit aantal paginas niet is toegestaan door de beheerder
		//Deze situatie kan niet voorkomen wanneer er gewoon op links wordt geklikt, maar alleen door een "hack" poging
		echo "Het maximum aantal paginas is door de beheerder ingesteld op ".$maximum_paginas."!";
		}
	}
	
function insert_post()
	{
	//Deze functie injecteerd de zojuist ingevulde waarden in de database
	
	//Dit stelt het formaat van tijd vast
	$time = date("d-m-y H:i:s");
	
	//Dit declareert $hashed	
	$hashed = md5($_POST["bericht"]);
	
	//Dit declareert de query die gebruikt wordt om de ingevulde waarden te injecteren in berichten
	$sql = "
	INSERT INTO berichten
	(time, name, email, bericht, md5)
		
	VALUES
		
	('".$time."',
	'".$_POST["name"]."',
	'".$_POST["email"]."',
	'".$_POST["bericht"]."',
	'".$hashed."');
	";
		
	//Dit slaat de return waarde op in result
	$result = mysql_query($sql);
	
	//Dit retourneert de return waarde van de MySQL query
	return $result;	
	}
	
function show_pages()
	{
	//Deze functie laat hyperlinks naar de beschikbare paginas zien
	
	//Dit includeert de benodigde configuratie instellingen
	global $posts_per_page, $maximum_paginas;
	
	//Dit declareert de query die gebruikt wordt om het huidige aantal berichten vast te stellen
	$sql = "
	SELECT id FROM berichten;
	";
	
	//Dit slaat de return waarde van de query op in result
	$result = mysql_query($sql);
	
	
	//Dit telt het aantal gevonden rijen, en daarmee dus het totaal aantal posts
	$num = mysql_num_rows($result);
	
	//Als het aantal posts hoger is dan het aantal toegestane posts per pagina
	if($num > $posts_per_page)
		{
		//Deel dan het een door het ander en rond af naar boven om het benodigde aantal paginas vast te stellen
		$paginas = ceil($num/$posts_per_page);
		
		//Als de waarde van paginas na de deling hoger is dan die van het ingestelde maximum
		if($paginas > $maximum_paginas)
			{
			//Verander de waarde van paginas dan in die van het maximum toegestane aantal
			$paginas = $maximum_paginas;
			}
		
		//Laat de tekst Pagina: zien om duidelijk te maken dat er hier naar andere paginas gegaan kan worden
		echo "Pagina: ";
		
		//Voer dit net zo vaak uit als de waarde van $paginas
		for($i=1;$i<=$paginas;$i++)
			{
			//Geef een link weer met het getal van het huidige pagina nummer
			echo "<a href=\"index.php?page=".$i."\">".$i."</a>&nbsp;";
			}
		
		//Print 2 witregels voor het overzicht
		echo "<br><br>";
		}	
	}
	
function check_hash()
	{
	//Deze functie vergelijkt de hash van het huidige bericht met dat van alle voorgaande berichten, om spam te voorkomen
	
	//Declereert hashed
	$hashed = md5($_POST["bericht"]);
	
	//Declareert de query die gebruikt wordt om te kijken of er al een row is met dezelfde md5 value
	$sql = "
	SELECT * FROM berichten WHERE md5 = '".$hashed."';
	";
	
	//Slaat de resultaten op in $result
	$result = mysql_query($sql);
	
	//Echot een eventuele mysql error	
	echo mysql_error();
	
	//Zet het aantal resultaten in $num
	$num = mysql_num_rows($result);
	
	//Als er resultaten zijn	
	if($num > 0)
		{
		//Return false
		return false;
		}
	
	//Als er geen resultaten zijn
	else
		{
		//Return true
		return true;
		}
	}
	
function validate()
	{
	//Deze functie controleerde de integriteit van de ingevulde gegevens
	
	//Maakt de array email aan met als separator @
	$email = explode("@",$_POST["email"]);
	
	//Als er meer dan 1 elementen in de array zitten
	if(count($email) > 1)
		{
		//Herdeclereert mail maar dan met . als separator
		$email = explode(".",$_POST["email"]);
		
		//Als er meer dan 1 elementen in de array zitten
		if(count($email) > 1)
			{
			//Zet de waarde van $mail op true
			$mail = true;
			}
		
		//Zoniet
		else
			{
			//Zet de waarde van mail op false
			$mail = false;
			}		
		}
	
	//Zoniet
	else
		{
		//Zet de waarde van mail op false
		$mail = false;
		}
	
	//Als de waarde van mail true is
	if($mail == true)
		{
		//Haal rare tekens uit name
		$_POST["name"] = ereg_replace("[^A-Za-z0-9 ]", "", $_POST["name"]);
		
		//Haal rare tekens uit bericht
		$_POST["bericht"] = ereg_replace("[^A-Za-z0-9 ]", "", $_POST["bericht"]);
		
		//Retourneer true
		return true;
		}
	
	//Als de waarde van mail niet true is
	else
		{
		//Retourneer false
		return false;
		}
	}
	
?>

</body>

</html>
[/code]

Reacties

0
Nog geen reacties.