<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'faq.using.php',
    1 => 'PHP verwenden',
    2 => 'PHP verwenden',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.build.php',
    1 => 'Probleme bei der Kompilierung',
  ),
  'next' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Password-Hashing',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'faq/using.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.using" class="chapter">
  <h1 class="title">PHP verwenden</h1>

  

  <p class="para">
   Diese Rubrik behandelt viele Fehler, die möglicherweise beim Schreiben von
   PHP-Skripten auftreten.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.using.parameterorder">
     
      Ich kann mir die Reihenfolge der Parameter von PHP-Funktionen nicht
      merken - gibt es ein Schema?
     
    </a></li><li><a href="#faq.using.anyform">
     
      Ich m&ouml;chte ein PHP-Skript schreiben, das Daten von beliebigen Formularen
      verarbeiten kann. Woher wei&szlig; ich, welche Variablen &uuml;ber die POST-Methode
      verf&uuml;gbar sind?
     
    </a></li><li><a href="#faq.using.addslashes">
     
      Ich m&ouml;chte alle einfachen Anf&uuml;hrungszeichen (&#039;) in einen Backslash
      gefolgt von einem einfachen Anf&uuml;hrungszeichen (\&#039;) ersetzen lassen. Wie
      kann ich das mit einem regul&auml;ren Ausdruck machen? Ich m&ouml;chte au&szlig;erdem &quot;
      zu \&quot; und \ zu \\ konvertieren.
     
    </a></li><li><a href="#faq.using.wrong-order">
     
      Wenn ich den folgenden Code ausf&uuml;hre, wird die Ausgabe in der falschen
      Reihenfolge ausgegeben:
      

&lt;?php
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo &quot;myfunc($variable) = &quot; . myfunc($variable);
?&gt;

      
      Woran liegt das?
     
    </a></li><li><a href="#faq.using.newlines">
     
      Wo sind meine Zeilenumbr&uuml;che geblieben?
      

&lt;pre&gt;
&lt;?php echo &quot;Das soll die erste Zeile sein.&quot;; ?&gt;
&lt;?php echo &quot;Das soll nach dem obigen Zeilenumbruch erscheinen.&quot;; ?&gt;
&lt;/pre&gt;

      
     
    </a></li><li><a href="#faq.using.headers-sent">
     
      Ich bekomme die Meldung &#039;Warning: Cannot send session cookie - headers
      already sent...&#039; oder &#039;Cannot add header information - headers already
      sent...&#039;.
     
    </a></li><li><a href="#faq.using.header">
     
      Wie kann ich auf Informationen aus dem Request-Header zugreifen?
     
    </a></li><li><a href="#faq.using.authentication">
     
      Wenn ich versuche, Authentifizierung mit IIS zu nutzen, bekomme ich die
      Meldung &#039;No Input file specified&#039;.
     
    </a></li><li><a href="#faq.using.iis.sharing">
     
      Windows: Ich kann keine auf einem anderen Rechner freigegebenen Dateien
      aufrufen, wenn ich den IIS verwende.
     
    </a></li><li><a href="#faq.using.mixml">
     
      Wie kann ich XML und PHP mischen? PHP beschwert sich &uuml;ber meine
      &lt;?xml-Tags!
     
    </a></li><li><a href="#faq.using.variables">
     
      Wo kann ich eine komplette Liste der mir zur Verf&uuml;gung stehenden
      Variablen finden?
     
    </a></li><li><a href="#faq.using.freepdf">
     
      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&ouml;tigt.
     
    </a></li><li><a href="#faq.using.shorthandbytes">
     
      Einige PHP-Direktiven akzeptieren nicht nur Integer-Byte-Werte,
      sondern auch abgek&uuml;rzte Byte-Werte. Welche Abk&uuml;rzungen gibt es?
     
    </a></li></ol></div>

   <dl class="qandaentry" id="faq.using.parameterorder">
    
    <dt><strong>
     
      Ich kann mir die Reihenfolge der Parameter von PHP-Funktionen nicht
      merken - gibt es ein Schema?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP besteht aus Hunderten externer Bibliotheken, so dass dies manchmal
      etwas durcheinander erscheint. Eine einfache Regel ist aber wie folgt:
     </p>
     <p class="para">
      Parameter von <a href="book.array.php" class="link">Array-Funktionen</a> sind
      als &quot;<em>needle, haystack</em>&quot; (Nadel, Heuhaufen) geordnet,
      während die Parameter von <a href="book.strings.php" class="link">String-Funktionen</a> genau andersrum geordnet
      sind, also als &quot;<em>haystack, needle</em>&quot; (Heuhaufen,
      Nadel).
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.anyform">
    <dt><strong>
     
      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?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP bietet viele <a href="language.variables.predefined.php" class="link">vordefinierte Variablen</a>,
      wie das superglobale <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var>. Sie können
      <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> 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 <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>-Schleife, um
      (mit der Funktion <span class="function"><a href="function.empty.php" class="function">empty()</a></span>) auf leere Werte zu prüfen,
      und geben diese Werte aus.
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$empty </span><span style="color: #007700">= </span><span style="color: #0000BB">$post </span><span style="color: #007700">= array();<br />foreach (</span><span style="color: #0000BB">$_POST </span><span style="color: #007700">as </span><span style="color: #0000BB">$varname </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">) {<br />    if (empty(</span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$empty</span><span style="color: #007700">[</span><span style="color: #0000BB">$varname</span><span style="color: #007700">] = </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #0000BB">$varname</span><span style="color: #007700">] = </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">;<br />    }<br />}<br /><br />print </span><span style="color: #DD0000">"&lt;pre&gt;"</span><span style="color: #007700">;<br />if (empty(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">)) {<br />    print </span><span style="color: #DD0000">"Keiner der POST-Werte ist leer. Die Werte sind:\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />} else {<br />    print </span><span style="color: #DD0000">"Wir haben " </span><span style="color: #007700">. </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">) . </span><span style="color: #DD0000">" leere Werte:\n"</span><span style="color: #007700">;<br />    print </span><span style="color: #DD0000">"Alle Werte:\n"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />    print </span><span style="color: #DD0000">"Leer:\n"</span><span style="color: #007700">;  </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">);<br />    exit;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>

    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.addslashes">
    
    <dt><strong>
     
      Ich möchte alle einfachen Anführungszeichen (&#039;) in einen Backslash
      gefolgt von einem einfachen Anführungszeichen (\&#039;) ersetzen lassen. Wie
      kann ich das mit einem regulären Ausdruck machen? Ich möchte außerdem &quot;
      zu \&quot; und \ zu \\ konvertieren.
     
    </strong></dt>
    <dd class="answer">
     <p class="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 <span class="function"><a href="function.mysql-real-escape-string.php" class="function">mysql_real_escape_string()</a></span> unter
      MySQL und <span class="function"><a href="function.pg-escape-string.php" class="function">pg_escape_string()</a></span> unter PostgreSQL nutzen.
      Es gibt außerdem die generische Funktionen
      <span class="function"><a href="function.addslashes.php" class="function">addslashes()</a></span> und <span class="function"><a href="function.stripslashes.php" class="function">stripslashes()</a></span>,
      die häufig in älterem PHP-Code genutzt werden.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.wrong-order">
    <dt><strong>
     
      Wenn ich den folgenden Code ausführe, wird die Ausgabe in der falschen
      Reihenfolge ausgegeben:
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">$argument</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #0000BB">$argument </span><span style="color: #007700">+ </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$variable </span><span style="color: #007700">= </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"myfunc(</span><span style="color: #0000BB">$variable</span><span style="color: #DD0000">) = " </span><span style="color: #007700">. </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">$variable</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      Woran liegt das?
     
    </strong></dt>
    <dd class="answer">
     <p class="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 <span class="function"><a href="function.return.php" class="function">return</a></span> zurückgeben und ihn
      nicht mit <span class="function"><a href="function.echo.php" class="function">echo</a></span> ausgeben.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.newlines">
    <dt><strong>
     
      Wo sind meine Zeilenumbrüche geblieben?
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;pre&gt;<br /><span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Das soll die erste Zeile sein."</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br />&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Das soll nach dem obigen Zeilenumbruch erscheinen."</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br /></span>&lt;/pre&gt;</span></code></div>
      </div>

     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      In PHP können Code-Blöcke entweder mit &quot;?&gt;&quot; oder mit &quot;?&gt;\n&quot; 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.
     </p>
     <p class="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.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.headers-sent">
    <dt><strong>
     
      Ich bekomme die Meldung &#039;Warning: Cannot send session cookie - headers
      already sent...&#039; oder &#039;Cannot add header information - headers already
      sent...&#039;.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Die Funktionen <span class="function"><a href="function.header.php" class="function">header()</a></span>,
      <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> und die <a href="ref.session.php" class="link">Session-Funktionen</a> 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
      <span class="function"><a href="function.headers-sent.php" class="function">headers_sent()</a></span> prüft, ob Ihr Skript bereits Header
      gesendet hat. Nützlich sind in diesem Zusammenhang auch die <a href="ref.outcontrol.php" class="link">Funktionen zur Ausgabesteuerung</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.header">
    <dt><strong>
     
      Wie kann ich auf Informationen aus dem Request-Header zugreifen?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Wenn Sie PHP als Apache-Modul laufen lassen, liefert Ihnen die Funktion
      <span class="function"><a href="function.getallheaders.php" class="function">getallheaders()</a></span> die gewünschten Informationen. Der
      folgende Code gibt alle Request-Header aus:
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$headers </span><span style="color: #007700">= </span><span style="color: #0000BB">getallheaders</span><span style="color: #007700">();<br />foreach (</span><span style="color: #0000BB">$headers </span><span style="color: #007700">as </span><span style="color: #0000BB">$name </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$content</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"headers[</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">] = </span><span style="color: #0000BB">$content</span><span style="color: #DD0000">&lt;br /&gt;\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Siehe auch <span class="function"><a href="function.apache-lookup-uri.php" class="function">apache_lookup_uri()</a></span>,
      <span class="function"><a href="function.apache-response-headers.php" class="function">apache_response_headers()</a></span> und
      <span class="function"><a href="function.fsockopen.php" class="function">fsockopen()</a></span>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.authentication">
    <dt><strong>
     
      Wenn ich versuche, Authentifizierung mit IIS zu nutzen, bekomme ich die
      Meldung &#039;No Input file specified&#039;.
     
    </strong></dt>
    <dd class="answer">
     <p class="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:
      <a href="http://support.microsoft.com/kb/q160422/" class="link external">&raquo;&nbsp;http://support.microsoft.com/kb/q160422/</a>. Lesen Sie auch den
      Manual-Abschnitt zur
      <a href="features.http-auth.php" class="link">HTTP-Authentifizierung mit PHP</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.iis.sharing">
    <dt><strong>
     
      Windows: Ich kann keine auf einem anderen Rechner freigegebenen Dateien
      aufrufen, wenn ich den IIS verwende.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Sie müssen die <code class="literal">Go to Internet Information Services</code>
      ändern. Suchen Sie Ihre PHP-Datei und rufen Sie deren Eigenschaften auf.
      Wechseln Sie auf das Register <code class="literal">File Security</code>, klicken
      Sie dort auf <code class="literal">Edit -&lt; Anonymous access and authentication
      control</code>.
     </p>
     <p class="para">
      Sie können das Problem beheben, indem Sie entweder den Haken bei
      <code class="literal">Anonymous Access</code> entfernen und ihn bei
      <code class="literal">Integrated Window Authentication</code> belassen, oder indem
      Sie <code class="literal">Anonymous Access</code> ankreuzen und dann die
      Berechtigungen der Benutzer, die keinen Zugriff bekommen sollen,
      anpassen.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.mixml">
    <dt><strong>
     
      Wie kann ich XML und PHP mischen? PHP beschwert sich über meine
      &lt;?xml-Tags!
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Um &lt;?xml in Ihren PHP-Code einzufügen müssen Sie die Kurzform der
      öffnenden PHP-Tags abschalten, indem Sie in Ihrer <var class="filename">php.ini</var> <a href="ini.core.php#ini.short-open-tag" class="link">short_tags</a> auf <code class="literal">0</code>
      setzen. Sie können diese Direktive nicht mit der Funktion
      <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span> setzen. Sie können unabhängig davon, ob
      <a href="ini.core.php#ini.short-open-tag" class="link">short_open_tags</a> aktiviert oder
      deaktiviert ist, z. B. <code class="literal">&lt;?php echo &#039;&lt;?xml&#039;; ?&gt;</code>
      verwenden. Der Standardwert für diese Direktive ist
      <code class="literal">On</code>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.variables">
    <dt><strong>
     
      Wo kann ich eine komplette Liste der mir zur Verfügung stehenden
      Variablen finden?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Lesen Sie die Manual-Seite zu <a href="language.variables.predefined.php" class="link">vordefinierten Variablen</a>,
      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 <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span> aufrufen.
      Beachten Sie auch den Abschnitt zu <a href="language.variables.external.php" class="link">Variablen außerhalb von
      PHP</a>, der verschiedene Szenarien für externen Variablen wie
      HTML-Formulare, Cookies oder den URL beschreibt.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.freepdf">
    <dt><strong>
     
      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.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Es gibt einige in PHP geschriebene Alternativen wie
      <a href="http://www.fpdf.org/" class="link external">&raquo;&nbsp;FPDF</a> und
      <a href="http://www.tcpdf.org/" class="link external">&raquo;&nbsp;TCPDF</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.shorthandbytes">
    <dt><strong>
     
      Einige PHP-Direktiven akzeptieren nicht nur <a href="language.types.integer.php" class="link">Integer</a>-Byte-Werte,
      sondern auch abgekürzte Byte-Werte. Welche Abkürzungen gibt es?
     
    </strong></dt>
    <dd class="answer">
     <p class="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. <code class="literal">1M</code>
      entspricht z. B. einem Megabyte oder <code class="literal">1048576</code> Bytes.
      <code class="literal">1K</code> entspricht einem Kilobyte oder
      <code class="literal">1024</code> Bytes. Diese abgekürzte Schreibweise kann in der
      <var class="filename">php.ini</var> und in der Funktion <span class="function"><a href="function.ini-get.php" class="function">ini_get()</a></span> verwendet
      werden. Es ist zu beachten, dass der numerische Wert nach
      <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> umgewandelt wird; beispielsweise wird
      <code class="literal">0.5M</code> als <code class="literal">0</code> interpretiert.
     </p>
     <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
      <strong>Kilobyte versus Kibibyte</strong><br />
      <p class="para">
       Die PHP-Notation beschreibt ein Kilobyte als Entsprechung von 1024
       Bytes, während der <abbr>IEC</abbr>-Standard dies als Kibibyte
       bezeichnet. Zusammenfassung: k und K = 1024 Bytes.
      </p>
     </p></blockquote>
    </dd>
   </dl>
  
 </div>
<?php manual_footer($setup); ?>