Beispiel persönliche Adressbuch programmieren mit Geodaten
Im folgenden Beispiel werden wir ein persönliches Adressbuch programmieren. Neben der Adresse kann eine URL (für ein Bild hinterlegt werden), die Telefonnummer, die E-Mail-Adresse (um direkt eine E-Mail zu sende) und die Geo-Koordinaten (um direkt eine Landkarte anzeigen zu können).

In dem Adressbuch besteht die Möglichkeit zur Detailansicht - hier wird das Bild angezeigt, die Geodaten anhand von Microsoft virtual earth und einen Link zur Homepage angeboten und die Möglichkeit, direkt eine E-Mail an diese Person zu senden.

Die notwendigen Datenfelder werden hier aufgelistet, für das Beispiel werden aber nur die zentralen Datenfelder genutzt (ob nun die Straße, die PLZ, die Schuhgröße etc. mit programmiert wird, ist primär Fingerübung und hat wenig Mehrwert beim Lernen ? kann aber später natürlich erweitert werden).
Welche Informationen für unser selber programmiertes Adressbuch werden benötigt?
verw. Bezeichnung Größe Art
Ja nachname 150 text
Ja vorname 100 text
Ja anrede 1 char
strasse 150 text
plz 10 text
ort 100 text
Ja geburtsdatum 10 date
Ja telefon 20 text
handy 20 text
telefon-arbeit 20 text
Ja email 150 text
Ja homepage 100 text
Ja url-bild 250 text
Ja geo-long 20 text
Ja geo-lat 20 text
Datenbank anlegen für Adressbuch in MySQL
Im ersten Schritt legen wir die Datenbank in MySQL an. Dazu Felder direkt in PHPmyAdmin anlegen.
...
oder die faule Variante?
CREATE TABLE `adressbuch` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nachname` VARCHAR( 150 ) NULL ,
`vorname` VARCHAR( 100 ) NULL ,
`anrede` CHAR( 1 ) NULL ,
`geburtsdatum` DATE NULL ,
`telefon` VARCHAR( 20 ) NULL ,
`email` VARCHAR( 150 ) NULL ,
`homepage` VARCHAR( 100 ) NULL ,
`url_bild` VARCHAR( 250 ) NULL ,
`geo_long` VARCHAR( 20 ) NULL ,
`geo_lat` VARCHAR( 20 ) NULL
) ENGINE = MYISAM ;
Zum Testen geben wir eine Adresse über phpMyAdmin ein: Die Geo-Daten erhält man am schnellsten über http://www.geonames.org und nach dem heraussuchen des Ortes dann auf auf tagzania – dort sieht man sauber die Geo-Daten in der URL:
http://www.tagzania.com/near/48.50129929277658/8.997311890125275/
für Axels: 36.095605 / -115.174734
INSERT INTO `adressbuch` ( `id` , `nachname` , `vorname` , `anrede` , `geburtsdatum` , `telefon` , `email` , `homepage` , `url-bild` , `geo-long` , `geo-lat` )
VALUES (
NULL , 'Pratzner', 'Axel', 'h', NULL , '07071-555 ...', NULL , 'www.php-kurs.com', NULL , '48.50129929277658', '8.997311890125275'
);
INSERT INTO `adressbuch` ( `id` , `nachname` , `vorname` , `anrede` , `geburtsdatum` , `telefon` , `email` , `homepage` , `url-bild` , `geo-long` , `geo-lat` )
VALUES (
NULL , 'Zocker', 'Zapford', 'h', NULL , '07171-555 ...', NULL , 'www.webmaster-crashkurs.de', NULL , '36.095605', '-115.174734'
);
Im ersten Schritt bauen wir die Verbindung zu Datenbank auf. Das geschieht in der selben Weise, wie bereits gezeigt im Kapitel: https://www.php-kurs.com/mysql-datenbank-verbindung-herstellen.htm
Dateiname für folgende PHP-Code ist „konfiguration.php“:
<?php
error_reporting(E_ALL);
// Zum Aufbau der Verbindung zur Datenbank
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'root' );
define ( 'MYSQL_KENNWORT', '' );
define ( 'MYSQL_DATENBANK', 'db-adressbuch' );
$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( $db_link )
{
echo 'Verbindung erfolgreich: ';
echo $db_link;
}
else
{
// hier sollte dann später dem Programmierer eine
// E-Mail mit dem Problem zukommen gelassen werden
die('keine Verbindung möglich: ' . mysql_error());
}
mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");
?>
Jetzt lesen wir die bestehenden Daten aus und zeigen diese in einer Tabelle an:
<?php
require_once ('konfiguration.php');
// Nutzen von Datenbank (Name ist hinterlegt in Konstante MYSQL_DATENBANK
$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");
$sql = " SELECT * FROM adressbuch ";
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
echo '<table border="1">';
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
echo "<tr>";
// hier kommt noch was :)
echo "<td>". $zeile['id'] . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['anrede'] . "</td>";
echo "<td>". $zeile['geburtsdatum'] . "</td>";
echo "<td>". $zeile['telefon'] . "</td>";
echo "<td>". $zeile['email'] . "</td>";
echo "<td>". $zeile['homepage'] . "</td>";
echo "<td>". $zeile['url_bild'] . "</td>";
echo "<td>". $zeile['geo_long'] . "</td>";
echo "<td>". $zeile['geo_lat'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_free_result( $db_erg );
?>
<a href="adresse-bearbeiten.php">neue Adresse anlegen</a>
Es soll nun möglich sein, einen weitere Adresse anzulegen. Dazu blenden wir nach der Tabelle einen Link ein, der die PHP-Datei zum Anlegen von neuen Adressen aufruft:
<a href="adresse-bearbeiten.php">neue Adresse anlegen</a>
In der Datei „adresse-bearbeiten.php“ zum Anlegen einer neuen Adresse wird ein Formular für alle notwendigen Feldern erstellt:

<form name="" action="" method="GET" enctype="text/html">
<p>Nachname:<br>
<input type="text" name="nachname" value="" size="60">
</p>
<p>Vorname:<br>
<input type="text" name="vorname" value="" size="60">
</p>
<p>Anrede:<br>
<input type="radio" name="anrede" value="w"> Frau
<input type="radio" name="anrede" value="m"> Herr
</p>
<p>Geburtsdatum (in der Form YYYY-MM-DD):<br>
<input type="text" name="geburtsdatum" value="" size="10">
</p>
<p>E-Mail:<br>
<input type="text" name="email" value="" size="60">
</p>
<p>Homepage:<br>
<input type="text" name="homepage" value="" size="60">
</p>
<p>URLBild:<br>
<input type="text" name="url_bild" value="" size="60">
</p>
<p>Geodaten:<br>
Longitude (long.): <input type="text" name="geo_long" value="" size="15">
Latitude (lat): <input type="text" name="geo_lat" value="" size="15">
</p>
<input type="hidden" name="aktion" value="speichern">
<input type="Submit" name="" value="speichern">
</form>
Dieses Formular ruft sich selber auf ein speichert eingegebene Daten in der MySQL-Datenbank:
Dazu wird der Kopf erweitert und kontrolliert, ob eine Eingabe gemacht wurde, der entsprechende SQL-Befehl zusammengebaut (zur Kontrolle ausgegeben) und der MySQL-Datenbank übergeben:
<?php
if ( $_GET['aktion'] == "speichern" )
{
$nachname = $_GET['nachname'];
$vorname = $_GET['vorname'];
$anrede = $_GET['anrede'];
$geburtsdatum = $_GET['geburtsdatum'];
$email = $_GET['email'];
$homepage = $_GET['homepage'];
$url_bild = $_GET['url_bild'];
$geo_long = $_GET['geo_long'];
$geo_lat = $_GET['geo_lat'];
$sql = "INSERT INTO adressbuch SET ";
$sql .= " nachname = '$nachname', ";
$sql .= " vorname = '$vorname', ";
$sql .= " anrede = '$anrede', ";
$sql .= " geburtsdatum = '$geburtsdatum', ";
$sql .= " email = '$email', ";
$sql .= " homepage = '$homepage', ";
$sql .= " url_bild = '$url_bild', ";
$sql .= " geo_long = '$geo_long', ";
$sql .= " geo_lat = '$geo_lat' ";
// Zur Kontrolle lassen wir uns den zusammengebauten SQLBefehl
// auf dem Bildschirm anzeigen
echo "<hr>";
echo "SQL: $sql";
echo "<hr>";
require_once ('konfiguration.php');
$db_erg = mysql_query($sql)
or die("Anfrage fehlgeschlagen: " . mysql_error());
echo '<h1>Adresse wurde speichert</h1>';
echo '<a href="auflistung.php">Auflistung anzeigen</a>';
exit;
}
?>
<form name="" action="" method="GET" enctype="text/html">
<p>Nachname:<br>
Wir wollen jetzt eine Adresse löschen können - dazu erweitern wir die Ausgabe der Tabelle mit einer weiteren Zelle am Anfang, in der wir die Aktionen für den entsprechenden Datensatz unterbringen:

<?php
require_once ('konfiguration.php');
// Nutzen von Datenbank (Name ist hinterlegt in Konstante MYSQL_DATENBANK
$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");
$sql = " SELECT * FROM adressbuch ";
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
echo '<table border="1">';
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
echo "<tr>";
echo "<td>";
echo '<a href="adresse-loeschen.php?id='. $zeile['id'] . '">löschen</a> ';
echo "</td>";
echo "<td>". $zeile['id'] . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['anrede'] . "</td>";
echo "<td>". $zeile['geburtsdatum'] . "</td>";
echo "<td>". $zeile['telefon'] . "</td>";
echo "<td>". $zeile['email'] . "</td>";
echo "<td>". $zeile['homepage'] . "</td>";
echo "<td>". $zeile['url_bild'] . "</td>";
echo "<td>". $zeile['geo_long'] . "</td>";
echo "<td>". $zeile['geo_lat'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_free_result( $db_erg );
?>
<a href="adresse-bearbeiten.php">neue Adresse anlegen</a>
In der Datei „adresse-loeschen.php“ wird über die id den zu löschenden Datensatz übergeben:
wir bauen den entsprechenden SQL-Befehl zusammen:
<?php
$id = $_GET['id'];
$sql = "DELETE FROM adressbuch WHERE id='$id' ";
// Zur Kontrolle lassen wir uns den zusammengebauten SQLBefehl
// auf dem Bildschirm anzeigen
echo "<hr>";
echo "SQL: $sql";
echo "<hr>";
require_once ('konfiguration.php');
$db_erg = mysql_query($sql)
or die("Anfrage fehlgeschlagen: " . mysql_error());
echo '<h1>Adresse $id wurde gelöscht</h1>';
echo '<a href="auflistung.php">Auflistung anzeigen</a>';
?>
Zusatzaufgabe: für die Schnellen - erstellen Sie eine Sicherheitsabfrage, in der der Inhalt des Datensatzes angezeigt wird und nochmals explizit auf löschen geklickt werden muss!
Datensatz anzeigen mit Geo-Koordinaten und Microsoft Virtual Earth
Wenn jetzt eine Adresse mit allen Daten und den Geo-Koordinaten direkt in Microsoft Virtual Earth angezeigt werden soll, erweitern wir in der auflistung.php die Aktionen um anzeigen:
<?php
require_once ('konfiguration.php');
// Nutzen von Datenbank (Name ist hinterlegt in Konstante MYSQL_DATENBANK
$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");
$sql = " SELECT * FROM adressbuch ";
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
echo '<table border="1">';
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
echo "<tr>";
echo "<td>";
echo '<a href="adresse-loeschen.php?id='. $zeile['id'] . '">löschen</a> ';
echo '<a href="adresse-anzeigen.php?id='. $zeile['id'] . '">anzeigen</a> ';
echo '<a href="mail-senden.php?id='. $zeile['id'] . '">Mail</a> ';
echo "</td>";
echo "<td>". $zeile['id'] . "</td>";
echo "<td>". $zeile['nachname'] . "</td>";
echo "<td>". $zeile['vorname'] . "</td>";
echo "<td>". $zeile['anrede'] . "</td>";
echo "<td>". $zeile['geburtsdatum'] . "</td>";
echo "<td>". $zeile['telefon'] . "</td>";
echo "<td>". $zeile['email'] . "</td>";
echo "<td>". $zeile['homepage'] . "</td>";
echo "<td>". $zeile['url_bild'] . "</td>";
echo "<td>". $zeile['geo_long'] . "</td>";
echo "<td>". $zeile['geo_lat'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_free_result( $db_erg );
?>
<a href="adresse-bearbeiten.php">neue Adresse anlegen</a>
Und nun sauber aufbereiten in adresse-anzeigen.php
<?php
$id = $_GET['id'];
$sql = " SELECT * FROM adressbuch WHERE id='$id' ";
require_once ('konfiguration.php');
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
$nachname = $zeile['nachname'];
$vorname = $zeile['vorname'];
$anrede = $zeile['anrede'];
$geburtsdatum = $zeile['geburtsdatum'];
$telefon = $zeile['telefon'];
$email = $zeile['email'];
$homepage = $zeile['homepage'];
$url_bild = $zeile['url_bild'];
$geo_long = $zeile['geo_long'];
$geo_lat = $zeile['geo_lat'];
}
mysql_free_result( $db_erg );
if ( $url_bild <> "" )
{
echo '<img src="';
echo $url_bild;
echo ' border="1">';
}
echo '<table border="1">';
echo '<tr>';
echo '<td>';
echo "Name:";
echo '</td>';
echo '<td>';
// Aufbau Nachname, Vorname Anrede
echo $nachname;
echo ", ";
echo $vorname;
echo " ";
if ( $anrede == "m" )
{
echo "Herr";
}
if ( $anrede == "w" )
{
echo "Frau";
}
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Geburtsdatum:";
echo '</td>';
echo '<td>';
// für die schnellen, Geburtsdatum sauber darstellen als tt.mm.YYYY
echo $geburtsdatum;
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Telefon:";
echo '</td>';
echo '<td>';
echo $telefon;
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "E-Mail:";
echo '</td>';
echo '<td>';
echo $email;
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Homepage:";
echo '</td>';
echo '<td>';
echo '<a href="http://';
echo $homepage;
echo '" target="_blank">';
echo $homepage;
echo '</a>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Geodaten:";
echo '</td>';
echo '<td>';
echo $geo_long;
echo " / ";
echo $geo_lat;
echo '</td>';
echo '</tr>';
echo "</table>";
?>
Als Bonbon zur Demonstration von Internet-Services binden wir nun eine Geokarten ein von Microsoft Earth:
Dazu wird die bereits vorbereitet Datei „geomap.php“ verwendet. Diese Datei erwartet als übergabewerte die Parameter „longitude“ und „latitude“ und „zoom“ und „ansicht“ Diese wird nun über einen iframe „eingebunden“.
geomap.php
<?php
if ( $_REQUEST['zoom'] == "")
{
$_REQUEST['zoom'] = 1;
}
if ( $_REQUEST['longitude'] == "")
{
$_REQUEST['longitude'] = '36.095605';
}
if ( $_REQUEST['latitude'] == "")
{
$_REQUEST['latitude'] = '-115.174734';
}
?>
<head>
<script src="http://dev.virtualearth.net/mapcontrol/v3/mapcontrol.js"></script>
<script>
var map = null;
function GetMap()
{
map = new VEMap('myMap');
map.LoadMap(new VELatLong(<?php echo $_REQUEST['longitude'] ?>,<?php echo $_REQUEST['latitude'] ?>), <?php echo $_REQUEST['zoom'] ?>, "<?php
if ($_REQUEST['ansicht'] == "satellit" )
{
echo "o";
}
else
{
echo "h";
}
?>", false);
}
</script>
</head>
<body onload="GetMap();">
<div id="myMap" style="width:100%; height:100%"></div>
</body>
Beispiel iframe:
<iframe width="100%" height="350"
src="geomap.php?longitude=36.095605&latitude=-115.174734&zoom=1&ansicht=satellit">
</iframe>
Erweitert für unsere Beispielanzeige:
<?php
$id = $_GET['id'];
$sql = " SELECT * FROM adressbuch WHERE id='$id' ";
require_once ('konfiguration.php');
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
$nachname = $zeile['nachname'];
$vorname = $zeile['vorname'];
$anrede = $zeile['anrede'];
$geburtsdatum = $zeile['geburtsdatum'];
$telefon = $zeile['telefon'];
$email = $zeile['email'];
$homepage = $zeile['homepage'];
$url_bild = $zeile['url_bild'];
$geo_long = $zeile['geo_long'];
$geo_lat = $zeile['geo_lat'];
}
mysql_free_result( $db_erg );
if ( $url_bild <> "" )
{
echo '<img src="';
echo $url_bild;
echo ' border="1">';
}
echo '<table border="1">';
echo '<tr>';
echo '<td>';
echo "Name:";
echo '</td>';
echo '<td>';
// Aufbau Nachname, Vorname Anrede
echo $nachname;
echo ", ";
echo $vorname;
echo " ";
if ( $anrede == "m" )
{
echo "Herr";
}
if ( $anrede == "w" )
{
echo "Frau";
}
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Geburtsdatum:";
echo '</td>';
echo '<td>';
// für die schnellen, Geburtsdatum sauber darstellen als tt.mm.YYYY
echo $geburtsdatum;
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Telefon:";
echo '</td>';
echo '<td>';
echo $telefon;
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "E-Mail:";
echo '</td>';
echo '<td>';
echo $email;
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Homepage:";
echo '</td>';
echo '<td>';
echo '<a href="http://';
echo $homepage;
echo '" target="_blank">';
echo $homepage;
echo '</a>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td>';
echo "Geodaten:";
echo '</td>';
echo '<td>';
echo $geo_long;
echo " / ";
echo $geo_lat;
echo '</td>';
echo '</tr>';
echo "</table>";
if ($geo_long <> "" AND $geo_lat <> "")
{
echo '<iframe width="100%" height="350" src="geomap.php?longitude=';
echo $geo_long;
echo '&latitude=';
echo $geo_lat;
echo '&zoom=1&ansicht=satellit"></iframe>';
}
?>

Zusätzlich die Möglichkeit, eine E-Mail zu senden:
<?php
if ( $_POST['aktion'] == 'senden' )
{
// hier kommt der entsprechende Mail-Befehl
// mail .....
// $_POST['absender']
// $_POST['empfaenger']
// $_POST['betreff']
// $_POST['inhalt']
echo '<a href="auflistung.php">Auflistung anzeigen</a>';
exit;
}
$id = $_GET['id'];
$sql = " SELECT * FROM adressbuch WHERE id='$id' ";
require_once ('konfiguration.php');
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
{
$nachname = $zeile['nachname'];
$vorname = $zeile['vorname'];
$anrede = $zeile['anrede'];
$geburtsdatum = $zeile['geburtsdatum'];
$telefon = $zeile['telefon'];
$email = $zeile['email'];
$homepage = $zeile['homepage'];
$url_bild = $zeile['url_bild'];
$geo_long = $zeile['geo_long'];
$geo_lat = $zeile['geo_lat'];
}
mysql_free_result( $db_erg );
echo '<form name="" action="" method="POST" enctype="text/html">';
echo '<p>';
echo 'Absender<br>';
echo '<input type="text" name="absender" value="';
echo 'axel@example.com';
echo '" size="50" maxlength="150">';
echo '</p>';
echo '<p>';
echo 'Empfänger<br>';
echo '<input type="text" name="empfaenger" value="';
echo $email;
echo '" size="50" maxlength="150">';
echo '</p>';
echo '<p>';
echo 'Betreff<br>';
echo '<input type="text" name="betreff" value="" size="50" maxlength="150">';
echo '</p>';
echo '<p>';
echo 'Inhalt<br>';
echo '<textarea name="inhalt" rows="15" cols="80">';
echo 'Hallo '. $vorname . " " . $nachname .",";
echo '<';
echo '<input type="hidden" name="aktion" value="senden">';
echo '<input type="Submit" name="" value="Save">';
echo '</form>';
?>
Wenn Sie einen Fehler finden, bitte mitteilen (egal ob Schreibfehler oder inhaltlicher Fehler).
Mit Maus fehlerhafte Stelle markieren und übernehmen mit folgendem Button: