PHP Kurs zum PHP programmieren lernen

www.PHP-Kurs.com

PHP lernen für Einsteiger und Fortgeschrittene

 

Beispiel Terminkalender programmieren

Im Folgenden programmieren wir uns einen Veranstaltungskalender für die eigene Website. Die Termine werden in einer MySQL-Datenbank abgelegt. Der Kalender soll untereinander alle Termine für den aktuellen Monat anzeigen und einen Link zu dem kommenden Monat und zum Vormonat bieten.

Eintragen, Löschen und Ändern der Termine soll möglich sein.

Vorüberlegungen zum PHP-Kalender:

Wir benötigen in der Datenbank folgende Felder:

id: eine eindeutige Nummer, um die Einträge verwalten zu können

datum: an welchem Datum ist der Termin

titel: Für die Kurzanzeige der Titel

beschreibung: großes Textfeld, das alle Informationen zum Termin enthält

Wie legen also als erstes in phpMyAdmin unsere Datenbank Terminkalender an: CREATE DATABASE `terminkalender` ;

Und dann legen wir unsere MySQL-Tabelle mit dem Namen "termine" an:

CREATE TABLE `termine` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`datum` DATE NOT NULL ,
`titel` VARCHAR( 256 ) NOT NULL ,
`beschreibung` BLOB NOT NULL 
) ENGINE = MYISAM ;

Zum Testen tragen wir von Hand ein paar Termine ein. Später werden neue Termine über ein Formular eingetragen.

INSERT INTO `termine` ( `id` , `datum` , `titel` , `beschreibung` ) 
VALUES (
NULL , '2007-08-10', 'PHP-Kurs.com besuchen ab 9:00', ''
), (
NULL , '2007-08-16', 'Geburtstag Elke', ''
);

Um jetzt unsere erste Anzeige zu erhalten (wenn es keine Angabe gibt, alle Termine des aktuellen Monats), müssen wir als erstes eine Verbindung zu unserer Datenbank herstellen. Diese Datei nennen wir "termin-konfiguration.php".

Es werden alle benötigten Daten hinterlegt (die MySQL-Zugangsdaten bekommen Sie normalerweise von Ihrem Provider beim Anlegen der Datenbank).

  1. define ( 'MYSQL_HOST', 'localhost' );
  2. define ( 'MYSQL_BENUTZER', 'root' );
  3. define ( 'MYSQL_KENNWORT', '' );
  4. define ( 'MYSQL_DATENBANK', 'terminkalender' );

Nun bauen wir die Verbindung zu Datenbank auf – dazu wird mysql_connect die bereits definierten Konstanten übergeben.

Das @ vor mysql_connect unterbindet eventuelle Fehlermeldungen, die den Nutzer nur verunsichern – sollte der Verbindungsaufbau nicht klappen, überprüfen wir es anhand der anschließenden if-Abfrage.

  1. $db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
  2. if ( ! $db_link )
  3. {
  4. // hier sollte dann später dem Programmierer eine
  5. // E-Mail mit dem Problem zukommen gelassen werden
  6. // die Fehlermeldung für den Programmierer sollte
  7. // das Problem ausgeben mit: mysql_error()
  8. die('keine Verbindung zur Zeit möglich - später probieren ');
  9. }

Beide obigen PHP-Code-Teile in der Datei "termin-konfiguration.php" abspeichern. Beide am Stück:

  1. <?php
  2. define ( 'MYSQL_HOST', 'localhost' );
  3. define ( 'MYSQL_BENUTZER', 'root' );
  4. define ( 'MYSQL_KENNWORT', '' );
  5. define ( 'MYSQL_DATENBANK', 'terminkalender' );
  6. $db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
  7. if ( ! $db_link )
  8. {
  9. // hier sollte dann später dem Programmierer eine
  10. // E-Mail mit dem Problem zukommen gelassen werden
  11. // die Fehlermeldung für den Programmierer sollte
  12. // das Problem ausgeben mit: mysql_error()
  13. die('keine Verbindung zur Zeit möglich - später probieren ');
  14. }
  15. ?>

