Claudia Steinberg Corporate Concepts

PHP-Codes

[cscc]

Hier stelle ich einige PHP-Scripte vor, die ich für diese Seiten geschrieben habe. Unter der Rubrik [cscc] befinden sich folgende Scripte:

[index.php] [menu.php] [content.php] [fotos_anzeigen.php] [mail.php]

Um Änderungen möglichst zentral vornehmen zu können, arbeite ich hier mit verschiedenen Dateien für die verschiedenen Bereiche der Seite, die dann mit include() eingebunden werden.

1

index.php:

2
3<?php include("SeitenAnfang.php");?>
4
5<body>
6
7<?php include("header.php");?>
8
9<div class="flexcontainer">
10
11<?php include("menu.php");?>
12<?php include("content.php");?>
13<?php include("footer.php");?>
14
15</div><!-- Ende Flexcontainer -->
16</body>
17</html>

Download des PHP-Codes

[index.php] [menu.php] [content.php] [fotos_anzeigen.php] [mail.php]

Die menu.php wurde zentral in die index.php eingebunden.
Soll das Menü verändert werden, etwa weil Seiten umbenannt, entfernt oder hinzugefügt werden, ist es lediglich nötig, diese Änderung zentral vorzunehmen:
Die Seite muss hochgeladen werden und in der menu.php in die Liste der erlaubten Dateien (Zeile 28) aufgenommen werden. Um eine Seite vorübergehend aus dem Menü zu entfernen, reicht es, sie in der Liste mit /*Datei*/ auszukommentieren.
Dann wird der Text für den Menüpunkt erzeugt, indem der Punkt und die Dateiendung entfernt werden (Zeile 31-33).
Als nächstes fragt das Script, das ja in die aktuelle Seite eingebunden ist, wie die aktuelle Seite heisst und entfernt den / vor dem Dateinamen (Zeile 35+36).
Entspricht der Dateiname dem Dateinamen, der gerade gelesen wird, wird ein Link gesetzt, der die Klasse "aktiv" hat. Ohne diese Übereinstimmung wird ein Link erzeugt, der diese Klasse nicht besitzt. So kann die aktuelle Seite im Menü über CSS gekennzeichnet werden.
Da die Reihenfolge, in der die Dateien gelesen werden, nicht beeinflusst werden kann, der Menüeintrag für "HOME" aber in jedem Fall der erste und der Menüeintrag für "Kontakt" in jedem Fall der letzte sein soll, sind diese beiden Sonderfälle fix über bzw. unter das flexible Menü eingetragen (Zeilen 20+21 und 47+48).

1

menu.php:

2
3<?php
4
5$verzeichnis = ".";
6
7echo "<nav class='mainnav' id='menu'>\n<ul class='dat'>\n";
8
9if ( is_dir ( $verzeichnis ))
10{
11 // oeffnen des Verzeichnisses
12 if ( $handle = opendir($verzeichnis) )
13 {
14 // einlesen der Verzeichnisses
15
16 $dieseSeite = $_SERVER['REQUEST_URI'];
17 $dieseSeite = substr($dieseSeite, 1);
18 //echo $dieseSeite;
19
20 if($dieseSeite == "index.php"){echo"<li class='hauptpunkt aktiv'><a href='index.php' name='m'>HOME</a></li>\n";}
21 else {echo"<li class='hauptpunkt'><a href='index.php' name='m' >HOME</a></li>\n";}
22
23
24 while (($file = readdir($handle)) !== false)
25 {
26 if(is_file($file)){ //Test ob es sich um eine Datei handelt (und kein Verzeichnis)
27
28 if( $file == "Grafik.php" || $file == "Fotos.php" || $file == "Web.php" || $file == "Print.php" ){ //Liste der erlaubten Dateien
29
30
31 $wert = $file;
32 $params = explode(".", $wert);
33 $file_kurz = $params[0]; //schneidet hinter dem Punkt den Dateinamen ab
34
35 $aktuelleSeite = $_SERVER['REQUEST_URI'];
36 $aktuelleSeite = substr($aktuelleSeite, 1);
37
38 if($aktuelleSeite == $file){
39
40 echo"<li class='hauptpunkt aktiv'><a href='".$file."' >".$file_kurz."</a></li>\n";}
41 else{echo"<li class='hauptpunkt'><a href='".$file."'>".$file_kurz."</a></li>\n";}
42
43 } //Ende erlaubte-Dateien-IF
44 }
45 } //Ende while
46
47 if($dieseSeite == "Kontakt.php"){echo"<li class='hauptpunkt aktiv'><a href='Kontakt.php' name='m'>Kontakt</a></li>\n";}
48 else {echo"<li class='hauptpunkt'><a href='Kontakt.php' name='m' >Kontakt</a></li>\n";}
49
50 closedir($handle);
51 }
52 }
53
54echo"</ul>\n</nav>\n";
55
56//Ende Liste Hauptpunkte
57
58?>

