PHP Grundlagen - © M. Meili

Lernhilfe für PHP

1. PHP Grundlagen & Syntax

Erstes PHP-Script
hello.php
<?php // Mein erstes PHP-Script echo "Hallo Welt!"; print "<br>Willkommen bei PHP!"; // PHP-Tags ?> <!-- HTML kann nach PHP-Tags stehen --> <h2>Das ist HTML</h2> <?php echo "<p>Zurück zu PHP</p>"; ?>
Ausgabe im Browser:
Hallo Welt!
Willkommen bei PHP!
Das ist HTML
Zurück zu PHP
PHP-Code steht zwischen <?php und ?> Tags. echo und print geben Text aus.
Kommentare in PHP
<?php // Einzeiliger Kommentar echo "Hallo!"; # Alternative für einzeiligen Kommentar print "Welt!"; /* Mehrzeiliger Kommentar für längere Erklärungen */ echo "<br>PHP ist toll!"; ?>
PHP unterstützt drei Arten von Kommentaren: //, # und /* */

2. Variablen und Datentypen

Variablen deklarieren
<?php // Variablen beginnen mit $ $name = "Anna"; // String $alter = 20; // Integer $preis = 19.99; // Float $istStudent = true; // Boolean $adresse = null; // NULL // Variablen ausgeben echo "Name: " . $name . "<br>"; echo "Alter: $alter Jahre<br>"; // Variable in String // Typ einer Variable herausfinden echo gettype($name) . "<br>"; // string echo gettype($alter) . "<br>"; // integer ?>
Ausgabe:
Name: Anna
Alter: 20 Jahre
string
integer
PHP-Variablen beginnen mit $. Der Punkt (.) verknüpft Strings.
Variable Typen prüfen
<?php $zahl = 42; $text = "Hallo"; $wahrheit = true; // Typ-Prüfungen if (is_int($zahl)) { echo "$zahl ist eine Ganzzahl<br>"; } if (is_string($text)) { echo "$text ist ein String<br>"; } if (is_bool($wahrheit)) { echo "Variable ist ein Boolean<br>"; } // Variable-Info ausgeben echo "<pre>"; var_dump($zahl, $text, $wahrheit); echo "</pre>"; ?>
is_int(), is_string(), is_bool() prüfen Datentypen. var_dump() zeigt detaillierte Infos.

3. Ausgabe (Echo, Print & Printf)

Echo vs Print
<?php $name = "Max"; $alter = 19; // Echo - schneller, kann mehrere Parameter echo "Hallo ", $name, "!<br>"; echo "Du bist $alter Jahre alt.<br>"; // Variable in String // Print - langsamer, nur ein Parameter, gibt 1 zurück print "Willkommen $name!<br>"; // Echo ohne Klammern (empfohlen) echo "Das ist einfacher zu schreiben.<br>"; // Längere Texte echo "<h3>Über mich</h3> <p>Ich bin $name und lerne PHP.</p>"; ?>
Ausgabe:
Hallo Max!
Du bist 19 Jahre alt.
Willkommen Max!
Das ist einfacher zu schreiben.
Über mich
Ich bin Max und lerne PHP.
echo ist schneller und flexibler als print. Verwende normalerweise echo.
Printf für formatierte Ausgabe
<?php $name = "Anna"; $punkte = 87.5; $rang = 3; // Printf mit Platzhaltern printf("Name: %s<br>", $name); // %s = String printf("Punkte: %.1f<br>", $punkte); // %.1f = Float mit 1 Dezimalstelle printf("Rang: %d<br>", $rang); // %d = Dezimalzahl // Alles in einer Zeile printf("%s hat %.2f Punkte und ist auf Rang %d.<br>", $name, $punkte, $rang); // Zahlen formatieren $preis = 1234.56; printf("Preis: CHF %08.2f<br>", $preis); // 8 Stellen, 2 Dezimalen, mit Nullen ?>
Ausgabe:
Name: Anna
Punkte: 87.5
Rang: 3
Anna hat 87.50 Punkte und ist auf Rang 3.
Preis: CHF 01234.56
printf() formatiert Ausgaben präzise. %s=String, %d=Integer, %f=Float

