<?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>Webentwicklung mit TYPO3, jQuery, CakePHP und Spaß an neuen Projekten</description>
	<lastBuildDate>Wed, 07 Dec 2011 14:26:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>phpMyAdmin Quick Access</title>
		<link>http://www.interaktionsdesigner.de/2010/12/01/phpmyadmin-quick-access/</link>
		<comments>http://www.interaktionsdesigner.de/2010/12/01/phpmyadmin-quick-access/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 14:53:07 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=737</guid>
		<description><![CDATA[Das Problem sind ca. 120 Datenbanken auf meiner lokalen Testumgebung und ich will beim arbeiten stets nur schnell in eine einzige. phpMyAdmin lädt aber länger den Frame mit allen Datenbanken. Seit Ewigkeiten stelle ich mir vor einfach anzufangen den Namen zu tippen und -zack- zur Datenbank weiter geleitet zu werden. So siehts aus: Installation Wer [...]]]></description>
			<content:encoded><![CDATA[<p>Das Problem sind <strong>ca. 120 Datenbanken</strong> auf meiner lokalen Testumgebung und ich will beim arbeiten stets nur schnell in eine einzige. <a title="phpMyAdmin kennt jeder" href="http://www.phpmyadmin.net/home_page/index.php" target="_blank">phpMyAdmin</a> lädt aber länger den Frame mit allen Datenbanken. Seit Ewigkeiten stelle ich mir vor einfach anzufangen den Namen zu tippen und <em>-zack-</em> zur Datenbank weiter geleitet zu werden. So siehts aus:<br />
<img class="aligncenter size-full wp-image-738" title="Bildschirmfoto 2010-11-30 um 19.56.53" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/12/Bildschirmfoto-2010-11-30-um-19.56.53.png" alt="Bildschirmfoto 2010-11-30 um 19.56.53" width="869" height="841" /><br />
<span id="more-737"></span></p>
<h2>Installation</h2>
<p>Wer keine Zeit oder Lust hat etwas über die Technik dahinter zu lesen, lädt sich alle Dateien bei <a href="https://github.com/apeunit/pmaqa">GitHub</a> herunter und schiebt sie in einen Ordner den er über seinen Webserver erreicht. Anschließend in der <strong>index.php</strong> den Zugang zur Datenbank und den Pfad zur lokalen phpMyAdmin Installation eintragen.</p>
<p><strong>Fertig!</strong> Aber vorsicht: Es sind absolut keine Sicherheitsmaßnahmen vorhanden, eine Installation auf einem Server würde ich tunlichst <strong>vermeiden</strong>!!</p>
<h2>Die Technik</h2>
<p>Die komplette Seite besteht aus der <strong>index.php</strong> Datei. Im oberen Teil sind ein paar Einstellungen zu treffen. Darunter werden mit <a href="http://de3.php.net/mysql_connect" target="_blank">mysql_connect</a> und <a href="http://de3.php.net/mysql_list_dbs" target="_blank">mysql_list_dbs</a> alle Datenbanken ausgelesen und in <strong>$db_list</strong> gespeichert. Die Funktion <strong>mysql_list_dbs</strong> gibt ein Objekt zurück das mit einer<strong> while()</strong> Schleife durchlaufen werden kann. In Kurzform:</p>
<code>$connection = mysql_connect($daten);<br />
$db_list = mysql_list_dbs($connection);<br />
while($row = mysql_fetch_object($db_list)) {<br />
[tab]echo $row-&gt;Database;<br />
}</code>
<p>Das eigentlich schöne passiert mal wieder mit <strong>jQuery</strong>: das geniale <a href="https://github.com/riklomas/quicksearch" target="_blank">Plugin Quicksearch</a> erlaubt das blitschnelle durchsuchen während der Eingabe. Das einzige was der Entwickler tun muss ist ein <strong>Formularfeld</strong> mit einer zu durchsuchenden Datenmenge (z.B. einer <strong>Tabelle</strong>) verknüpfen:</p>
<code>$('input#db').quicksearch('table tr');</code>
<p>Damit das Formularfeld beim Aufruf der Seite den Fokus erhält erweitert man die Zeile noch um einen einfachen Aufruf:</p>
<code>$('input#db')<br />
[tab].focus()<br />
[tab].quicksearch('table tr');</code>
<h2>Fazit</h2>
<p>Nach dem der erste Schritt geschafft ist, drängen sich natürlich eine ganze Reihe weiterer Ideen auf:</p>
<ul>
<li>Navigation mit Pfeiltasten</li>
<li>Automatische Vervollständigung</li>
<li>Anlegen von neuen Datenbanken</li>
</ul>
<p>Wer Lust hat mitzumachen, ist dazu herzlich auf <a href="https://github.com/apeunit/pmaqa" target="_blank">GitHub</a> herzlich eingeladen. Neue Ideen und Verbesserungsvorschläge gerne in den Kommentaren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/12/01/phpmyadmin-quick-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP sortiert Arrays</title>
		<link>http://www.interaktionsdesigner.de/2010/10/21/php-sortiert-arrays/</link>
		<comments>http://www.interaktionsdesigner.de/2010/10/21/php-sortiert-arrays/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 19:37:02 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=731</guid>
		<description><![CDATA[Heute stand ich mal wieder vor der Aufgabe ein Array zu sortieren. Arrays muss man beim programmieren ständig sortieren. Richtig spannend wird es mit mehrdimensionalen Arrays und eigenen Bedingungen nach den sortiert werden soll. Und immer wieder sucht man die selben Begriffe und landet auf den gleichen Seiten, das hat mit diesem Eintrag ein Ende, [...]]]></description>
			<content:encoded><![CDATA[<p>Heute stand ich mal wieder vor der Aufgabe ein Array zu <strong>sortieren</strong>. Arrays muss man beim programmieren ständig sortieren. Richtig spannend wird es mit <strong>mehrdimensionalen Arrays</strong> und eigenen Bedingungen nach den sortiert werden soll.</p>
<p>Und immer wieder sucht man die selben Begriffe und landet auf den gleichen Seiten, das hat mit diesem Eintrag ein Ende, <strong>wenn man ein mehrdimensionales Array mit einer eigenen Funktion sortieren will</strong>.</p>
<p><span id="more-731"></span></p>
<h2>Anforderungen</h2>
<p>In meinem Projekt stand ich vor folgendem Array:</p>
<pre>$data = array(
&nbsp;&nbsp;array('title' =&gt; 'Ape Unit', 'value' =&gt; '5'),
&nbsp;&nbsp;array('title' =&gt; 'faf', 'value' =&gt; '1'),
&nbsp;&nbsp;array('title' =&gt; 'Kiwi Service', 'value' =&gt; '3')
);</pre>
<p>Aus diesen (dynamisch generierten) Daten wird ein Diagramm erzeugt. Die Daten kommen aus einer <strong>TYPO3 Extension</strong>, und das Diagramm wird ebenfalls über eine Extension eingebunden. Die Redaktion kann verschiedene Datensätze auswählen welche dargestellt werden sollen.</p>
<p>Da sich die Werte ständig ändern, das Corporate Design aber vorschreibt, dass der größte Wert immer am Anfang des Diagramms steht, landete also die Anfrage auf meinem Tisch die D<strong>atensätze nach ihrem Inhalt zu sortieren</strong>.</p>
<h2>Erster Gedanke</h2>
<p>Kein Problem, in PHP gibt es eine ganze Menge <a title="Die verschiedenen Sortierfunktionen für Arrays" href="http://de3.php.net/manual/en/array.sorting.php" target="_blank">Funktionen um Arrays zu sortieren</a>. Die Funktion <a title="Usort sortiert Arrays" href="http://de2.php.net/manual/en/function.usort.php" target="_blank">usort</a> erlaubt es eine <strong>benutzerdefinierte Funktion</strong> zum sortieren zu benutzen. Das sieht dann ungefähr so aus:</p>
<pre>$data = array(); //siehe oben
function cmp($a, $b) {
&nbsp;&nbsp;return $a['value'] &gt; $b['value'] ? 1 : -1;
}
usort($data, 'cmp');</pre>
<p><strong>Funktioniert.</strong> Aber was wenn das Corporate Design beim nächsten Kunden vorschreibt das der niedrigste Wert als Erstes angezeigt werden soll? Und wir programmieren ja wiederverwendbare Objekte, also auf zum zweiten Gedanken.</p>
<h2>Zweiter Gedanke</h2>
<p>Die Sortierung passiert in einer Klasse welche beim Initialisieren eine Variable übergeben bekommt, die die Richtung anzeigt. An diese Variable kommt man aber gar nicht ohne weiteres ran, denn die User Function zum sortieren wird direkt vor dem Aufruf definiert oder muss eine statische Klasse vom Objekt sein.</p>
<p>Aber zum Glück gibt es auch hier eine Lösung, das Zauberwort, respektive die Zauberfunktion ist <a title="PHP Funktion erstellen" href="http://de2.php.net/create_function">create_function</a>. Mit der erstellt man onthefly eine PHP Funktion, die man dann wiederum <strong>usort</strong> als Parameter übergibt:</p>
<pre>$cmp = create_function('$a, $b', 'if('.$order.' == 2) {
&nbsp;&nbsp;return $a["value"] &lt; $b["value"] ? -1 : 1;
}
if('.$order.' == 3) {
&nbsp;&nbsp;return $a["value"] &gt; $b["value"] ? -1 : 1;
}');
usort($table, $cmp);</pre>
<p><strong>Nett, oder?</strong> Das war eine schwere Geburt, und ich bin mir nicht sicher ob ich das Ergebnis perfekt finde. Wirklich schön sieht es im Code nicht aus. Vielleicht hat jemand eine bessere Idee?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/10/21/php-sortiert-arrays/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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 [...]]]></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>"spalte1", "spalte2", "spalte3"</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>Array(&nbsp;&nbsp;[delimiter] =&gt; ; &nbsp;&nbsp;[enclosure] =&gt; ")</pre></p>
<p>Hier kommt die <strong>komplette Funktion</strong> und anschließend ein paar erklärende Worte.<pre>function csv_autodetect($string) {
&nbsp;&nbsp;$str = trim($string);
&nbsp;&nbsp;$char = '';
&nbsp;&nbsp;$e = '';
&nbsp;&nbsp;$d = array();
&nbsp;&nbsp;$open = false;
&nbsp;&nbsp;$strip = false;
&nbsp;&nbsp;for($i = 0; $i &lt; strlen($str); $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;$char = $str[$i];
&nbsp;&nbsp;&nbsp;&nbsp;if(preg_match('=[\W]=', $char) &amp;&amp; ord($char) != 32) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($i == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$e = $char;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($char == '\\')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$strip = true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$strip = false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($char == $e &amp;&amp; !$strip) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$open = $open ? false : true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$open &amp;&amp; !$strip)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$d[$char]++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;asort($d);
&nbsp;&nbsp;$dd = array_keys($d, array_pop($d));
&nbsp;&nbsp;$return['delimiter'] = $dd[0];
&nbsp;&nbsp;$return['enclosure'] = $e;
&nbsp;&nbsp;return $return;&nbsp;&nbsp;
}</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>if($i == 0)
&nbsp;&nbsp;$e = $char;</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>if($char == '\\')
&nbsp;&nbsp;$strip = true;
else
&nbsp;&nbsp;$strip = false;</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>if($char == $e &amp;&amp; !$strip)
$open = $open ? false : true;</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>if(!$open &amp;&amp; !$strip)
&nbsp;&nbsp;$d[$char]++;</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 [...]]]></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>&nbsp;&nbsp;ob_start();
&nbsp;&nbsp;$filename = 'remote-bar-'.$_GET['fn'].'.temp';
&nbsp;&nbsp;for($i = 1; $i &lt;= 10; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;echo $i.'0&lt;br&gt;';
&nbsp;&nbsp;&nbsp;&nbsp;ob_flush(); flush();
&nbsp;&nbsp;&nbsp;&nbsp;$fh = fopen($filename, 'w');
&nbsp;&nbsp;&nbsp;&nbsp;fwrite($fh, $i."0");
&nbsp;&nbsp;&nbsp;&nbsp;fclose($fh);
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;unlink('remote-bar-'.$_GET['fn'].'.temp');</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>var res = 0;
var fn = Math.random(0, 999)+"";
fn = fn.substr(5, 10);</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>jQuery(function($) {
&nbsp;&nbsp;$("#bar").progressbar({value: 0});
&nbsp;&nbsp;$.ajax({
&nbsp;&nbsp;&nbsp;&nbsp;url: "remote.php",
&nbsp;&nbsp;&nbsp;&nbsp;type: "get",
&nbsp;&nbsp;&nbsp;&nbsp;data: {fn: fn},
&nbsp;&nbsp;&nbsp;&nbsp;success: function() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#watcher").html("Fertig!");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;});
&nbsp;&nbsp;get_remote();
});</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>function get_remote() {
&nbsp;&nbsp;$.ajax({
&nbsp;&nbsp;&nbsp;&nbsp;url: "remote-bar-"+fn+".temp",
&nbsp;&nbsp;&nbsp;&nbsp;dataType: "text",
&nbsp;&nbsp;&nbsp;&nbsp;ifModified: true,
&nbsp;&nbsp;&nbsp;&nbsp;success: function(response) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#bar").progressbar('option', 'value', response);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#watcher").html(response);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(response &lt; 100)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout("get_remote()", 100);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;});
}</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>8</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 [...]]]></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>&lt;?=$welcome_msg?&gt;</pre>Diese Zeile, man könnte es schon fast als Tag bezeichnen und ist gleichbedeutend mit <pre>&lt;? echo $welcome_msg; ?&gt;</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>&lt;? if($user == "admin"): ?&gt;
&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;
&nbsp;&nbsp;&lt;div id="status"&gt;&lt;h1&gt;Projektstatus&lt;/h1&gt;&lt;/div&gt; &lt;!-- usw. usf. --&gt;
&lt;? endif; ?&gt;</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>&lt;? if($user == "admin"): ?&gt;
&nbsp;&nbsp;... viele Ausgaben ...
&lt;? elseif($user == "redakteur"): ?&gt;
&nbsp;&nbsp;--- andere Ausgaben ----
&lt;? else: ?&gt;
&nbsp;&nbsp;___ alternative Ausgaben ___
&lt;? endif; ?&gt;</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>&lt;?=$owner == $user ? "meins" : "fremd"?&gt;</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>&lt;? if($owner == $user) {
&nbsp;&nbsp;echo "meins";
}
else {
&nbsp;&nbsp;echo "fremd";
}</pre></p>
<p>Ein praktisches Beispiel wäre z.B. innerhalb einer Schleife: <pre>&lt;li class="&lt;?=$i%2 == 0 ? "even" : "odd"?&gt;"&gt;&lt;=$content?&gt;&lt;/li&gt;</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>&lt;? for($i = 0; $i &lt; 10; $i++): ?&gt;
&nbsp;&nbsp;Zeile &lt;?=$i?&gt; von 10
&lt;? endfor; ?&gt;</pre></p>
<p>hat die gleiche Syntax wie die <strong>Foreach-Schleife</strong>:<pre>&lt;? foreach($array as $key =&gt; $value): ?&gt;
&nbsp;&nbsp;Array: &lt;?=$key?&gt; = &lt;?=$value?&gt;&lt;br&gt;
&lt;? endforeach; ?&gt;</pre></p>
<p>Und die <strong>While-Schleife</strong> darf natürlich auch nicht fehlen:<pre>&lt;? while($row = mysql_fetch_object($hdl)): ?&gt;
&nbsp;&nbsp;Zeile &lt;?=$row-&gt;uid?&gt; gehört &lt;?=$row-&gt;name?&gt;&lt;br&gt;
&lt;? endwhile; ?&gt;</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>
<p><em>UPDATE: </em>Aufgrund von unendlich vielen unverständlichen, russichen Spamkommentaren habe ich die Kommentare geschlossen. Bei Fragen einfach bei der <a title="Webentwicklung Berlin" href="http://www.apeunit.com">Ape Unit GmbH</a> melden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/feed/</wfw:commentRss>
		<slash:comments>2</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 [...]]]></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>for($i = 0; $i &lt;= 10; $i++) {
&nbsp;&nbsp;$timestamp = strtotime("-{$i} days");
&nbsp;&nbsp;echo $timestamp." = ".date("d.m.Y", $timestamp). "&lt;br&gt;";
}</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>for($i = 0; $i &lt;= 10; $i++) {
&nbsp;&nbsp;$start = strtotime("-{$i} days", mktime(0, 0, 01));
&nbsp;&nbsp;$ende = strtotime("-{$i} days", mktime(23, 59, 59));
&nbsp;&nbsp;echo "Von ".date("d.m.Y H:i", $start). " bis ".date("d.m.Y H:i", $ende)."&lt;br&gt;";
}</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 [...]]]></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>

