Appearance
Kapitel 18: Häufige Fehler und Lösungen
18.1 Leere Seite, 500-Fehler
Problem 1: Leere Seite (weisse Seite)
Ursache: PHP-Fehler werden nicht angezeigt (in Produktionsumgebung).
Lösung:
php
<?php
// In Entwicklungsumgebung: Alle Fehler anzeigen
error_reporting(E_ALL);
ini_set('display_errors', 1);
// In Produktionsumgebung: Fehler nicht anzeigen (nur loggen)
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/pfad/zu/error.log');
?>Häufige Ursachen für leere Seite:
- Syntaxfehler: Fehlendes Semikolon, runde Klammer, etc.
- Speicherüberlauf: Endlosschleife oder zu viel Speicherverbrauch
- Fatal Error: Nicht existierende Klasse/Funktion aufrufen
- PHP-Code wird nicht ausgeführt: Datei hat
.html-Endung statt.php
Problem 2: 500 Internal Server Error
Ursache: Server-seitiger Fehler (PHP-Fehler, falsche Server-Konfiguration).
Lösung:
Fehlerprotokoll (Error Log) prüfen:
- XAMPP:
C:\xampp\php\logs\php_error_log - Linux:
/var/log/apache2/error.logoder/var/log/nginx/error.log
- XAMPP:
.htaccess-Datei überprüfen:apache# Falsche Zeilen in .htaccess können 500-Fehler verursachen # Überprüfen Sie SyntaxPHP-Modules überprüfen:
bashphp -m # Zeigt installierte Module anDateiberechtigungen überprüfen:
bashchmod 755 /pfad/zu/datei.php
18.2 Datenbankverbindung fehlgeschlagen
Problem: "Connection failed" / "Zugriff verweigert"
Ursachen und Lösungen:
1. Falsche Zugangsdaten
php
<?php
// Fehler beim Verbindungsaufbau abfangen
$conn = new mysqli("localhost", "root", "", "meine_datenbank");
if ($conn->connect_error) {
die("Verbindungsfehler: " . $conn->connect_error);
}
// Überprüfen Sie:
// 1. Hostname (meist localhost)
// 2. Benutzername (meist root)
// 3. Passwort (bei XAMPP leer, bei Produktion gesetzt)
// 4. Datenbankname (muss existieren!)
?>2. MySQL-Server läuft nicht
XAMPP:
- XAMPP Control Panel öffnen
- Bei MySQL auf "Start" klicken
- Status sollte grün sein
Linux:
bash
sudo service mysql start
# oder
sudo systemctl start mysql3. Port 3306 ist belegt
php
<?php
// Wenn MySQL nicht auf Standardport 3306 läuft
$conn = new mysqli("localhost:3307", "root", "", "meine_datenbank");
?>MySQL-Port ändern:
my.ini(Windows) odermy.cnf(Linux) öffnenport=3306aufport=3307ändern- MySQL neu starten
4. Benutzerrechte fehlen
sql
-- Benutzerrechte überprüfen (in phpMyAdmin oder MySQL-Konsole)
SHOW GRANTS FOR 'root'@'localhost';
-- Benutzer Rechte geben
GRANT ALL PRIVILEGES ON meine_datenbank.* TO 'root'@'localhost';
FLUSH PRIVILEGES;18.3 Formulardaten nicht empfangen
Problem: $_POST / $_GET ist leer
Ursachen und Lösungen:
1. Falsche Methode verwendet
php
<?php
// Formular mit method="post"
// <form method="post" action="verarbeite.php">
// In verarbeite.php:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? ''; // Korrekt
}
// Formular mit method="get"
// <form method="get" action="verarbeite.php">
// In verarbeite.php:
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$name = $_GET['name'] ?? ''; // Korrekt
}
?>2. enctype bei Datei-Upload vergessen
html
<!-- Falsch (bei Datei-Upload) -->
<form method="post" action="upload.php">
<input type="file" name="datei">
</form>
<!-- Korrekt (bei Datei-Upload) -->
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="datei">
</form>3. php.ini-Einstellungen (post_max_size, upload_max_filesize)
ini
; php.ini
post_max_size = 20M ; Maximale Größe von POST-Daten
upload_max_filesize = 10M ; Maximale Größe von Upload-Dateien
; Nach Änderung: Apache neu starten!4. Formularfelder haben keine name-Attribute
html
<!-- Falsch -->
<input type="text" id="name">
<!-- Korrekt -->
<input type="text" id="name" name="name">18.4 Zeichenkaos (Umlaute falsch dargestellt)
Problem: Umlaute werden falsch dargestellt (z.B. "ä" wird zu "ä")
Ursachen und Lösungen:
1. PHP-Datei ist nicht in UTF-8 kodiert
In VS Code:
- Unten rechts auf "UTF-8" klicken
- "Save with Encoding" wählen
- "UTF-8" auswählen
2. HTML-Header fehlt oder ist falsch
php
<?php
// Ganz oben in der PHP-Datei
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8"> <!-- WICHTIG! -->
<title>Meine Webseite</title>
</head>
<!-- ... -->3. MySQL-Datenbank/Verbindung ist nicht auf UTF-8 gesetzt
php
<?php
$conn = new mysqli("localhost", "root", "", "meine_datenbank");
if ($conn->connect_error) {
die("Verbindungsfehler: " . $conn->connect_error);
}
// Zeichenkodierung setzen (WICHTIG!)
$conn->set_charset("utf8mb4"); // Immer utf8mb4 verwenden!
// Alternative:
mysqli_set_charset($conn, "utf8mb4");
?>4. MySQL-Datenbank/Tabelle ist nicht auf UTF-8 gesetzt
sql
-- Datenbank auf UTF-8 setzen
ALTER DATABASE meine_datenbank CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Tabelle auf UTF-8 setzen
ALTER TABLE benutzer CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;18.5 Upload fehlgeschlagen
Problem: Datei-Upload funktioniert nicht
Ursachen und Lösungen:
1. enctype im Formular fehlt
html
<!-- Korrekt (siehe 18.3) -->
<form method="post" action="upload.php" enctype="multipart/form-data">2. php.ini-Einstellungen (upload_max_filesize, post_max_size)
ini
; php.ini
upload_max_filesize = 10M ; Maximale Größe von Upload-Dateien
post_max_size = 20M ; Maximale Größe von POST-Daten
; Nach Änderung: Apache neu starten!3. Upload-Verzeichnis hat falsche Berechtigungen
Windows (XAMPP):
- Rechtsklick auf Upload-Verzeichnis
- "Eigenschaften" → "Sicherheit"
- "Bearbeiten" → "Benutzer hinzufügen"
- "Jeder" (Everyone) hinzufügen
- "Voller Zugriff" geben
Linux:
bash
chmod 755 /pfad/zu/uploads
# Oder (weniger sicher, aber funktioniert meist)
chmod 777 /pfad/zu/uploads4. Temporäres Verzeichnis hat falsche Berechtigungen
ini
; php.ini
upload_tmp_dir = /tmp ; Temporäres Verzeichnis für Uploads
; Berechtigungen prüfen
; Linux: /tmp muss für Webserver-Benutzer (www-data) beschreibar sein5. $_FILES-Array ist leer (siehe 18.3)
18.6 Login-Status verloren (Session-Probleme)
Problem: Benutzer wird ausgeloggt / Session-Daten gehen verloren
Ursachen und Lösungen:
1. session_start() fehlt oder steht nicht ganz oben
php
<?php
// MUSS ganz oben stehen (vor jeglicher Ausgabe!)
session_start();
// ... Rest des Codes
?>2. session_start() nach HTML-Ausgabe aufrufen
php
<!-- Falsch -->
<html>
<body>
<?php session_start(); ?> <!-- ZU SPÄT! -->
<!-- Korrekt -->
<?php session_start(); ?>
<html>
<body>3. Session-Daten werden nicht korrekt gespeichert
php
<?php
session_start();
// Falsch (Session-Variable wird nicht gespeichert)
$benutzername = "Max";
// Korrekt (Session-Variable speichern)
$_SESSION['benutzername'] = "Max";
// Überprüfen, ob Session-Variable gesetzt ist
if (isset($_SESSION['benutzername'])) {
echo "Willkommen " . $_SESSION['benutzername'];
}
?>4. Session zerstören funktioniert nicht
php
<?php
session_start();
// Falsch (löscht nur Session-Daten, aber nicht Session-Cookie)
// session_unset();
// Korrekt (löscht alle Session-Daten UND Session-Cookie)
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
?>5. Session-ID wird nicht korrekt übertragen
php
<?php
// Session-ID in URL überprüfen (wenn Cookies deaktiviert sind)
echo session_id();
// Session-ID manuell setzen (wenn nötig)
$session_id = $_GET['session_id'] ?? '';
if (!empty($session_id)) {
session_id($session_id);
}
session_start();
?>Zusammenfassung
In diesem Kapitel haben Sie:
- ✅ "Leere Seite" und "500-Fehler" behoben
- ✅ "Datenbankverbindung fehlgeschlagen" behoben
- ✅ "Formulardaten nicht empfangen" behoben
- ✅ "Zeichenkaos" (Umlaute falsch dargestellt) behoben
- ✅ "Upload fehlgeschlagen" behoben
- ✅ "Login-Status verloren" (Session-Probleme) behoben
Nächstes Kapitel: Wir werden Webseite veröffentlichen (Domain, Server, Code-Upload, Datenbank-Import, Live-Test, ICP-Registrierung).
Übungsaufgaben:
- Simulieren Sie einen 500-Fehler und beheben Sie ihn
- Simulieren Sie einen Datenbankverbindungsfehler und beheben Sie ihn
- Simulieren Sie ein Formulardaten-Empfangsproblem und beheben Sie es
- Simulieren Sie Zeichenkaos und beheben Sie es
- Simulieren Sie ein Upload-Problem und beheben Sie es
- Simulieren Sie ein Session-Problem und beheben Sie es
Häufige Fehler:
- ❌
error_reporting(0)in Entwicklungsumgebung → Fehler werden nicht angezeigt! - ❌
display_errors = 1in Produktionsumgebung → Sicherheitsrisiko! - ❌
session_start()nach HTML-Ausgabe aufrufen → Session funktioniert nicht! - ❌
header('Location: ...')ohneexit()verwenden → Code wird weiter ausgeführt!