4. Bedingungen (if/else)

Einfache Bedingungen
<?php $punkte = 85; if ($punkte >= 90) { echo "Note: Sehr gut!<br>"; } elseif ($punkte >= 70) { echo "Note: Gut!<br>"; } elseif ($punkte >= 50) { echo "Note: Bestanden!<br>"; } else { echo "Note: Nicht bestanden!<br>"; } // Vergleichsoperatoren $a = 5; $b = "5"; if ($a == $b) { echo "$a == $b ist wahr (nur Wert)<br>"; } if ($a === $b) { echo "Identisch<br>"; } else { echo "$a === $b ist falsch (Wert UND Typ)<br>"; } ?>
Ausgabe:
Note: Gut!
5 == 5 ist wahr (nur Wert)
5 === 5 ist falsch (Wert UND Typ)
Verwende === für genaue Vergleiche (Wert UND Typ), == vergleicht nur Werte.
Switch-Case
<?php $wochentag = date("w"); // 0=Sonntag, 1=Montag, etc. switch ($wochentag) { case 1: $tag = "Montag"; break; case 2: $tag = "Dienstag"; break; case 3: $tag = "Mittwoch"; break; case 4: $tag = "Donnerstag"; break; case 5: $tag = "Freitag"; break; case 6: case 0: $tag = "Wochenende"; break; default: $tag = "Unbekannt"; } echo "Heute ist $tag!<br>"; // Einfacher Notenschlüssel $note = "B"; switch ($note) { case "A": echo "Ausgezeichnet!"; break; case "B": echo "Gut!"; break; default: echo "Andere Note"; } ?>
Switch-Case ist übersichtlicher bei vielen Vergleichen. break verhindert Fall-Through.

5. Schleifen

For-Schleife
<?php // Klassische for-Schleife echo "<h4>Zahlen von 1 bis 10:</h4>"; for ($i = 1; $i <= 10; $i++) { echo $i . " "; } echo "<br><br>"; // Multiplikationstabelle echo "<h4>5er-Reihe:</h4>"; for ($i = 1; $i <= 10; $i++) { $ergebnis = 5 * $i; echo "5 x $i = $ergebnis<br>"; } // Rückwärts zählen echo "<h4>Countdown:</h4>"; for ($i = 5; $i > 0; $i--) { echo $i . "... "; } echo "Start!<br>"; ?>
Ausgabe:
Zahlen von 1 bis 10:
1 2 3 4 5 6 7 8 9 10

5er-Reihe:
5 x 1 = 5
5 x 2 = 10
...
Countdown:
5... 4... 3... 2... 1... Start!
While und Do-While
<?php // While-Schleife $zahl = 1; echo "While-Schleife: "; while ($zahl <= 5) { echo $zahl . " "; $zahl++; } echo "<br><br>"; // Do-While (läuft mindestens einmal) $x = 10; echo "Do-While mit x = $x: "; do { echo $x . " "; $x--; } while ($x > 10); // Bedingung ist falsch, aber läuft einmal echo "<br><br>"; // Praktisches Beispiel: Potenz berechnen $basis = 2; $exponent = 8; $ergebnis = 1; $counter = 0; while ($counter < $exponent) { $ergebnis *= $basis; $counter++; } echo "$basis hoch $exponent = $ergebnis"; ?>
While prüft die Bedingung vor dem Durchlauf, Do-While danach.
Foreach für Arrays
<?php // Array definieren $früchte = array("Apfel", "Banane", "Orange", "Kiwi"); // Foreach - nur Werte echo "<h4>Meine Früchte:</h4><ul>"; foreach ($früchte as $frucht) { echo "<li>$frucht</li>"; } echo "</ul>"; // Foreach mit Index echo "<h4>Mit Nummern:</h4>"; foreach ($früchte as $index => $frucht) { $nummer = $index + 1; // Index startet bei 0 echo "$nummer. $frucht<br>"; } // Assoziatives Array $person = array( "name" => "Anna", "alter" => 20, "stadt" => "Zürich" ); echo "<h4>Person-Info:</h4>"; foreach ($person as $schlüssel => $wert) { echo ucfirst($schlüssel) . ": $wert<br>"; } ?>
Foreach ist ideal für Arrays. Mit => kann man auf Keys und Values zugreifen.