Download des PHP-Codes

[index.php] [menu.php] [content.php] [fotos_anzeigen.php] [mail.php]

Die content.php ist ebenfalls zentral in die jeweils aktuelle Seite eingebunden.
Als erstes fragt das Script wieder den Dateinamen der aktuellen Seite ab.
Um nach einem gleichnamigen Verzeichnis suchen zu können, werden der / vor dem Dateinamen (Zeile 9) und der Punkt und die Dateiendung dahinter (Zeile 13+14) entfernt.

Ist der Name der aktuellen Seite index.php oder wird er in der URL nicht angezeigt, weil die index.php beim ersten Aufruf der Seite nicht benannt wird, lautet der Name des Verzeichnisses "start" (Zeile 15-17). In allen anderen Fällen liest das Script zum ersten Mal das Unterverzeichnis aus und prüft über die Abfrage der Position des Punktes vor der Dateiendung nicht nur, ob es sich auch wirklich um eine Datei und kein Verzeichnis handelt (dazu könnte man auch is_file() bzw. is_dir() verwenden), sondern schließt auch defekte Dateinamen aus. Handelt es sich um eine Datei mit einem intakten Dateinamen, wird sie mit den anderen in ein Array geschrieben, das oben als Array (Zeile 20) als solches definiert wurde.
Das gleiche geschieht ein zweites Mal (Zeile 47-65). Der Grund dafür ist, dass das erste Array zunächst erhalten bleibt, während das zweite aufgelöst (ab Zeile 67) wird.
Hierzu wird es zunächst alphabetisch sortiert (Zeile 69), um die Reihenfolge der Ausgabe steuern zu können.
Da die Ausgabe keineswegs alphabetisch sein soll, sind die Dateinamen mit einer führenden dreistelligen Zahl versehen z.B. 100eineDatei.php und 200andereDatei.php. So ist es möglich, die Reihenfolge zwar zu steuern, aber den Dateinamen, der mit einem "e" beginnt, vor dem aufzurufen, der mit einem "a" beginnt. Sollen dazwischen später noch andere Dateien aufgerufen werden, bieten 99 Stellen ausreichend Spielraum.

