Skip to content

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:

  1. Syntaxfehler: Fehlendes Semikolon, runde Klammer, etc.
  2. Speicherüberlauf: Endlosschleife oder zu viel Speicherverbrauch
  3. Fatal Error: Nicht existierende Klasse/Funktion aufrufen
  4. 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:

  1. Fehlerprotokoll (Error Log) prüfen:

    • XAMPP: C:\xampp\php\logs\php_error_log
    • Linux: /var/log/apache2/error.log oder /var/log/nginx/error.log
  2. .htaccess-Datei überprüfen:

    apache
    # Falsche Zeilen in .htaccess können 500-Fehler verursachen
    # Überprüfen Sie Syntax
  3. PHP-Modules überprüfen:

    bash
    php -m  # Zeigt installierte Module an
  4. Dateiberechtigungen überprüfen:

    bash
    chmod 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 mysql

3. 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:

  1. my.ini (Windows) oder my.cnf (Linux) öffnen
  2. port=3306 auf port=3307 ändern
  3. 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:

  1. Unten rechts auf "UTF-8" klicken
  2. "Save with Encoding" wählen
  3. "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/uploads

4. 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 sein

5. $_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:

  1. Simulieren Sie einen 500-Fehler und beheben Sie ihn
  2. Simulieren Sie einen Datenbankverbindungsfehler und beheben Sie ihn
  3. Simulieren Sie ein Formulardaten-Empfangsproblem und beheben Sie es
  4. Simulieren Sie Zeichenkaos und beheben Sie es
  5. Simulieren Sie ein Upload-Problem und beheben Sie es
  6. Simulieren Sie ein Session-Problem und beheben Sie es

Häufige Fehler:

  • error_reporting(0) in Entwicklungsumgebung → Fehler werden nicht angezeigt!
  • display_errors = 1 in Produktionsumgebung → Sicherheitsrisiko!
  • session_start() nach HTML-Ausgabe aufrufen → Session funktioniert nicht!
  • header('Location: ...') ohne exit() verwenden → Code wird weiter ausgeführt!

Frei für alle Anfänger