PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<Probleme bei der CompilierungPHP und HTML>
view the version of this page
Last updated: Sat, 19 Apr 2003

Kapitel 50. 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.

Die Funktion addslashes() erledigt genau das. Siehe auch mysql_escape_string(). Mit der Funktion stripslashes() k�nnen Sie die Backslash-Zeichen wieder entfernen.

directive note: magic_quotes_gpc: The PHP directive magic_quotes_gpc defaults to on. It essentially runs addslashes() on all your GET, POST, and COOKIE data. You may use stripslashes() to strip them.

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.

directive note: magic_quotes_gpc: The PHP directive magic_quotes_gpc defaults to on. It essentially runs addslashes() on all your GET, POST, and COOKIE data. You may use stripslashes() to strip them.

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. ) pr�fen. Z.B. kann ein fehlendes </table> den Fehler verursachen.

IE und Lynx ignorieren auch NULs (\0) 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 \0 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



User Contributed Notes
PHP benutzen
add a note
There are no user contributed notes for this page.

<Probleme bei der CompilierungPHP und HTML>
 Last updated: Sat, 19 Apr 2003
show source | credits | mirror sites 
Copyright © 2001-2003 The PHP Group
All rights reserved.
This mirror generously provided by: /
Last updated: Mon May 12 21:12:21 2003 CEST