<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ebene7 &#187; Header</title>
	<atom:link href="http://blog.ebene7.com/schlagwort/header/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ebene7.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 18:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Das schließende PHP Tag am Ende einer Datei und die Sache mit der Stecknadel im Heuhaufen</title>
		<link>https://blog.ebene7.com/2010/03/08/das-schliessende-php-tag-am-ende-einer-datei-und-die-sache-mit-der-stecknadel-im-heuhaufen/</link>
		<comments>https://blog.ebene7.com/2010/03/08/das-schliessende-php-tag-am-ende-einer-datei-und-die-sache-mit-der-stecknadel-im-heuhaufen/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 09:00:35 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[BOM]]></category>
		<category><![CDATA[Byte Order Mark]]></category>
		<category><![CDATA[Datei]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Header]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Tag]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=407</guid>
		<description><![CDATA[Wer seit vielen Jahren mit PHP programmiert, der ist es sicherlich gewohnt, jedes geöffnete PHP-Tag auch wieder zu schließen. So ging es mir auch, bis ich vor längerer Zeit mal zu einem Probearbeiten für einen neuen Job eingeladen war und &#8230; <a href="https://blog.ebene7.com/2010/03/08/das-schliessende-php-tag-am-ende-einer-datei-und-die-sache-mit-der-stecknadel-im-heuhaufen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wer seit vielen Jahren mit PHP programmiert, der ist es sicherlich gewohnt, jedes geöffnete PHP-Tag auch wieder zu schließen.</p>
<p>So ging es mir auch, bis ich vor längerer Zeit mal zu einem Probearbeiten für einen neuen Job eingeladen war und es plötzlich hieß: &#8220;So machen wir das aber nicht mehr, das PHP-Tag wird nicht mehr geschlossen.&#8221;</p>
<p>Die Frage beschäftigte mich zu dem Zeitpunkt schon, warum das PHP-Tag am Dateiende nicht mehr geschlossen werden sollte. Ich habe es seit Jahren verwendet und es sind mir nie Nachteile durch die Verwendung aufgefallen. Warum nun also?</p>
<p><span id="more-407"></span>Es ist ja auch kein Fehler es zu Verwenden (maximal ein Verstoß gegen die <a href="http://de.wikipedia.org/wiki/Coding_standards" target="_blank">Coding Standards</a>), hilft aber, Fehler zu vermeiden, wenn man es weglässt.</p>
<p>Viele Projekte bestehen heute aus einer Vielzahl von PHP-Dateien und dank <a href="http://de.wikipedia.org/wiki/Model_View_Controller" target="_blank">MVC</a> über eine kontrollierte Ausgabe der Response.</p>
<p>Das bedeutet, dass wir in unserem Programm zu jeder Zeit die Header setzen können und diese dann erst mit dem kompletten Response gesendet werden.</p>
<p>Das funktioniert aber nur solange, wie noch nichts gesendet wurde und genau da liegt das Risiko des schließenden PHP-Tags.</p>
<p>Während ungewollte Zeichen zu Beginn der Datei relativ offensichlich sind, sind sie nach dem schließenden PHP-Tag unter Umständen quasi unsichtbar.</p>
<pre>&lt;?php
// irgendwelcher Code
?&gt;</pre>
<p>Denn sobald in irgendeiner Datei ein quasi unsichtbares Leerzeichen oder ein Zeilenumbruch dahinter folgt, werden, sofern die Ausgabe nicht gebuffert wird, auch schon die entsprechende Headerinformationen gesendet und wir würden im weiteren Verlauf unseres Programms wahrscheinlich eine Fehlermeldung zu sehen bekommen (&#8220;header already sent&#8221;).</p>
<p>Die entsprechende Stelle dann in mehreren hunderten oder oft sogar tausenden Dateien zu suchen wäre relativ zeitaufwendig und vor allem vermeidbar. Daher sollte auf die Verwendung verzichtet werden.</p>
<pre>&lt;?php
// irgendwelcher Code</pre>
<p>Ein weiterer, noch gemeinerer, Fehler kann auftreten, wenn die Datei im Unicode gespeichert wurde. In dem Fall wird vor dem eigentlichen Dateiinhalt die Bytefolge &#8220;FE FF&#8221; (<strong></strong><a href="http://de.wikipedia.org/wiki/Byte_Order_Mark" target="_blank">Byte Order Mark/BOM</a>) gespeichert, die von PHP bereits auch schon als Ausgabe interpretiert wird.</p>
<p>Das tückische daran ist jedoch, dass man diesen Fehler nicht im normalen Editor zu sehen bekommt und ggf. mit einem Hex-Editor ran müsste.</p>
<p>Siehe auch:</p>
<ul>
<li><a href="http://de.php.net/basic-syntax.instruction-separation" target="_blank">Abgrenzung von Anweisungen</a></li>
<li><a href="http://framework.zend.com/manual/en/coding-standard.coding-style.html" target="_blank">Zend Framework Coding Style</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/03/08/das-schliessende-php-tag-am-ende-einer-datei-und-die-sache-mit-der-stecknadel-im-heuhaufen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Verschiedene Aktionen nach Form-Submit</title>
		<link>https://blog.ebene7.com/2010/01/22/verschiedene-aktionen-nach-form-submit/</link>
		<comments>https://blog.ebene7.com/2010/01/22/verschiedene-aktionen-nach-form-submit/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 09:00:55 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Bedienung]]></category>
		<category><![CDATA[Formular]]></category>
		<category><![CDATA[Header]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Weiterleitung]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=275</guid>
		<description><![CDATA[Das worüber ich heute schreibe, ist weder neu, noch sonderlich aufregend, aber dennoch oftmals hilfreich. Es geht darum, über mehrere Submit-Buttons die Aktion nach dem Absenden eines HTML-Formulares steuern zu können. Angenommen, über ein Formular sollen die Stammdaten von Kunden &#8230; <a href="https://blog.ebene7.com/2010/01/22/verschiedene-aktionen-nach-form-submit/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Das worüber ich heute schreibe, ist weder neu, noch sonderlich aufregend, aber dennoch oftmals hilfreich. Es geht darum, über mehrere Submit-Buttons die Aktion nach dem Absenden eines HTML-Formulares steuern zu können.</p>
<p><span id="more-275"></span>Angenommen, über ein Formular sollen die Stammdaten von Kunden bearbeitet werden und wir wollen dem Bearbeiter das Leben etwas leichter machen, indem er nach dem Speichern der Daten direkt die nächste Aktion ausführen kann ohne sie in der Navigation zu suchen.</p>
<p>In unserem Fall könnten die Aktionen z.B. &#8216;speichern&#8217;, &#8216;speichern und zur Liste&#8217; und &#8216;speichern und neu anlegen&#8217; sein.</p>
<p>Erstmal brauchen wir ein gewöhnliches <a href="http://de.wikipedia.org/wiki/Affenformular" target="_blank">Affenformular</a> mit den gewünschten Eingabefeldern:</p>
<pre>&lt;form action="machwas" method="post"&gt;
  // ein paar Felder
  &lt;input type="submit" value="speichern"&gt;
&lt;/form&gt;</pre>
<p>Soweit, so gut. Bislang ein ganz gewöhnliches Formular. Doch wie steuern wir denn nun was nach dem Absenden passieren soll? Ganz einfach, wir geben dem Formular noch ein paar Buttons und benennen diese.</p>
<pre>&lt;form action="machwas" method="post"&gt;
  // ein paar Felder
  &lt;input type="submit" value="speichern" name="btnSave"&gt;
  &lt;input type="submit" value="speichern und zur Liste" name="btnSaveList"&gt;
  &lt;input type="submit" value="speichern und neu anlegen" name="btnSaveNew"&gt;
&lt;/form&gt;</pre>
<p>Für diesen Zweck habe ich mir angewöhnt, den Namen das Prefix &#8216;btn&#8217; zu geben, damit sie besser zuordenbar sind.</p>
<p>Was passiert nun? Durch die Benennung der Buttons wird deren Wert (value) mit den andere Werten übertragen und wir können serverseitig damit arbeiten.</p>
<p>Theoretisch hätte ich auch alle Buttons gleich benennen können und hätte dann mit dem jeweiligen Wert weiter arbeiten können, aber dieser wäre nicht zuverlässig nutzbar. Dazu etwas später mehr.</p>
<p>Natürlich brauchen wir auch noch eine Auswertung für unser Formular:</p>
<pre>&lt;?php
// Daten prüfen, speichern und weiterleiten, wenn alles geklappt hat...

if(isset($_REQUEST['btnSave'])) {
  // ...und wieder auf das Formular weiterleiten (mit Daten anzeigen)
} else if(isset($_REQUEST['btnSaveList'])) {
  // ...und zur Liste weiterleiten
} else if(isset($_REQUEST['btnSaveNew'])) {
  // ...und wieder auf das Formular weiterleiten (ohne Daten anzeigen)
}</pre>
<p>Das Beispiel funktioniert auch mit anderen Sprachen, müsste dann aber natürlich an die Syntax angepasst werden. Persönlich finde ich nach einem POST-Request einen HTTP-<a href="http://de.wikipedia.org/wiki/Redirect" target="_blank">Redirect</a> ganz nützlich.</p>
<p>Nun noch kurz die Aufklärung, warum ich die Namen der Buttons auswerte. Es ist einfacher, da der Name sich in der Regel nicht verändert, jedoch evtl. die Beschriftung und somit der Wert, wenn die Anwendung mehrsprachig programmiert ist.</p>
<p>Ich hoffe, dass es vielleicht dem Einen oder Anderen hilft, auch wenn es eigentlich zu den Basics gehört. Viel Spaß beim Ausprobieren!</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2010/01/22/verschiedene-aktionen-nach-form-submit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
