quakenet:#php FAQ
1. Welches ist das beste x?
back to top http://faq.php-quake.net/#best
Es kommt häufiger die Frage nach dem besten Texteditor, Betriebssystem, Webserver, Datenbank usw. auf. Das Ergebnis dieser Diskussionen ist meist, dass keine der Parteien nachgibt, und am Ende doch bei seiner Meinung bleibt. Das Problem dabei ist, dass es oftmals kein 'Bestes' gibt, sondern bei allem Pro und Contra. Einige klassiche Beispiele dazu sind:
  • vim vs. emacs
  • Open Source vs. Closed Source
  • Windows vs. *nix
  • Unix Derivat vs. Unix Derivat
Ich denke es kommt zum einen immer auf den Zusammenhang an, was 'dem besten' am nächsten kommt, und zudem ist es bei einigen Sachen einfach nur Geschmackssache, ob man x oder y nimmt. Dies sollte spätestens bei McDonalds vs. Burger King deutlich werden :).

-- matled

2. PHP meldet "Notice: Use of undefined constant x - assumed 'x' [...]"
back to top http://faq.php-quake.net/#constant
PHP meldet diesen Fehler, wenn Strings nicht gequotet sind. Dies kann z.B. beim Zugriff auf Arrays oder bei der Verwendung von Funktionen vorkommen.

<?php
    eine_function
(test); // falsch
    
    
$array[key] = 'foo'// falsch
?>