PHP-Terminkalender Hauptprogramm – Termine anzeigen

Es werden nun alle Termine für einen Monat angezeigt. Sollte kein Monat angegeben sein, wird der aktuelle Monat verwendet. Unsere neue Datei nennen wir terminanzeige.php

  1. // wenn ein Monat angegeben ist, wird die Echtheit der Daten überprüft
  2. if ( $_GET['monat'] )
  3. {
  4. if ( (INT) $_GET['monat'] > 0 AND (INT) $_GET['monat'] < 13 )
  5. {
  6. $monat = (INT) $_GET['monat'];
  7. }
  8. else
  9. {
  10. // something is wrotten - es wird aktuelle Monat verwendet
  11. $monat = date("n");
  12. }
  13. }
  14. else
  15. {
  16. // ist kein Monat angegeben, wird der aktuelle Monat verwendet
  17. $monat = date("n");
  18. }

Dasgleiche für das Jahr

  1. if ( $_GET['jahr'] )
  2. {
  3. if ( (INT) $_GET['jahr'] > 0 AND (INT) $_GET['jahr'] < 3000 )
  4. {
  5. $jahr = (INT) $_GET['jahr'];
  6. }
  7. else
  8. {
  9. $jahr = date("Y");
  10. }
  11. }
  12. else
  13. {
  14. $jahr = date("Y");
  15. }

Und für den Besucher (und für den Programmierer zu Kontrolle) die Ausgabe von Monat und Jahr.

  1. // Ausgabe vom Monat und dem Jahr
  2. echo "<h1>Terminkalender $monat.$jahr</h1>";

Über die MySQL-Befehl findet die Eingrenzung der Termine auf den gewünschten Monat und das gewünschte Jahr statt.

  1. $sql = "
  2. SELECT
  3. id, datum, titel, beschreibung
  4. FROM termine
  5. WHERE
  6. YEAR(datum) = '$jahr'
  7. AND
  8. MONTH(datum) = '$monat'
  9. ORDER BY datum
  10. ";

Die SQL-Anweisung wird über mysql_query ausgeführt – gefolgt von einer Sicherheitsabfrage, ob die Ausführung funktioniert hat.

  1. $db_erg = mysql_query( $sql );
  2. if ( ! $db_erg )
  3. {
  4. die('Ungültige Abfrage: ' . mysql_error());
  5. }

Es erfolgt die Ausgabe der Ausgabe der Anzahl der Termine – die Ermittlung funktioniert über mysql_num_rows, wobei bereits die mysql_query-Abfrage im Vorfeld erfolgt sein muss.

  1. $anzahl_eintraege = mysql_num_rows($db_erg);
  2. echo "<p>Anzahl der Einträge: $anzahl_eintraege </p>";

Wenn es nun mindestens einen Termin gibt, erfolgt die Ausgabe in einer Tabelle (hier kann man bestimmt sich noch am Design austoben – hier zählt erstmal die Funktion :) )

Die von der Datenbank gelieferten Ergebnisse werden über mysql_fetch_array in einer Array übertragen und per while-Schleife solange durchlaufen, bis alle Einträge ausgegeben worden sind.

  1. echo '<table border="1">';
  2. while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
  3. {
  4. echo '<tr>';
  5. echo '<td>'. $zeile['datum'] . '</td>';
  6. echo '<td>';
  7. echo '<b>'. $zeile['titel'] . '</b><br />';
  8. echo $zeile['beschreibung'];
  9. echo '</td>';
  10. echo '</tr>';
  11. }
  12. echo '</table>';

Jetzt wird der Speicher geleert und die Verbindung zum MySQL beendet mit:

  1. mysql_free_result( $db_erg );

