Kategorie: PHP Programmierung

Hier finden Sie verschiedene PHP Programmierung Anleitungen.

Mit PHP und MySQL ein Adressbuch erstellen

Mit PHP und MySQL ein Adressbuch erstellen

In dieser BC24 Anleitung geht es darum, ein kleines Adressbuch mit Hilfe von PHP und MySQL zu erstellen. PHP wird verwendet um die Eingabedaten zu verarbeiten und die Datenbank dient dazu die Einträge zu speichern. Das Adressbuch wird die Funktionen besitzen, neue Einträge hinzuzufügen und bereits vorhandene wieder zu löschen.

Adressbuch mit PHP

Adressbuch
Adressbuch

Das Adressbuch besteht aus einer Eingabemaske für Name, Telefonnummer und E-Mail. Darunter werden die bereits eingetragenen Daten in einer Tabelle wieder ausgegeben. Jeder Eintrag kann zusätzlich über einen Link gelöscht werden. Das ist aber nur mal das Aussehen, das mit der Logik im Hintergrund noch relativ wenig zu tun hat.

Das gesamte Adressbuch wird am Ende aus 4 Teilen bestehen, einer Klasse AddressBook, welche die Schnittstelle zur Datenbank sein wird, einer index Datei, welche alle Anfragen entgegen nimmt und zu guter Letzt einer Template Datei, die das gesamte HTML Markup enthält.

Adressbuch Daten
Adressbuch Daten

Die AddressBook Klasse

Die Klasse AddressBook ist das Herzstück unserer Adressbuch Webanwendung, in dieser definieren wir Methoden, um Datensätze in die Datenbank zu schreiben und auch wieder zu löschen. Außerdem verfügt sie über eine Methode um vorhanden Datensätze auszulesen.

Das Gerüst der Klasse

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
class AddressBook {
    
    private $db;
    private $error;
    
    public function __construct($db) {
        $this->db = $db;       
    }
    
    public function getError() {
    return $this->error;
    }
    
    
    
    public function add($name, $phone, $email) {
  
    }
    
    
    public function getEntries() {
      
    }
    
    
    public function delete($id) {
        
    }
       
    
}

Der Konstruktor (__construct()) wird ausgeführt, sobald die Klasse instanziiert wird, also ein konkretes Objekt von ihr erzeugt wird. Dort übergeben wir auch direkt ein MySQLi Objekt, mit dem eine Verbindung zur Datenbank hergestellt werden kann. Dieses MySQLi Objekt erzeugen wir aber erst später und soll jetzt erst mal als BlackBox gegeben sein.

In der Variable $error werden mögliche Fehler die auftreten gespeichert, zum Beispiel eine fehlerhafte Eingabe. Mit der Funktion getError() kann auf diese Fehlermeldung dann zugegriffen werden.

Die add() Methode

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function add($name, $phone, $email) {
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->error = 'NO VALID EMAIL';
            return;
        }
        $sql = 'INSERT INTO
                            adress_book(Name, Phone, Email, date)
               VALUES
                            (?, ?, ?, NOW())';
        $stmt = $this->db->prepare($sql);
        $stmt->bind_param('sss', $name, $phone, $email);
        $stmt->execute();
        $result = $stmt->insert_id;
        $stmt->close();
        return (boolean)$result;   
}

Diese Methode macht im Prinzip nichts anderes als zu prüfen, ob die E-Mail-Adresse ein gültiges Format hat und anschließend die Daten in der Datenbank zu speichern. Hier wird bewusst darauf verzichtet, zu prüfen ob die Werte leer sind. Sollten sie leer sein, wäre das zwar keine sinnvolle Eingabe, aber eine Zeichenkette ohne Sinn wäre ebenfalls nicht sinnvoll. Von daher macht eine solche Prüfung insgesamt relativ wenig Sinn.

Die delete Methode()

Nachdem die Methode zum Eintragen der Daten in die Datenbank fertig ist, möchten wir natürlich auch Einträge aus dem Adressbuch wieder löschen können.

1
2
3
4
5
6
7
8
9
10
11
public function delete($id) {
    if(!is_numeric($id)) return false;
    $id = (int)$id;
    $sql = 'DELETE FROM adress_book WHERE ID = ?';
    $stmt = $this->db->prepare($sql);
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $result = $stmt->affected_rows;
    $stmt->close();
    return (boolean)$result;        
}