PHP interpretiert test und key als Konstanten, die es überhaupt nicht gibt, "biegt" aber den Fehler wieder gerade. Der Funktionsparameter test oder der Array-Index key muss in Singlequotes (') oder Doublequotes (") eingeschlossen werden. Wenn es sich allerdings um keinen String (z.B. einen Integer) oder einen numerischen Array-Index handelt, wird nicht gequotet. Untenstehend ein paar Beispiele, wie es richtig und falsch ist.

<?php
    eine_function
(test);    // falsch
    
eine_function('test');  // richtig, da in Singlequotes
    
eine_function("test");  // richtig, da in Doublequotes
    
    
eine_function(123);     // richtig, da ein Integer übergeben wird
    
eine_function('123');   // auch richtig, hier ist es allerdings ein String mit dem Wert '123'
    
    
$array[key] = 'foo';    // falsch
    
$array['key'] = 'foo';  // richtig
    
$array["key"] = 'foo';  // richtig
    
    
$array[0] = 'foo';      // richtig, da numerischer Index
?>

-- gix

3. Ich suche einen guten PHP-Editor
back to top http://faq.php-quake.net/#editor
Es gibt eine Menge PHP-Editoren auf den Markt. Manche kosten viel, manche wenig, manche sind Freeware. Hier eine Liste von PHP-Editoren und Editoren mit PHP-Syntaxhighlightschema. Welcher Editor für euch am besten ist müsst ihr selber herausfinden (siehe http://faq.php-quake.net/#best).

-- Progman

4. Mein Script arbeitet nicht so wie ich es will, jedoch gibt PHP auch keine Fehlermeldung(en) aus.
back to top http://faq.php-quake.net/#error
Ein häufiges Probleme besteht darin, dass der PHP-Code Fehlermeldungen erzeugt, diese jedoch durch die PHP-Konfiguration unterdrückt werden. Somit funktioniert das Skript nicht wie gewünscht, jedoch ist auch nicht ersichtlich, wo das Problem liegt. Zum Anzeigen der Fehlermeldungen am Anfang des Skripts diese zwei Zeilen einfügen.

<?php
    ini_set
('display_errors'1);
    
error_reporting(E_ALL);
?>

Die Funktion error_reporting() erlaubt es, genauer einzustellen, welche Fehlermeldungen angezeigt werden sollen. Nähere Informationen dazu sind auf http://php3.de/error_reporting zu finden.

-- matled

5. Kann man bei php >= 4.2 keine Variablen mehr per URL übergeben?
back to top http://faq.php-quake.net/#globals
Natürlich ist dies weiterhin möglich, jedoch ist seit PHP 4.2 register_globals standardmäßig auf Off. register_globals On sorgt dafür, dass Variablen, die per GET, POST und Cookie übertragen wurden, auch direkt als Variablen in PHP verfügbar sind (z.B. bei ?foo=bar gibt es dann im Script eine Variable $foo mit dem Wert 'bar').
Dies kann jedoch zu Sicherheitsproblemen führen, falls man Variablen benutzt, die man vorher nicht initialisiert hat. Der Besucher ist so in der Lage, die Variable selbst zu erzeugen. Das Problem tritt dann auf, wenn das Script diese Variable als 'vertrauenswerte' Variable ansieht, obwohl sie vom Benutzer manipuliert werden kann.
Wenn register_globals auf Off ist, kann auf die GET-, POST- und Cookie-Variablen nur über die Arrays $_GET, $_POST, $_COOKIE, und alternativ auch $HTTP_*_VARS zugegriffen werden. Der Unterschied zwischen $_* und $HTTP_*_VARS ist, dass erstere superglobal sind, d.h. es muss in Funktionen nicht erst global $_GET; gemacht werden ($_* Variablen sind seit PHP >= 4.1 verfügbar). Weitere Informationen sind hier zu finden: http://php3.de/manual/en/security.registerglobals.php.

-- matled

6. Woher kommen die \ vor einigen Zeichen aus $_GET, $_POST, $_COOKIE, $_GLOBALS, $_REQUEST, der Datenbank oder einer Text-Datei?
back to top http://faq.php-quake.net/#magic
Es gibt einige Optionen in der php.ini, welche dies verursachen können: magic_quotes_gpc, magic_quotes_runtime und magic_quotes_sybase.
Es wird empfohlen stripslashes() zu benutzen um die zusätzlichen \ zu entfernen. Die Einstellung für magic_quotes kann mit folgenden Funktionen abgefragt werden: get_magic_quotes_gpc und get_magic_quotes_runtime.

-- Athon Solo

7. Ich kriege "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource [...]" in meinem Script
back to top http://faq.php-quake.net/#mysql

<?php
    $result 
mysql_query('SELECT * FROM Table WHERE Field=Text');
    while(
$row mysql_fetch_array($result))
    {
        
/* mach irgendwas total tolles */
    
}
?>

PHP beschwert sich hier, dass $result keine gültige MySQL result resource ist; dies passiert normalerweise, wenn das SQL-Query fehlschlägt. Dies kann verschiedene Gründe haben, z.B. Tippfehler oder fehlende Quotes. Um den Fehler, den das Query produziert hat zu erfahren, müssen Sie hier eine Fehlerabfrage, wie im unteren Beispiel, einbauen.

<?php
    $query 
"SELECT * FROM Table WHERE Field='Text'";
    
$result mysql_query($query);
    if (empty(
$result)) {
        
trigger_error('MySQL ERROR ('.mysql_errno().'): "'.
            
mysql_error().'", the query was: "' $query '".',
            
E_USER_ERROR);
    }
    while(
$row mysql_fetch_array($result)) {
        
/* mach irgendwas total tolles */
    
}
?>

Für den Fall, dass mysql_query() fehlschlägt, wird das Script stoppen und eine Fehlermeldung anzeigen. Diese Fehlermeldung enthält praktischerweise auch die Zeile in der der Fehler aufgetreten ist; dies erleichtert es insbesondere in langem Code die betreffende Zeile sofort zu finden. Diesen Weg der Fehlerbehandlung können Sie auch bei mysql_connect() und mysql_select_db() benutzen. Nachdem man das Script erfolgreich von Fehlern befreit hat, sollte man trigger_error() durch einen Block Code ersetzen, der in sinnvoller Weise mit dem Error umgeht. Für fortgeschrittenen Datenbankzugriff kann man einen Blick auf PEAR::DB werfen.

-- sica

8. Wie leite ich einen User auf eine andere Seite um?
back to top http://faq.php-quake.net/#redirect
Es gibt drei Möglichkeiten, einen User auf eine andere Seite umzuleiten. Eine mit einem HTML Meta-Element, eine mit Javascript und eine mit Header-Bearbeitung.
HTML Meta-Element
In HTML gibt es eine Möglichkeit, mittels einen Meta-Element dem Besucher auf eine andere Seite weiterzuleiten. Diese Möglichkeit wird aber nicht vom W3C offiziell anerkannt, das sollte man immer im Hinterkopf behalten.
Das Meta-Element mit seinen Werten sieht so aus:

<meta http-equiv="refresh" content="sec; URL=neue_url">

Bei sec trägt man die Anzahl der Sekunden bis zur Weiterleitung ein; bei neue_url die URL, wohin umgeleitet werden soll. Dies kann eine vollständige URL oder ein relativer Link auf eine lokale Seite sein.
Selbsverständlich muss ein Meta-Element innerhalb des Head-Elements geschrieben werden, was die Benutzung von einer Meta-Umleitung ein wenig einschränkt. So eine Umleitung mit einem Meta-Element nennt man auch Meta-Refresh.

<meta http-equiv="refresh" content="0; URL=http://faq.php-quake.net/#redirect"> <meta http-equiv="refresh" content="5; URL=topic.php?id=5">

Javascript
Die zweite Möglichkeit, einen Besucher weiterzuleiten, ist die Benutzung von Javascript. Dabei muss man die Javascript-Variable window.location.href entsprechend verändern. Dies geht z.B. mit folgendem Code:

window.location.href = "http://www.mein-server.de/"; // oder window.location.href = "index.html";

Wenn dieser Teil an den Browser gesendet wird, wird der Besucher sofort umgeleitet. Falls eine Zeitverzögerung benötigt wird, können Sie dafür window.setTimeout() benutzen - Details siehe SELFHTML.
Da Sie Javascript an fast jeder Stelle benutzen können, haben Sie auch etwas mehr Freiheit, einen geeigneten Zeitpunkt für die Umleitung zu wählen. Doch nicht jeder Browser kann Javascript.
Header-Bearbeitung
Die letzte Möglichkeit einer Weiterleitung kann direkt in PHP verwendet werden. Mit dem header()-Befehl hat man die Möglichkeit, die Headerangaben, die dem Browser geschickt werden, zu bearbeiten, wie man es üblicherweise bei PHP-Scripten, die Bilder erzeugen, machen muss.
Mit dem header()-Befehl ändern wir dabei den Wert von der Angabe Location.

<?php
    header
("Location: absolute_URL");
?>

Bei der Location-Angabe muss man eine komplette URL angeben, angefangen mit http://. Hier sind einige Beispiele:

<?php
    header
("Location: http://www.mein-server.de/index.php");
    
header("Location: ftp://ftp.bla.com/file.zip");
    
header("Location: http://www.mein-server.de/forum.php?forum=2");
?>

Die Header-Angaben können Sie natürlich nur dann verändern, wenn diese noch nicht gesendet sind. Das heißt, sie können kein echo, printf, oder HTML-Elemente vor header() verwenden. Selbst ein Leerzeichen vor einem <?php ist zuviel. Wenn Sie eine Fehlermeldung wie "Cannot modify header information - headers already sent by..." oder ähnlich bekommen, achten Sie darauf, dass vor dem header-Befehl keine Ausgabe erzeugt wird. PHP sagt ihn dazu in der Fehlermeldung selber, wo die Ausgabe stattgefunden hat ("output started at Datei:Zeile"). Dies schränkt die Funktionsweise von header() sehr stark ein, doch Sie können sich darauf verlassen, das der Browser die veränderte Location-Angabe richtig verarbeiten kann (sie ist Teil des HTTP-Protokolls).

-- Progman

9. Was heißt 'Resource ID #x'?
back to top http://faq.php-quake.net/#resource
Einige Funktion in PHP (mysql_query, fopen, usw.) liefern eine Resource ID zurück. Diese sind mehr oder weniger Referenzen, also "Zeiger" auf die eigentliche Resource, also die Information, die im Speicher liegt. Um die Informationen dieser Resource zu verwenden muß man andere Funktionen (mysql_fetch_array, fgets, usw.) benutzen. Diesen wird dann die Resource ID als Arugment übergeben.

<?php
    
/* Unerwünscht */
    
$file fopen("myfile.txt","r");
    echo 
$file;
    
// Wird  "Resource id #x" ausgeben, was wahrscheinlich nicht das ist, was du willst.
    
var_dump($file);
    
// Gibt testweise "resource(#) of type (stream)" aus

    
$result mysql_query("SELECT * FROM `foo`");
    echo 
$result;
    
// Wird  "Resource id #x" ausgeben, was wahrscheinlich nicht das ist, was du willst.
    
var_dump($result);
    
// Gibt testweise "resource(#) of type (mysql result)" aus

    /* Erwünscht */

    
$file fopen("myfile.txt","r");
    
$line fgets($file);
    echo 
$line;
    
// Gibt die Zeile der Datei aus, was wahrscheinlich das erwünschte Verhalten ist.

    
$result mysql_query("SELECT * FROM `foo`");
    
$array mysql_fetch_array($result);
    echo 
$array['bar'];
    
// Gibt den Wert der Spalte 'bar' in der ersten Zeile der Tabelle 'foo' aus.
?>

-- MD87

10. Was bedeutet 'Notice: Undefined variable / index: <variable or array element name> ...'?
back to top http://faq.php-quake.net/#undefined
Seit PHP 4.3.4 ist error_reporting standardmäßig auf E_ALL gesetzt. Falls auf eine undefinierte Variable oder ein nicht vorhandenes Array-Element zugegriffen wird, wird so eine Fehlermeldung ausgegeben. Um vorher überprüfen ob dies der Fall ist kann isset() genutzt werden. Das Problem lässt sich entweder durch vorheriges Definieren oder Prüfen umgehen.
Beispiel 1
Anstelle von:

<?php
    $action 
$_POST['action'];
?>

Benutze:

<?php
    
if (isset ($_POST['action'])) {
      
$action $_POST['action'];
    } else {
      
$action '';
    }
?>

Beispiel 2
Anstelle von:

<?php
    
// Error checking code
    // Wenn ein Fehler auftritt wird $error_count erhöht
    
    
if ($error_count != 0) {
      echo 
"Es gab ein Problem!";
    }
?>

Benutze:

<?php
    
// Variablen _immer_ vor dem Benutzen initialisieren 
    
$error_count 0;
                
    
// Error checking code
    // Wenn ein Fehler auftritt wird $error_count erhöht
                
    
if ($error_count != 0) {
      echo 
"Es gab ein Problem!";
    }
?>

Warnung
Es wird davon abgeraten das @ Symbol zu nutzen um Fehlermeldungen zu unterdrücken. Beispielsweise wurde von Einigen bei diesem Beispiel empfohlen dies zu benutzen um den aufgetretenen Fehler zu beheben:

<?php
    
echo $error;
?>

sollte geändert werden zu:

<?php
    
@echo $error;
?>

Auch wenn dadurch der Fehler nicht mehr angezeigt wird tritt der Fehler weiterhin auf. Falls weitere Probleme in diesem Ausdruck auftreten sollten werden diese auch unterdrückt. So kann es zu schwerwiegenden Problemen kommen, ohne dass man einen Hinweis bekommt, wo diese liegen.
Es wird weiter nicht empfohlen den Wert von error_reporting zu vermindern um Fehlermeldungen zu vermeiden. Zum einen eben genannter Grund und zum anderen kann es auf bestimmten Servern nicht möglich sein den Wert zu ändern, da auch ini_set() deaktiviert sein kann. Zudem fordert eine hohe Einstellung von error_reporting einen guten Coding-Stil und läuft auf mehr Servern.
Hinweis: Häufig tritt dieser Fehler durch veraltete Tutorials auf. Seit PHP 4.2.x ist register_globals standardmäßg deaktiviert. Mehr Informationen hierzu finden sich auf http://php.net/register_globals.

-- Athon Solo

11. Welche Editoren benutzt ihr?
back to top http://faq.php-quake.net/#which
Wir werden oft gefragt, welche Editoren wir zum Schreiben unserer Scripte benutzen. Hier ist nun eine Liste, die von Zeit zu Zeit aktualisiert wird: Siehe dazu auch http://faq.php-quake.net/#best und http://faq.php-quake.net/#editor.

-- Progman