Im letzten Schritt möchten wir noch 3 Links haben – einen zum Anzeigen des Folgemonats, einen zum Sprung zum aktuellen Monat, einen Link zum vergangenen Monat. Interessant wird es bei den Jahresübergängen.

  1. // Vormonat Kontrolle, ob bereits Januar
  2. if ( $monat == 1 )
  3. {
  4. $vmonat = 12;
  5. $vjahr = bcsub ( $jahr, 1 );
  6. }
  7. else
  8. {
  9. $vmonat = bcsub ( $monat, 1 );
  10. $vjahr = $jahr;
  11. }
  12. echo '<a href="terminanzeige.php';
  13. echo '?monat='. $vmonat;
  14. echo '&jahr='. $vjahr;
  15. echo '">Vormonat</a>';
  16. echo ' | ';
  17. echo '<a href="terminanzeige.php';
  18. echo '?monat='. date("n");
  19. echo '&jahr='. date("Y");
  20. echo '">akt. Monat</a>';
  21. echo ' | ';
  22. // nächster Monat - Kontrolle, ob bereits Dezember
  23. if ( $monat == 12 )
  24. {
  25. $nmonat = 1;
  26. $njahr = bcadd ( $jahr, 1 );
  27. }
  28. else
  29. {
  30. $nmonat = bcadd ( $monat, 1 );
  31. $njahr = $jahr;
  32. }
  33. echo '<a href="terminanzeige.php';
  34. echo '?monat='. $nmonat;
  35. echo '&jahr='. $njahr;
  36. echo '">n&auml;chster Monat</a>';

Im nächsten Schritt sollen Termine erfasst werden. Dazu benötigen wir ein Formular mit den entsprechenden Feldern – hierbei wird nun nicht auf Sicherheit geachtet, da die Annahme zugrunde liegt, dass nur berechtigte Personen Termine erfassen, ändern und löschen dürfen. Soll dies auch für unbekannte Benutzer möglich sein (Websitebenutzer), muss unbedingt auf Sicherheit geachtet werden!

Wir geben unser Formular unter der Auflistung aus. Es werden 3 Felder benötigt – das Datumsfeld, ein Feld für die Terminbeschreibung und ein Textbereich für die ausführliche Fassung.

Dabei sollte bei der Übertragungsmethode method="POST" unbedingt POST gewählt werden, da sonst die Datenmenge (Textbereich für Beschreibung) für GET zu viel werden könnte.

  1. // Anzeige Formular
  2. echo '<hr />';
  3. echo '<form name="" action="" method="POST" enctype="text/html">';
  4. echo '<p>Datum in der Form JJJJ-MM-TT<br />';
  5. echo '<input type="text" name="termin[datum]" value="" size="10" maxlength="10" />';
  6. echo '</p>';
  7. echo '<p>Kurzbeschreibung<br />';
  8. echo '<input type="text" name="termin[kurzbeschreibung]" value="" size="50" maxlength="255" />';
  9. echo '</p>';
  10. echo '<p>ausf&uuml;hrliche Beschreibung<br />';
  11. echo '<textarea name="termin[beschreibung]" rows="10" cols="80"></textarea></p>';
  12. echo '<input type="hidden" name="vorgang" value="neu" />';
  13. echo '<input type="Submit" name="" value="speichern" />';
  14. echo '</form>';

Im Formular gibt es ein verstecktes Feld mit dem Name "vorgang" – über dieses kann nach Absenden des Formulars angefragt werden, was mit den Daten geschehen soll.

Nun folgt vor der Ausgabe der Tabelle eine Abfrage, ob neue Daten vorhanden sind, und wenn ja, werden diese gespeichert.

  1. // Speichern neuer Daten
  2. if ( $_POST['vorgang'] == 'neu' )
  3. {
  4. speichere_daten ( $_POST['termin'] );
  5. }

Das Speichern erfolgt über den Funktionsaufruf speichere_daten ( $_POST['termin'] ); - durch die Übergabe der Arrays $_POST kann in der Funktion direkt auf die Daten zugegriffen werden. Die praktische Übergabe durch $_POST['termin'] ist auch der Grund für die Schreibweise vorher im Formular mit <input type="text" name="termin[datum]" value="" size="10" maxlength="10" />.