Bereits in Zeile 4 wurde eine HTML-Tabelle geöffnet.
Nun wird in Zeile 72 eine Tabellen-Zeile geöffnet, sowie das erste Feld der Tabellen-Zeile, das die Klasse "Inhalt" erhält.
Für jeden Inhalt wird ein Ankerlink <a name='100eineDatei'></a> erzeugt (Zeile 74-77), um den Inhalt über Links anspingen zu können.
In Zeile 80+81 wird der Inhalt der Datei über include() eingebunden.
In Zeile 82 wird das Tabellen-Feld mit dem Hauptinhalt geschlossen und ein zweites mit der Klasse "Rand" geöffnet.
In Zeile 84 wird das erste Array alphabetisch sortiert. Während der Auflösung dieses Arrays in einer for-Schleife (Zeile 85) werden in Zeile 86-88 der Punkt und die Dateiendung entfernt. Sollte der Dateiname einen _ enthalten, wird er in Zeile 90 durch ein Leerzeichen ersetzt.
In Zeile 92 wird ein Link erzeugt, über den der jeweilige Inhalt angesprungen werden kann. In Zeile 93 endet die for-Schleife, die in Zeile 85 beginnt und das erste Array auflöst, während das zweite Array aufgelöst wird. Dafür wurde in Zeile 70 eine for-Schleife geöffnet, die in Zeile 99 geschlossen wird, also die for-Schleife von Zeile 85-93 umschließt.
Nun enthält das Tabellen-Feld "Rand" sämtliche Links, um die Anker der Inhalte anspringen zu können. Es wird in Zeile 95 geschlossen, ebenso die in Zeile 72 geöffnete Tabellen-Zeile.
Unter dieser ersten Tabellenzeile folgt in Zeile 96 eine zweite, die im Randbereich nur einen Link zum Anker des Menüs enthält.
Die HTML-Tabelle wird in Zeile 104 geschlossen. Sie enthält nun sämtliche Inhalte, die im gleichnamigen Verzeichnis für die aktuelle Seite hinterlegt sind. Jeder Inhalt befindet sich mit einem begleitenden "Rand-Menü" in einer eigenen Tabellen-Zeile, die jeweils von einer Zwischenzeile gefolgt wird.

1

content.php:

2
3<section class="maincontent">
4<table class="Tabelle_1">
5
6<?php
7
8 $dieseSeite = $_SERVER['REQUEST_URI'];
9 $dieseSeite = substr($dieseSeite, 1);
10 //echo $dieseSeite;
11
12 $wert = $dieseSeite;
13 $params = explode(".", $wert);
14 $verzeichnis = $params[0]; //schneidet hinter dem Punkt den Dateinamen ab
15 if($verzeichnis==""||$verzeichnis=="index"){
16 $verzeichnis = "start";
17 }
18 //echo $verzeichnis;
19
20 $PfadListe = Array();
21 //$Inhalt = Array();
22 $InhaltListe = Array();
23
24// Test, ob es sich um ein Verzeichnis handelt
25if ( is_dir ( $verzeichnis )) {
26
27
28 // oeffnen des Verzeichnisses zum 1. Mal
29
30 if( $handle = opendir($verzeichnis)){
31 while (($dateien = readdir($handle))!== false){
32 if ($dateien != "." && $dateien != ".."){
33
34 $suche_dot = ".";
35 $dot = strpos($dateien, $suche_dot); //pos wo punkt
36 //echo $dot."<br>";
37 if($dot !== false){
38
39 array_push($PfadListe, $dateien);}
40 //print_r($PfadListe);
41 }
42 }
43 closedir($handle);
44 }
45
46
47 // oeffnen des Verzeichnisses zum 2. Mal
48
49 if( $handle = opendir($verzeichnis)){
50 while (($Inhalt = readdir($handle))!== false){
51 if ($Inhalt != "." && $Inhalt != ".."){
52
53 $suche_dot = ".";
54 $dot = strpos($Inhalt, $suche_dot); //pos wo punkt
55 //echo $dot."<br>";
56 if($dot !== false){
57
58 array_push($InhaltListe, $Inhalt);}
59 //print_r($InhaltListe);
60 }
61 }
62
63 closedir($handle);
64
65 }
66
67 // Array $InhaltListe aufloesen
68
69 $InhaltABC = sort($InhaltListe);
70 for ($a=0; $a < count($InhaltListe); $a++){
71
72 echo "<tr><td class='Inhalt'><a name='";
73
74 $DateiName = $InhaltListe[$a];
75 $ZwischenName = explode(".", $DateiName);
76 $AnkerName = $ZwischenName[0];
77 echo $AnkerName;
78
79 echo"'></a>";
80 $einbauen = $verzeichnis."/".$InhaltListe[$a];
81 include($einbauen);
82 echo "</td>\n<td class='Rand'>";
83
84 $ABC = sort($PfadListe);
85 for($i=0; $i < count($PfadListe); $i++) {
86 $Link = explode(".", $PfadListe[$i]);
87 $Link_kurz = $Link[0];
88 $Link_kurz_2 = substr($Link_kurz, 3);
89
90 $Link_kurz_2 = ereg_replace("_", " ", $Link_kurz_2);
91
92 echo "<a href='#".$Link_kurz."'>".$Link_kurz_2."</a><br>\n";
93 }
94
95 echo"</td></tr>
96 <tr><td class='Zwischenzeile'></td><td class='hoch' ><a href='#m'>zum Menü</a></td></tr>
97 \n";
98
99 }
100
101 }
102
103?>
104</table>
105</section>

