<?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>Der Interaktionsdesigner - PHP, jQuery und CSS &#187; PHP</title>
	<atom:link href="http://www.interaktionsdesigner.de/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.interaktionsdesigner.de</link>
	<description>Pauls Blog beschäftigt sich mit Webentwicklungsthemen, im Focus stehen jQuery, TYPO3, CSS und PHP.</description>
	<lastBuildDate>Sat, 05 Jun 2010 21:13:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Automatisch erkennen wie CSV Dateien aufgebaut sind</title>
		<link>http://www.interaktionsdesigner.de/2009/02/25/automatisch-erkennen-wie-csv-dateien-aufgebaut-sind/</link>
		<comments>http://www.interaktionsdesigner.de/2009/02/25/automatisch-erkennen-wie-csv-dateien-aufgebaut-sind/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 17:04:49 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=285</guid>
		<description><![CDATA[CSV Dateien sind z.B. Exports aus Datenbanken oder Excel. Der Name steht für Comma-Separated Values und bedeutet, dass die Werte von einem Komma getrennt sind. Damit kann man einfach eine CSV importieren und zum Beispiel in PHP weiter verarbeiten.
Tja, einfach ist das natürlich nicht und jedes Programm erstellt andere CSV Dateien. Ich habe eine Funktion [...]]]></description>
			<content:encoded><![CDATA[<p>CSV Dateien sind z.B. <strong>Exports aus Datenbanken oder Excel</strong>. Der Name steht für <em>Comma-Separated Values </em>und bedeutet, dass die Werte von einem Komma getrennt sind. Damit kann man <strong>einfach</strong> eine CSV importieren und zum Beispiel in PHP weiter verarbeiten.</p>
<p>Tja, einfach ist das natürlich nicht und jedes Programm erstellt <strong>andere CSV Dateien</strong>. Ich habe eine Funktion geschrieben die versucht <strong>automatisch</strong> zu erkennen wie eine CSV Datei aufgebaut ist. <a title="Automatische CSV Erkennung" href="http://interaktionsdesigner.de/stuff/csv.php" target="_blank">Hier ist eine Demo</a> und im folgenden Artikel kommt die Funktionsweise.<span id="more-285"></span>Die Funktion erwartet einen String, z.B. <pre><code class=''>"spalte1", "spalte2", "spalte3"</code></pre> und gibt dann ein Array zurück mit den Keys <em>delimiter</em> und <em>enclosure</em>. Aus dem obrigen Beispiel wäre das dann <pre><code class=''>Array(&nbsp;&nbsp;[delimiter] =&gt; ; &nbsp;&nbsp;[enclosure] =&gt; ")</code></pre></p>
<p>Hier kommt die <strong>komplette Funktion</strong> und anschließend ein paar erklärende Worte.<pre><code class='php'>function csv_autodetect($string) {<br />
&nbsp;&nbsp;$str = trim($string);<br />
&nbsp;&nbsp;$char = '';<br />
&nbsp;&nbsp;$e = '';<br />
&nbsp;&nbsp;$d = array();<br />
&nbsp;&nbsp;$open = false;<br />
&nbsp;&nbsp;$strip = false;<br />
&nbsp;&nbsp;for($i = 0; $i &lt; strlen($str); $i++) {<br />
&nbsp;&nbsp;[tab]$char = $str[$i];<br />
&nbsp;&nbsp;[tab]if(preg_match('=[\W]=', $char) &amp;&amp; ord($char) != 32) {&nbsp;&nbsp;[tab]&nbsp;&nbsp;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;if($i == 0)<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]$e = $char;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;if($char == '\\')<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]$strip = true;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;else<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]$strip = false;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;if($char == $e &amp;&amp; !$strip) {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]$open = $open ? false : true;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;}<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]if(!$open &amp;&amp; !$strip)<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]&nbsp;&nbsp;$d[$char]++;<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;}<br />
&nbsp;&nbsp;[tab]}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;asort($d);<br />
&nbsp;&nbsp;$dd = array_keys($d, array_pop($d));<br />
&nbsp;&nbsp;$return['delimiter'] = $dd[0];<br />
&nbsp;&nbsp;$return['enclosure'] = $e;<br />
&nbsp;&nbsp;return $return;&nbsp;&nbsp;<br />
}</code></pre></p>
<p>Nachdem einige Variablen vorbelegt wurden, erfolgt die <strong>zeichenweise Untersuchung des Strings</strong>. Wenn es sich um ein Sonderzeichen handelt, dann beginnt die Untersuchung.</p>
<p><pre><code class='php'>if($i == 0)<br />
&nbsp;&nbsp;$e = $char;</code></pre>Wenn das erste Zeichen des Strings ein <strong>Sonderzeichen</strong> ist und kein Leerzeichen, dann ist es mit Sicherheit jenes, welches die Werte umfasst (<em>e = Enclosure</em>).<br />
<pre><code class='php'>if($char == '\\')<br />
&nbsp;&nbsp;$strip = true;<br />
else<br />
&nbsp;&nbsp;$strip = false;</code></pre>Wenn es sich um ein <strong>Backslash</strong> handelt, dann wird das nächste Zeichen ignoriert. Damit sind dann Fälle wie <em>"eine \"Spalte\"";</em> auch möglich.<br />
<pre><code class='php'>if($char == $e &amp;&amp; !$strip)<br />
$open = $open ? false : true;</code></pre>Wenn es also das umschließende Zeichen ist, und nicht durch ein Backslash auskommentiert wurde (<em>$strip</em>), dann wird der Status von <em>$open</em> geändert. Durch diese Beachtung ist es dann möglich den Delimeter innerhalb einer Spaltenbezeichnung zu benutzen (z.B. <em>"spalte1", "spalte1,5", "spalte2"</em>). Wenn es sich nicht um das umschließende Zeichen handelt, dann muss weiter überlegt werden:<br />
<pre><code class='php'>if(!$open &amp;&amp; !$strip)<br />
&nbsp;&nbsp;$d[$char]++;</code></pre>Wenn sich das Zeichen nicht innerhalb einer Spaltenbezeichnung befindet und auch nicht auskommentiert wurde, dann wird das Arrayelement <em>$d</em> (<em>d = Delimiter</em>) mit dem Zeichen als Schlüssel um eins erhöht.</p>
<p>Der Grund dafür ist das eventuelle Auftreten von Sonderzeichen in einer Spaltenbezeichnung ohne Enclosure (z.B. spalte1, spalte2&amp;3, spalte4). Am Ende wird das Zeichen als Delimeter erwartet welches <strong>am häufigsten gefunden</strong> wurde. Das gibt zwar ein Problem bei einem String wie <em>c&amp;a, p&amp;c, m&amp;m</em> - aber dann muss man seine Felder halt mit einem Zeichen umschließen.</p>
<p><strong>Ende!</strong> Wer jetzt in seinem Kopf die Idee spinnt daraus ein Tool zu bauen welches <strong>CSV Dateien in eine Datenbank importiert</strong>, dem sei geraten noch ein paar Tage zu warten oder mir eine Mail zu schicken. Hab da was tolles in der mache was demnächst veröffentlicht wird <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Wer <em>Ideen</em>, <em>Probleme</em> und <em>Verbesserungsvorschläge</em> hat kann diese gerne in den Kommentaren los werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/02/25/automatisch-erkennen-wie-csv-dateien-aufgebaut-sind/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery UI Progressbar und PHP verbinden</title>
		<link>http://www.interaktionsdesigner.de/2009/02/20/jquery-ui-progressbar-und-php-verbinden/</link>
		<comments>http://www.interaktionsdesigner.de/2009/02/20/jquery-ui-progressbar-und-php-verbinden/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 19:26:02 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=275</guid>
		<description><![CDATA[Der neuste Release Candidate vom jQuery Userinterface 1.6 ist genial! Vor allem das neue Element, die Progressbar, hat es mir angetan. Die Bedienung ist sehr einfach, einem Element wird die Progressbar zugewiesen und die Bar dehnt sich in den gegebenen Proportionen automatisch aus.
Herrlich und sehr einfach mit einer Schleife in JavaScript zu verändern. Aber wie [...]]]></description>
			<content:encoded><![CDATA[<p>Der neuste <a title="jQuery UI 1.6" href="http://jqueryui.com/download" target="_blank">Release Candidate vom jQuery Userinterface 1.6</a> ist genial! Vor allem das neue Element, <a title="jQuery UI Progressbar" href="http://docs.jquery.com/UI/Progressbar" target="_blank">die Progressbar</a>, hat es mir angetan. Die Bedienung ist sehr einfach, einem Element wird die Progressbar zugewiesen und die Bar dehnt sich in den gegebenen Proportionen automatisch aus.</p>
<p><strong>Herrlich</strong> und sehr einfach mit einer Schleife in JavaScript zu verändern. Aber wie um alles in der Welt kriegt man die Bar dazu den aktuellen Status einer langwierigen <strong>PHP Operation</strong> wider zu spiegeln?</p>
<p>Ich habe eine ganze Weile herumprobiert und das folgende ist dabei heraus gekommen. Hier ist <a title="PHP und jQuery UI Progressbar vereint!" href="http://www.interaktionsdesigner.de/stuff/progressbar/" target="_blank">die Demo</a> und im Beitrag folgt die Beschreibung.<span id="more-275"></span></p>
<h2>Vorüberlegungen</h2>
<p>Was man in dieser Situation braucht ist eine <strong>Push-Funktion</strong>. Die Webseite soll eine Verbindung zu einem serverseitigen Script aufbauen und halten. Wenn sich bei dem Script etwas tut, dann kriegt die Seite bescheid und kann darauf reagieren. Opera unterstützt diese Funktion bereits, und sagt dazu <a title="Event Streaming von Opera" href="http://my.opera.com/WebApplications/blog/show.dml/438711" target="_blank">Event Streaming to Web Browsers</a>, aber <span style="text-decoration: line-through;">leider</span> zum Glück entwickeln wir<strong> Applikationen für alle Browser</strong>.</p>
<p>Es gibt eine PHP Klasse, die <a title="Progressbar von David Bongard" href="http://www.bongard.net/blog/2007/08/14/php-progressbar-update-auf-version-12/" target="_blank">Progressbar von David Bongard</a>, welche eine eigene Progressbar auf die Seite bringt. Die ist wirklich gut und funktioniert zuverlässig, aber hat zwei entscheidene Nachteile: Erstens sitzt der User immer vor einer unfertigen Seite (bis die Progressbar fertig geladen ist) und zweitens kann man damit nicht ohne weiteres die Progressbar des UI benutzen.</p>
<h2>Erster Gedanke</h2>
<p>Ich gucke mir die Funktionen von Davids Progressbar ab und greife per Ajax auf die dynamisch generierte Datei zu. In der steht dann, je nach Fortschritt, immer etwas anderes drin.<br />
Nun wird die Ausgabe aber über <em>flush()</em> erzwungen, welches zwar eine Ausgabe erzeugt aber nicht dem Browser sagt, dass die Seite fertig geladen wurde.  Diese fehlende Information bringt jQuery dazu solange zu warten, bis alle Schritte ausgeführt wurden, also die Datei vollständig geladen ist und dann erst den Callback auszuführen. Funktioniert nicht, bzw. springt <strong>von Null auf Hundert</strong>.</p>
<h2>Zweiter Gedanke</h2>
<p>Im PHP Script muss eine neue Datei erzeugt werden, welche nur den aktuellen Fortschritt als Inhalt hat. Diese kann per jQuery abgefragt werden und das Ergebnis auf der Progressbar dargestellt werden.<br />
<strong>Los gehts!</strong></p>
<h2>Das PHP Script</h2>
<p>Das PHP Script sieht natürlich bei jedem anders aus. In der <a title="Progressbar und PHP" href="http://www.interaktionsdesigner.de/stuff/progressbar/">Demo</a> ist es einfach nur eine Schleife mit einer Sleep-Anweisung.<pre><code class='php'>&nbsp;&nbsp;ob_start();<br />
&nbsp;&nbsp;$filename = 'remote-bar-'.$_GET['fn'].'.temp';<br />
&nbsp;&nbsp;for($i = 1; $i &lt;= 10; $i++) {<br />
&nbsp;&nbsp;[tab]echo $i.'0&lt;br&gt;';<br />
&nbsp;&nbsp;[tab]ob_flush(); flush();<br />
&nbsp;&nbsp;[tab]$fh = fopen($filename, 'w');<br />
&nbsp;&nbsp;[tab]fwrite($fh, $i."0");<br />
&nbsp;&nbsp;[tab]fclose($fh);<br />
&nbsp;&nbsp;[tab]sleep(1);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;unlink('remote-bar-'.$_GET['fn'].'.temp');</code></pre>Ich habe den Ausgabechache benutzt und eine Ausgabe erzeugt, was eigentlich sinnlos ist, aber zum Testen ist es praktisch. Die wesentlichen Funktionen sind die Filehandler: es wird<em> eine Datei geöffnet</em>, der Inhalt mit dem aktuellen Schritt <em>überschrieben</em> und wieder <em>geschlossen</em>. Anschließend wartet das Script für eine Sekunde und führt das Ganze dann wieder von vorne aus.</p>
<p>Der Parameter <strong>fn</strong> wird gleich per JavaScript gesetzt, damit nicht alle Benutzer in die gleiche Datei schreiben.</p>
<h2>jQuery</h2>
<p>Kurz angemerkt sei, dass im HTML ein Container mit der ID <em>bar</em> vorhanden sein muss, logisch oder? Der Rest ist mehr oder weniger dem aktuellen Layout geschuldet.<pre><code class='javascript'>var res = 0;<br />
var fn = Math.random(0, 999)+"";<br />
fn = fn.substr(5, 10);</code></pre>Es geht los mit der Generierung einer zufälligen Zahl für den Dateinamen. Weiter gehts mit dem Script für das Laden der Seite.<pre><code class='javascript'>jQuery(function($) {<br />
&nbsp;&nbsp;$("#bar").progressbar({value: 0});<br />
&nbsp;&nbsp;$.ajax({<br />
&nbsp;&nbsp;[tab]url: "remote.php",<br />
&nbsp;&nbsp;[tab]type: "get",<br />
&nbsp;&nbsp;[tab]data: {fn: fn},<br />
&nbsp;&nbsp;[tab]success: function() {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;$("#watcher").html("Fertig!");<br />
&nbsp;&nbsp;[tab]}<br />
&nbsp;&nbsp;});<br />
&nbsp;&nbsp;get_remote();<br />
});</code></pre>Wenn das DOM geladen und der Browser bereit ist <em>jQuery(function($) {</em> dann wird die Progressbar mit einem Startwert von 0 initalisiert <em>$("#bar").progressbar({value: 0});</em>. Anschließend (oder in einer "richtigen" Anwendung erst nach einem ausgelösten Eventhandler) wird das PHP Script aufgerufen. Das startet die Schleife, erstellt eine neue Datei und ist erst fertig,wenn der komplette Vorgang ausgeführt wurde.<br />
Anschließend wird die Funktion <em>get_remote()</em> aufgerufen, welche den aktuellen Status prüft.<pre><code class='javascript'>function get_remote() {<br />
&nbsp;&nbsp;$.ajax({<br />
&nbsp;&nbsp;[tab]url: "remote-bar-"+fn+".temp",<br />
&nbsp;&nbsp;[tab]dataType: "text",<br />
&nbsp;&nbsp;[tab]ifModified: true,<br />
&nbsp;&nbsp;[tab]success: function(response) {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;$("#bar").progressbar('option', 'value', response);<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;$("#watcher").html(response);<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;if(response &lt; 100)<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;[tab]setTimeout("get_remote()", 100);<br />
&nbsp;&nbsp;[tab]}<br />
&nbsp;&nbsp;});<br />
}</code></pre>Diese Funktion besteht aus einer einzigen <strong>Ajaxabfrage</strong>. Die Datei <em>remote-bar-"+fn+".temp</em> wird aufgerufen, erwartet wird ein Text als antwort <em>dataType: "text"</em>, aber nur wenn sich der Inhalt verändert hat <em>ifModified: true</em>.<br />
Wenn ein Rückgabewert besteht <em>success: function(response)</em> wird die folgende Funktion ausgeführt (in der Variable <em>response</em> steht der aktuelle Fortschritt): Der Progressbar wird der ausgelesene Wert zugewiesen, in das Element mit der ID <em>watcher</em> wird der Wert eingefügt und wenn es noch keine 100 (Prozent) erreicht hat, dann wird in 100 Millisekunden erneut die Funktion aufgerufen.</p>
<p><strong>Das wars.</strong></p>
<h2>Fazit</h2>
<p>In der <a title="Progressbar und ein PHP Script" href="http://www.interaktionsdesigner.de/stuff/progressbar/" target="_blank">Demo</a> kann man sich das Resultat ansehen und ich bin gespannt ob der Server sofort zusammen bricht unter der Last eurer fleißigen und interessierten Tests. Außerdem bin ich mir unsicher, ob das ein sinnvolles Vorgehen war, denn wirklich effektiv scheint es mir nicht zu sein.</p>
<p>Aber <strong>es funktioniert</strong> und ist bestimmt für eine Applikation die nicht von mehreren Benutzern gleichzeitig aufgerufen werden kann (dazu demnächst mehr!). Wenn jemand einen Verbesserungsvorschlag hat, dann bin ich offen und dankbar dafür!</p>
<p>Bis dahin frohes <strong>ausprobieren</strong> und <strong>voranschreiten</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/02/20/jquery-ui-progressbar-und-php-verbinden/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PHP Kurzschreibweisen</title>
		<link>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 13:49:18 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=224</guid>
		<description><![CDATA[Mit PHP kann man zwischen &#60;? und ?&#62; nicht nur ganze Programme schreiben sondern auch einfach und schnell Werte ausgeben. Das ist besonders praktisch für Templates mit Funktionen wie z.B. in WordPress und TYPOlight eingesetzt.
Anders als bei TYPO3 wird der Inhalt nicht über Marker in den HTML Code transportiert, sondern direkt über dynamischen PHP Code. [...]]]></description>
			<content:encoded><![CDATA[<p>Mit PHP kann man zwischen <strong>&lt;? und ?&gt;</strong> nicht nur ganze Programme schreiben sondern auch einfach und schnell Werte ausgeben. Das ist besonders praktisch für <strong>Templates mit Funktionen</strong> wie z.B. in <strong>WordPress</strong> und <strong>TYPOlight</strong> eingesetzt.</p>
<p>Anders als bei <strong>TYPO3</strong> wird der Inhalt nicht über Marker in den HTML Code transportiert, sondern direkt über <strong>dynamischen PHP Code</strong>. Diese Art der Templates finde ich sehr gut, weil man auf verschiedene Bedingungen einfacher reagieren kann als, z.B. mit Typoscript.</p>
<p>Allerdings erfordern solche Templates auch mehr Konsequenz vom Entwickler, denn <strong>Präsentation und Logik gehören nicht vermischt</strong>.</p>
<p>Jetzt kommt eine Übersicht der<strong> praktischen Kurzschreibweisen </strong>zum Verwenden in eigenen Projekten, WordPress oder TYPOlight.</p>
<p><span id="more-224"></span></p>
<h2>Ausgaben</h2>
<p>Um Variablen auszugeben wird das <strong>= Zeichen</strong> benutzt. <pre><code class='php'>&lt;?=$welcome_msg?&gt;</code></pre>Diese Zeile, man könnte es schon fast als Tag bezeichnen und ist gleichbedeutend mit <pre><code class='php'>&lt;? echo $welcome_msg; ?&gt;</code></pre></p>
<h2>Bedingungen</h2>
<p>Die gute alte<strong> If-Abfrage </strong>kann auf zwei Weisen dargestellt werden. <strong>Die erste</strong> ist für Fälle in denen mehr Inhalt ausgegeben werden soll.<pre><code class='php'>&lt;? if($user == "admin"): ?&gt;<br />
&nbsp;&nbsp;Hallo &lt;b&gt;Admin&lt;/b&gt;, hier sind deine &lt;a href="#" class="admin"&gt;Optionen&lt;/a&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&lt;div id="status"&gt;&lt;h1&gt;Projektstatus&lt;/h1&gt;&lt;/div&gt; &lt;!-- usw. usf. --&gt;<br />
&lt;? endif; ?&gt;</code></pre>Das wichtige ist der <strong>Doppelpunkt</strong>, welches dem Parser sagt alles was folgt ist gehört zu dieser Bedingung, bis zum <strong>endif;</strong></p>
<p>Alternativen lassen sich darin natürlich auch einbauen<pre><code class='php'>&lt;? if($user == "admin"): ?&gt;<br />
&nbsp;&nbsp;... viele Ausgaben ...<br />
&lt;? elseif($user == "redakteur"): ?&gt;<br />
&nbsp;&nbsp;--- andere Ausgaben ----<br />
&lt;? else: ?&gt;<br />
&nbsp;&nbsp;___ alternative Ausgaben ___<br />
&lt;? endif; ?&gt;</code></pre>Damit lässt sich HTML Code auf angenehme Art und Weise per PHP steuern. Wichtig und sinnvoll ist auf eine korrekte Einrückung zu achten damit die Übersicht erhalten bleibt.</p>
<p><strong>Die zweite</strong> ist noch kürzer. Wenn man keine komplexen Ausgaben hat sondern nur, z.B. einzelne Worte ausgeben möchte<pre><code class='php'>&lt;?=$owner == $user ? "meins" : "fremd"?&gt;</code></pre>gibt, wenn <em>$owner</em> gleich <em>$user</em> ist, das Wort "<em>meins</em>" zurück, ansonsten "<em>fremd</em>".</p>
<p>Die Syntax ist etwas gewöhnungsbedürftig, aber schnell gelernt: <strong>Der erste Block ist die Abfrage</strong>, sie wird beendet vom <strong>Fragezeichen</strong> welches auch gleichzeitig den Block einleitet der bei erfüllter Bedingung ausgeführt wird. Abgeschlossen und gleichbedeutend mit <em>else</em> folgt dann der <strong>Doppelpunkt und die Else-Anweisung</strong>. Alle Teile müssen vorhanden sein, sonst funktioniert es nicht.</p>
<p>Ausgeschrieben ist die Abfrage gleichbedeutend mit:<pre><code class='php'>&lt;? if($owner == $user) {<br />
&nbsp;&nbsp;echo "meins";<br />
}<br />
else {<br />
&nbsp;&nbsp;echo "fremd";<br />
}</code></pre></p>
<p>Ein praktisches Beispiel wäre z.B. innerhalb einer Schleife: <pre><code class='php'>&lt;li class="&lt;?=$i%2 == 0 ? "even" : "odd"?&gt;"&gt;&lt;=$content?&gt;&lt;/li&gt;</code></pre>Alle erinnern sich an die <a title="Modulo verstehen auf Pauls Blog" href="http://www.interaktionsdesigner.de/2009/01/27/modulo-verstehen-und-benutzen/" target="_blank">Modulo-Operation</a>?</p>
<p>Gut, dann weiter mit</p>
<h2>Schleifen</h2>
<p>Die Syntax der Schleifen ist im Prinzip genau die selbe. Die <strong>For-Schleife</strong>:<pre><code class='php'>&lt;? for($i = 0; $i &lt; 10; $i++): ?&gt;<br />
&nbsp;&nbsp;Zeile &lt;?=$i?&gt; von 10<br />
&lt;? endfor; ?&gt;</code></pre></p>
<p>hat die gleiche Syntax wie die <strong>Foreach-Schleife</strong>:<pre><code class='php'>&lt;? foreach($array as $key =&gt; $value): ?&gt;<br />
&nbsp;&nbsp;Array: &lt;?=$key?&gt; = &lt;?=$value?&gt;&lt;br&gt;<br />
&lt;? endforeach; ?&gt;</code></pre></p>
<p>Und die <strong>While-Schleife</strong> darf natürlich auch nicht fehlen:<pre><code class='php'>&lt;? while($row = mysql_fetch_object($hdl)): ?&gt;<br />
&nbsp;&nbsp;Zeile &lt;?=$row-&gt;uid?&gt; gehört &lt;?=$row-&gt;name?&gt;&lt;br&gt;<br />
&lt;? endwhile; ?&gt;</code></pre></p>
<h2>Fazit</h2>
<p>Das waren <strong>Kurzschreibweisen in PHP</strong>. Sind schon sehr schmal und können für ein übersichtliches Template sorgen, wenn der fleißige Entwickler sich an die Einrückung hält und Logik mit Präsentation nicht vermischt wird. <em>Frohes Nachdenken!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Snipplet: Die letzten X Tage&#8230;</title>
		<link>http://www.interaktionsdesigner.de/2009/01/08/php-snipplet-die-letzten-x-tage/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/08/php-snipplet-die-letzten-x-tage/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 15:00:23 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=174</guid>
		<description><![CDATA[Dieser gregorianischer Kalender hat bekanntlich seine Tücken. Zum Glück gibt es mit PHP eine sehr einfache Möglichkeit die letzten X Tage durchzugehen. Ohne sich Gedanken über Monatswechsel, Jahreswechsel und Schaltjahre zu machen.

Das Geheimnis liegt in meiner aktuellen Lieblingsfunktion strtotime($str). Diese versucht aus dem übergebenen String einen Timestamp zu machen. Das funktioniert nicht nur mit Daten [...]]]></description>
			<content:encoded><![CDATA[<p>Dieser <strong>gregorianischer Kalender</strong> hat bekanntlich seine Tücken. Zum Glück gibt es mit PHP eine sehr einfache Möglichkeit <strong>die letzten X Tage </strong>durchzugehen. Ohne sich Gedanken über <strong>Monatswechsel</strong>, <strong>Jahreswechsel</strong> und <strong>Schaltjahre</strong> zu machen.<br />
<span id="more-174"></span></p>
<p>Das Geheimnis liegt in meiner aktuellen Lieblingsfunktion <a title="Meine Lieblingsfunktion: strtotime" href="http://www.php.net/strtotime" target="_blank">strtotime($str)</a>. Diese versucht aus dem übergebenen String einen Timestamp zu machen. Das funktioniert nicht nur mit Daten (10.03.1985 oder 3/10/85) sondern auch mit <strong>relativen Angaben</strong>!!<br />
<pre><code class='php'>for($i = 0; $i &lt;= 10; $i++) {<br />
&nbsp;&nbsp;$timestamp = strtotime("-{$i} days");<br />
&nbsp;&nbsp;echo $timestamp." = ".date("d.m.Y", $timestamp). "&lt;br&gt;";<br />
}</code></pre>Die <strong>for() Schleife</strong> geht von 0 bis 10 durch und führt den folgenden Code aus. Mit dem Parameter <em>"-{$i} days"</em> wird Tag für Tag zurück gegangen und ein Timestamp generiert. Der kann wie gewohnt, z.B. mit <a title="Auch ganz nett: date()" href="http://www.php.net/date" target="_blank">date()</a>, verarbeitet werden. Als Uhrzeit wird die aktuelle Uhrzeit gespeichert.</p>
<p>Das ist leicht zu verhindern! Um den Timestamp von -X Tagen <strong>von 0:00 bis 23:59 Uhr</strong> zu bekommen sind nur kleine Modifikationen nötig. Die Funktion strtotime() bekommt als zweiten Parameter einen Timestamp zugewiesen mit der aktuellen Uhrzeit. Es hilft: <a title="Darf nicht fehlen: mktime" href="http://www.php.net/mktime" target="_blank">mktime()</a>.<br />
<pre><code class='php'>for($i = 0; $i &lt;= 10; $i++) {<br />
&nbsp;&nbsp;$start = strtotime("-{$i} days", mktime(0, 0, 01));<br />
&nbsp;&nbsp;$ende = strtotime("-{$i} days", mktime(23, 59, 59));<br />
&nbsp;&nbsp;echo "Von ".date("d.m.Y H:i", $start). " bis ".date("d.m.Y H:i", $ende)."&lt;br&gt;";<br />
}</code></pre></p>
<p>Die Timestamps kann man jetzt wunderbar benutzen um statistische Datenbankabfragen zu erstellen, E-Mails zu verschicken oder Textdateien zu speichern; der Entwicklung sind keine Grenzen gesetzt. Und um die Tücken vom Kalender kümmern sich andere Leute. Herrlich!</p>
<p>Kennt jemand eine bessere Lösung?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/08/php-snipplet-die-letzten-x-tage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Besser PHP Programmieren mit Filtern</title>
		<link>http://www.interaktionsdesigner.de/2008/09/09/besser-php-programmieren-mit-filtern/</link>
		<comments>http://www.interaktionsdesigner.de/2008/09/09/besser-php-programmieren-mit-filtern/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 11:23:26 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=74</guid>
		<description><![CDATA[Heute gibts im lesenswerten Blog Nettuts den Artikel 10 Principles of the PHP Masters. Gespickt ist er mit interessanten Links und wertvollen Erkentnissen der PHP Gurus. Nett zu lesen definitiv. Für mich neu und wirklich nützlich sind die Filterfunktionen von PHP.
Wie praktisch ist das denn? Im Folgenden ein Schnelleinstieg.
Prüfen ob Filter verfügbar sind
Die Funktionen um [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-75" title="php" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/09/php.png" alt="" width="187" height="100" />Heute gibts im lesenswerten Blog <a href="http://nettuts.com/" target="_blank">Nettuts</a> den Artikel <a href="http://nettuts.com/articles/10-principles-of-the-php-masters/" target="_blank">10 Principles of the PHP Masters</a>. Gespickt ist er mit interessanten Links und wertvollen Erkentnissen der PHP Gurus. Nett zu lesen definitiv. Für mich neu und wirklich nützlich sind die <a href="http://www.php.net/manual/de/book.filter.php" target="_blank">Filterfunktionen</a> von PHP.<br />
Wie praktisch ist das denn? Im Folgenden ein Schnelleinstieg.<span id="more-74"></span></p>
<h2>Prüfen ob Filter verfügbar sind</h2>
<p>Die Funktionen um die es geht sind erst mit PHP 5 dazu gekommen. Deshalb ist vor dem Gebrauch zu überprüfen ob sie überhaupt zur Verfügung stehen:</p>
<pre><code class="php">if (!function_exists('filter_list')) {
  die('Sorry, dieses PHP ist zu alt.');
}</code></pre>
<p>(Falls nicht, lassen wir die Filter einfach weg - haha)</p>
<h2>Ach ja, und welche sind da?</h2>
<p>Okay, wir sind nicht gestorben. Mit ein paar einfachen Zeilen können wir ausgeben welche Filter im System vorhanden sind:</p>
<pre><code class="php">$filters = filter_list();
foreach ($filters as $filter) {
  echo "- ".$filter."&lt;br&gt;";
}</code></pre>
<p>Mit leuchtenden Augen entdecken wir dann Perlen wie <strong>int</strong>, <strong>email</strong> und <strong>url</strong>. Klingt schon mal gut.</p>
<h2>Filter einsetzen</h2>
<p>PHP bietet eine einfache Funktion um eine Variable zu überprüfen. Sie nennt sich <a href="http://www.php.net/manual/de/function.filter-var.php" target="_blank">filter_var</a>($daten, FLAG). Die Variable ($daten) beinhaltet die zu überprüfenden Daten. Mit FLAG wird eine Konstante übergeben um anzusagen was geprüft wird. Hier ein einfaches Beispiel um die Eingabe auf ganze Zahlen zu überprüfen:</p>
<pre><code class="php">if(filter_var($_GET["input"], FILTER_VALIDATE_INT)) {
  echo "Es ist eine Zahl!";
}</code></pre>
<p>Der letzte, mit Unterstrich getrennte Teil gibt den Filternamen an (siehe Liste oben). Mit FILTER_VALIDATE weisen wir die Funktion an die Variable zu überprüfen. Aber damit noch nicht genug!</p>
<h2>Daten mit Hilfe von Filtern verändern</h2>
<p>Es ist möglich die übergebenen Daten auch <strong>zu verändern</strong>. Dafür nehmen wir statt VALIDATE einfach SANITIZE. Ein Beispiel:</p>
<pre><code class="php">echo filter_var($_GET["input"], FILTER_SANITIZE_STRING);</code></pre>
<p>Mit dieser Super-Funktion wird bei dem Aufruf</p>
<pre>index.php?input=&lt;script&gt;alert("Böse!");&lt;/script&gt;</pre>
<p>nichts weiter als <strong>alert(\"Böse!\");</strong> ausgegeben. Schön, nicht wahr?</p>
<h2>Mehr Informationen</h2>
<p>Das wars - sehr knapp zusammen gefasst um den ganzen Kram nicht zu vergessen. Ausführliche Informationen, und einen angekündigten zweiten Teil gibt es bei <a href="http://nettuts.com/articles/10-principles-of-the-php-masters/" target="_blank">Devolio</a> oder direkt im <a href="http://www.php.net/manual/de/book.filter.php" target="_blank">PHP Manual</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/09/09/besser-php-programmieren-mit-filtern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
