PHP FAQ und häufig auftretende Fehlermeldungen

Patrick Kamin

Erfahrenes Mitglied
Diese FAQ soll eine Sammlung der am häufigst auftretenden PHP Probleme werden.

Ich habe mir Apache / PHP /MySQL auf einem XYZ Betriebssystem installiert und ich bekomme keine bzw nur HTML Seiten angezeigt
  • Die Seite der Apachefriends.org beschäftigt sich mit der Installation des Apache Webservers unter Linux / Windows.
    Die FAQ der Apachefriends findet sich hier


Meine Zeilenumbrüche aus einer Textarea werden nicht übernommen, was tun?
  • Es gibt in PHP die Funktion nl2br(), welche die durch Enter hinzugefügten Umbrüche in einer Textarea in XHTML komforme <br /> Tags umwandelt.

Ich kann nach Abschicken des Formulars nicht auf meine Variablen zugreifen, was tun?

Ich habe Probleme damit, Dateien über eine Formular auf meinen Webserver hochzuladen, was tun?

Wie kann ich Inhalte per PHP dynamisch in meine Seite einfügen?

Ich bekomme die Fehlermeldung "cannot add header information", was mache ich falsch?
  • Diese Fehlermeldung wird ausgegeben, wenn versucht wird, ein Cookie zu setzen, eine Session zu starten oder per Header auf eine andere Seite weiterzuleiten, zuvor allerdings schon HTML Code an den Browser geschickt wurde. Entweder ihr stellt nun euren Code dementsprechend um oder ihr benutzt die Funktion ob_start() in Verbindung mit ob_end_flush().

Wie kann ich die Ausgabe einer Datenbankabfrage auf mehrere Seiten verteilen?

Warum kann ich xyz mit meinem in der MySQL Datenbank gespeicherten Datum nicht machen?
  • Um eine einfachere Handhabung von gespeicherten Daten zu ermöglichen, empfiehlt es sich, das entsprechende Datum nicht im MySQL Spalten-Typ date zu speichern, sondern in eine normale Spalte vom Typ Integer den aktuellen Unix-Timestamp, welchen man über time() ausgeben kann.
  • Durch verwenden des UNIX-Timestamps vereinfacht sich die Bildung von Differenzen zwischen zwei Daten, sowie die individuelle Ausgabe eines Datums bis auf die Sekunde genau via date().

Weitere Themen sind hier herzlich willkommen.

Suchfunktion: php faq tutorial hilfe
 
Zuletzt bearbeitet von einem Moderator:
Häufig auftretende Fehler

In diesem Thema werde ich zukünftig die hier am häufigsten genannten und auftretenden Fehler nennen sowie Ursachen und Lösungen dazu erläutern.


Warning: Cannot modify header information - headers already sent by (output started at ?Dateipfad A?:?Zeile A?) in ?Dateipfad B? on line ?Zeile B?

Bedeutung?Die Datenausgabe begann in ?Dateipfad A?:?Zeile A?. Deshalb kann in ?Dateipfad B?:?Zeile B? der Header nicht mehr verändert werden.

Ursache?Der Header ist Teil einer HTTP-Nachricht und enthält Informationen über über den Körper der Nachricht (der eigentlich Nutzlast) und wird vor diesem gesendet. Sobald eine Ausgabe stattfand – sowohl explizit also auch implizit – wird der Header an den Client gesendet und eine Änderung ist nicht mehr möglich.

Betroffen sind davon alle Funktionen, die den HTTP-Header direkt oder indirekt verändern. So beispielsweise die header()-, setcookie()- und session_start()-Funktion.
Verwandte Fehlermeldungen:
  • Warning: session_start(): Cannot send session cookie - headers already sent …
  • Warning: session_start(): Cannot send session cache limiter - headers already sent …
  • Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent …

Lösung?Es muss dafür gesorgt werden, dass vorzeitig keine Ausgabe geschieht. Dies ist zwar mit dem EVA-Prinzip (Eingabe-Verarbeitung-Ausgabe) möglich, aber oft auch nicht durchgehend anwendbar. Deshalb ist es sinnvoller und zuverlässiger die Ausgaben mithilfe der Funktionen zur Ausgabesteuerung zu puffern.



