quakenet:#php FAQ
| | 1.
Welches ist das beste x? |
|---|
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' [...]" |
|---|
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 |
|---|
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. |
|---|
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? |
|---|
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? |
|---|
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 |
|---|
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? |
|---|
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.
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">
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.
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'? |
|---|
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> ...'? |
|---|
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.
Anstelle von:
<?php $action = $_POST['action']; ?>
Benutze:
<?php if (isset ($_POST['action'])) { $action = $_POST['action']; } else { $action = ''; } ?>
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!"; } ?>
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? |
|---|
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:
-
bluefish - LittleIdiot
-
HTML-Editor (Phase 5) - aoh-hell
-
kwrite - Progman
-
quanta - LittleIdiot
-
UltraEdit - matled, gix
-
(g)vim - bigfoot, ch, et, gix, LittleIdiot, matled, Progman, soohrt, sica, Thomas
-
Weaverslave - Thomas
Siehe dazu auch http://faq.php-quake.net/#best und
http://faq.php-quake.net/#editor.
-- Progman |
|