Diese Methode macht nichts weiter, als einen Eintrag anhand einer ID aus der Datenbanktabelle zu löschen. $resulthat entweder den Wert 1 (Datensatz wurde gelöscht) oder den Wert 0 (Datensatz nicht vorhanden), mit einem cast ((type)obejct) zum Typ boolean erhalten wir daraus einen boolschen true oder false Wert.

Die getEntries() Methode

Zu guter Letzt fehlt noch eine Methode um die Klasse zu komplettieren. Das Eintragen und wieder Löschen ist zwar schön, jedoch nützt das Ganze auch nichts, wenn wir die Daten nicht ausgeben können.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function getEntries() {
        $result = false;
        $sql = 'SELECT
                        ID, Name, Phone, Email, date
                FROM
                        adress_book';
        $stmt = $this->db->prepare($sql);
        $stmt->execute();
        $stmt->bind_result($id, $name, $phone, $email, $date);
        while($stmt->fetch()) :
            $result[] = array('ID' => $id,
                              'Name' => $name,
                              'Phone' => $phone,
                              'Email' => $email,
                              'Date' => $date);            
        endwhile;         
        return $result;       
}

Wiederrum eine sehr simple Methode, wenn Einträge vorhanden sind, dann wird ein Array mit den Daten zurückgegeben. Ansonsten wird der Wert false zurückgegeben, als Indikator dafür, dass keine Einträge im Adressbuch vorhanden sind.

Die Datenbank

Bevor wir zum Frontend kommen, müssen wir uns nochmal vor Augen führen, wie die Datenbank beziehungsweise die Tabelle in der Datenbank überhaupt aussieht.

1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `address_book` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT,
  `Name` VARCHAR(100) NOT NULL,
  `Phone` VARCHAR(200) NOT NULL,
  `Email` VARCHAR(200) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Engine und default charset kann man natürlich nach Belieben einstellen.

Das HTML Markup / Das Template

Das Adressbuch sollte unabhängig von seinem Aussehen funktionieren und auch kreativen Freiraum für weitere Entwicklungen bieten. Aus diesem Grund werden Logik und Aussehen strikt getrennt, dies entspricht in etwa einem Model-View-Controller Pattern.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<html>
<head>
</head>
  <body>
 
  <h1 style="background:white; padding:10px;">Mit PHP und MySQL ein Adressbuch erstellen / BC24.org</h1>
 
  <div style="padding:20px;">
    <form action="" method="post" name="abook" id="adress_book_form">
    <span class="element">
        <span class="label">Name:</span> <input type="text" name="name"/>
    </span>
 
    <span class="element">
        <span class="label">Telefon:</span> <input type="text" name="phone"/>
    </span>
 
    <span class="element">
        <span class="label">E-Mail:</span> <input type="text" name="email"/>
    </span>
 
    <button type="submit" class="button element"> Hinzufügen </button>
 
    </form>
 
    </div>
 
 
    <?php if(is_array($data)) : ?>
    <table class="result">
        <tr>
            <th> Name </th>
            <th> Telefon </th>
            <th> E-Mail </th>
            <th> Admin </th>
        </th>
        </tr>
        <?php foreach($data as $dat) : ?>
        <tr>
            <td> <?php echo htmlspecialchars($dat['Name']) ?> </th>
            <td> <?php echo htmlspecialchars($dat['Phone']) ?> </td>
            <td> <?php echo htmlspecialchars($dat['Email']) ?> </td>
            <td> <a href="index.php?id=<?php echo $dat['ID'] ?>&amp;action=delete">Löschen</a> </td>
        </tr>
        <?php endforeach; ?>
    </table>
    <?php else: ?>
        <div class="info"> Keine Daten vorhanden </div>
    <?php endif; ?>   
 
 
  </body>
</html>

Die Form ist dazu da, um neue Einträge in das Adressbuch schreiben zu können.
Damit das Ganze auch noch nach etwas aussieht, verwenden wir etwas CSS. Dadurch wird vor allem die Tabelle lesbarer.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
html, body {
padding:0px;
margin:0px;
background: rgb(102, 144, 219); /* Old browsers */
overflow:hidden;
font: 12px Verdana,Tahoma,Arial,Calibri,Geneva,sans-serif;
 
}
 
#adress_book_form input[type=text] {
    border:1px solid darkgreen;
    padding:5px;
    width:200px;
    font-size:14px;
}
 
.label {
    font-size: 15px;
 
}
 
.element {
    margin-right:10px;
}
 
.button {
    background:darkgreen;
    color:white;
    border:1px solid black;
    padding:3px;
    font-size:15px;
    margin-left:20px;
}
 
.button:hover {
    cursor:pointer;
    background: rgb(102, 144, 219);
    color:black;
}
 
.result {
    width:100%;
}
 
/*
.result th {
    font-size:18px;
}
 
.result td {
    text-align:center;
}
 
.result tr:nth-child(even) {
    background:grey;
}
*/
 
 
table { border-collapse: collapse; border: 1px solid #839E99; 
background: #f1f8ee; color: #033; }
caption { font-size: 1.3em; font-weight: bold; text-align: left; padding: 1em 4px; }
td, th { padding: 3px 3px .75em 3px; line-height: 1.3em; }
th { background: #839E99; color: #fff; font-weight: bold; text-align: left; padding-right: .5em; vertical-align: top; }
thead th { background: #2C5755; text-align: center; }
.odd td { background: #DBE6DD; }
.odd th { background: #6E8D88; }
td a, td a:link { color: #325C91; }
td a:visited { color: #466C8E; }
td a:hover, td a:focus { color: #1E4C94; }
th a, td a:active { color: #fff; }
tfoot th, tfoot td { background: #2C5755; color: #fff; }
th + td { padding-left: .5em; }
 
.info {
    padding:20px; 
    font-size:15px;
    border:1px solid black;
    margin-top:20px;
}

Diese Styles ergeben direkt das Adressbuch, welches auf dem oberen Screenshot zu sehen ist. Das Aussehen kann aber individuell von jedem selbst geändert werden, dies ist ein großer Vorteil der Trennung zwischen Logik und Ausgabe.

Ich habe auch schon viele Lösungen gesehen, wo das gesamte Adressbuch in einer einzigen PHP Datei umgesetzt wurde, davon würde ich aber abraten. Dies ist zum einen enorm unprofessionell, zum anderen werden Änderungen schnell zur Qual.

Die Heirat in der index.php

Die Überschrift ist vielleicht etwas überzogen, dennoch brauchen wir noch einen Vermittler der die Daten vom Benutzer entgegennimmt und an das Objekt der Klasse weitergibt. Außerdem müssen die Adressbucheinträge an das Template übergeben werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** CONFIG */
$Server = 'localhost';
$Username = 'root';
$Password = '';
$DB_Name = 'adress_book';
$db = new mysqli($Server, $Username, $Password, $DB_Name);
/** END CONFIG */
 
require_once 'AdressBook.php';
 
$AddressBook = new AddressBook($db);
/* Hier wird geprüft, ob das Eingabeformular abgeschickt wurde, um einen neuen Eintrag in das Adressbuch einzufügen */
if(isset($_POST['name'], $_POST['phone'], $_POST['email'])) {
    $AddressBook-&gt;add($_POST['name'], $_POST['phone'], $_POST['email']);
}
/* Hier wird geprüft, ob ein Eintrag aus dem Adressbuch gelöscht werden soll */
if(isset($_GET['id'], $_GET['action']) &amp;&amp; $_GET['action'] === 'delete') {
    $AddressBook-&gt;delete($_GET['id']);
}
 
$data = $AddressBook-&gt;getEntries(); 
 
require_once 'book.tpl';

Die Datenbankverbindung muss natürlich entsprechend angepasst werden.

Fazit

So schnell kann man ein kleines Adressbuch mit PHP und MySQL umsetzten. Das Adressbuch kann natürlich noch beliebig erweitert werden.
Eine fertige Demo findet ihr hier: Adressbuch in PHP
Das gesamte Anwendung kann unter https://bc24.org/Adressbuch/Adressbuch.rar heruntergeladen werden.