PHP: Difference between revisions

From Medien Wiki
 
(18 intermediate revisions by 5 users not shown)
Line 3: Line 3:
PHP (PHP Hypertext Processor) ist eine serverseitige Programmiersprache. '''Der Quellcode wird am Server interpretiert und erzeugt [[HTML]]''', das dann an den Browser übertragen wird. Im Gegensatz dazu ist [[JavaScript]] eine clientseitige Programmiersprache.
PHP (PHP Hypertext Processor) ist eine serverseitige Programmiersprache. '''Der Quellcode wird am Server interpretiert und erzeugt [[HTML]]''', das dann an den Browser übertragen wird. Im Gegensatz dazu ist [[JavaScript]] eine clientseitige Programmiersprache.


Da PHP [[HTML]] erzeugt, ist die Kenntnis von [[HTML]] Grundvoraussetzung zum Verständnis der Sprache.
Da PHP in der Regel (und in unserem Werkmodul) dazu verwendet wird, [[HTML]] zu erzeugen, ist die Kenntnis von [[HTML]] eine Grundvoraussetzung zum Verständnis der Sprache.


Um PHP benutzen zu können, brauchen wir einen Server, der PHP Dateien interpretieren kann. Viele Hoster bieten Webserver an, die über PHP verfügen. Zum Entwickeln benutzen wir eine einfach zu installierende lokale Version: [http://de.wikipedia.org/wiki/XAMP XAMP].
Um PHP benutzen zu können, brauchen wir einen Server, der PHP Dateien interpretieren kann. Viele Hoster bieten Webserver an, die über PHP verfügen. Zum Entwickeln benutzen wir eine einfach zu installierende lokale Version: [http://de.wikipedia.org/wiki/XAMP XAMP].


XAMP steht für:
XAMP steht für:
* '''X''': Platzhalter für das Betriebssystem; gängig sind  
* '''X''': Platzhalter für das Betriebssystem; gängig sind
** '''L''' für Linux: [http://www.apachefriends.org/de/index.html LAMP]
** '''M''' für Macintosh: [http://www.mamp.info/de/index.html MAMP]
** '''M''' für Macintosh: [http://www.mamp.info/de/index.html MAMP]
** '''W''' für Windows: [http://www.wampserver.com/ WAMP]
** '''W''' für Windows: [http://www.wampserver.com/ WAMP]
** '''L''' für Linux: [http://www.apachefriends.org/de/index.html LAMP]
* '''A''': Apache - ein Open Source Webserver
* '''A''': Apache - ein Open Source Webserver
* '''M''': MySQL - eine Open Source Datenbank
* '''M''': MySQL - eine Open Source Datenbank
Line 24: Line 24:
<body>
<body>
<?php
<?php
echo ("<p>Hallo Welt!</p>");
echo "<p>Hallo Welt!</p>";
echo ("<p>Da hat um " . date("H:s") . " Uhr jemand <i>Yippee!</i> gerufen...</p>");
echo "<p>Da hat um " . date("H:i") . " Uhr jemand <i>Yippee!</i> gerufen...</p>";
?>
?>
</body>
</body>
Line 32: Line 32:


<br/>
<br/>
Übrigens: Wer Mac OS X oder Linux benutzt, hat meistens schon PHP auf dem Rechner! Öffne die Konsole bzw. das Terminal und tippe: <source lang="bash">php -info</source>
Übrigens: Wer Mac OS X oder Linux benutzt, hat meist schon PHP auf dem Rechner! Öffne die Konsole bzw. das Terminal und tippe: <source lang="bash">php -info</source>
 
Der in OS X integrierte Apache-server wird von Apple als ''Websharing'' (10.5) bzw ''Webfreigabe'' (10.6, 10.7) bezeichnet und lässt sich über das Systemeinstellung ''Freigaben'' starten. Um das PHP parsing des Apache zu aktivieren müssen die Voreinstellungen des Apache-servers entsprechend [http://zathras.de/angelweb/activatingphponosx.htm angepasst] werden.


Zum schnellen Testen von PHP Zeilen auf der Konsole kann man <tt>php -r</tt> (für "run") verwenden; der PHP-Ausdruck muss dabei in Anführungszeichen stehen:
Zum schnellen Testen von PHP Zeilen auf der Konsole kann man <tt>php -r</tt> (für "run") verwenden; der PHP-Ausdruck muss dabei in Anführungszeichen stehen:
<source lang="bash">php -r "echo('Hallo Welt!');"</source>
<source lang="bash">php -r "echo 'Hallo Welt!';"</source>


== Mischen von PHP und HTML ==
== Mischen von PHP und HTML ==


PHP Quellcode wird mit den Schlüsselzeichen <tt><nowiki><?php</nowiki></tt> und <tt><nowiki>?></nowiki></tt> umgeben. Man kann HTML und PHP mischen!
PHP Quellcode wird mit den Schlüsselzeichen <tt style="color:red">&lt;?php</tt> und <tt style="color:red">?&gt;</tt> umgeben. Man kann HTML und PHP mischen!


<source lang="PHP">
<source lang="PHP">
<p>Hallo <?php echo ("Welt"); ?>!</p>
<p>Hallo <?php echo "Welt"; ?>!</p>
<?php
<?php
     $a = true;
     $a = true;
Line 64: Line 66:
$b = "4";
$b = "4";
$c = $a + $b;
$c = $a + $b;
echo("Das Ergebnis ist " . $c . "!"); // Das Ergebnis ist die Zahl 9
echo "Das Ergebnis ist " . $c . "!"; // Das Ergebnis ist die Zahl 9
</source>
</source>


Line 72: Line 74:


Mit [http://de.php.net/manual/de/reserved.variables.php Vordefinierte Variablen] kann man sehr einfach an wichtige Informationen kommen, z.B.
Mit [http://de.php.net/manual/de/reserved.variables.php Vordefinierte Variablen] kann man sehr einfach an wichtige Informationen kommen, z.B.
* $_GET['form_username'] - z.B. ein inputFeld eines Formulars
* $_GET['form_username'] - z.B. ein inputFeld eines Formulars, via GET versendet
* $_SERVER['REQUEST_URI'] - die URI, die vom User verlangt wird (z.B. "http://url.de/index.php")
* $_POST['form_username'] - z.B. ein inputFeld eines Formulars via POST (empfohlen)
* $_SERVER['PATH_INFO'] - bei "http://url.de/index.php/some/stuff?foo=bar" => "/some/stuff"
* $_SERVER['REQUEST_URI'] - die URI, die vom User verlangt wird (z.B. "http:&nbsp;//url.de/index.php")
* $_SERVER['PATH_INFO'] - bei "http:&nbsp;//url.de/index.php/some/stuff?foo=bar" => "/some/stuff"
 
Spezielle Variablen wie $_POST sind [[PHP#Arrays|Arrays]], die eckigen Klammern enthalten somit den Key mit dem man den Value im Array abfragen kann (siehe Arrays für weitere Erläuterung).


== Operatoren ==
== Operatoren ==
Line 109: Line 114:
|Verkettungsoperator
|Verkettungsoperator
|<source lang="PHP">.</source>
|<source lang="PHP">.</source>
|<source lang="PHP">echo("Hallo " . "Welt");</source>
|<source lang="PHP">echo "Hallo " . "Welt";</source>
|-
|-
|Logische Operatoren
|Logische Operatoren
Line 131: Line 136:
|Inkrement/Dekrement-Operatoren
|Inkrement/Dekrement-Operatoren
|
|
<source lang="PHP">++</source>
<source lang="PHP">
<source lang="PHP">--</source>
++
 
--
</source>
|<source lang="PHP">
|<source lang="PHP">
$a++; // Post-Inkrement ($a = $a + 1;)
$a++; // Post-Inkrement ($a = $a + 1;)
++$a; // Pre-Inkrement
$a--; // Post-Dekrement ($a = $a - 1;)
$a--; // Post-Dekrement ($a = $a - 1;)
--$a; // Pre-Dekrement
</source>
</source>
|}
|}
'''Unterschied zwischen Post- und Pre-Inkrement/Dekrement'''
Der Post-Inkrement/Dekrement führt die Operation erst aus nachdem die Variable aus dem Speicher gelesen und an die entsprechende Stelle gesetzt wurde. Im Gegensatz dazu führt der Pre-Inkrement/Dekrement die Operation aus bevor die Variable aus dem Speicher gelesen wird.
<source lang="PHP">
echo "Post Inkrement:\n";
$variable = 0;
echo $variable++."\n"; // = 0
echo $variable."\n"; // = 1
echo "Pre Inkrement:\n";
$variable = 0;
echo ++$variable."\n"; // = 1
echo $variable."\n"; // = 1
</source>
== Kontrollstrukturen ==
Als Kontrollstruktur bezeichnet man Abfragen und Schleifen. Die in PHP vorhandenen Kontrollstrukturen sind fast gleich wie die in anderen Sprachen ([[C]], [[JavaScript]] u.v.a.). Folgend werden die gängigsten vorgestellt. Weitere Beispiele bei [http://de.php.net/manual/de/language.control-structures.php php.net (Kontrollstrukturen)].
=== if then else ===
<source lang="PHP">
if($a) {
// do something
} else {
// do something
}
</source>
=== switch case ===
<source lang="PHP">
switch($a) {
case 0:
// do something
break;
case 1:
// do something
break;
default:
// do something
break;
}
</source>
=== for, while ===
<source lang="PHP">
// for(Ausgangszustand; Endzustand; Schleifen-Operation) { ... }
for($a=0; $a<10; $a++) {
// do something
if($b = 5) {
break; // siehe auch continue; und exit;
}
}
// while(Bedingungszustand) { ... }
while($a > 10) {
echo "Countdown: ".$a."<br/>";
$a--;
}
</source>
Bei Schleifen ist unbedingt darauf zu achten, dass sie sich nicht "aufhängen".
So etwas wäre beispielsweise fatal, weil es sich um eine endlose Schleife handelt:
<source lang="PHP">for($a=0; $a>=0; $a++) { ... }</source>




Line 177: Line 248:
<source lang="PHP">mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )</source>
<source lang="PHP">mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )</source>
''mixed'' meint, dass der Variablen-Typ unterschiedlich sein kann:
''mixed'' meint, dass der Variablen-Typ unterschiedlich sein kann:
* ''mixed'' am Anfang heißt, die Funktion gibt einen Wert zurück (kein spezieller Typ; in diesem Fall also den ersetzten String)
* ''mixed'' am Anfang bezeichnet den Typ des von der Funktion zurückgelieferten Wertes (bei ''mixed'' ist das nicht genau spezifiziert; in diesem Fall also den ersetzten String)
* ''str_replace'' ist der Funktionsname
* ''str_replace'' ist der Funktionsname
* ''$search'' erwartet das Ersetzte (alt)
* ''$search'' erwartet den zu ersetzenden String (alt)
* ''$replace'' erwartet das Ersetzende (neu)
* ''$replace'' erwartet den ersetzenden String (neu)
* ''$subject'' erwartet den zu durchsuchenden String
* ''$subject'' erwartet den zu durchsuchenden String (Ausgangstext)
* alle anderen Angaben, die in eckigen Klammern stehen sind ''optional''
* alle anderen Angaben, die in eckigen Klammern stehen sind ''optional''
Wenn wir also im String $myString alle Vorkommen von "Hans" durch "Fritz" ersetzen wollen, dann:
Wenn wir also im String $myString alle Vorkommen von "Hans" durch "Fritz" ersetzen wollen, dann:
Line 189: Line 260:
// $ergebnis enhält nun: "Fritz geht in die Welt."
// $ergebnis enhält nun: "Fritz geht in die Welt."
</source>
</source>
== Arrays ==
Arrays können mehrere Werte an bestimmten Positionen speichern. Das Abrufen der Werte (Values) kann über die Position im Array (Index) oder über ein vorher definiertes Schlüsselwort (Key) geschehen.
Ein Array wird mit dem Schlüsselwort <tt>array()</tt> erstellt:
<source lang="PHP">// array( key => value {, more key => value entries…} );
// 'key' may only be integer or string! 'value' may be anything
$myArray = array("Nachname"=>"Mustermann", "Vorname"=>"Max", "Telefon"=>12345);
// add new element to array
$myArray["Spitzname"] = "Maxie";
// read elements from array
echo $myArray["Vorname"] . " " . $myArray["Nachname"];
</source>
Bei Zugriff via Index ist darauf zu achten, dass die erste Position Null ist! Hat ein Array z.B. 23 Werte, ist der letzte Wert auf Position 22. Ein Zugriff auf Position 23 ist unbedingt zu vermeiden, da in diesem Fall versucht wird, auf etwas zuzugreifen, das nicht existiert.
<source lang="PHP">echo $myArray[0];</source>
Die Positionierung in Arrays wird durch folgendes Beispiel deutlicher:
<source lang="PHP">// This array is the same as ...
array(5 => 43, 32, 56, "b" => 12);
// ...this array
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
</source>
Elemente eines Arrays können mit der <tt>foreach()</tt> Schleife prima durchlaufen werden, z.B.:
<source lang="PHP">
// foreach (array_expression as $value)
foreach($myArray as $value) {
    echo $value . "<br/>";
}
// oder: foreach (array_expression as $key => $value)
foreach($myArray as $key => $value) {
    echo $key . "=>" . $value . "<br/>"
</source>
'''Siehe auch: [http://de.php.net/manual/de/language.types.array.php PHP.net Arrays]'''


== Includes ==
== Includes ==
Eine der tollen Funktionen von PHP ist die Möglichkeit, Dateien einzubetten. So kann man z.B. PHP einsetzen, um eine HTML-Datei aus einem Header, dem eigentlichen Content (variabel) und einem Footer zusammenzusetzen.
Eine der sehr nüztlichen Funktionen von PHP ist die Möglichkeit, Dateien einzubetten. So kann man z.B. PHP einsetzen, um eine HTML-Datei aus einem Header, dem eigentlichen Content (variabel) und einem Footer zusammenzusetzen.


Dies kann man mit <tt>include("Link/zur/Datei.inc.php");</tt> machen.  
Dies kann man mit <tt>include("Link/zur/Datei.inc.php");</tt> machen.  
Line 237: Line 347:
// first, check if any parameter given, eg: index.php?id=kontakt
// first, check if any parameter given, eg: index.php?id=kontakt
if(isset($_GET['id'])) {
if(isset($_GET['id'])) {
// Hier fehlt noch eine Fehlerprüfung und Test auf relative Pfadangaben
$id = $_GET['id'];
$id = $_GET['id'];
} else {
} else {
Line 243: Line 354:
}
}
// Debug (welchen Wert hat $id? Nicht raten, zeigen!)
// Debug (welchen Wert hat $id? Nicht raten, zeigen!)
echo("<p>Aktuelle Seite ist: " . $id);
echo "<p>Aktuelle Seite ist: " . $id;
// now include content
// now include content
include($id . ".inc.php");
include($id . ".inc.php");
Line 264: Line 375:
Natürlich fehlt bei diesem Beispiel eine Fehlerprüfung, z.B. wenn es ein Dokument nicht gibt, aber im Prinzip ist das schon ein ziemlich einfaches CMS :)
Natürlich fehlt bei diesem Beispiel eine Fehlerprüfung, z.B. wenn es ein Dokument nicht gibt, aber im Prinzip ist das schon ein ziemlich einfaches CMS :)


== Kontrollstrukturen ==
'''WICHTIG!'''<br/>
Als Kontrollstruktur bezeichnet man Abfragen und Schleifen. Die in PHP vorhandenen Kontrollstrukturen sind fast gleich wie die in anderen Sprachen ([[C]], [[JavaScript]] u.v.a.). Folgend werden die gängigsten vorgestellt. Weitere Beispiele bei [http://de.php.net/manual/de/language.control-structures.php php.net (Kontrollstrukturen)].
'''Das obige Beispiel ist möglicherweise unsicher, weil es theoretisch Lese-Zugriff auf alle möglichen Dateien mit der Endung "inc.php" gibt. So kann man die per GET an index.php übermittelte 'id' mit einer relativen Pfadangabe dazu bringen, Dateien außerhalb des Verzeichnisses anzuzeigen. Z.B. <tt>index.php?id=/</tt>, damit bekommt man Zugriff auf das Wurzelverzeichnis ("/") des Servers. Eine von vielen möglichen Lösungen ist z.B. die angeforderten includes zu testen und nur solche durchlassen, die in einem bestimmten Verzeichnis liegen. Oder man kann id-Werte blockieren, die bestimmte Sonderzeichen wie Schrägstriche enthalten.'''


=== if then else ===
<source lang="PHP">
if($a) {
// do something
} else {
// do something
}
</source>
=== switch case ===
<source lang="PHP">
switch($a) {
case 0:
// do something
break;
case 1:
// do something
break;
default:
// do something
break;
}
</source>
=== for, while, foreach ===
<source lang="PHP">
// for(Ausgangszustand; Endzustand; Schleifen-Operation) { ... }
for($a=0; $a<10; $a++) {
// do something
if($b = 5) {
break; // siehe auch continue; und exit;
}
}
// while(Bedingungszustand) { ... }
while($a > 10) {
echo ("Countdown: ".$a."<br/>");
$a--;
}
</source>
Bei Schleifen ist unbedingt darauf zu achten, dass sie sich nicht "aufhängen".
So etwas wäre beispielsweise fatal, weil es sich um eine endlose Schleife handelt:
<source lang="PHP">for($a=0; $a>=0; $a++) { ... }</source>


== Ressourcen ==
== Ressourcen ==
Line 320: Line 388:
* [http://openbook.galileocomputing.de/php4/ Galileo OpenBook PHP]
* [http://openbook.galileocomputing.de/php4/ Galileo OpenBook PHP]
* [http://en.wikibooks.org/wiki/Php WikiBooks: PHP]
* [http://en.wikibooks.org/wiki/Php WikiBooks: PHP]
* [http://www.feierfeil.at/php/grundlagen.php PHP-Grundlagen]
* [http://www.phpbox.de/grundlagen/programmieren.php phpbox.de]




{{Template:Webprogramming}}
{{Template:Webprogramming}}
[[Category:PHP]]
[[Category:Webtechnologien]]
[[Category:OS X]]
[[Category:Linux]]
[[Category:PHP]]
[[Category:Webtechnologien]]
[[Category:OS X]]
[[Category:Linux]]

Latest revision as of 18:32, 18 November 2011

Hallo Welt

PHP (PHP Hypertext Processor) ist eine serverseitige Programmiersprache. Der Quellcode wird am Server interpretiert und erzeugt HTML, das dann an den Browser übertragen wird. Im Gegensatz dazu ist JavaScript eine clientseitige Programmiersprache.

Da PHP in der Regel (und in unserem Werkmodul) dazu verwendet wird, HTML zu erzeugen, ist die Kenntnis von HTML eine Grundvoraussetzung zum Verständnis der Sprache.

Um PHP benutzen zu können, brauchen wir einen Server, der PHP Dateien interpretieren kann. Viele Hoster bieten Webserver an, die über PHP verfügen. Zum Entwickeln benutzen wir eine einfach zu installierende lokale Version: XAMP.

XAMP steht für:

  • X: Platzhalter für das Betriebssystem; gängig sind
    • L für Linux: LAMP
    • M für Macintosh: MAMP
    • W für Windows: WAMP
  • A: Apache - ein Open Source Webserver
  • M: MySQL - eine Open Source Datenbank
  • P: PHP - Open Source PHP Parser
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>php</title>
</head>
<body>
<?php
	echo "<p>Hallo Welt!</p>";
	echo "<p>Da hat um " . date("H:i") . " Uhr jemand <i>Yippee!</i> gerufen...</p>";
?>
</body>
</html>


Übrigens: Wer Mac OS X oder Linux benutzt, hat meist schon PHP auf dem Rechner! Öffne die Konsole bzw. das Terminal und tippe:

php -info

Der in OS X integrierte Apache-server wird von Apple als Websharing (10.5) bzw Webfreigabe (10.6, 10.7) bezeichnet und lässt sich über das Systemeinstellung Freigaben starten. Um das PHP parsing des Apache zu aktivieren müssen die Voreinstellungen des Apache-servers entsprechend angepasst werden.

Zum schnellen Testen von PHP Zeilen auf der Konsole kann man php -r (für "run") verwenden; der PHP-Ausdruck muss dabei in Anführungszeichen stehen:

php -r "echo 'Hallo Welt!';"

Mischen von PHP und HTML

PHP Quellcode wird mit den Schlüsselzeichen <?php und ?> umgeben. Man kann HTML und PHP mischen!

<p>Hallo <?php echo "Welt"; ?>!</p>
<?php
    $a = true;
    if($a) { ?>
        <p>Die Variable a ist true!</p>
<?php } else { ?>
        <p>Die Variable a ist false!</p>
<?php } ?>

Kommentare

Übersicht Kommentarfunktion in HTML, CSS, JavaScript und PHP:

Sprachen Syntax
HTML
<!-- Mehrzeiliger Kommentar -->
PHP, JavaScript, CSS
/* Mehrzeiliger Kommentar */
PHP, JavaScript
// Einzeiliger Kommentar
PHP
# Einzeiliger Kommentar

Variablen

Variablen in PHP haben immer ein $-Zeichen vorgestellt! Variablennamen sollten niemals mit einem _ (Unterstrich) beginnen (z.B. $_date), da systemrelevante Variablen diese Kennzeichnung haben. Variablen sind case-sensitive, d.h. $a ist eine andere Variable als $A.

Im Gegensatz zu vielen anderen Sprachen, haben Variablen in PHP keine explizite Typ-Zuweisung (non-typecasted), d.h. eine Variable kann Werte beliebiger Typen enthalten, z.B. bool, int, long, float, double, string, array ...

$a = 5;
$b = "4";
$c = $a + $b;
echo "Das Ergebnis ist " . $c . "!"; // Das Ergebnis ist die Zahl 9

Im Gegensatz zu JavaScript gibt es hier keine Rechenprobleme bei Additionen, da der String-Verkettungsoperator ein . (Punkt) ist (und kein "+" wie bei JavaScript) - und der PHP Parser denkt besser mit ;-)

Spezielle Variablen

Mit Vordefinierte Variablen kann man sehr einfach an wichtige Informationen kommen, z.B.

  • $_GET['form_username'] - z.B. ein inputFeld eines Formulars, via GET versendet
  • $_POST['form_username'] - z.B. ein inputFeld eines Formulars via POST (empfohlen)
  • $_SERVER['REQUEST_URI'] - die URI, die vom User verlangt wird (z.B. "http: //url.de/index.php")
  • $_SERVER['PATH_INFO'] - bei "http: //url.de/index.php/some/stuff?foo=bar" => "/some/stuff"

Spezielle Variablen wie $_POST sind Arrays, die eckigen Klammern enthalten somit den Key mit dem man den Value im Array abfragen kann (siehe Arrays für weitere Erläuterung).

Operatoren

Hier sind die wichtigsten Operatoren aufgeführt, eine vollständige Aufzählung gibt es bei php.net!

Operator Zeichen Beispiel
Zuweisungsoperator
=
+=
-=
$a = 5;
$a += 5; // $a = $a + 5;
$a -= 5; // $a = $a - 5;
Mathematische Operatoren
+
-
*
/
$a = 10 + 2;
$a = 10 - 2;
$a = 10 * 2;
$a = 10 / 2;
Verkettungsoperator
.
echo "Hallo " . "Welt";
Logische Operatoren
==
!, !=
<, <=
>, >=
&&, and
||, or
xor
if($a == true) {...}
if(!$a) { // oder if($a != true)...
if($a >= 0) {...}
if(($a > 0) && ($a <= 10)) {...}
if($a && $b) {...}
if(($a=="Hans") || ($a=="Fritz")) {...}
if($a xor $b) {...}
Inkrement/Dekrement-Operatoren
++

--
$a++; // Post-Inkrement ($a = $a + 1;)
++$a; // Pre-Inkrement
$a--; // Post-Dekrement ($a = $a - 1;)
--$a; // Pre-Dekrement

Unterschied zwischen Post- und Pre-Inkrement/Dekrement

Der Post-Inkrement/Dekrement führt die Operation erst aus nachdem die Variable aus dem Speicher gelesen und an die entsprechende Stelle gesetzt wurde. Im Gegensatz dazu führt der Pre-Inkrement/Dekrement die Operation aus bevor die Variable aus dem Speicher gelesen wird.

echo "Post Inkrement:\n";
$variable = 0;
echo $variable++."\n"; // = 0
echo $variable."\n"; // = 1

echo "Pre Inkrement:\n";
$variable = 0;
echo ++$variable."\n"; // = 1
echo $variable."\n"; // = 1

Kontrollstrukturen

Als Kontrollstruktur bezeichnet man Abfragen und Schleifen. Die in PHP vorhandenen Kontrollstrukturen sind fast gleich wie die in anderen Sprachen (C, JavaScript u.v.a.). Folgend werden die gängigsten vorgestellt. Weitere Beispiele bei php.net (Kontrollstrukturen).

if then else

if($a) {
	// do something
} else {
	// do something
}

switch case

switch($a) {
	case 0:
		// do something
		break;
	case 1:
		// do something
		break;
	default:
		// do something
		break;
}

for, while

// for(Ausgangszustand; Endzustand; Schleifen-Operation) { ... }
for($a=0; $a<10; $a++) {
	// do something
	if($b = 5) {
		break; // siehe auch continue; und exit;
	}
}
// while(Bedingungszustand) { ... }
while($a > 10) {
	echo "Countdown: ".$a."<br/>";
	$a--;
}

Bei Schleifen ist unbedingt darauf zu achten, dass sie sich nicht "aufhängen". So etwas wäre beispielsweise fatal, weil es sich um eine endlose Schleife handelt:

for($a=0; $a>=0; $a++) { ... }


Funktionen

Funktionen sind gruppierte Einheiten, die eine bestimmte Aufgabe lösen. Eine Funktion erkennt man (wie in vielen anderen Sprachen auch) an den beiden runden Klammern. Üblicherweise sollten Funktionen durch ein Verb benannt sein. Z.B. doSomething(); oder getItem();.

Das Semikolon schließt einen Ausdruck ab. Zeilensprünge oder Leerzeichen sind unrelevant; der PHP Parser sieht alles als eine "Zeile" an, bis er auf ein Semikolon trifft.

function myFunction($paramA, $paramB) {
	$ergebnis = $paramA + $paramB;
	return $ergebnis;
}
// Aufrufen einer Funktion:
$x = myFunction(4, 5);	// $x ist 9

Funktionen können optionale Parameter enthalten:

function myFunction($paramA, $paramB = 10) {
	$ergebnis = $paramA + $paramB;
	return $ergebnis;
}
// Aufrufen der Funktion:
$x = myFunction(4, 5);	// $x ist 9
// oder
$x = myFunction(4);	// $x ist 14
 PHP besitzt sehr, sehr viele bereits vorhandene Funktionen!
 Deshalb ist die Kunst, PHP zu programmieren eigentlich nur die Kunst, 
 in der Funktionsreferenz nachschlagen zu können:

php Funktionsreferenz-Suche.


Wenn man z.B. Text suchen und ersetzen möchte, dann befindet man sich in der Kategorie Strings, also sollte man string replace in das Funktionssuchfeld eingeben (meistens beginnen String-Funktionen auch mit str). In diesem Fall würde man unter str_replace fündig:
In der Funktionsreferenz ist die entscheidende Angabe, wie die Funktion str_replace funktioniert:

mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

mixed meint, dass der Variablen-Typ unterschiedlich sein kann:

  • mixed am Anfang bezeichnet den Typ des von der Funktion zurückgelieferten Wertes (bei mixed ist das nicht genau spezifiziert; in diesem Fall also den ersetzten String)
  • str_replace ist der Funktionsname
  • $search erwartet den zu ersetzenden String (alt)
  • $replace erwartet den ersetzenden String (neu)
  • $subject erwartet den zu durchsuchenden String (Ausgangstext)
  • alle anderen Angaben, die in eckigen Klammern stehen sind optional

Wenn wir also im String $myString alle Vorkommen von "Hans" durch "Fritz" ersetzen wollen, dann:

$myString = "Hans geht in die Welt."
$ergebnis = str_replace("Hans", "Fritz", $myString);
// $ergebnis enhält nun: "Fritz geht in die Welt."


Arrays

Arrays können mehrere Werte an bestimmten Positionen speichern. Das Abrufen der Werte (Values) kann über die Position im Array (Index) oder über ein vorher definiertes Schlüsselwort (Key) geschehen.

Ein Array wird mit dem Schlüsselwort array() erstellt:

// array( key => value {, more key => value entries…} );
// 'key' may only be integer or string! 'value' may be anything
$myArray = array("Nachname"=>"Mustermann", "Vorname"=>"Max", "Telefon"=>12345);
// add new element to array
$myArray["Spitzname"] = "Maxie";

// read elements from array
echo $myArray["Vorname"] . " " . $myArray["Nachname"];

Bei Zugriff via Index ist darauf zu achten, dass die erste Position Null ist! Hat ein Array z.B. 23 Werte, ist der letzte Wert auf Position 22. Ein Zugriff auf Position 23 ist unbedingt zu vermeiden, da in diesem Fall versucht wird, auf etwas zuzugreifen, das nicht existiert.

echo $myArray[0];

Die Positionierung in Arrays wird durch folgendes Beispiel deutlicher:

// This array is the same as ...
array(5 => 43, 32, 56, "b" => 12);
// ...this array
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);

Elemente eines Arrays können mit der foreach() Schleife prima durchlaufen werden, z.B.:

// foreach (array_expression as $value)
foreach($myArray as $value) {
    echo $value . "<br/>";
}
// oder: foreach (array_expression as $key => $value)
foreach($myArray as $key => $value) {
    echo $key . "=>" . $value . "<br/>"

Siehe auch: PHP.net Arrays

Includes

Eine der sehr nüztlichen Funktionen von PHP ist die Möglichkeit, Dateien einzubetten. So kann man z.B. PHP einsetzen, um eine HTML-Datei aus einem Header, dem eigentlichen Content (variabel) und einem Footer zusammenzusetzen.

Dies kann man mit include("Link/zur/Datei.inc.php"); machen.

Wichtig: Es ist darauf zu achten, dass PHP-Skripte immer mit der Endung .php oder .php5 abgespeichert werden, da das Skript ansonsten quelloffen als Textdatei gesendet wird! Das sieht dann nicht nur doof aus, sondern stellt auch ein Sicherheitsrisiko dar, da in PHP-Dateien oft sensible Informationen, wie Datenbanknamen und -passwörter gespeichert sein können!

 Wir legen eine Datei "header.inc.php" an:
<html>
<head>
	<title>PHP Include Test</title>
	<meta http-equiv="content-type" content="text/html; charset=UTF8" />
	<meta keywords="..."/>
</head>
<body>
	<div id="menu">...hier kommt ein menü</div>
	<div id="content">
 dann eine Datei "kontakt.inc.php":
	<p><b>Mein Kontakt: ...</b></p>
 dann eine Datei "impressum.inc.php"
	<p><b>Das Impressum...</b></p>
 ...und eine Datei "footer.inc.php":
	</div><!-- div id="content" ende -->
	<div id="legal">blah blah copyright blah</div>
</body>
</html>
 Schließlich legen wir eine Datei "index.php" an:
<?php
// include header
include("header.inc.php");
 
// first, check if any parameter given, eg: index.php?id=kontakt
if(isset($_GET['id'])) {
	// Hier fehlt noch eine Fehlerprüfung und Test auf relative Pfadangaben
	$id = $_GET['id'];
} else {
	// default to kontakt
	$id = kontakt;
}
// Debug (welchen Wert hat $id? Nicht raten, zeigen!)
echo "<p>Aktuelle Seite ist: " . $id;
// now include content
include($id . ".inc.php");
 
// include footer
include("footer.inc.php");
?>

Nun können wir die index.php aufrufen und sollten den Kontakt sehen. Wenn wir die URL ändern in /index.php?id=impressum, dann sehen wir den Inhalt der Datei impressum.inc.php!

Falls gar nichts angezeigt wird, dann liegt das wahrscheinlich daran, dass die inkludierten Dateien nicht gefunden werden (Tippfehler!). In diesem Fall hilft ein Blick in das PHP Fehler-Log: am Mac ist das unter /Applications/MAMP/logs/php_error.log. Am Besten öffnen in "/Applications/Utilities/Console.app", dann aktualisiert sich das von selbst, wenn unsere PHP Skripte einen Fehler erzeugen:

[01-Dec-2009 21:45:18] PHP Warning:  include() 
    [<a href='function.include'>function.include</a>]: 
    Failed opening 'impressuminc.php' for inclusion 
    (include_path='.:/Applications/MAMP/bin/php5/lib/php') 
    in ~/Sites/webprogramming/index.php on line 16

Wer das liest, der muss nicht lange rätseln, warum impressuminc.php nicht gefunden wird, wenn die Datei doch impressum.inc.php heißt :)

Natürlich fehlt bei diesem Beispiel eine Fehlerprüfung, z.B. wenn es ein Dokument nicht gibt, aber im Prinzip ist das schon ein ziemlich einfaches CMS :)

WICHTIG!
Das obige Beispiel ist möglicherweise unsicher, weil es theoretisch Lese-Zugriff auf alle möglichen Dateien mit der Endung "inc.php" gibt. So kann man die per GET an index.php übermittelte 'id' mit einer relativen Pfadangabe dazu bringen, Dateien außerhalb des Verzeichnisses anzuzeigen. Z.B. index.php?id=/, damit bekommt man Zugriff auf das Wurzelverzeichnis ("/") des Servers. Eine von vielen möglichen Lösungen ist z.B. die angeforderten includes zu testen und nur solche durchlassen, die in einem bestimmten Verzeichnis liegen. Oder man kann id-Werte blockieren, die bestimmte Sonderzeichen wie Schrägstriche enthalten.


Ressourcen




Diese Seite ist Teil der Werkmodule Grundlagen der Webprogrammierung und WebApps - Grundlagen Webprogrammierung von Michael Markert für Interface Design / Fakultät Medien an der Bauhaus-Universität Weimar.