mirror of
https://github.com/php/doc-de.git
synced 2026-03-23 23:02:13 +01:00
391 lines
14 KiB
XML
391 lines
14 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: aab33d644359aba597e810e2fc0c0caa0d347c9c Maintainer: wiesemann Status: ready -->
|
|
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>PHP verwenden</title>
|
|
<titleabbrev>PHP verwenden</titleabbrev>
|
|
|
|
<para>
|
|
Diese Rubrik behandelt viele Fehler, die möglicherweise beim Schreiben von
|
|
PHP-Skripten auftreten.
|
|
</para>
|
|
|
|
<qandaset>
|
|
|
|
<qandaentry xml:id="faq.using.parameterorder">
|
|
<!-- TODO: Mention named arguments -->
|
|
<question>
|
|
<para>
|
|
Ich kann mir die Reihenfolge der Parameter von PHP-Funktionen nicht
|
|
merken - gibt es ein Schema?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
PHP besteht aus Hunderten externer Bibliotheken, so dass dies manchmal
|
|
etwas durcheinander erscheint. Eine einfache Regel ist aber wie folgt:
|
|
</para>
|
|
<para>
|
|
Parameter von <link linkend="book.array">Array-Funktionen</link> sind
|
|
als "<emphasis>needle, haystack</emphasis>" (Nadel, Heuhaufen) geordnet,
|
|
während die Parameter von <link
|
|
linkend="book.strings">String-Funktionen</link> genau andersrum geordnet
|
|
sind, also als "<emphasis>haystack, needle</emphasis>" (Heuhaufen,
|
|
Nadel).
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.anyform">
|
|
<question>
|
|
<para>
|
|
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?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
PHP bietet viele <link
|
|
linkend="language.variables.predefined">vordefinierte Variablen</link>,
|
|
wie das superglobale <varname>$_POST</varname>. Sie können
|
|
<varname>$_POST</varname> mit einer Schleife durchlaufen, da es sich um
|
|
ein assoziatives Array mit allen über die POST-Methode übertragenen
|
|
Variablen handelt. Als Beispiel verwenden wir die &foreach;-Schleife, um
|
|
(mit der Funktion <function>empty</function>) auf leere Werte zu prüfen,
|
|
und geben diese Werte aus.
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.addslashes">
|
|
<!-- TODO Probably should mention not doing this... -->
|
|
<question>
|
|
<para>
|
|
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.
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Falls Sie dies für eine Datenbank tun möchten, sollten Sie den
|
|
Maskierungsmechanismus nutzen, der für diese Datenbank vorgesehen ist.
|
|
Z. B. sollten Sie <function>mysql_real_escape_string</function> unter
|
|
MySQL und <function>pg_escape_string</function> unter PostgreSQL nutzen.
|
|
Es gibt außerdem die generische Funktionen
|
|
<function>addslashes</function> und <function>stripslashes</function>,
|
|
die häufig in älterem PHP-Code genutzt werden.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.wrong-order">
|
|
<question>
|
|
<para>
|
|
Wenn ich den folgenden Code ausführe, wird die Ausgabe in der falschen
|
|
Reihenfolge ausgegeben:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
function myfunc($argument)
|
|
{
|
|
echo $argument + 10;
|
|
}
|
|
$variable = 10;
|
|
echo "myfunc($variable) = " . myfunc($variable);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
Woran liegt das?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
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 <function>return</function> zurückgeben und ihn
|
|
nicht mit <function>echo</function> ausgeben.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.newlines">
|
|
<question>
|
|
<para>
|
|
Wo sind meine Zeilenumbrüche geblieben?
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<pre>
|
|
<?php echo "Das soll die erste Zeile sein."; ?>
|
|
<?php echo "Das soll nach dem obigen Zeilenumbruch erscheinen."; ?>
|
|
</pre>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
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.
|
|
</para>
|
|
<para>
|
|
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.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.headers-sent">
|
|
<question>
|
|
<para>
|
|
Ich bekomme die Meldung 'Warning: Cannot send session cookie - headers
|
|
already sent...' oder 'Cannot add header information - headers already
|
|
sent...'.
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Die Funktionen <function>header</function>,
|
|
<function>setcookie</function> und die <link
|
|
linkend="ref.session">Session-Funktionen</link> müssen dem Output-Stream
|
|
Header 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
|
|
<function>headers_sent</function> prüft, ob Ihr Skript bereits Header
|
|
gesendet hat. Nützlich sind in diesem Zusammenhang auch die <link
|
|
linkend="ref.outcontrol">Funktionen zur Ausgabesteuerung</link>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.header">
|
|
<question>
|
|
<para>
|
|
Wie kann ich auf Informationen aus dem Request-Header zugreifen?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Wenn Sie PHP als Apache-Modul laufen lassen, liefert Ihnen die Funktion
|
|
<function>getallheaders</function> die gewünschten Informationen. Der
|
|
folgende Code gibt alle Request-Header aus:
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
$headers = getallheaders();
|
|
foreach ($headers as $name => $content) {
|
|
echo "headers[$name] = $content<br />\n";
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</para>
|
|
<para>
|
|
Siehe auch <function>apache_lookup_uri</function>,
|
|
<function>apache_response_headers</function> und
|
|
<function>fsockopen</function>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.authentication">
|
|
<question>
|
|
<para>
|
|
Wenn ich versuche, Authentifizierung mit IIS zu nutzen, bekomme ich die
|
|
Meldung 'No Input file specified'.
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Das Sicherheitsmodell des IIS ist hier fehlerhaft. Dies ist ein Problem,
|
|
das bei allen CGI-Programmen auftritt, die unter dem IIS laufen. Als
|
|
Workaround können Sie eine leere HTML-Datei, die nicht von PHP geparst
|
|
wird, als Eingangsseite in ein per Authentifizierung geschütztes
|
|
Verzeichnis legen. 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. Auch auf
|
|
anderen NT-Web-Servern sollte dieses Problem nicht auftauchen. Weitere
|
|
Informationen finden Sie auch hier:
|
|
<link xlink:href="&url.iis;">&url.iis;</link>. Lesen Sie auch den
|
|
Manual-Abschnitt zur
|
|
<link linkend="features.http-auth">HTTP-Authentifizierung mit PHP</link>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.iis.sharing">
|
|
<question>
|
|
<para>
|
|
Windows: Ich kann keine auf einem anderen Rechner freigegebenen Dateien
|
|
aufrufen, wenn ich den IIS verwende.
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Sie müssen die <literal>Go to Internet Information Services</literal>
|
|
ändern. Suchen Sie Ihre PHP-Datei und rufen Sie deren Eigenschaften auf.
|
|
Wechseln Sie auf das Register <literal>File Security</literal>, klicken
|
|
Sie dort auf <literal>Edit -< Anonymous access and authentication
|
|
control</literal>.
|
|
</para>
|
|
<para>
|
|
Sie können das Problem beheben, indem Sie entweder den Haken bei
|
|
<literal>Anonymous Access</literal> entfernen und ihn bei
|
|
<literal>Integrated Window Authentication</literal> belassen, oder indem
|
|
Sie <literal>Anonymous Access</literal> ankreuzen und dann die
|
|
Berechtigungen der Benutzer, die keinen Zugriff bekommen sollen,
|
|
anpassen.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.mixml">
|
|
<question>
|
|
<para>
|
|
Wie kann ich XML und PHP mischen? PHP beschwert sich über meine
|
|
<?xml-Tags!
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Um <?xml in Ihren PHP-Code einzufügen müssen Sie die Kurzform der
|
|
öffnenden PHP-Tags abschalten, indem Sie in Ihrer &php.ini; <link
|
|
linkend="ini.short-open-tag">short_tags</link> auf <literal>0</literal>
|
|
setzen. Sie können diese Direktive nicht mit der Funktion
|
|
<function>ini_set</function> setzen. Sie können unabhängig davon, ob
|
|
<link linkend="ini.short-open-tag">short_open_tags</link> aktiviert oder
|
|
deaktiviert ist, z. B. <literal><?php echo '<?xml'; ?></literal>
|
|
verwenden. Der Standardwert für diese Direktive ist
|
|
<literal>On</literal>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.variables">
|
|
<question>
|
|
<para>
|
|
Wo kann ich eine komplette Liste der mir zur Verfügung stehenden
|
|
Variablen finden?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Lesen Sie die Manual-Seite zu <link
|
|
linkend="language.variables.predefined">vordefinierten Variablen</link>,
|
|
die eine (unvollständige) Liste der vordefinierten Variablen enthält,
|
|
die Ihren Skripten zur Verfügung stehen. Eine komplette Liste der
|
|
verfügbaren Variablen (und viele weitere Informationen) können Sie
|
|
sehen, wenn Sie die Funktion <function>phpinfo</function> aufrufen.
|
|
Beachten Sie auch den Abschnitt zu <link
|
|
linkend="language.variables.external">Variablen außerhalb von
|
|
PHP</link>, der verschiedene Szenarien für externen Variablen wie
|
|
HTML-Formulare, Cookies oder den URL beschreibt.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.freepdf">
|
|
<question>
|
|
<para>
|
|
Wie kann ich PDF-Dateien generieren, ohne die nicht-freie und
|
|
kommerzielle Bibliothek PDFLib zu verwenden? Ich suche etwas, das frei
|
|
ist und keine externen PDF-Bibliotheken benötigt.
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Es gibt einige in PHP geschriebene Alternativen wie
|
|
<link xlink:href="&url.pdf.fpdf;">FPDF</link> und
|
|
<link xlink:href="&url.pdf.tcpdf;">TCPDF</link>.
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.using.shorthandbytes">
|
|
<question>
|
|
<para>
|
|
Einige PHP-Direktiven akzeptieren nicht nur &integer;-Byte-Werte,
|
|
sondern auch abgekürzte Byte-Werte. Welche Abkürzungen gibt es?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
Die verfügbaren Abkürzungen sind K (für Kilobytes), M (für Megabytes)
|
|
und G (für Gigabytes), Groß-/Kleinschreibung spielt dabei keine Rolle.
|
|
Alle anderen Werte werden als Byte-Werte erkannt. <literal>1M</literal>
|
|
entspricht z. B. einem Megabyte oder <literal>1048576</literal> Bytes.
|
|
<literal>1K</literal> entspricht einem Kilobyte oder
|
|
<literal>1024</literal> Bytes. Diese abgekürzte Schreibweise kann in der
|
|
&php.ini; und in der Funktion <function>ini_get</function> verwendet
|
|
werden. Es ist zu beachten, dass der numerische Wert nach
|
|
<type>int</type> umgewandelt wird; beispielsweise wird
|
|
<literal>0.5M</literal> als <literal>0</literal> interpretiert.
|
|
</para>
|
|
<note>
|
|
<title>Kilobyte versus Kibibyte</title>
|
|
<para>
|
|
Die PHP-Notation beschreibt ein Kilobyte als Entsprechung von 1024
|
|
Bytes, während der <acronym>IEC</acronym>-Standard dies als Kibibyte
|
|
bezeichnet. Zusammenfassung: k und K = 1024 Bytes.
|
|
</para>
|
|
</note>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandaset>
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|