Download des PHP-Codes

[index.php] [menu.php] [content.php] [fotos_anzeigen.php] [mail.php]

Die fotos_anzeigen.php ist ein Script für eine Verzeichnisgalerie. Bis Zeile 27 funktioniert sie ebenso, wie die entsprechenden Abschnitte der content.php (s.o.).
Allerdings habe ich hier in den Zeilen 15-27 die {...} von innen nach außen gezählt und kommentiert.

Da eine Kamera die Dateinamen der Bilder numerisch fortschreibt, werden die Zahlen immer größer.
Würde man das Array hier alphabetisch aufsteigend sortieren, würden die neusten Bilder immer nach den älteren ausgegeben.
Wer die Seite aber schon besucht hat, hat wohl eher Interesse an den neuen Bilder und möchte nicht erst die alten durchscrollen, bis er die neuen findet. Also wird in Zeile 31 alphabetisch rückwärts bzw. absteigend sortiert.

In Zeile 32 beginnt die for-Schleife, die das Array auflöst.
In Zeile 34 wird ein <img>-Tag geöffnet.
Dann wird der Bild-Name für den src=''-Text und den alt=''-Text erzeugt (Zeile 35). Er wird in Zeile 37+38 weiter um Punkt und Dateiendung gekürzt, um ihn in JavaScript verwenden zu können.
In Zeile 39 erhält der <img>-Tag die Klasse "foto", die über CSS angesprochen werden kann, und den Event-Handler onClick='...', der auf eine bildspezifische JavaScript-Funktion verweist.
In Zeile 40-45 wird die bildspezifische JavaScript-Funktion erzeugt.

1

fotos_anzeigen.php

2
3<?php
4 //diese Seite wird inkludiert, $kamera ist oben definiert
5 $suche_in = "Fotos/";
6 $kamera_h2 = ereg_replace("_", " ", $kamera);
7 $unter_verzeichnis = $suche_in.$kamera;
8
9 echo "<h2>".$kamera_h2."</h2>\n";
10
11 $BilderListe = Array();
12
13 // oeffnen des unter_verzeichnis zum 1. Mal
14
15 if( $handle = opendir($unter_verzeichnis)){ //4
16 while (($unter_dateien = readdir($handle))!== false){ //3
17 if ($unter_dateien != "." && $unter_dateien != ".."){ //2
18 $suche_dot = ".";
19 $dot = strpos($unter_dateien, $suche_dot); //pos wo punkt
20 //echo $dot."<br>";
21 if($dot !== false){ //1
22 array_push($BilderListe, $unter_dateien);} //1
23 //print_r($BilderListe);
24 } //2
25 } //3
26 closedir($handle);
27 } //4
28 //-----------------------------------------
29 // Array $BilderListe aufloesen
30
31 $BilderABC = rsort($BilderListe);
32 for ($b=0; $b < count($BilderListe); $b++){
33
34 echo "<img src='";
35 $BildName = $BilderListe[$b];
36 echo $unter_verzeichnis."/".$BildName;
37 $ZwischenBName = explode(".", $BildName);
38 $BildName_kurz = $ZwischenBName[0];
39 echo "' alt='".$BildName."' border='0' width='' height='' class='foto' onclick='foto_gross".$BildName_kurz."()'>\n
40<script>
41 function foto_gross".$BildName_kurz."() {
42
43 window.open('".$unter_verzeichnis."/".$BildName."', '_blank', 'height=532, width=708, location=no, menubar=no, toolbar=no');
44 }
45 </script>
46
47 ";
48 }
49
50?>