Die Funktion nimmt die Daten und speichert diese über die SQL-Anweisung "INSERT ...". Sie sollten noch ein wenig Zeit in die Validierung der Daten stecken – hier zum Lernen soll es ohne Validierung ausreichen.

  1. // Daten speichern
  2. function speichere_daten ( $termin )
  3. {
  4. // hier sollte noch eine Validierung des Datums stattfinden
  5. $sql = "INSERT INTO termine
  6. (
  7. `id`, `datum` , `titel` , `beschreibung`
  8. )
  9. VALUES
  10. (
  11. NULL ,
  12. '". $termin['datum'] ."',
  13. '". $termin['kurzbeschreibung'] ."',
  14. '". $termin['beschreibung'] ."'
  15. )
  16. ";
  17. $db_erg = mysql_query( $sql );
  18. if ( ! $db_erg )
  19. {
  20. die("Ungültige Abfrage: $sql <hr />" . mysql_error());
  21. }
  22. else
  23. {
  24. echo "<h2>Termin gespeichert</h2>";
  25. }
  26. }

Im nächsten Schritt wollen wir auch das Löschen von Daten ermöglich. Dazu ergänzen wir die Tabelle noch um eine weitere Spalte, die mit Links versehen wird. In den Links wird über die ID ein eindeutiger Zugriff möglich. Auch hier findet über die Variable "vorgang" eine Steuerung statt.

  1. echo '<td>';
  2. echo '<a href="terminanzeige.php?vorgang=loeschen&id=';
  3. echo $zeile['id'];
  4. echo '">l&ouml;schen</a> ';
  5. echo '</td>';

Am Anfang vom Programm erfolgt wieder eine Abfrage, ob die Variable "vorgang" den Inhalt "loeschen" hat. Wenn ja, erfolgt der Aufruf des Löschvorgangs über eine Funktion, der die ID übergeben wird. Da der Aufruf über einen Link stattfindet, muss die Variablenabfrage mit $_GET stattfinden!

  1. // Löschen von Einträgen
  2. if ( $_GET['vorgang'] == 'loeschen' )
  3. {
  4. loeschen_daten ( $_GET['id'] );
  5. }

Die entsprechende Funktion beinhaltet die SQL-Anweisung "DELETE FORM ... WHERE ... LIMIT 1"

Der Zusatz "LIMIT 1" begrenzt den Schaden :) – es wird maximal ein Datensatz gelöscht.

  1. function loeschen_daten ( $id ) {
  2. $sql = "DELETE FROM termine
  3. WHERE id='$id'
  4. LIMIT 1
  5. ";
  6. $db_erg = mysql_query( $sql );
  7. if ( ! $db_erg )
  8. {
  9. die("Ungültige Abfrage: $sql <hr />" . mysql_error());
  10. }
  11. else
  12. {
  13. echo "<h2>Termin gel&ouml;scht</h2>";
  14. }
  15. }

Hier können Sie den Vorgang erweitern, dass vor dem Löschen erst eine Sicherheitsabfrage stattfindet!

Daten aktualisieren

Um nun Daten ändern zu können, fügen wir in der Tabelle einen weiteren Link hinzu.

  1. echo '<td>';
  2. echo '<a href="terminanzeige.php?vorgang=aendern&id=';
  3. echo $zeile['id'];
  4. echo '">&auml;ndern</a> ';

Am Anfang der Datei erfolgt wieder eine Abfrage und der Funktionsaufruf

  1. // Daten zum Ändern anzeigen
  2. if ( $_GET['vorgang'] == 'aendern' )
  3. {
  4. anzeige_daten_zum_bearbeiten ( $_GET['id'] );
  5. }

