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).

Auflistung des persönlichen Adressbuches

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.

Adressbuch anzeigen mit Geodaten und Microsoft virtual earth

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: http://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:

Formular für Daten des persönlichen Adressbuches
<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:

Löschen von Adressen möglich machen
<?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>';
}


?>
Adressbuch anzeigen mit Geodaten und Microsoft virtual earth

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 '</textarea>';

echo '<input type="hidden" name="aktion" value="senden">';
echo '<input type="Submit" name="" value="Save">';
echo '</form>';
?>