Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

dermainzer

Routinier

Dabei seit: 07.03.2009

Beiträge: 327

 

1 Zum Seitenanfang

Sonntag, 19. Juli 2009, 14:30

[PHP] Gästebuch-Tutorial

Oft wollen PHP-Newbies ein eigenes Gästebuch o.ä. für die eigene Website schreiben. Dazu habe ich ein kleines Tutorial verfasst:
  • Schritt 1: Vorüberlegungen
  • Schritt 2: Das Formular
  • Schritt 3: Daten auswerten und eintragen
  • Schritt 4: Einträge ausgeben

Schritt 1: Vorüberlegungen

Auf was soll das Gästebuch basieren?
Es gibt zwei Möglichkeiten:
  • eine Datenbank
  • Textdateien

In diesem Fall habe ich mich für eine MySQL-Datenbank entschieden, da man damit die eingetragenen Daten einfacher zu verwalten sind.
Wieviele Dateien brauche ich?
Ich habe mich für vier Dateien entschieden:
  • index.php: Einträge anzeigen
  • form.php: Formular anzeigen
  • connect.php: Zum MySQL-Server connecten
  • auswerten.php: Die Daten aus dem Formular auswerten und verarbeiten

Die Tabellenstruktur
Die nächste, größere Frage ist die Struktur der Tabelle.
Da alle Daten Texte sind, benutzen wir auch als Feldtyp den Typen Text. Dann fügen wir noch eine eindeutige ID hinzu, damit wir jeden einzelnen Eintrag identifizieren können. Dies kann zB für ein späteres Adminpanel von Nutzen sein. Also ergibt sich folgendes Query:

MySQL-Abfrage(n)