In der Funktion wird für diesen einen Datensatz über die entsprechende SQL-Anweisung der Inhalt geholt und in einem Formular zum Ändern angezeigt

  1. function anzeige_daten_zum_bearbeiten ($id)
  2. {
  3. $sql = "
  4. SELECT *
  5. FROM termine
  6. WHERE id = '$id'
  7. ";
  8. $db_erg = mysql_query( $sql );
  9. if ( ! $db_erg )
  10. {
  11. die('Ungültige Abfrage: ' . mysql_error());
  12. }
  13. $zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC);
  14. echo '<form name="" action="" method="POST" enctype="text/html">';
  15. echo '<p>Datum in der Form JJJJ-MM-TT<br />';
  16. echo '<input type="text" name="termin[datum]" value="';
  17. echo $zeile['datum'];
  18. echo '" size="10" maxlength="10" />';
  19. echo '</p>';
  20. echo '<p>Kurzbeschreibung<br />';
  21. echo '<input type="text" name="termin[kurzbeschreibung]" value="';
  22. echo $zeile['titel'];
  23. echo '" size="50" maxlength="255" />';
  24. echo '</p>';
  25. echo '<p>ausf&uuml;hrliche Beschreibung<br />';
  26. echo '<textarea name="termin[beschreibung]" rows="10" cols="80">';
  27. echo $zeile['beschreibung'];
  28. echo '</textarea></p>';
  29. echo '<input type="hidden" name="termin[id]" value="';
  30. echo $zeile['id'];
  31. echo '" />';
  32. echo '<input type="hidden" name="vorgang" value="update" />';
  33. echo '<input type="Submit" name="" value="&Auml;nderungen speichern" />';
  34. echo '</form>';
  35. echo '<hr />';
  36. }

Die Steuerung erfolgt über die beiden versteckten Formularfelder "vorgang" und "id", die am Beginn unseres Scripts abgefragt werden.

  1. if ( $_POST['vorgang'] == 'update' )
  2. {
  3. update_daten ( $_POST['termin'] );
  4. }

Und die Funktion zum Speichern der aktualisierten Daten:

  1. // Daten updaten
  2. function update_daten ( $termin )
  3. {
  4. // hier sollte noch eine Validierung des Datums stattfinden
  5. $sql = "UPDATE termine SET
  6. `datum` = '". $termin['datum'] ."',
  7. `titel` = '". $termin['kurzbeschreibung'] ."',
  8. `beschreibung` = '". $termin['beschreibung'] ."'
  9. WHERE
  10. id = '". $termin['id'] ."'
  11. ";
  12. $db_erg = mysql_query( $sql );
  13. if ( ! $db_erg )
  14. {
  15. die("Ungültige Abfrage: $sql <hr />" . mysql_error());
  16. }
  17. else
  18. {
  19. echo "<h2>Termin geupdatet</h2>";
  20. }
  21. }

Damit nach dem Speichern nicht nochmals das Formular angezeigt wird, muss die if-Anweisung für den Vorgang "aendern" ergänzt werden mit:

  1. // Daten zum Ändern anzeigen
  2. if ( $_GET['vorgang'] == 'aendern' AND $_POST['vorgang'] <> 'update' )
  3. {
  4. anzeige_daten_zum_bearbeiten ( $_GET['id'] );
  5. }

Ente gut, alles gut und satt

Dies als "kleines" Tutorial, wie man mit Datenbanken umgehen kann. Das Beispiel in fast 300 Code-Zeilen zeigt eine prinzipielle Vorgehensweise – es fehlen noch Validierungen (damit keine falsche Daten eingegeben werden können), und die Eintrag-, Lösch- und Änderungsfunktionen sollten auf keinen Fall für fremde Websitebesucher zugänglich gemacht werden. Die Anzeige der Termine kann sehr wohl genutzt werden, da dort nur 2 Daten verwendet werden (Monat und Jahr), die validiert werden.

Hier bekommen Sie das Terminkalender-Script an einem Stück, damit die obigen Sprünge nachvollzogen werden können.

Zur Verdeutlichung ein Ablaufdiagramm:

Ablaufdiagramm Terminkalender-Anwendung
Gästebuch absichernSeitenanfangScript PHP-Terminkalender
PHP-Kurs.com - jetzt PHP lernen    Bookmark bei del.icio.us setzen    Bookmark bei Mister Wong setzen