6. Arrays

Indexed Arrays (nummeriert)
<?php // Array erstellen - verschiedene Methoden $farben = array("rot", "grün", "blau"); $zahlen = [1, 2, 3, 4, 5]; // Kurze Syntax (PHP 5.4+) // Zugriff auf Elemente echo "Erste Farbe: " . $farben[0] . "<br>"; echo "Zweite Zahl: " . $zahlen[1] . "<br>"; // Array-Länge echo "Anzahl Farben: " . count($farben) . "<br>"; // Elemente hinzufügen $farben[] = "gelb"; // Am Ende hinzufügen array_push($farben, "lila"); // Alternative array_unshift($farben, "schwarz"); // Am Anfang hinzufügen echo "<br>Alle Farben:<br>"; print_r($farben); // Elemente entfernen $letztesFarbe = array_pop($farben); // Letztes entfernen $ersteFarbe = array_shift($farben); // Erstes entfernen echo "<br>Entfernt: $ersteFarbe und $letztesFarbe<br>"; ?>
Ausgabe:
Erste Farbe: rot
Zweite Zahl: 2
Anzahl Farben: 3

Alle Farben:
Array ( [0] => schwarz [1] => rot [2] => grün [3] => blau [4] => gelb [5] => lila )

Entfernt: schwarz und lila
Indexed Arrays verwenden Zahlen als Schlüssel (0, 1, 2, ...). count() gibt die Länge zurück.
Associative Arrays (Schlüssel-Wert)
<?php // Assoziatives Array erstellen $student = array( "name" => "Max Mustermann", "alter" => 19, "kurs" => "Informatik", "note" => 1.8 ); // Kurze Syntax $lehrer = [ "name" => "Frau Schmidt", "fach" => "PHP", "erfahrung" => 5 ]; // Zugriff auf Werte echo "Student: " . $student["name"] . "<br>"; echo "Alter: " . $student["alter"] . " Jahre<br>"; // Neue Schlüssel hinzufügen $student["email"] = "max@example.com"; $student["bestanden"] = true; // Alle Schlüssel anzeigen echo "<br>Verfügbare Daten:<br>"; $schlüssel = array_keys($student); foreach ($schlüssel as $key) { echo "- $key<br>"; } // Prüfen ob Schlüssel existiert if (array_key_exists("email", $student)) { echo "<br>Email gefunden: " . $student["email"] . "<br>"; } ?>
Assoziative Arrays verwenden Strings als Schlüssel. Ideal für strukturierte Daten.

7. Funktionen

Grundlegende Funktionen
<?php // Einfache Funktion ohne Parameter function begrüssung() { echo "Herzlich willkommen!<br>"; } // Funktion mit Parametern function addieren($a, $b) { return $a + $b; } // Funktion mit Default-Parametern function vorstellung($name, $alter = 18, $stadt = "Unbekannt") { return "Ich bin $name, $alter Jahre alt und wohne in $stadt."; } // Funktionen aufrufen begrüssung(); $summe = addieren(15, 27); echo "15 + 27 = $summe<br>"; // Mit Default-Werten echo vorstellung("Anna") . "<br>"; echo vorstellung("Max", 20, "Zürich") . "<br>"; // Funktion mit mehreren Rückgabewerten function rechnen($x, $y) { $summe = $x + $y; $differenz = $x - $y; $produkt = $x * $y; return [$summe, $differenz, $produkt]; } // Mehrere Rückgabewerte verwenden $ergebnisse = rechnen(8, 3); echo "Summe: {$ergebnisse[0]}, Differenz: {$ergebnisse[1]}, Produkt: {$ergebnisse[2]}"; ?>
Ausgabe:
Herzlich willkommen!
15 + 27 = 42
Ich bin Anna, 18 Jahre alt und wohne in Unbekannt.
Ich bin Max, 20 Jahre alt und wohne in Zürich.
Summe: 11, Differenz: 5, Produkt: 24
Funktionen mit return geben Werte zurück. Default-Parameter haben Standardwerte.
Variable Scopes (Gültigkeit)
<?php // Globale Variable $globalerWert = "Ich bin global"; function testLokaleVariable() { $lokalerWert = "Ich bin lokal"; echo "In Funktion: $lokalerWert<br>"; // Globale Variable verwenden global $globalerWert; echo "In Funktion: $globalerWert<br>"; } function testStaticVariable() { static $counter = 0; // Behält Wert zwischen Aufrufen $counter++; echo "Aufruf Nummer: $counter<br>"; } // Tests echo "Global ausserhalb: $globalerWert<br>"; testLokaleVariable(); echo "<br>Static-Variable Test:<br>"; testStaticVariable(); // 1 testStaticVariable(); // 2 testStaticVariable(); // 3 // $lokalerWert hier nicht verfügbar! // echo $lokalerWert; // Würde Fehler verursachen ?>
global macht globale Variablen in Funktionen verfügbar. static behält Werte zwischen Aufrufen.

8. String-Funktionen

String-Manipulation
<?php $text = " Hallo PHP Welt! "; // String-Länge und Aufräumen echo "Original: '$text' (Länge: " . strlen($text) . ")<br>"; $sauber = trim($text); // Leerzeichen entfernen echo "Getrimmt: '$sauber' (Länge: " . strlen($sauber) . ")<br>"; // Gross-/Kleinschreibung echo "Grossbuchstaben: " . strtoupper($sauber) . "<br>"; echo "Kleinbuchstaben: " . strtolower($sauber) . "<br>"; echo "Erster Buchstabe gross: " . ucfirst(strtolower($sauber)) . "<br>"; // String-Teile $wort = substr($sauber, 0, 5); // Erste 5 Zeichen echo "Erstes Wort: '$wort'<br>"; $ende = substr($sauber, -5); // Letzten 5 Zeichen echo "Ende: '$ende'<br>"; // Text ersetzen $neu = str_replace("PHP", "JavaScript", $sauber); echo "Ersetzt: '$neu'<br>"; ?>
Ausgabe:
Original: ' Hallo PHP Welt! ' (Länge: 19)
Getrimmt: 'Hallo PHP Welt!' (Länge: 15)
Grossbuchstaben: HALLO PHP WELT!
Kleinbuchstaben: hallo php welt!
Erster Buchstabe gross: Hallo php welt!
Erstes Wort: 'Hallo'
Ende: 'Welt!'
Ersetzt: 'Hallo JavaScript Welt!'
String in Array aufteilen
<?php $satz = "Apfel,Banane,Orange,Kiwi"; $email = "max.mustermann@example.com"; // String in Array aufteilen $früchte = explode(",", $satz); echo "Früchte-Array:<br>"; print_r($früchte); // Email aufteilen $email_teile = explode("@", $email); echo "<br>Benutzername: " . $email_teile[0] . "<br>"; echo "Domain: " . $email_teile[1] . "<br><br>"; // Array wieder zu String verbinden $verbunden = implode(" - ", $früchte); echo "Verbunden: $verbunden<br>"; // Praktisches Beispiel: Namen formatieren $vollname = "max mustermann"; $name_teile = explode(" ", $vollname); // Jeden Namen-Teil gross schreiben for ($i = 0; $i < count($name_teile); $i++) { $name_teile[$i] = ucfirst($name_teile[$i]); } $formatiert = implode(" ", $name_teile); echo "Formatiert: '$formatiert'"; ?>
explode() teilt Strings, implode() verbindet Arrays zu Strings. Sehr nützlich für Datenverarbeitung.

9. Include & Require

Dateien einbinden
header.php
<?php // header.php - Wiederverwendbarer Header $seitentitel = "Meine PHP Webseite"; ?> <!DOCTYPE html> <html lang="de"> <head> <meta charset="UTF-8"> <title><?php echo $seitentitel; ?></title> </head> <body> <header> <h1>Willkommen auf meiner Seite</h1> <nav> <a href="index.php">Home</a> | <a href="kontakt.php">Kontakt</a> </nav> </header>
funktionen.php
<?php // funktionen.php - Sammlung von Hilfsfunktionen function formatDatum($timestamp = null) { if ($timestamp === null) { $timestamp = time(); } return date("d.m.Y H:i", $timestamp); } function istEmailGültig($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } function sicherheitHtml($text) { return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); } echo "Funktionen geladen am " . formatDatum() . "<br>"; ?>
index.php
<?php // index.php - Hauptseite // Funktionen einbinden - nur einmal require_once 'funktionen.php'; // Header einbinden include 'header.php'; // Seiteninhalt echo "<main>"; echo "<h2>Willkommen!</h2>"; $benutzer_eingabe = "<script>alert('Hallo')</script>"; echo "<p>Sichere Ausgabe: " . sicherheitHtml($benutzer_eingabe) . "</p>"; $test_email = "test@example.com"; if (istEmailGültig($test_email)) { echo "<p>$test_email ist eine gültige Email.</p>"; } echo "<p>Aktuelle Zeit: " . formatDatum() . "</p>"; echo "</main>"; // Footer könnte auch eingebunden werden echo "<footer><p>&copy; 2025 Meine Webseite</p></footer>"; echo "</body></html>"; ?>
include lädt Dateien. require bricht ab bei Fehler. *_once verhindert mehrfaches Laden.
Unterschiede:
include: Warnung bei Fehler, Script läuft weiter
require: Fataler Fehler bei Problemen, Script stoppt
*_once: Lädt Datei nur einmal, auch bei mehreren Aufrufen

10. GET/POST & Formulare

GET-Parameter (URL)
<?php // URL: http://example.com/seite.php?name=Max&alter=19&kurs=PHP // GET-Parameter lesen if (isset($_GET['name'])) { $name = $_GET['name']; echo "Hallo $name!<br>"; } // Sicherere Methode mit Default-Wert $alter = isset($_GET['alter']) ? $_GET['alter'] : 'unbekannt'; $kurs = isset($_GET['kurs']) ? $_GET['kurs'] : 'kein Kurs'; echo "Alter: $alter<br>"; echo "Kurs: $kurs<br>"; // Alle GET-Parameter anzeigen if (!empty($_GET)) { echo "<h4>Alle GET-Parameter:</h4>"; foreach ($_GET as $schlüssel => $wert) { // Sicherheit: HTML-Zeichen escapen $wert_sicher = htmlspecialchars($wert); echo "$schlüssel: $wert_sicher<br>"; } } // Link mit Parametern erstellen echo "<br><a href='?name=Anna&alter=20&kurs=JavaScript'>Anna's Profil</a>"; ?>
GET-Parameter sind in der URL sichtbar. Verwende isset() um zu prüfen ob Parameter existieren.
POST-Formular
<?php // POST-Daten verarbeiten if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Formularfelder lesen $name = trim($_POST['name'] ?? ''); $email = trim($_POST['email'] ?? ''); $nachricht = trim($_POST['nachricht'] ?? ''); $newsletter = isset($_POST['newsletter']); // Validierung $fehler = []; if (empty($name)) { $fehler[] = "Name ist erforderlich"; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $fehler[] = "Ungültige Email-Adresse"; } if (strlen($nachricht) < 10) { $fehler[] = "Nachricht zu kurz (mindestens 10 Zeichen)"; } // Ergebnis anzeigen if (empty($fehler)) { echo "<div style='background:#d4edda; border:1px solid #c3e6cb; padding:10px; margin:10px 0;'>"; echo "<h3>Nachricht erfolgreich gesendet!</h3>"; echo "Name: " . htmlspecialchars($name) . "<br>"; echo "Email: " . htmlspecialchars($email) . "<br>"; echo "Newsletter: " . ($newsletter ? 'Ja' : 'Nein') . "<br>"; echo "</div>"; } else { echo "<div style='background:#f8d7da; border:1px solid #f5c6cb; padding:10px; margin:10px 0;'>"; echo "<h3>Fehler:</h3><ul>"; foreach ($fehler as $fehler_text) { echo "<li>$fehler_text</li>"; } echo "</ul></div>"; } } ?> <!-- HTML-Formular --> <form method="POST" action=""> <h3>Kontaktformular</h3> <label>Name:</label><br> <input type="text" name="name" required><br><br> <label>Email:</label><br> <input type="email" name="email" required><br><br> <label>Nachricht:</label><br> <textarea name="nachricht" rows="4" cols="50" required></textarea><br><br> <input type="checkbox" name="newsletter" value="1"> <label>Newsletter abonnieren</label><br><br> <input type="submit" value="Absenden"> </form>
POST-Daten sind nicht in der URL sichtbar. Immer Eingaben validieren und htmlspecialchars() verwenden!
Sicherheitstipps:
• Alle Eingaben validieren und filtern
• htmlspecialchars() gegen XSS-Angriffe
• isset() und empty() für sichere Abfragen
• ?? (Null Coalescing) für Default-Werte