Download des PHP-Codes

[index.php] [menu.php] [content.php] [fotos_anzeigen.php] [mail.php]

Die mail.php wird aufgerufen, sobald der <button type='submit'> der Seite E-Mail_Formular.php (s.u.) gedrückt wird.

Mittels der method='post' im Formular und der name='...'-Definitionen in den <input> bzw. <textarea>-Tags werden die dort eingetragenen Texte/Werte an die mail.php übergeben, wenn diese aufgerufen wird.

In Zeile 15 und 18-20 werden die Variablen aus dem Formular mittels der für die method='post' in PHP vordefinierten Variable $_POST['...'] an die mail.php bei deren Aufruf automatisch übergeben.

In Zeile 14 und 16 werden der absendende Server/Mail-Konto und das Mail-Konto definiert, auf dem die E-Mail eingehen soll.
Bei dem absendenden Server/Mail-Konto muss es sich um ein Mail-Konto handeln, das von dem Server, auf dem die mail.php liegt, verwaltet wird.

Beispiel: Mein Provider bietet mir zusammen mit der Domain und dem Web-Hosting auch eine Mail-Adresse an. Diese wird von dem Server, auf dem diese Seiten laufen, verwaltet. Also kann ich dieses Mail-Konto als Absender für mein E-Mail Formular nutzen.

Die Zeilen 23-37 beschäftigen sich mit dem Austausch von Sonderzeichen. Sonst bekäme ich bei Umlauten u.ä. nur "Buchstabensalat" übermittelt.
In der Download-Datei ist klar sichtbar, welche Zeichen mir ohne den Austausch angezeigt würden.

In Zeile 41 wird die Nachricht definiert, die übertragen werden soll, also der Text, den die E-Mail enthält.
Da das absendende E-Mail-Konto mein eigenes ist (s.o.), muss ich die vom Nutzer eingetragene E-Mail-Adresse mit angeben, sonst kann ich ihm nicht antworten.

Nun folgt ab Zeile 43 die Validierung der E-Mail-Adresse, die der Nutzer mir angibt.
Hierzu öffnet sich in Zeile 56 eine if/else-Schleife. Ihre Bedingungen enthalten die abschließende Validierung der E-Mail-Adresse des Nutzers. Darüber hinaus dürfen das Feld mit dem Klarnamen des Nutzers und das Feld der <textarea>, das die eigentliche Nachricht enthält, nicht leer sein.
Zwar kann ich nicht prüfen, ob alle Angaben der Wahrheit entsprechen, aber doch verhindern, dass leere Nachrichten abgeschickt werden oder entscheidende Informationen für eine Kommunikation fehlen.
Sind die Bedingungen aus Zeile 56 erfüllt, wird die Nachricht in Zeile 58 mit der in PHP vordefinierten main()-Funktion versendet. Die Parameter sind hier selbsterklärend und nicht vollständig. Es ist z.B. auch möglich die Nachricht cc: zu versenden. Möchte ich dem Nutzer dies ermöglichen, muss ich im E-Mail Formular das entsprechnde Feld vorsehen und die Variable wie beschrieben übergeben.
Sind die Bedingungen aus Zeile 56 nicht erfüllt, erhält der Nutzer die Fehlermeldung aus Zeile 63.
Zeile 64 enthält einen <button>, die Javascript-Funktion dazu ist in den Zeilen 66-70 definiert. Es handelt sich um eine history.back()-Funktion, die es erlaubt, die vom Nutzer in das E-Mail Formular eingetragenen Werte zu erhalten, wenn er diesen Button nutzt, um in das Formular zurück zu gehen.

1

mail.php

