1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-23 23:02:13 +01:00
Files
archived-doc-de/faq/using.xml
Martin Samesch dfa11f2b9e sync with EN
2021-04-24 21:29:24 +02:00

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 "?&gt;" oder mit "?&gt;\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 -&lt; 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
&lt;?xml-Tags!
</para>
</question>
<answer>
<para>
Um &lt;?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>&lt;?php echo '&lt;?xml'; ?&gt;</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
-->