11. Fehlerbehandlung & Debugging

Fehler anzeigen und loggen
<?php // Fehleranzeigen aktivieren (nur in Entwicklung!) error_reporting(E_ALL); ini_set('display_errors', '1'); // Fehlerbeispiel echo $unbekannt; // Variable existiert nicht ?>
Nutze diese Einstellungen nur auf lokalen Entwicklungsservern – niemals auf Live-Websites!
Try-Catch für Ausnahmen
<?php // Fehler mit Exception behandeln try { throw new Exception("Etwas ist schief gelaufen"); } catch (Exception $e) { echo "Fehler: " . $e->getMessage(); } ?>
Mit try-catch kannst du kontrolliert auf Fehler reagieren, z.B. bei Datenbankzugriffen.

12. Arbeiten mit Dateien

Datei schreiben und lesen
<?php // Datei schreiben file_put_contents("test.txt", "Hallo Datei!"); // Datei lesen $inhalt = file_get_contents("test.txt"); echo "Datei-Inhalt: $inhalt"; ?>
Mit file_put_contents und file_get_contents kannst du schnell Textdateien speichern und laden.
Datei zeilenweise lesen
<?php $datei = fopen("test.txt", "r"); while (($zeile = fgets($datei)) !== false) { echo "Zeile: $zeile<br>"; } fclose($datei); ?>
Mit fopen/fgets/fclose kannst du Dateien flexibel zeilenweise verarbeiten.

13. Sessions & Cookies

Session verwenden
<?php session_start(); // Werte speichern $_SESSION["benutzer"] = "Anna"; // Werte auslesen echo "Angemeldet als: " . $_SESSION["benutzer"]; ?>
Mit Sessions kannst du Nutzerdaten über mehrere Seiten hinweg speichern.
Cookie setzen und lesen
<?php setcookie("farbe", "blau", time() + 3600); // Cookie lesen if (isset($_COOKIE["farbe"])) { echo "Lieblingsfarbe: " . $_COOKIE["farbe"]; } ?>
Cookies werden im Browser gespeichert, z.B. für Einstellungen oder Logins.

14. Grundlegende Sicherheitstipps

SQL-Injection vermeiden mit PDO
<?php // Sichere Datenbankabfrage $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass"); $name = "Anna"; $stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name"); $stmt->execute([":name" => $name]); // Ergebnis auslesen... ?>
Nutze immer Prepared Statements, nie Variablen direkt in SQL einfügen!
Passwort sicher speichern
<?php // Passwort hashen und prüfen $passwort = "meinGeheimesPasswort"; $hash = password_hash($passwort, PASSWORD_DEFAULT); // Passwort prüfen if (password_verify("meinGeheimesPasswort", $hash)) { echo "Passwort korrekt!"; } ?>
Speichere nie Klartext-Passwörter. password_hash/password_verify sind sicher!

15. Objektorientierte Programmierung (OOP)

Einfache Klasse & Objekt
<?php // Klasse definieren class Auto { public $marke; public $farbe; public function hupen() { echo "Hup Hup!"; } } // Objekt erstellen und verwenden $meinAuto = new Auto(); $meinAuto->marke = "VW"; $meinAuto->farbe = "rot"; $meinAuto->hupen(); ?>
Mit OOP kannst du eigene Datentypen (Klassen) und Methoden für komplexere Programme nutzen.