2
3<?php
4include("SeitenAnfang.php");
5echo"<body>";
6include("header.php");
7
8echo"<div class='flexcontainer'>";
9include("menu.php");
10echo"<section class='maincontent'>
11<table class='Tabelle_1'><tr><td class='Inhalt'>";
12
13
14$empfaenger = "EMPFAENGER@DOMAIN.de";
15$betreff = $_POST["betreff"];
16$from = "From: Webseite [cscc] <ABSENDER@DOMAIN.de>";
17
18$absender = $_POST["absender"];
19$klarname = $_POST["klarname"];
20$nachricht_text = $_POST["nachricht"];
21
22
23$nachricht_text = ereg_replace("ä", "", $nachricht_text);
24$nachricht_text = ereg_replace("ö", "", $nachricht_text);
25$nachricht_text = ereg_replace("ü", "", $nachricht_text);
26$nachricht_text = ereg_replace("Ä", "", $nachricht_text);
27$nachricht_text = ereg_replace("Ö", "", $nachricht_text);
28$nachricht_text = ereg_replace("Ü", "", $nachricht_text);
29$nachricht_text = ereg_replace("ß", "", $nachricht_text);
30
31$nachricht_text = ereg_replace("²", "", $nachricht_text);
32$nachricht_text = ereg_replace("³", "", $nachricht_text);
33$nachricht_text = ereg_replace("§", "", $nachricht_text);
34$nachricht_text = ereg_replace("µ", "", $nachricht_text);
35$nachricht_text = ereg_replace("©", "", $nachricht_text);
36$nachricht_text = ereg_replace("°", "", $nachricht_text);
37//$nachricht_text = ereg_replace("", "", $nachricht_text);
38
39
40
41$nachricht = "E-Mail von:".$absender."\n".$klarname." schreibt:\n".$nachricht_text;
42
43$suche_at = "@";
44$at =strpos ( $absender ,$suche_at); //gibt int pos at zurck
45
46$rest_at = substr($absender, $at+1); //text hinter @
47
48$suche_punkt = ".";
49$punkt = strpos($rest_at, $suche_punkt); //pos wo punkt
50
51$rest_punkt = substr($rest_at, $punkt+1); //text hinter punkt
52
53
54
55
56if($at>0 && $punkt>0 && $rest_punkt!="" && $klarname!="" && $nachricht_text!=""){
57
58mail($empfaenger, $betreff, $nachricht, $from);
59
60echo"Mail versendet.";
61}
62else{
63echo"Sie haben nicht alle Pflichtfelder ausgefüllt.<br>Bitte überprüfen Sie Ihre Eingaben:<p>
64<button onclick='goBack()'>Zurück zum Formular</button>
65
66<script>
67 function goBack() {
68 window.history.back();
69 }
70 </script>
71</p>";
72}
73
74
75
76echo"</td><td class='Rand'></td></tr></table></section>";
77
78include("footer.php");
79echo"</div></body></html>";
80?>

Download des PHP-Codes

1

E-Mail_Formular.php

2
3<?php
4
5echo"
6<form method='post' action='mail.php' id='mail_form'>
7<h2>E-Mail Formular</h2><br>
8* = Pflichtfelder
9
10<p>Ihre E-Mail Adresse:*<br>
11<input type='text' name='absender' id='absender' maxlength='255'></p>
12
13<p>Ihr Name:*<br>
14<input type='text' name='klarname' id='klarname' maxlength='255'></p>
15
16<p>Betreff:<br>
17<input type='text' name='betreff' id='betreff' maxlength='255'></p>
18
19
20<p>Ihre Nachricht:*<br>
21<textarea cols='25' rows='10' name='nachricht'></textarea></p>
22
23
24
25 <p><button type='submit' id='absenden'>Nachricht absenden</button></p>
26 <p><button type='reset' id='reset'>Eingaben zurücksetzen</button></p>
27
28</form>";
29
30?>

Download des PHP-Codes

PHP-Codes:

[cscc]