Warning: ?Funktion?: supplied argument is not a valid MySQL result resource in ?Dateipfad? on line ?Zeile?

Bedeutung?Um Datensätze einer Datenbankabfrage verarbeiten zu können, muss diese in der Form einer Ergebnisressource angegeben werden.

Ursache?Die Ergebnisressource ist meist der Rückgabewert der mysql_query()-Funktion. Diese gibt jedoch bei einem Fehlschlag der Datenbankabfrage (Syntaxfehler, fehlende Verbindung mit einem Datenbankserver, Tabellen oder Spalten nicht vorhanden, etc.) den Wert false zurück. Auch bei Abfragen, die keine Datensätze sondern nur den Erfolgsstatus zurückliefern (insb. INSERT-, UPDATE-, DELETE-Abfragen), ist der Rückgabewert keine Ergebnisressource.

Lösung?Die grundsätzliche Regel lautet, dass Funktionen wie die mysql_fetch_*()-Funktionen zum Abholen eines Datensatzes nur bei Datenbankabfragen mit einer MySQL-Ergebnisressource als Rückgabewert erlaubt sind. Dies kann mit der is_resource()- und get_resource_type()-Funktion sichergestellt werden. Zusätzlich sollte geprüft werden, ob es bei der Datenbankabfrage nicht zu einem Fehler kam (siehe mysql_error()- und mysql_errno()-Funktion). Erst wenn beide Bedingungen (richtiger Datentyp, kein MySQL-Fehler) erfüllt sind, kann der Wert bedenkenlos verarbeitet werden.
 
Komische Zeichen -> Zeichensatz-Probleme

Sehr häufig scheinen Probleme mit den verwendeten Zeichensätzen aufzutreten.

Hier mal eine kleine Checkliste dazu:
  • Was habe ich überhaupt für einen Zeichensatz?
    Der verwendete Zeichensatz ist üblicherweise(sofern ihr die auszugebenden Daten nicht selbst vor der Ausgabe mit einem anderen Zeichensatz kodiert) derjenige, in dem ihr die Dateien(PHP-Skripte,HTML-Dokumente etc. ) abspeichert.
    Ihr könnt das idR. in dem von euch verwendeten Editor einsehen und einstellen, welcher Zeichensatz dies ist/sein soll.
    Achtet darauf, daß ihr bei der Wahl von UTF8 ohne die sogenannte ByteOrderMark(BOM) speichert.

  • Was denkt der Browser, was ich für einen Zeichensatz ich verwende?
    Der Browser denkt garnicht, er macht, was ihm gesagt wird.
    Folgende Quellen können ihm das sagen:
    • Der Besitzer des Browsers kann einstellen, welcher Zeichensatz verwendet wird, wenn keine Informationen von anderer Seite verfügbar sind.

    • Das Dokument selbst kann es dem Browser sagen, über eine META-Angabe zum Inhaltstyp des Dokumentes, ein Beispiel für Latin1:
Code:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />


  • Der Webserver kann es dem Browser sagen.
    Beispiel für die Apache-Konfiguration mit UTF8 als Standardzeichensatz:
Code:
AddDefaultCharset utf-8


  • PHP kann es dem Browser sagen.
    Beispiel für die PHP-Konfiguration mit UTF8 als Standardzeichensatz:
Code:
default_charset = "utf-8"


  • Ein PHP-Skript kann es dem Browser sagen:
Code:
<?php header('Content-Type: text/html; charset=utf-8'); ?>


Beachtet, dass die serverseitigen Angaben(3,4,5) zum Zeichensatz Vorrang haben vor der im META-Tag(2) notierten.


  • Soweit, so gut. Die Dateien sind korrekt gespeichert, der Browser bekommt die korrekte Information, trotzdem sehe ich da komische Zeichen:eek:
    Viele PHP-Funktionen arbeiten derzeit noch mit Latin1 als Standardzeichensatz.
    Enthalten Strings, die mit solchen Funktionen bearbeitet werden, Nicht-ASCII-Zeichen, und ist der Zeichensatz des verarbeiteten Strings nicht Latin1, kann dies zu Fehlern führen.
    Kleines Beispiel eines UTF-8-kodierten Skriptes:
Code:
<?php 
header('Content-Type: text/html; charset=utf-8'); 
echo strtolower('Knödelsüppchenvielfraß');
?>
Das Ergebnis ist nicht zufriedenstellend:
kn?dels?ppchenvielfra
Lösung: Multbyte-String-Funktionen:
Code:
<?php 
header('Content-Type: text/html; charset=utf-8'); 
echo mb_strtolower('Knödelsüppchenvielfraß');
?>
Das Ergebnis wie gewünscht:
knodelsüppchenvielfraß


  • Ok, das funktioniert jetzt, aber ihr kommuniziert mit Datenbanken, schreibt dort hinein und lest dort Daten aus.
    Für Daten in einer DB wird natürlich ein bestimmter Zeichensatz verwendet
    Welcher das ist, das könnt ihr beim Erstellen der Datenbanken/Tabellen festlegen. Tut ihr das nicht, wird der Standard des Datenbankservers verwendet.

  • Super, auch das ist erledigt, aber es herrscht immer noch Chaos?
    Die Daten sind zwar im gewünschten Zeichensatz in der Datenbank gespeichert, das bedeutet jedoch nicht, dass sie in diesem Zeichensatz dort ankommen oder von dort abgeschickt werden.
    Verantwortlich dafür (MySQL als Beispiel genommen) sind diese 3 Konfigurationseinstellungen des DB-Servers:
    1. character_set_client
      Diese Einstellung gibt an, mit welchem Zeichensatz die Daten kodiert sind, die der DB-Server gesendet bekommt. Das sollte natürlich derjenige sein, den euer PHP-Skript verwendet.

    2. character_set_connection
      Diese Einstellung gibt an, in welchen Zeichensatz die Anweisungen(inklusive Daten) kodiert werden sollen, bevor der Server die Anweisung ausführt.
      Das sollte derjenige sein, in dem die Daten in der DB abgespeichert werden sollen oder gespeichert sind.

    3. character_set_results
      Das ist der Zeichensatz, in dem der DB-Server die Daten an euer PHP-Skript zurücksenden soll. idR. also derselbe wie bei character_set_client

    Nun gut, die Wenigsten werden die Möglichkeit haben, den verwendeten MySQL-Server selbst zu konfigurieren.
    Brauchen sie aber auch nicht.
    Nach dem Herstellen der Datenbankverbindung könnt ihr die 3 genannten Einstellungen über ein einziges Query vornehmen:
SQL:
SET NAMES utf8
...setzt den Zeichensatz für alle 3 Einstellungen bspw. auf UTF-8
Diese Einstellung bleibt erhalten für alle Anweisungen, welche die aktuelle DB-Verbindung nutzen.
Sie kann auch wieder geändert werden, dazu einfach nochmals das Query absetzen mit einem anderen Zeichensatz.
Beachtet die Schreibweise des Zeichensatzes, sie ist nicht identisch mit der in PHP verwendeten.
Ein
SQL:
SET NAMES UTF-8
...würde nicht die gewünschte Wirkung erzielen.
Die Liste der von MySQL unterstützen Datensätze (inkl. der zu verwendenden Schreibweise im Statement) findet ihr hier: http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html
 
Standard-Frage: Ich habe ein Script, das nicht funktioniert.

Anwort:

Möglicherweise ist die Fehler-Anzeige bei dir deaktiviert, bitte schalte doch folgende Einstellungen ein. Dafür gibt es zwei Möglichkeiten.

1. Über Code:
PHP:
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);

2. Über die php.ini
Wenn man den Pfad zur Datei kennt, kann man es auch dauerhaft so einstellen, das Fehler im Browser angezeigt werden. Dafür sucht man in der php.ini die Einstellung für

  • display_errors: Muss auf On stehen
  • error_reporting: Sollte auf E_ALL | E_STRICT stehen


Häufig kann man sich selbst dadurch schon einige Fragen beantworten.
 
Zuletzt bearbeitet:
Zurück