|
|
 |
|
|
 |
 |
 |
 |
 |
Hits gesamt: 5195358 Hits Heute: 699 max. Hits (10.07.07): 6964 User Online: 29 Scripts: 2828 |
|
|
 |
 |
 |
 |
 |
 |
|
 |
|
|
 |
|
|
 |
|
|
 |
 |
 |
 |
 |
 Jetzt lerne ich ASP.NET . Dynamische Webseiten im .NET-Framework einfach programmiert |
|
|
 |
 |
 |
 |
 |
 |
|
 |
|
 |
 |
 |
 |
 |
Manuals > PHP >
PHP benutzen |
Diese Rubrik behandelt viele beim Schreiben von PHP-Skripten auftretende
Fehler.
- 1.
Ich möchte ein PHP-Skript schreiben, das Daten von beliebigen Formularen
verarbeiten kann. Woher weiß ich, welche Variablen über die POST-Methode
verfügbar sind?
- 2.
Ich möchte alle einfachen Anführungszeichen (') in einen
Backslash gefolgt von einem einfachen Anführungszeichen (')
ersetzen lassen. Wie kann ich das mit einem regulären
Ausdruck machen? Ich möchte außerdem " zu \" und \ zu \
konvertieren.
- 3.
Alle meine " werden in \" und meine ' werden in \' konvertiert.
Wie kann ich den nicht gewünschten Backslash entfernen? Warum und
wie sind diese Zeichen überhaupt konvertiert worden?
- 4.
Wenn ich den folgenden Code ausführe, wird die Ausgabe in der
falschen Reihenfolge ausgegeben:
<?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?>
|
Woran liegt das?
- 5.
Wo sind meine Zeilenumbrüche geblieben?
<pre> <?php echo "Das soll die erste Zeile sein."; ?> <?php echo "Das soll nach dem obigen Zeilenumbruch erscheinen."; ?> </pre>
|
- 6.
Ich bekomme die Meldung 'Warning: Cannot send session cookie - headers already
sent...' oder 'Cannot add header information - headers already sent...'.
- 7.
Wie kann ich auf Informationen aus dem Request-Header zugreifen?
- 8.
Wenn ich versuche, Authentifikation mit IIS zu nutzen, bekomme ich die
Meldung 'No Input file specified'.
- 9.
Mein PHP-Skript funktioniert unter IE und Lynx, aber unter Netscape
fehlt ein Teil meiner Ausgabe. Wenn ich mir den Quelltext anschaue,
sehe ich die Ausgabe unter IE, aber nicht unter Netscape.
- 10.
Wie kann ich XML und PHP mischen? PHP beschwert sich über meine
<?xml-Tags!
- 11.
Wie kann ich mit PHP mit Frontpage oder einem anderen HTML-Editor,
der meinen Code verschiebt, benutzen?
- 12.
Wo kann ich eine komplette Liste der mir zur Verfügung stehenden
Variablen finden?
- 13.
Ich versuche, auf eine der Standard-CGI-Variablen (wie
$DOCUMENT_ROOT oder $HTTP_REFERER) in einer selbst-definierten
Funktion zuzugreifen, aber anscheinend kann ich nicht darauf zugreifen.
Was mache ich falsch?
1.
Ich möchte ein PHP-Skript schreiben, das Daten von beliebigen Formularen
verarbeiten kann. Woher weiß ich, welche Variablen über die POST-Methode
verfügbar sind?
PHP bietet viele vordefinierte
Variablen, wie das superglobale $_POST. Sie
können $_POST mit einer Schleife durchlaufen, da es sich
um ein assoziatives Array mit allen über die POST-Methode übertragenen
Variablen handelt. Als Beispiel benutzen wir die foreach-Schleife, um auf
leere Werte (mit der empty()-Funktion) zu prüfen
und geben diese Werte aus.
<?php $empty = $post = array(); foreach ($_POST as $varname => $varvalue) { if (empty($varvalue)) { $empty[$varname] = $varvalue; } else { $post[$varname] = $varvalue; } }
print "<pre>"; if (empty($empty)) { print "Keiner der POST-Werte ist leer. Die Werte sind:\n"; var_dump($post); } else { print "Wir haben " . count($empty) . " leere Werte:\n"; print "Alle Werte:\n"; var_dump($post); print "Leer:\n"; var_dump($empty); exit; } ?>
|
2.
Ich möchte alle einfachen Anführungszeichen (') in einen
Backslash gefolgt von einem einfachen Anführungszeichen (')
ersetzen lassen. Wie kann ich das mit einem regulären
Ausdruck machen? Ich möchte außerdem " zu \" und \ zu \
konvertieren.
3.
Alle meine " werden in \" und meine ' werden in \' konvertiert.
Wie kann ich den nicht gewünschten Backslash entfernen? Warum und
wie sind diese Zeichen überhaupt konvertiert worden?
Die PHP-Funktion stripslashes() entfernt solche
Backslash-Zeichen aus Ihrem String. In den meisten
Fällen existieren diese Zeichen automatisch, weil die magic_quotes_gpc-Direktive
auf on steht.
4.
Wenn ich den folgenden Code ausführe, wird die Ausgabe in der
falschen Reihenfolge ausgegeben:
<?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?>
|
Woran liegt das?
Um das Ergebnis Ihrer Funktion in einem Ausdruck verwenden zu können
(um es z.B. wie im obigen Beispiel mit dem anderen String zu verbinden),
müssen Sie den Wert mit return() zurückgeben und
ihn nicht mit echo() ausgeben.
5.
Wo sind meine Zeilenumbrüche geblieben?
<pre> <?php echo "Das soll die erste Zeile sein."; ?> <?php echo "Das soll nach dem obigen Zeilenumbruch erscheinen."; ?> </pre>
|
In PHP können Code-Blöcke entweder mit "?>" oder mit "?>\n"
enden (\n steht für Zeilenumbruch). Im obigen Beispiel sind
die ausgegebenen Zeilen daher in einer Zeile, denn PHP lässt
die Zeilenumbrüche nach den Block-Ende-Zeichen weg.
Wenn Sie möchten, dass PHP einen Zeilenumbruch ausgibt, müssen Sie nach
jedem Code-Block einen zusätzlichen Zeilenumbruch einfügen.
Warum macht PHP das so? Wenn Sie normales HTML formatieren,
erleichert PHP Ihnen die Arbeit, da Sie meist diesen Zeilenumbruch
gar nicht haben möchten. Würde PHP diesen Zeilenumbruch ausgeben,
müssten Sie sehr lange Zeilen schreiben und Ihren Code damit
unlesbar machen.
6.
Ich bekomme die Meldung 'Warning: Cannot send session cookie - headers already
sent...' oder 'Cannot add header information - headers already sent...'.
Die Funktionen header(),
setcookie() und die Session-Funktionen müssen Header
dem Output-Stream hinzufügen. Header können aber nur gesendet werden, wenn Sie
vor allen anderen Daten gesendet werden. Vor dem Aufruf dieser Funktionen darf
also keine Ausgabe (wie z.B. HTML-Code) stattfinden. Die Funktion
headers_sent() prüft, ob Ihr Skript bereits Header gesendet
hat. Nützlich sind in diesem Zusammenhang auch die Funktionen zur Ausgabesteuerung.
7.
Wie kann ich auf Informationen aus dem Request-Header zugreifen?
Wenn Sie PHP als Apache-Modul laufen lassen, liefert Ihnen die
getallheaders()-Funktion die gewünschten Informationen.
Der folgende Code gibt alle Request-Header aus:
<?php $headers = getallheaders(); foreach ($headers as $name => $content) { echo "headers[$name] = $content<br>\n"; } ?>
|
Siehe auch
apache_lookup_uri(),
apache_response_headers() und
fsockopen().
8.
Wenn ich versuche, Authentifikation mit IIS zu nutzen, bekomme ich die
Meldung 'No Input file specified'.
Das Sicherheitsmodell des IIS hat Unrecht. Dies ist ein Problem,
das alle CGI-Programme, die unter dem IIS laufen, haben.
Als Workaround können Sie eine leere HTML-Datei, die nicht von PHP
geparst wird, als Eingangsseite in ein per Authenfikation geschütztes
Verzeichnis erzeugen. Anschließend leiten Sie den Browser durch ein
META-Tag auf die PHP-Seite weiter oder sie setzen einen Link auf
die PHP-Seite. PHP erkennt dann die Authentifizierung korrekt.
Dieses Problem tritt mit dem ISAPI-Modul nicht auf. Auch auf anderen
NT-Web-Servern sollte dieses Problem nicht auftauchen. Weitere
Informationen finden Sie auch hier:
???. Lesen Sie auch den
Manual-Abschnitt zur HTTP-Authentifizierung mit PHP.
9.
Mein PHP-Skript funktioniert unter IE und Lynx, aber unter Netscape
fehlt ein Teil meiner Ausgabe. Wenn ich mir den Quelltext anschaue,
sehe ich die Ausgabe unter IE, aber nicht unter Netscape.
Netscape verarbeitet HTML-Tags (z.B. Tabellen) strenger als der IE.
Meist ist es hilfreich, wenn Sie Ihre HTML-Ausgabe mit einem
HTML-Validator (z.B.
validator.w3.org)
prüfen. Z.B. kann ein fehlendes </table> den Fehler verursachen.
IE und Lynx ignorieren auch NULs () im HTML-Stream,
Netscape nicht. Um dies zu überprüfen, kompilieren Sie am besten die
Kommandozeilen-Version
von PHP (auch bekannt als die CGI-Version) und führen Sie Ihr Skript
auf der Kommandozeile aus. Unter Unix pipen Sie es durch
od -c und schauen Sie nach
Zeichen.
Unter Windows müssen Sie einen Editor oder ein anderes Programm benutzen,
das es Ihnen ermöglicht, binäre Dateien anzuschauen.
Wenn Netscape ein NUL in einer Datei findet, gibt es normalerweise in dieser
Zeile nichts mehr aus, während IE und Lynx die Zeile normal ausgeben.
10.
Wie kann ich XML und PHP mischen? PHP beschwert sich über meine
<?xml-Tags!
Um <?xml in Ihren PHP-Code einzufügen müssen Sie die Kurzform der
öffnenden PHP-Tags abschalten, indem Sie in Ihrer php.ini short_tags auf 0
setzen. Sie können diese Direktive nicht mit der Funktion
ini_set() setzen. Sie können unabhängig davon, ob
short_open_tags auf on oder
off gesetzt ist, z.B. <?php echo '<?xml'; ?>
benutzen. Der Standardwert für diese Direktive ist on.
11.
Wie kann ich mit PHP mit Frontpage oder einem anderen HTML-Editor,
der meinen Code verschiebt, benutzen?
Die einfachste Möglichkeit ist, ASP-Tags in Ihrem PHP-Code zu aktivieren.
Sie können dann <% und %> zur Begrenzung Ihres Codes verwenden.
Viele HTML-Editoren verarbeiten solche Code-Blöcke intelligenter.
Um die ASP-Tags zu aktiveren, müssen Sie in Ihrer php.ini
asp_tags auf On
setzen oder die gleichwertige Apache-Direktive verwenden.
12.
Wo kann ich eine komplette Liste der mir zur Verfügung stehenden
Variablen finden?
Lesen Sie die Manual-Seite zu vordefinierten Variablen,
die eine (unvollständige) Liste der vordefinierten Variablen, die Ihren
Skripten zur Verfügung stehen, enthält. Eine komplette Liste der
verfügbaren Variablen (und viele weitere Informationen) können Sie
sehen, wenn Sie die Funktion phpinfo() aufrufen.
Beachten Sie auch den Abschnitt zu Variablen außerhalb von PHP,
der verschiedene Szenarien für externen Variablen wie HTML-Formulare,
Cookies oder den URL beschreibt.
register_globals: important
note: Since PHP 4.2.0, the default value for the PHP directive
register_globals is
off. The PHP community encourages all to not rely on this
directive but instead use other means, such as the superglobals.
13.
Ich versuche, auf eine der Standard-CGI-Variablen (wie
$DOCUMENT_ROOT oder $HTTP_REFERER) in einer selbst-definierten
Funktion zuzugreifen, aber anscheinend kann ich nicht darauf zugreifen.
Was mache ich falsch?
Es ist wichtig, zu verstehen, dass die PHP-Direktive register_globals auch
Server- und Umgebungsvariablen betrifft. Wenn
register_globals = off (Standardwert seit PHP 4.2.0), dann
existiert $DOCUMENT_ROOT nicht. Stattdessen
können Sie $_SERVER['DOCUMENT_ROOT']
benutzen. Wenn register_globals = on, dann existieren auch
die Variablen $DOCUMENT_ROOT und
$GLOBALS['DOCUMENT_ROOT'].
Wenn Sie sicher sind, dass register_globals = on, und sich wundern,
warum $DOCUMENT_ROOT innerhalb von Funktionen
nicht verfügbar ist: das liegt daran, dass es sich dabei um eine
Variable wie jede andere handelt und sie deswegen innerhalb der
Funktion zunächst global $DOCUMENT_ROOT
benutzen müssen. Siehe auch die Manual-Seite zum Geltungsbereich von Variablen.
Empfehlenswert ist, register_globals = off zu verwenden.
Superglobals: availability note: Since PHP 4.1.0, superglobal arrays such as $_GET
, $_POST, and $_SERVER,
etc. have been available. For more information, read the manual section
on superglobals
|
|
|
 |
 |
 |
 |
 |
 |
|
 |