1
2
3
4
5
6
CREATE TABLE tabelle (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` TEXT NOT NULL ,
`email` TEXT NOT NULL ,
`kommentar` TEXT NOT NULL
) ENGINE = MYISAM ;


Das muss nur noch in phpmyadmin ein- und ausgeführt werden und schon ist die Tabelle fertig. Natürlich muss vorher noch eine Datenbank erstellt werden.

Schritt 2: Das Formular
Natürlich muss sich der User erstmal eintragen können, bevor irgendwelche Einträge ausgegeben werden können. Dies geschieht über ein Formular:

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>G&auml;stebuch</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
	<form action="auswerten.php" method="post">
		<table>
			<tr>
				<td>Name:*</td>
				<td><input type="text" name="name" /></td>
			</tr>
			<tr>
				<td>eMail:*</td>
				<td><input type="text" name="email" /></td>
			</tr>
			<tr>
				<td valign="top">Kommentar:*</td>
				<td><textarea cols="50" rows="10" name="kommentar"></textarea></td>
			</tr>
			<tr>
				<td><input type="hidden" value="1" name="send" />
				<input type="submit" value="Eintragen" />
				</td>
            </tr>
            <tr>
            	<td>* Die mit * gekennzeichneten Felder sind Pflichtfelder</td>
            </tr>
		</table>
	</form>
</body>
</html>

Das Formular ist nun fertig. Kommen wir zum nächsten Schritt:


Schritt 3: Daten auswerten und eintragen
Bevor wir irgendwelche Daten ausgeben und auswerten, müssen wir erstmal eine Verbindung zum Datenbankserver aufbauen. Dies geschieht in der connect.php. Folgende Zeilen fügen wir dort ein:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
$dbserver ""// der Datenbankserver
$dbuser ""// der Datenbankuser
$dbuserpw ""// das Passwort des Datenbankusers
$db ""// die Datenbank    
// auf einen Tabellenpräfix verzichten wir an dieser Stelle
    
// ... und die Verbindnung aufbauen
mysql_connect($dbhost$dbuser$dbuserpw) or die("Konnte keine Verbinung aufbauen: ".mysql_error()); // fehler ausgeben
// die Datenbank wählen
mysql_select_db($db) or die("Fehler beim Datenbankauswählen: ".mysql_error());

Natürlich dürfen wir die PHP Tags am Anfang und Ende der Datei nicht vergessen.

Kommen wir zum Auswerten der Daten:
Zuerst legen wir ein Array an, das die später die eingegebenen Daten enthalten wird. Doch davor müssen wir erstmal die connect.php includen:

PHP-Quelltext

1
include('connect.php');

Jetzt legen wir das Array an:

PHP-Quelltext

1
2
3
4
5
$arr = array( // arr steht für array
        'name' => mysql_real_escape_string($_POST['name']),
        'email' => mysql_real_escape_string($_POST['email']),
        'kommentar' => mysql_real_escape_string($_POST['kommentar']),
    );

Nun kommt ein Array für die Fehler:

PHP-Quelltext

1
2
3
4
5
6
$err = array( // err steht für error
        'name' => false,
        'email' => false,
        'kommentar' => false,
                'emailvalid' => false,
    );

Da wir die Felder Name, eMail und Kommentar als Pflichtfelder markiert haben, müssen diese Ausgefüllt werden. Ob sie leer oder voll sind überprüfen wir jetzt:

PHP-Quelltext

1
2
3
4
5
6
if(empty($arr['name']))
        $err['name'] = true;
if(empty($arr['email']))
    $err['email'] = true;
if(empty($arr['kommentar']))
    $err['kommentar'] = true;

Natürlich müssen wir auch prüfen, ob der Benutzer eine gültige Email angegeben hat:

PHP-Quelltext

1
2
3
$emailpattern '^[_a-zA-Z0-9\-](\.{0,1}[_a-zA-Z0-9\-])*@([a-zA-Z0-9\-]{2,}\.){0,}[a-zA-Z0-9\-]{3,}(\.[a-zA-Z]{2,4}){1,2}$';
if (!ereg($emailpattern$arr['email']))
         $err['emailvalid'] = true;

Jetzt muss nur noch überprüft werden, ob irgendein value von einem Key des Arrays err true ist.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
if($err['name'] || $err['email'] || $err['kommentar'] || $err['emailvalid']) {
        echo('Bitte füllen Sie alle Felder korrekt aus.');
}
else {
        $query mysql_query("INSERT INTO tabelle (name, email, kommentar) VALUES ('".$arr['name']."', '".$arr['email']."', '".$arr['kommentar']."')");
        if($query) {
                echo('Ihr Eintrag wurde erfolgreich eingetragen.');
        }
        else {
                die('Es gab einen Fehler: '.mysql_error());
        }
}


Schritt 4: Einträge ausgeben
Nun sind wir schon fast am Ende. Was wäre ein Gästebuch, wenn man sich die Einträge nicht anschauen könnte? Nichts. Und genau dagegen wollen wir jetzt etwas tun.
Zuerst includen wir wieder die connect.php:

PHP-Quelltext

1
include('connect.php');

Jetzt kommt die Abfrage der Einträge:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
$query mysql_query("SELECT * FROM tabelle");
while($row mysql_fetch_assoc($query)) {
 
    echo('<strong>Name:</strong> '.nl2br(htmlentities($row['name'])).'<br />
              <strong>eMail:</strong> '.nl2br(htmlentities($row['email'])).'<br />
              <strong>Kommentar:</strong> '.nl2br(htmlentities($row['kommentar'])));
    
    // nl2br und htmlentities muss man anwenden, weil der Benutzer sonst HTML Code einfügen kann, also zB auch eine weiterleitung auf google.de
}

Aber wer will alle seine Einträge auf nur einer Seite haben? Nur 10 Einträge pro Seite wären doch viel besser.
Darum kümmern wir uns jetzt. Dafür müssen wir erst mal wissen, wieviele Einträge wir insgesamt haben.
Es gibt in MySQL eine Funktion COUNT, mit der man alle Datensätze zählen kann.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$gesamt null;
$proseite 10;
$seiten null;
$query mysql_query("SELECT COUNT(*) AS anzahl FROM tabelle");
while($row mysql_fetch_assoc($query)) {
    $gesamt $row['anzahl'];
}
$seiten ceil($gesamt $proseite);
 
// Jetzt geben wir die Seiten als Textlinks aus:
 
for($i=1;$i <=$gesamt;$i++) {
    echo('[ <a href="'.$_SERVER['PHP_SELF'].'?s='.$i.'">'.$i.'</a> ]');
}
 
$limit = ($_GET['s'] - 1) * 10;
$query mysql_query("SELECT * FROM tabelle LIMIT $limit, $gesamt");
$seite 1;
$start = ($seite -1) * $gesamt;

// und noch die ausgabe von vorhin
while($row mysql_fetch_assoc($query)) {
 
    echo('<strong>Name:</strong> '.nl2br(htmlentities($row['name'])).'<br />
              <strong>eMail:</strong> '.nl2br(htmlentities($row['email'])).'<br />
              <strong>Kommentar:</strong> '.nl2br(htmlentities($row['kommentar'])));
    
    // nl2br und htmlentities muss man anwenden, weil der Benutzer sonst HTML Code einfügen kann, also zB auch eine weiterleitung auf google.de
}


Und schon sind wir am Ende des Tutorials angekommen. Noch ein paar Schlussbemerkungen:
  1. Ich habe hier nicht auf korrekten HTML-Code geachtet, der PHP Teil stand im Vordergrund
  2. Auch die graphische Darstellung stand nicht im Vordergrund
  3. Auf OOP hab ich auch nicht geachtet, da das Tutorial für Anfänger geeignet sein soll
  4. Eine Administrationsoberfläche ist auch nicht angelegt worden, aus dem schon oben genannten Grund.


Ich hoffe, euch hat dieses Tutorial gefallen und ihr habt dabei etwas gelernt ;).
 

Ähnliche Themen