<?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>Kau-Boys blog &#187; Webentwicklung</title>
	<atom:link href="http://kau-boys.de/category/webentwicklung/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:09:53 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>RewriteRule mit Leerzeichen in der Zieladresse</title>
		<link>http://kau-boys.de/webentwicklung/rewriterule-mit-leerzeichen-in-der-zieladresse?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rewriterule-mit-leerzeichen-in-der-zieladresse</link>
		<comments>http://kau-boys.de/webentwicklung/rewriterule-mit-leerzeichen-in-der-zieladresse#comments</comments>
		<pubDate>Mon, 19 Apr 2010 10:22:03 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=887</guid>
		<description><![CDATA[Auf einer Seite die ich betreue wurde ich vor kurzem vor die Aufgabe gestellt eine RewriteRule in der .htaccess zu definieren, die auf eine PDF zeigt, die ein Leerzeichen im Dateinamen enth&#228;lt. Das war gar nicht so einfach rauszufinden und selbst im sehr guten Forum von modrewrite.de konnte ich keine geeignete L&#246;sung finden. In URLs [...]]]></description>
			<content:encoded><![CDATA[<p>Auf einer Seite die ich betreue wurde ich vor kurzem vor die Aufgabe gestellt eine RewriteRule in der .htaccess zu definieren, die auf eine PDF zeigt, die ein Leerzeichen im Dateinamen enth&#228;lt. Das war gar nicht so einfach rauszufinden und selbst im sehr guten <a href="http://www.modrewrite.de/foren/index.php">Forum von modrewrite.de</a> konnte ich keine geeignete L&#246;sung finden.</p>
<p>In URLs werden Leerzeichen einfach mit der Zeichenkette <code>%20</code> ersetzt, aber das alleine f&#252;hrt noch nicht zum Erfolg. Da das Prozentzeichen ein spezielles Zeichen in Rewrite Rules darstellt muss es mit einem Backslash escaped werden. Eine funktionierende Rewrite Rule mit einem Leerzeichen k&#246;nnte also wie folgt aussehen:</p>
<pre class="brush: bash; gutter: false;">
RewriteEngine on
RewriteRule ^kurzer-dateiname.pdf$ dateiname\%20mit\%20Leerzeichen\%20.pdf
</pre>
<p>Wer also den Dateinamen nicht &#228;ndern kann um Leerzeichen zu ersetzen (z.B. durch Unterstriche) kann mit dieser Regel trotzdem einen sch&#246;neren/k&#252;rzeren Dateinamen &#252;ber die .htaccess anbieten.</p>
<p>Das war es auch schon. Heute gibt es mal nur einen kurzen Artikel, aber viel mehr gibt es auch nicht dazu zu sagen. Au&#223;er vielleicht, dass ihr niemals versuchen solltet ein Leerzeichen in der Zieladresse zu verwenden, da sonst die gesamte .htaccess ung&#252;ltig wird und der Server einen 500 Fehler f&#252;r jede Seite zur&#252;ckliefert.</p>
<p>Ich hoffe der Tipp konnte euch weiterhelfe. Kommentare sind wie immer gern gesehen!</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/rewriterule-mit-leerzeichen-in-der-zieladresse/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous – Teil 2: Droppables</title>
		<link>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:29:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=830</guid>
		<description><![CDATA[Nachdem wir uns in Teil 1 des Tutorials mit der Draggable Klasse besch&#228;ftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr k&#246;nnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufk&#246;rbe auf Online-Shops. Ich m&#246;chte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode f&#252;r dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable">Teil 1 des Tutorials</a> mit der <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Klasse</a> besch&#228;ftigt haben, wenden wir uns heute seinem Bruder der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">Droppables Klasse</a> zu. Mit ihr k&#246;nnen wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufk&#246;rbe auf Online-Shops. Ich m&#246;chte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode f&#252;r dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode f&#252;r dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erkl&#228;ren. Die Zeilen 1-34 enthalten das grundlegende Ger&#252;st der HTML-Seite sowie die Stylesheets, auf die ich nicht n&#228;her eingehen m&#246;chte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Part 2&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			.item {
				padding: 40px;
				border: 1px solid #000;
				cursor: move;
				display: inline-block;
				margin-right: 20px;
			}
			.blue {
				background-color: #39c;
			}
			.green {
				background-color: #292;
			}
			div#shopping_cart {
				width: 180px;
				height: 180px;
				background: #fff;
				border: 5px solid #ccc;
			}
			div#shopping_cart.hover {
				border: 5px dashed #aaa;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;blue_box&quot; title=&quot;Blaue Box&quot; class=&quot;item blue&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;green_box&quot; title=&quot;Gr&#252;ne Box&quot; class=&quot;item green&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;shopping_cart&quot;&gt;
			&lt;ul id=&quot;items_in_cart&quot;&gt;&lt;/ul&gt;
		&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('blue_box', {
				revert: true
			});
			new Draggable('green_box', {
				revert: true
			});
			Droppables.add('shopping_cart', {
				onDrop: addItem,
				hoverclass: 'hover'
			});
			function addItem(dragged, dropped, event){
				var itemCount = $('items_in_cart').select('li[id=&quot;item' +
									dragged.id + '&quot;] span').first();
				if(itemCount == undefined){
					$('items_in_cart').insert({
						bottom: '&lt;li id=&quot;item' + dragged.id +
								'&quot;&gt;&lt;span&gt;1&lt;/span&gt;x ' + dragged.title + '&lt;/li&gt;'
					});
				} else {
					itemCount.update(parseInt(itemCount.innerHTML) + 1);
				}
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>In den Zeilen 35-39 sind zwei einfache &#8220;Artikel&#8221; aufgef&#252;hrt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enth&#228;lt. In diese f&#252;gen wir dann per Drag-and-Drop die Waren ein. Sehen wir uns nun aber den interessanten Teil des Quellcodes an, das JavaScript. Die Zeilen 41-46 sollten aus dem ersten Teil des Tutorials bekannt sein. Wir erzeugen hier zwei Draggables wobei wir die Option <code>reset</code> auf <code>true</code> setzen, damit die Artikel beim &#8220;loslassen&#8221; wieder auf ihre ursrp&#252;ngliche Position zur&#252;ckkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false;">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schl&#252;sselwort <code>new</code> erzeugen. Es existiert vielmehr schon eine Instanz, der wir mit der <code>add()</code> Funktion eine neue &#8220;Drop-Zone&#8221; hinzuf&#252;gen. Es ist also m&#246;glich mehrere Bereiche einer Website f&#252;r die Reaktion auf Draggables zu verwenden. Es w&#228;re z.B. m&#246;glich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugef&#252;gten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion k&#246;nnen auch mehrere Optionen &#252;bergeben werden, welche das sind k&#246;nnt ihr in der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">API zu Droppables</a> nachlesen. Ich verwende hier die <code>hoverClass</code> Option, die der &#8220;Drop-Zone&#8221; eine Klasse zu weist, wenn der Benutzer mit einem Draggable dar&#252;ber steht. Zus&#228;tzliche gebe ich eine Callback-Funktion f&#252;r das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen k&#246;nnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst &#252;bergeben. In der Funktion selbst f&#252;gen wir den Artikel an die Liste an und setzen die Anzahl auf 1, sofern er noch nicht enthalten ist. Wenn er enthalten ist erh&#246;hen wir dir Anzahl um 1.</p>
<h2>Das Beispiel</h2>
<p>Das oben beschriebene Beispiel sieht dann wie folgt aus (es darf aber gerne unter Verwendung von Bildern anstelle von DIVs und mehr CSS noch ansprechender gestaltet werden):</p>
<div id="blue_box" title="Blaue Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #39c;"></div>
<div id="green_box" title="Gr&#252;ne Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #292;"></div>
<div id="shopping_cart" style="width: 180px; height: 180px; background: #fff; border: 5px solid #ccc;">
<ul id="items_in_cart">
<li style="display: none;">Warenkorb</li>
</ul>
</div>
<p><script type="text/javascript" src="http://kau-boys.de/wp-content/uploads/2010/03/part2.js"></script></p>
<p>Wie ihr also sehen k&#246;nnt ist es sehr einfach ein Element f&#252;r die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie &#252;berlassen. Die M&#246;glichkeiten sind schier unbegrenzt. Ich m&#246;chte euch also dazu animieren einfach einmal mit der Funktion zu experimentieren.</p>
<p>Das war es dann auch schon wieder mit diesem Teil des Tutorials. Im n&#228;chsten Teil sehen wir uns einen sehr speziellen Fall von Drag-and-Drop an und zwar mit dem Sortieren von Elementen. Wie einfach so etwas m&#246;glich ist und wie leicht sich die Sortierreihenfolge auslesen l&#228;sst, das erwartet euch in Teil 3 des Tutorials. F&#252;r welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? &#220;ber einen Kommentar dazu w&#252;rde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Assoziatives Array als HTML Tabelle ausgeben</title>
		<link>http://kau-boys.de/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=assoziatives-array-als-html-tabelle-ausgeben</link>
		<comments>http://kau-boys.de/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben#comments</comments>
		<pubDate>Tue, 09 Mar 2010 21:39:06 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snippet]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=803</guid>
		<description><![CDATA[Sehr h&#228;ufig wird gefordert ein assoziatives Array als HTML Tabelle auszugeben. Ich nutze hier sehr oft die implode() Funktion, um dabei mit m&#246;glichst wenig Quellcode zu dem Gew&#252;nschten Ergebnis zu kommen. Da ich meine L&#246;sung wirklich sehr sch&#246;n und genial einfach finde, wollte ich euch kurz die Funktion pr&#228;sentieren. Als auszugebendes Array nehmen wir das [...]]]></description>
			<content:encoded><![CDATA[<p>Sehr h&#228;ufig wird gefordert ein assoziatives Array als HTML Tabelle auszugeben. Ich nutze hier sehr oft die <a href="http://de.php.net/manual/en/function.implode.php">implode() Funktion</a>, um dabei mit m&#246;glichst wenig Quellcode zu dem Gew&#252;nschten Ergebnis zu kommen. Da ich meine L&#246;sung wirklich sehr sch&#246;n und genial einfach finde, wollte ich euch kurz die Funktion pr&#228;sentieren. Als auszugebendes Array nehmen wir das MySQL-Debugging Array aus meinem vorherigen Artikel <a href="http://kau-boys.de/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse">MySQL unter PHP debuggen mit einer eigenen MySQL Klasse</a>.</p>
<pre class="brush: php;">
function array_to_table($a){
	$t='&lt;table&gt;';
	$t.='&lt;tr&gt;&lt;th&gt;'.implode('&lt;/th&gt;&lt;th&gt;', array_keys($a[0])).'&lt;/th&gt;&lt;/tr&gt;';
	foreach($a as $row){
		$t.= '&lt;tr&gt;&lt;td&gt;'.implode('&lt;/td&gt;&lt;td&gt;', $row).'&lt;/td&gt;&lt;/tr&gt;';
	}
	return $t.='&lt;/table&gt;';
}

// Ausgabe der Tabelle
echo array_to_table($mysqli-&gt;queries);
</pre>
<p><span id="more-803"></span></p>
<p>In Zeile 3 werden die Schl&#252;ssel des assoziativen Array f&#252;r die &#220;berschriften der Spalten genutzt. Wir &#246;ffnen hier eine Zeile und eine Spalte und f&#252;gen dann mit Hilfe der implode() Funktion alle Schl&#252;ssel in diese Zeile ein. Die &#8220;Glue&#8221; f&#252;r die implode() Funktion ist hierbei ein schlie&#223;endes Tag f&#252;r die Spalte und ein weiteres &#246;ffnendes. Am Ende der Zeile schlie&#223;en wir noch die letzte Spalte und die Zeile. Die gleiche elegante Anwendung der implode() Funktion verwenden wir auch bei den einzelnen Spalten mit den Werten. Hier in einer foreach Schleife.</p>
<p>Mit dieser Funktion kann jedes assoziative Array sehr elegant ausgegeben werden. Dabei l&#228;sst sich die Funktion trefflich erweitern. So k&#246;nnte z.B. in einem Parameter ein Array mit Schl&#252;sselnamen &#252;bergeben werden, wenn die Schl&#252;ssel des Assoziativen Arrays nicht passend f&#252;r die Tabelle sind. Oder es k&#246;nnte jeder Zeile eine alternierende &#8220;gerade&#8221; und &#8220;ungerade&#8221; Klasse mitgegeben werden. Oder aber man vergibt Klassen um eine der vielen JavaScript Sortierungen auf die Tabelle anwenden zu k&#246;nnen.</p>
<p>Wir ihr also sehen k&#246;nnt ihr eure Fantasie bei der Erweiterbarkeit freien Lauf lassen. Ich vergebe meistens die Klassen f&#252;r Sortierung einer Tabelle mit der <a href="http://www.millstream.com.au/view/code/tablekit/">Tablekit Sortierung</a>.</p>
<p>Ich hoffe, dass euch die Funktion bei eurer t&#228;glichen Arbeit helfen kann. Ich liebe die implode() Funktion, da man mit ihr sehr elegant PHP Arrays in Strings umwandeln kann. Ich verwende sie auch h&#228;ufig beim Erstellen von SQL Statements in Verbindung mit dem <a href="http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html#id2785292">IN() Operator</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL unter PHP debuggen mit einer eigenen MySQL Klasse</title>
		<link>http://kau-boys.de/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse</link>
		<comments>http://kau-boys.de/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse#comments</comments>
		<pubDate>Thu, 04 Mar 2010 22:41:07 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=794</guid>
		<description><![CDATA[Bei einem meiner Projekte kam es zu ungew&#246;hnlich langen Ladezeiten eines Formulars. Da hier allerdings auch sehr viele Datenbankabfragen ausgef&#252;hrt werden m&#252;ssen und dabei auch noch die Werte per COUNT() gez&#228;hlt werden wunderten mich die Zeiten nicht wirklich. Nun wollte ich nat&#252;rlich wissen, welche Abfrage dabei besonders viel Zeit in Anspruch nimmt um dann gezielt [...]]]></description>
			<content:encoded><![CDATA[<p>Bei einem meiner Projekte kam es zu ungew&#246;hnlich langen Ladezeiten eines Formulars. Da hier allerdings auch sehr viele Datenbankabfragen ausgef&#252;hrt werden m&#252;ssen und dabei auch noch die Werte per <a href="http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count">COUNT()</a> gez&#228;hlt werden wunderten mich die Zeiten nicht wirklich.</p>
<p>Nun wollte ich nat&#252;rlich wissen, welche Abfrage dabei besonders viel Zeit in Anspruch nimmt um dann gezielt optimieren zu k&#246;nnen. Ich setze in dem Projekt auf die <a href="http://de.php.net/manual/en/book.mysqli.php">MySQLi Klasse</a> von PHP. Da ich hierbei die Klasse objektorientiert nutze, war es sehr einfach m&#246;glich diese zu erweiterten. Eine M&#246;glichkeit w&#228;re es nat&#252;rlich gewesen eine eigene Funktion zu schreiben, aber in diesem Fall h&#228;tte ich auch alle Skript anpassen m&#252;ssen, in denen ich eine Query ausf&#252;hre. Daher habe ich mich dazu entschlossen einfach die <a href="http://de.php.net/manual/en/mysqli.query.php">query() Funktion</a> von MySQLi zu &#252;berschreiben. Hier ein stark vereinfachtes Beispiel, wie so etwas aussehen k&#246;nnte:</p>
<p><span id="more-794"></span></p>
<pre class="brush: php;">
&lt;?php

class mysqliDebugger extends mysqli {

	public $queries = array();
	public $queries_time = 0;

	function __construct($host, $user, $pass, $name, $port, $sock){
		parent::__construct($host, $user, $pass, $name, $port, $sock);
	}

	function __destruct(){
		parent::__destruct();
	}

	function query($query){
		$start = microtime(true);

		if(!$result = parent::query($query)){
				$error_message = $this-&gt;error;
		}

		$end = microtime(true);

		$this-&gt;queries[] = array(
			'number' =&gt; count($this-&gt;queries),
			'query' =&gt; $query,
			'error' =&gt; $error_message,
			'time' =&gt; $end - $start
		);

		$this-&gt;queries_time += $end - $start;

		return $result;
	}
}

$mysqli = new mysqliDebugger('host', 'user', 'pass', 'name');
if($result = $mysqli-&gt;query('SELECT * FROM tablename')){
	while($row = $result-&gt;fetch_assoc()){
		// Verarbeiten der Ergebniszeilen
	}
}

if($result = $mysqli-&gt;query('SELECT * FROM tablename2')){
	while($row = $result-&gt;fetch_assoc()){
		// Verarbeiten der Ergebniszeilen
	}
}

?&gt;
</pre>
<p>Sehen wir uns die wichtigsten Zeilen des Quellcodes an. Die Zeilen 8-10 zeigen den Konstruktor unserer neuen Klasse, die den Konstruktor der geerbten Klasse MySQLi aufruft. In den Zeilen 16-36 &#252;berschreiben wir die query() Funktion der MySQLi Klasse mit unserer Debugging-Klasse. Dort wird zuerst einmal zur Protokollierung der Ausf&#252;hrungszeit der Startzeitpunkt mit Hilfe der <a href="http://de.php.net/manual/en/function.microtime.php">microtime() Funktion</a> ermittelt. Anschlie&#223;end wird der Query mit dem Aufruf <code>parent::query($query)</code> an die query() Funktion der MySQLi Klasse &#252;bergeben. Einen eventuell auftretenden Fehler speichern wir dabei in einer Variablen ab.</p>
<p>In Zeile 23 speichern wir die Endzeit des Query. Anschlie&#223;end speichern wir alle Werte, die wir zur sp&#228;teren Auswertung ben&#246;tigen in einem Array gespeichert. Zus&#228;tzlich summieren wir noch alle Zeiten auf, um sp&#228;ter die Gesamtdauer aller Statements bestimmen zu k&#246;nnen. Die ab Zeile 38 wird eine einfache Instanziierung und Nutzung der Klasse aufgezeigt, wie man sie auch von MySQLi kennt. Wer also in seinen Skripten schon MySQLi verwendet kann einfach beim Instanziieren der Klasse die neue Debugging-Klasse verwenden und muss keine weiteren Zeilen im Quellcode &#228;ndern. Ich empfehle eine kleine Bedingung zu verwenden, die feststellt, ob der Debugging-Modus aktiv ist und nur dann die Debugging-Klasse zu verwenden, wenn sie auch ben&#246;tigt wird. Das spart im produktiven Einsatz etwas Rechenzeit. Eine m&#246;gliche Bedingung k&#246;nnte wie folgt aussehen:</p>
<pre class="brush: php; gutter: false;">
if($debug){
	$mysqli = new mysqliDebugger('host', 'user', 'pass', 'name');
} else {
	$mysqli = new mysqli('host', 'user', 'pass', 'name');
}
</pre>
<p>Anstelle der <code>$debug</code> Variablen k&#246;nntet ihr auch einen GET Parameter oder einen Session Parameter verwenden. Ich rate aber dringend davon ab einen einfach zu erratenden GET Parameter zu verwenden, da in solchen F&#228;llen eure SQL-Statements f&#252;r Unbefugte sichtbar werden k&#246;nnten, was unter Umst&#228;nden die Sicherheit eueres Systems gef&#228;hrden k&#246;nnte.</p>
<p>Nachdem wir die Daten gesammelt haben m&#246;chten wir sie nat&#252;rlich auch ausgeben. Das solltet ihr auch wieder die vorherige Bedingung verwenden. Dazu erstellen wir einfach eine Tabelle, die die gesammelten Daten enth&#228;lt:</p>
<pre class="brush: xml;">
&lt;table style=&quot;border: 1px solid #000;&quot; rules=&quot;all&quot;&gt;
	&lt;caption&gt;Gesamtdauer: &lt;?= $mysqli-&gt;queries_time ?&gt;&lt;/caption&gt;
	&lt;tr&gt;
		&lt;th&gt;Anzahl&lt;/th&gt;
		&lt;th&gt;Query&lt;/th&gt;
		&lt;th&gt;Fehler&lt;/th&gt;
		&lt;th&gt;Zeit&lt;/th&gt;
	&lt;/tr&gt;
&lt;? foreach($mysqli-&gt;queries as $query) : ?&gt;
	&lt;tr&gt;
		&lt;td&gt;&lt;?= $query['number'] ?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?= $query['query'] ?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?= $query['error'] ?&gt;&lt;/td&gt;
		&lt;td&gt;&lt;?= $query['time'] ?&gt;&lt;/td&gt;
	&lt;/tr&gt;
&lt;? endforeach ?&gt;
&lt;/table&gt;
</pre>
<p>Nehmen wir an, wir die Tabelle aus dem ersten Statement ist in der Datenbank nicht vorhanden. In diesem Fall w&#252;rden wir einen SQL-Fehler erhalten. In der Tabelle k&#246;nnen wir dann direkt den Fehler ermitteln und entsprechend das Statement korrigieren. Auch hier wird das Statement gespeichert und die Zeit gemessen.</p>
<table style="color: rgb(185, 189, 182); background-color: rgb(27, 36, 38); width: 100%; padding: 5px; border: 1px solid #000;" rules="all">
<caption style="background-color: rgb(27, 36, 38);">Gesamtdauer: 0.0025820732116699</caption>
<tr>
<th>Anzahl</th>
<th>Query</th>
<th>Fehler</th>
<th>Zeit</th>
</tr>
<tr>
<td>0</td>
<td>SELECT * FROM tablename</td>
<td>Table &#8216;name.tablename&#8217; doesn&#8217;t exist</td>
<td>0.00076198577880859</td>
</tr>
<tr>
<td>1</td>
<td>SELECT * FROM tablename2</td>
<td></td>
<td>0.0018200874328613</td>
</tr>
</table>
<p>Ihr habt mit dieser kleinen Beispiel-Klasse einen sehr einfachen Debugger zur Hand, mit dem ihr sehr schnell die langsamen Statements in eurem System finden k&#246;nnt. Ihr k&#246;nnt die Klasse nat&#252;rlich auch noch nach euren W&#252;nschen erweitern und auch andere Funktionen von MySQLi &#252;berschreiben. Wenn ihr, so wie ich, zentral an einer Stelle die Datenbankverbindung erzeugt k&#246;nnt ihr durch die Bedingung aus dem zweiten Quellcode eure gesamte Applikation debuggen.</p>
<p>Ich habe damit in meinem Projekt schon zwei &#252;berfl&#252;ssige Statements finden k&#246;nnen und einige andere Statements noch weiter optimieren k&#246;nnen. Ich hoffe, dass euch der Debugger auch bei eurer t&#228;glichen Arbeit unterst&#252;tzen kann. &#220;ber Anregungen und Kommentare Wrede ich mich wie immer freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Das Bermudadreieck des Internet Explorer &#8211; Oder: Wo zum Teufel ist mein Ordner hin?</title>
		<link>http://kau-boys.de/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin</link>
		<comments>http://kau-boys.de/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin#comments</comments>
		<pubDate>Wed, 03 Mar 2010 17:10:12 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=790</guid>
		<description><![CDATA[Heute bin ich mal wieder auf ein sehr faszinierendes Problem mit dem Internet Explorer gesto&#223;en. Meine erste Vermutung war mal wieder ein Programmierfehler im vielgeliebten IE6, aber der Fehler trat auch im Internet Explorer 7 auf. Ich nutze in einem Projekt absolute Pfade in allen Dateinamen, Links und Formularen. Nun hatte ich aber im einem [...]]]></description>
			<content:encoded><![CDATA[<p>Heute bin ich mal wieder auf ein sehr faszinierendes Problem mit dem Internet Explorer gesto&#223;en. Meine erste Vermutung war mal wieder ein Programmierfehler im vielgeliebten IE6, aber der Fehler trat auch im Internet Explorer 7 auf.</p>
<p>Ich nutze in einem Projekt absolute Pfade in allen Dateinamen, Links und Formularen. Nun hatte ich aber im einem Formular dummerweise das Gleichheitszeichen nach dem Short Open Tag in PHP vergessen. Mein Formular sah also in verk&#252;rzter Form wie folgt aus: </p>
<pre class="brush: xml;">
&lt;form action=&quot;&lt;? ABSOLUTER_PFAD ?&gt;form.php&quot;&gt;
...
&lt;/form&gt;
</pre>
<p><span id="more-790"></span></p>
<p>Soweit so gut, aber im Grund durfte hierdurch kein Problem entstanden sein. Der absolute Pfad enthielt eine Angabe in der Form <code>http:/www.beispiel.de/formularordner</code>. Da nun dieser Pfad nicht zur Verf&#252;gung stand enthielt das <code>action</code> Attribut des Formulars nur den Wert <code>form.php</code>.</p>
<p>Das Formular wurde &#252;ber einen Link aufgerufen und somit befand sich der Nutzer innerhalb des &#8220;formularordner&#8221;. Wenn nun also der Pfad relativ angegeben wird, m&#252;sste das Formular in genau diesem Ordner gesucht werden. Einige Nutzer bekamen aber eine sch&#246;ne 404 Fehlermeldung. Da mir einer dieser Nutzer einen Screenshot des Dilemmas geschickt hat konnte ich feststellen, dass der Browser versuchte den Pfad <code>http./www.beispiel.de/form.php</code> zu &#246;ffnen. Hier war aber nat&#252;rlich kein Formular zu finden.</p>
<p>Ich konnte den Fehler dann beheben, indem ich das Gleichheitszeichen wieder an seine korrekte Stelle eingef&#252;gt habe. Dadurch kam es nicht mehr zu den falschen Aufrufen. Der Vollst&#228;ndigkeit halber hier noch der korrekte Quellcode:</p>
<pre class="brush: xml;">
&lt;form action=&quot;&lt;?= ABSOLUTER_PFAD ?&gt;form.php&quot;&gt;
...
&lt;/form&gt;
</pre>
<p>Was aber genau beim Internet Explorer dazu gef&#252;hrt hat, dass er den Ordner einfach &#8220;verschluckt&#8221; hat konnte ich bisher noch nicht feststellen. Mir ist es auch bisher nicht gelungen den Fehler auf einem meiner Rechner zu reproduzieren. Es liegt auch nicht an einem grunds&#228;tzlichen Problem bei einem der Nutzer, denn nachdem sie den Browser neu ge&#246;ffnet hatten funktionierte pl&#246;tzlich alles wieder wie gewohnt.</p>
<p>Das erstaunlichste ist aber, dass dieser Fehler schon vor 13 Monaten im Skript vorhanden ist und erst jetzt von drei Nutzern entdeckt wurde, obwohl das betreffende Formular wohl hunderte Male am Tag genutzt wird.</p>
<p>Sollte jemand von euch schon einmal dieses Problem selbst erlebt haben und vielleicht sogar eine Erkl&#228;rung oder L&#246;sung daf&#252;r kennen w&#252;rde es mich wirklich brennend interessieren. Mit dem absoluten Link funktioniert es aber soweit wieder und ich hoffe, dass der Internet Explorer nun den Ordner beibeh&#228;lt.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous &#8211; Teil 1: Draggable</title>
		<link>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable#comments</comments>
		<pubDate>Tue, 02 Mar 2010 16:38:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=785</guid>
		<description><![CDATA[Heute m&#246;chte ich mein angek&#252;ndigtes Tutorial &#252;ber Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel &#214;ffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf [...]]]></description>
			<content:encoded><![CDATA[<p>Heute m&#246;chte ich mein angek&#252;ndigtes Tutorial &#252;ber Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel <a href="http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">&#214;ffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen</a> vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf dem Schritt zur fertigen Seite nachvollziehen.</p>
<p>Im ersten Teil geht es um die Grundlage einer Seite mit Drag-and-Drop. Wir verwenden f&#252;r dieses Tutorial die Drag-and-Drop Funktionalit&#228;t von <a href="http://script.aculo.us">Scriptaculous</a>, welches eine Erweiterung des <a href="http://www.prototypejs.org">Prototype Frameworks</a> ist. Um die hier gezeigten Funktionen selbst nachprogrammieren zu k&#246;nnen ben&#246;tigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode f&#252;r dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal ben&#246;tigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen m&#246;chten. F&#252;r das Element nehme ich exemplarisch ein DIV, aber ihr k&#246;nnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Teil 1&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;draggable&quot;&gt;&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('draggable');
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Wichtig f&#252;r das Aktivieren der Draggable Funktion auf ein Element ist eine ID f&#252;r das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien f&#252;r Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zus&#228;tzlich ist noch etwas CSS angegeben um dem DIV einen Rahmen und eine Hintergrundfarbe zu verpassen. Alles was nun notwendig ist, um das DIV aufnehmbar zu machen ist eine einzige Zeile JavaScript:</p>
<pre class="brush: jscript; gutter: false;">
new Draggable('draggable');
</pre>
<p>Es wird hier eine neue Instanz des <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Objekts</a> erzeugt. Dem Konstruktor wird hierbei die ID des Elements &#252;bergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gef&#228;llig</h2>
<p>Da dieser Blog auch Prototype einsetzt, sollten wir es nicht bei einem Quellcode Auszug belassen, sondern einfach mal hier ein solches DIV einf&#252;gen. Also, hier kommt es:</p>
<div id="draggable" style="width: 100px; height: 100px; padding: 30px; background-color: #39c; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable')</script></p>
<p>Dieses DIV kann nun beliebig im Sichtbaren Bereich verschoben werden. Die Klasse bietet aber auch viele Optionen, die in einem Hash an die Funktion als zweiten Parameter &#252;bergeben werden k&#246;nnen. Wir k&#246;nnen z.B. die Bewegung eines Elements auf die horizontale beschr&#228;nken und zus&#228;tzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine urspr&#252;ngliche Position zur&#252;cksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false;">
new Draggable('draggable2', {constraint: 'horizontal', revert: true});
</pre>
<p>Ich habe hier die ID um eine Zwei erweitert, damit ich auch dieses Beispiel hier vorf&#252;hren kann. Wichtig ist nat&#252;rlich immer, dass ihr f&#252;r die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verh&#228;lt sich dann wie folgt:</p>
<div id="draggable2" style="width: 100px; height: 100px; padding: 30px; background-color: #292; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable2', {constraint: 'horizontal', revert: true})</script></p>
<p>Da es hier in diesem Tutorial nicht darum geht alle m&#246;glichen Optionen zu erkl&#228;ren m&#246;chte ich euch gerne auf die <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">API Referenz der Draggable Klasse</a> verweisen. Dort findet ihr eine Liste aller Optionen und einige weitere Beispiele.</p>
<p>Damit m&#246;chte ich auch schon den ersten Teil des Tutorials abschlie&#223;en. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verh&#228;lt. Im zweiten Teil besch&#228;ftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es erm&#246;glicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weitere Sicherheitsl&#252;cken beim Internet Explorer 6 aufgetreten</title>
		<link>http://kau-boys.de/webentwicklung/weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten</link>
		<comments>http://kau-boys.de/webentwicklung/weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten#comments</comments>
		<pubDate>Mon, 01 Mar 2010 22:52:15 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=783</guid>
		<description><![CDATA[Es vergeht fast keine Woche, in dem nicht neue Sicherheitsl&#252;cken im Internet Explorer 6 bekannt werden. Dieses Mal sind die Versionen 6 und 7 f&#252;r Windows XP betroffen. User von Windows 7 sowie von Windows Server 2008 und Vista sind laut dem Blogartikel von Microsoft nicht betroffen. Wie so oft wird den Nutzern geraten die [...]]]></description>
			<content:encoded><![CDATA[<p>Es vergeht fast keine Woche, in dem nicht neue Sicherheitsl&#252;cken im Internet Explorer 6 bekannt werden. Dieses Mal sind die Versionen 6 und 7 f&#252;r Windows XP betroffen. User von Windows 7 sowie von Windows Server 2008 und Vista sind laut <a href="http://blogs.technet.com/msrc/archive/2010/02/28/investigating-a-new-win32hlp-and-internet-explorer-issue.aspx">dem Blogartikel von Microsoft</a> nicht betroffen.</p>
<p>Wie so oft wird den Nutzern geraten die Scripting Funktionen ihres Browsers zu deaktivieren. Dies ist aber nicht immer f&#252;r den Benutzer m&#246;glich bzw. findet er oft die n&#246;tigen Einstellungen dazu nicht. Meiner Meinung nach wird durch diese Sicherheitsl&#252;cken zunehmend die Angst vor JavaScript und Co. gest&#228;rkt. Das macht es f&#252;r uns Webentwickler nat&#252;rlich teilweise sehr schwer den effektiven und wohl dosierten Einsatz von clientseitigen Skriptsprachen zu rechtfertigen.</p>
<p>Nun kann man zwar nicht dem Internet Explorer die Schuld daran geben, denn schlie&#223;lich tauchen bei jedem Browser mehrmals pro Jahr Sicherheitsl&#252;cken auf. Aber beim Internet Explorer 6 h&#228;ufen sich solche Fehler in letzter Zeit. Wenn das nat&#252;rlich dazu f&#252;hrt, dass er IE6 schneller von Unternehmensrechnern verschwindet und damit seine Hauptzielgruppe verliert umso besser. Doch leider findet er sich noch immer auf jeder Standardinstallation eines Windows XP System und auch die Service Packs zwingen den Benutzer nicht zum Update. Microsoft hat zwar angek&#252;ndigt den Support f&#252;r Windows XP ohne SP3 zum Juli einzustellen, aber auf ein Support Ende des IE6 warten wir bisher vergeblich.</p>
<p>Wenn ich mir zu meinem Geburtstag diesen Monat etwas von Microsoft w&#252;nschen d&#252;rfte, dann w&#228;re es nicht das neue Office 2010, was ja im Juni erscheinen soll, sondern das Ende einer &#196;ra im Browsermarkt.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/weitere-sicherheitsluecken-beim-internet-explorer-6-aufgetreten/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Internet Explorer ist tot! Lang lebe der Internet Explorer!</title>
		<link>http://kau-boys.de/webentwicklung/der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer</link>
		<comments>http://kau-boys.de/webentwicklung/der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer#comments</comments>
		<pubDate>Thu, 25 Feb 2010 16:01:50 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=768</guid>
		<description><![CDATA[Schon vor l&#228;ngerer Zeit hat Google angek&#252;ndigt den Support f&#252;r den Internet Explorer 6.0 f&#252;r die meisten seiner Dienste nicht mehr fortzusetzen. Zu dieser Aussage gibt es jetzt auch ein genaues Datum, ab wann der Support eingestellt werden soll. Der Stichtag ist demnach der 13. M&#228;rz 2010. Was anschlie&#223;end beim Aufruf der entsprechenden Dienste mit [...]]]></description>
			<content:encoded><![CDATA[<p>Schon vor l&#228;ngerer Zeit hat Google angek&#252;ndigt den Support f&#252;r den Internet Explorer 6.0 f&#252;r die meisten seiner Dienste nicht mehr fortzusetzen. Zu dieser Aussage gibt es jetzt auch ein genaues Datum, ab wann der Support eingestellt werden soll. Der Stichtag ist demnach der 13. M&#228;rz 2010. Was anschlie&#223;end beim Aufruf der entsprechenden Dienste mit dem Internet Explorer 6.0 zu sehen sein wird konnte ich noch nicht erfahren.</p>
<p>Da ich aber, wie in meinem Artikel <a href="http://kau-boys.de/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode">Internet Explorer 6 unter Windows 7 nutzen mit dem Windows XP Mode</a> beschrieben habe, selbst noch eine Installation des IE6 auf meinem Laptop laufen habe, werde ich euch dann berichten, ob die Dienste noch nutzbar sind. Auf der Homepage von <a href="http://www.youtube.com/">YouTube</a> ist f&#252;r Nutzer des Internet Explorers schon l&#228;nger ein Hinweis zu sehen, der zum Update des Browsers auffordert:</p>
<p><span id="more-768"></span></p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/YouTube-IE6-Warnung.png" title="YouTube IE6 Warnung" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/YouTube-IE6-Warnung-small.png" title="YouTube IE6 Warnung" alt="YouTube IE6 Warnung" /></a></p>
<p>Interessant ist hierbei auch, dass die Reihenfolge der vorgeschlagenen Browser bei jedem neuen Laden der Seite zuf&#228;llig neu verteil wird. Genau das hat man ja auch Microsoft bei der aufgezwungenen Browserauswahl f&#252;r Windows 7 gefordert.</p>
<p>Nachdem nun aber nicht nur Google dem IE6 abschw&#246;rt, sondern auch in letzter Zeit immer mehr Berichte &#252;ber Sicherheitsprobleme in fast allen Medien die Runde machen ist zu hoffen, dass der Internet Explorer 6 das Jahr 2010 nicht &#252;berleben wird. Es sollte mittlerweile auch dem letzten Admin klar sein, dass dieser in die Jahre gekommene Browser keine Zukunft mehr hat. Die vielen Unternehmen, die noch am Browser festhalten, weil es speziell angepasste Intranet-L&#246;sungen daf&#252;r gibt sollten sich ernsthaft fragen, wie seri&#246;s ein Anbieter solch einer Software noch sein kann, wenn es mittlerweile schon zwei Nachfolgeversionen des IE6 gegeben hat. Die Zeit zum umstellen der Software war also sehr wohl da. Jeder von euch, der schon einmal eine Website aus den IE6 Zeiten auf den IE7 portiert hat wird mir wohl zustimmen k&#246;nnen, dass die Anpassungen marginal waren. Das optimieren von Websites an den IE6 ist aber bis heute eine K&#246;nigsdiziplin f&#252;r Webdesigner und eine der sinnlosesten und zeitraubenden oberdrein.</p>
<p>Ich sehe im Internet Explorer 8 einen gro&#223;en Schritt von Microsoft in die richtige Richtung. Der Internet Explorer in Version 9 soll dann den anderen standardkonformen Browsern in nichts mehr nachstehen. Mal sehen, was aus dieser Ank&#252;ndigung am Ende wird. Aber da der Umstieg vom IE7 auf den IE8 und sp&#228;ter den IE9 keine gro&#223;en H&#252;rden darstellen sollte ist zu hoffen, dass wir Webentwickler dann mehr Zeit f&#252;r interessantere Dinge haben werden.</p>
<p>P.S. Bei all dem schlechten Gerede &#252;ber den IE6 wollte ich noch erw&#228;hnen, dass ich heute die Umarbeitung des Themes meines Blog f&#252;r den IE6 abgeschlossen habe. Alle transparenten PNGs sind nun in transparente GIFs konvertiert. Alle Nutzer die noch dazu gezwungen sind den IE6 zu nutzen k&#246;nnen meinen Blog nun auch in all seiner Pracht genie&#223;en.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/der-internet-explorer-ist-tot-lang-lebe-der-internet-explorer/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#214;ffentlich-rechtlich und vorbildhaft &#8211; So muss eine Web 2.0 zu Olympia aussehen</title>
		<link>http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen</link>
		<comments>http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen#comments</comments>
		<pubDate>Tue, 23 Feb 2010 23:46:48 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=757</guid>
		<description><![CDATA[An dieser Stelle muss ich mal ein Lob loswerden. Zurzeit laufen ja die Olympischen Winterspiele in Vancouver und Whistler. Und nat&#252;rlich ist die Pr&#228;senz im Web auch extrem hoch. Im Fernsehen sind die Spiele vor allem in ARD und im ZDF im Free-TV und bei den digitalen Kan&#228;len der beiden &#214;ffentlich-rechtlichen zu sehen. Das erwartet [...]]]></description>
			<content:encoded><![CDATA[<p>An dieser Stelle muss ich mal ein Lob loswerden. Zurzeit laufen ja die Olympischen Winterspiele in Vancouver und Whistler. Und nat&#252;rlich ist die Pr&#228;senz im Web auch extrem hoch. Im Fernsehen sind die Spiele vor allem in ARD und im ZDF im Free-TV und bei den digitalen Kan&#228;len der beiden &#214;ffentlich-rechtlichen zu sehen. Das erwartet man auch, denn daf&#252;r zahlen wir ja auch brav unsere Geb&#252;hren.</p>
<p>Was man nicht unbedingt erwartet und was mich sehr &#252;berrascht hat ist der sehr gute Web 2.0 auftritt. Es ist immer sehr gut zu sehen, auf welchen Kan&#228;len gerade etwas live zu sehen ist und was gerade f&#252;r neue Entscheidungen gefallen sind. Au&#223;ergew&#246;hnlich ist allerdings, wie dynamisch sich die Seite an die eigenen Interessen anpassen l&#228;sst:</p>
<p><span id="more-757"></span></p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de_.png" title="Startseite von olympia.ard.de" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-small.png" title="Startseite von olympia.ard.de" alt="Startseite von olympia.ard.de" /></a><br />
<a href="http://olympia.ard.de/">Quelle: olympia.ard.de</a></p>
<p>Wie ihr auf dem ersten Screenshot sehen k&#246;nnt k&#246;nnen die verschiedenen Bereiche ausgelendet werden. Die Einstellungen werden hierbei in einem Cookie gespeichert, sodass die Einstellungen bei einem erneuten Besuch erhalten bleiben.</p>
<p>Eine andere M&#246;glichkeit die Seite anzupassen besteht darin die verschiedenen Elemente per Drag-and-Drop zu verschieben. Dies geht genauso fl&#252;ssig und unproblematisch wie man es auch von <a href="http://www.google.de/ig">iGoogle</a> oder &#228;hnlichen Seiten gewohnt ist. Auch hier werden die Anordnungen in demselben Cookie gespeichert:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-dd.png" title="Drag-and-Drop auf olympia.ard.de" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/02/olympia.ard_.de-dd-small.png" title="Drag-and-Drop auf olympia.ard.de" alt="Drag-and-Drop auf olympia.ard.de" /></a><br />
<a href="http://olympia.ard.de/">Quelle: olympia.ard.de</a></p>
<p>Ebenfalls sehr nett gemacht ist die Mediabox, die sehr an die Steuerung von diversen MP3-Playern mit Albumansicht erinnert. Einige Inhalte seinen au&#223;erdem erst dann geladen zu werden, sobald der Benutzer an die entsprechende Stelle scrollt.</p>
<p>Einige von euch werden sich jetzt fragen wieso ich einen solchen Artikel geschrieben habe. Einerseits um wirklich mal ein Lob an einen sehr guten Internet Auftritt loszuwerden. Andererseits aber auch um einen kleinen &#220;berblick zu geben, was alles mit recht einfachen Mitteln m&#246;glich ist. Dem Quellcode konnte ich entnehmen, dass die ARD auf das <a href="http://mootools.net/">JavaScript-Framework MooTools</a> setzt.</p>
<p>Ich m&#246;chte diesen Artikel zum Einstieg f&#252;r eine kleine Reihe rund um Drag-and-Drop Funktionen und andere oft gesehene Techniken zu nehmen. Im ersten Teil dieser Reihe werde ich auf die Grundlagen von Drag-and-Drop eingehen und diese am Beispiel des <a href="http://script.aculo.us/">Scriptaculous Frameworks</a> zeigen. Anschlie&#223;end werden ich dann zeigen, wie man per Drag-and-Drop Elemente sortieren kann. In einem weiteren Teil geht es dann vermutlich um die Kombination der Sortierung mit AJAX.</p>
<p>Wer jetzt Lust bekommen hat sich das Ganze mal live anzusehen kann das auf der <a href="http://olympia.ard.de/">Olympia Website der ARD</a> tun. Und das ZDF? Ja, das m&#246;chte ich nicht unerw&#228;hnt lassen. Auch hier gibt es viele Informationen rund um die WM und auch Livestreams. Aber die Seite ich nicht so dynamisch wie die der ARD. Besser gel&#246;st finde ich hier aber der Liveticker. Dieser bekommt zwar die gleichen Eintr&#228;ge wie der bei der ARD, aber er aktualisiert sich von selbst und stellt auch sehr sch&#246;n die aktuellen Zwischenergebnisse dar. Er l&#228;uft bei mir zurzeit fast st&#228;ndig im Hintergrund. Also auch hier solltet ihr auch mal die <a href="http://olympia.zdf.de/">Olympia Website des ZDF</a> ansehen.</p>
<p>Ich hoffe ihr freut euch auf die kleine Tutorialreihe. Ich w&#252;rde mich aber auch &#252;ber eure Kommentare zu den Websites freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zeilen-Duplizierer mit AutoComplete Felder nutzen</title>
		<link>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen#comments</comments>
		<pubDate>Wed, 17 Feb 2010 13:18:55 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=697</guid>
		<description><![CDATA[ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: Einfacher Zeilen-Duplizierer mit Prototype auch auf Feldern funktioniert, die die Scriptaculous Ajax.AutoCompleter Funktion verwenden. Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enth&#228;lt. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei [...]]]></description>
			<content:encoded><![CDATA[<p>ich bekam heute in einem Kommentar die Frage gestellt, ob mein Zeilen-Duplizierer aus dem Beitrag: <a href="http://kau-boys.de/webentwicklung/einfacher-zeilen-duplizierer-mit-prototype">Einfacher Zeilen-Duplizierer mit Prototype</a> auch auf Feldern funktioniert, die die <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Scriptaculous Ajax.AutoCompleter</a> Funktion verwenden.</p>
<p>Ich nutze den Duplizierer selbst in einem Formular, das solche Felder enth&#228;lt. Meine erste Fassung entsprach dabei dem Einzeiler aus dem vorherigen Beitrag. Das Problem dabei ist allerdings, dass die AutoCompleter Funktion beim Erzeugen mit dem Felder verkn&#252;pft wird, auf das sie angewendet werden soll. Wenn man nun dieses Feld kopiert wird nicht eine neue Instanz des Ajax.AutoCompleter erzeugt, sondern die Referenz auf das alte Feld mit kopiert. Ein Eintrag im neu erzeugten Feld aktiviert also die AutoCompleter Funktion des vorherigen Feldes.</p>
<p><span id="more-697"></span></p>
<p>Um dieses Problem zu l&#246;sen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es m&#246;glich die Referenz zum vorherigen Feld zu l&#246;sen und eine neue Instanz des Ajax.AutoCompleter nach dem Erzeugen der Kopie zu erstellen. Hier aber zuerst noch einmal die Funktion selbst. Ich habe mittlerweile auch eine Option zum Fokussieren des ersten Feldes in der Kopie hinzugef&#252;gt:</p>
<pre class="brush: jscript;">
function addRow(selector, options){
	var lastRow = $$(selector).last();
	var newRow = lastRow.cloneNode(true);
	if (options.reset) {
		newRow.select('select', 'textarea', 'input').each(function(elm){
			elm.clear().checked = '';
		});
	}
	if(options.beforeInsert) options.beforeInsert(newRow);
	lastRow.insert({'after': newRow});
	if(options.afterInsert) options.afterInsert(newRow);

	if (options.focusFirst) {
		newRow.select('input', 'select', 'textarea').first().focus();
	}
}
</pre>
<p>Um die Ajax.Autocompleter Funktion nutzen zu k&#246;nnen ben&#246;tigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld f&#252;r unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollst&#228;ndigung mit Scriptaculous</a>):</p>
<pre class="brush: xml;">
&lt;form id=&quot;addressform&quot; action=&quot;address_save.php&quot; class=&quot;niceform&quot;&gt;
	&lt;fieldset&gt;
		&lt;legend&gt;Choose an address&lt;/legend&gt;
		&lt;dl&gt;
			&lt;dt&gt;&lt;label for=&quot;address&quot;&gt;Address:&lt;/label&gt;&lt;/dt&gt;
			&lt;dd&gt;&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address[]&quot; style=&quot;width: 300px;&quot; /&gt;&lt;/dd&gt;
		&lt;/dl&gt;
	&lt;/fieldset&gt;
	&lt;fieldset&gt;
		&lt;input type=&quot;submit&quot; value=&quot;Send!&quot; /&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Wichtig sind hierbei nat&#252;rlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mit&#252;bertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzuf&#252;gen k&#246;nnen, m&#252;ssen wir beim Kopieren auch die ID ver&#228;ndern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript;">
function activateAutocomplete(newRow){
	var addressInput = $A(newRow.select('input')).first();
	addressInput.id += 1;
	addressInput.stopObserving();
	new Ajax.Autocompleter(addressInput.id, 'adresse_choices', 'get_addresses.php');
}
</pre>
<p>In der 2. Zeile selektieren wir das erste Element innerhalb der neuen Zeile (wir nehmen hier also an, dass es sich dabei um das AutoCompleter Feld handelt). Diesem f&#252;gen wir in der 3. Zeile zus&#228;tzlich zur ID eine 1 hinzu. Es entstehen also Felder nach dem Muster <code>"address1", "address11"</code> usw. Das reicht aus um die Felder genau zu referenzieren.<br />
In der 4. Zeile kommt die schon angesprochene Funktion zum Einsatz, die das Autocomplete f&#252;r das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir k&#246;nnen dabei als zweiten Parameter dasselbe DIV Element f&#252;r die Vorschl&#228;ge verwenden, da es ja nicht m&#246;glich ist, gleichzeitig in zwei Felder etwas einzutippen. Das DIV wird automatisch durch Scriptaculous unter das Feld positioniert, in dem es verwendet wird.</p>
<p>Damit das ganze nun auch dupliziert werden kann, f&#252;gen wir noch einen entsprechenden Link ein. Dieser muss dann die Callback-Funktion als zweiten Parameter in der Funktion erhalten. Ich verwende hier ein SPAN Element mit einem onclick Event. Es geht aber auch mit einem gew&#246;hnlichen Link:</p>
<pre class="brush: xml; gutter: false;">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzuf&#252;gen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr k&#246;nnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel k&#246;nnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p><a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip">Download</a></p>
<p>Ich hoffe, dass euch die erweiterte Anwendung gefallen hat und vielleicht auf neue Ideen gebracht hat. Wenn ihr eine andere Anwendung kennt, bei der Ihr nicht weiterkommt w&#252;rde ich mich wie immer &#252;ber einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Internet Explorer 6 unter Windows 7 nutzen mit dem Windows XP Mode</title>
		<link>http://kau-boys.de/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode</link>
		<comments>http://kau-boys.de/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode#comments</comments>
		<pubDate>Mon, 01 Feb 2010 14:26:12 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=674</guid>
		<description><![CDATA[Wer sich von euch jetzt fragen sollte &#8220;Wieso sollte ich den IE6 unter Windows 7 nutzen?&#8221; dem w&#252;rde ich gerne &#8220;Willst du nicht!&#8221; antworten. Aber diejenigen unter uns, die Webseiten entwickeln und auch mit dem IE6 eine Website testen m&#252;ssen, wird dieser Artikel wohl helfen. Unter Windows kann ja bekannterma&#223;en immer nur eine Version des [...]]]></description>
			<content:encoded><![CDATA[<p>Wer sich von euch jetzt fragen sollte &#8220;Wieso sollte ich den IE6 unter Windows 7 nutzen?&#8221; dem w&#252;rde ich gerne &#8220;Willst du nicht!&#8221; antworten. Aber diejenigen unter uns, die Webseiten entwickeln und auch mit dem IE6 eine Website testen m&#252;ssen, wird dieser Artikel wohl helfen.</p>
<p>Unter Windows kann ja bekannterma&#223;en immer nur eine Version des Internet Explorers installiert sein. Da der IE8 auch einen Kompatibilit&#228;tsmodus f&#252;r den IE7 besitzt hat man so schon mal zwei Fliegen mit einer Klappe geschlagen. Aber wie soll man unter Windows 7 einen IE6 installieren. Zum Gl&#252;ck gibt es hier eine sehr einfache und sehr benutzerfreundliche Methode. Zum Testen des Chrome Frame f&#252;r<a href="http://kau-boys.de/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6"> meinem letzen Artikel</a> habe ich noch eine virtuelle Maschine mit Windows XP unter <a href="http://www.virtualbox.org/">Suns VirtualBox</a> verwendet. Es geht aber sehr viel einfacher und erfordert keine Zeitaufw&#228;ndige Installation eines XP-Systems, f&#252;r das man auch noch eine Lizenz ben&#246;tigt. Wer also keine mehr rumliegen hat und nicht unbedingt eine XP-VM ben&#246;tigt, kann sich trotzdem den IE6 f&#252;r Win7 holen.</p>
<p><span id="more-674"></span></p>
<h2>Der Windows XP Modus</h2>
<p>Alles was ihr ben&#246;tigt ist der sogenannten Windows XP Mode. Dabei handelt es sich um eine spezielle Version von Microsofts Virtual PC. Alle Programme, die dort installiert sind, k&#246;nnen auch unter Windows 7 gestartet werden. Und nicht wie man es von VMs gewohnt, indem man die VM startet und dort die Programme ausf&#252;hrt, sondern indem man sie direkt aus dem Startmen&#252; von Windows 7 aufruft und auch direkt in Win7 nutzen kann.</p>
<p>Damit ihr den Windows XP Mode ben&#246;tigt ihr mindestens eine Windows 7 Professional Lizenz oder h&#246;her. Benutzer von Win7 Starter oder Home k&#246;nnen den Modus leider nicht nutzen. Zum installieren geht ihr einfach auf die <a href="http://www.microsoft.com/windows/virtual-pc/download.aspx">Download-Website f&#252;r den Windows XP Mode</a> w&#228;hlt eure Windows 7 Version und die gew&#252;nschte Sprache aus und installiert beide Dateien nacheinander. Anschlie&#223;end k&#246;nnt ihr die virtuelle Maschine &#252;ber das Startmen&#252; aufrufen und die n&#246;tigen Einstellungen f&#252;r Windows XP durchf&#252;hren. Ihr solltet in diesem Zusammenhang auch die Updates installieren aber auf KEINEN FALL das Update f&#252;r den Internet Explorer 7.</p>
<h2>Den Internet Explorer 6 unter Windows 7 nutzbar machen</h2>
<p>Damit ihr nun den IE6 auch unter Windows 7 nutzen k&#246;nnte ist ein sehr simpler Eingriff notwendig. Ihr m&#252;sst lediglich eine Verkn&#252;pfung zum IE6 in das Startmen&#252; f&#252;r &#8220;Alle Benutzer&#8221; kopieren. Dazu klickt ihr einfach mit der rechten Maustaste auf den &#8220;Start&#8221; Kopf und w&#228;hlt &#8220;&#214;ffnen &#8211; Alle Benutzer&#8221;:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-Startmen&#252;-f&#252;r-alle-Benutzer.png" alt="Windows XP Mode - Startmen&#252; f&#252;r alle Benutzer" title="Windows XP Mode - Startmen&#252; f&#252;r alle Benutzer" /></p>
<p>Alle Verkn&#252;pfungen die hier zus&#228;tzlich zu den bereits abgelegten hinzugef&#252;gt werden sind anschlie&#223;end in Windows 7 aufrufbar. Ihr k&#246;nnt nun also hier eine Verkn&#252;pfung zum IE6 anlegen. Das geht wiederrum recht schnell, wenn ihr einfach die Verkn&#252;pfung auf dem Desktop per Drag-and-Drop hierher zieht:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-Verkn&#252;pfung-f&#252;r-IE6-kopieren.png" alt="Windows XP Mode - Verkn&#252;pfung f&#252;r IE6 kopieren" title="Windows XP Mode - Verkn&#252;pfung f&#252;r IE6 kopieren" /></p>
<p>Nun solltet ihr zur Sicherheit die Virtuelle Maschine einmal neustarten. Es funktioniert vielleicht auch ohne Neustart, aber bei mir war er notwendig (eventuell wegen der installierten Updates).</p>
<h2>Den IE6 in Windows 7 aufrufen</h2>
<p>Wenn alles richtig eingerichtet wurde, solltet ihr im Startmen&#252; unter Windows 7 einen Unterordner in &#8220;Windows Virtual PC&#8221; mit der Bezeichnung &#8220;Windows XP Mode-Anwendungen&#8221; vorfinden. Dort sollte dann der Internet Explorer 6 aufrufbar sein:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-IE6-in-Win7-starten.png" alt="Windows XP Mode - IE6 in Win7 starten" title="Windows XP Mode - IE6 in Win7 starten" /></p>
<p>Nachdem ihr den Internet Explorer gestartet habt k&#246;nnt ihr ihn so verwenden, als w&#228;re er direkt in Windows 7 installiert. Da aber nicht nur der IE6 sondern das gesamte System gestartet wird kommt es manchmal zu kuriosen Meldungen. So wird euch z.B. auch ab und zu auf Updates hingewiesen oder darauf, dass ihr keinen Virenscanner in der VM installiert habt. Wenn euch die Meldungen st&#246;ren, solltet ihr einfach die erforderlichen Schritte in der VM durchf&#252;hren. </p>
<p>Hier noch ein kleines &#8220;Beweisfoto&#8221; der Familienzusammenf&#252;hrung, f&#252;r alle, die daran Zweifel haben, dass es so einfach ist:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-IE6-und-IE8-in-Windows-7.png" title="Windows XP Mode - IE6 und IE8 in Windows 7" class="thickbox"><br />
<img src="http://kau-boys.de/wp-content/uploads/2010/02/Windows-XP-Mode-IE6-und-IE8-in-Windows-7-small.png" alt="Windows XP Mode - IE6 und IE8 in Windows 7" title="Windows XP Mode - IE6 und IE8 in Windows 7" /><br />
</a></p>
<h2>Fazit</h2>
<p>Mit dem Windows XP Mode ist es sehr einfach alte Programme unter Windows 7 zu nutzen. Es ist dabei sogar m&#246;glich mit der erweiterten Version von Virtual PC mehr als eine virtuelle Maschine zu betreiben. Wenn auch eine der anderen VMs eine Windows Installation ist, k&#246;nnt ihr hier auch die Programme unter Win7 nutzbar machen. Wer also einen &#8220;echten Internet Explorer 7&#8243; haben m&#246;chte, k&#246;nnte z.B. eine weitere XP-VM aufsetzen oder eine Vista-VM nutzen. Ihr k&#246;nnte in den VMs dann z.B. auch &#228;ltere Version von anderen Browsern installieren um diese gleichzeitig unter Win7 nutzen zu k&#246;nnen. Zwar kann man viele andere Browser auch in mehreren Versionen auf einem System installieren, aber z.B. beim Firefox gibt es dabei immer mal wieder Probleme mit den Profilen.</p>
<p>Hat jemand von euch noch andere sinnvolle Anwendungen des Windows XP Mode gefunden? Vielleicht um ein paar Spieleklassiker zum Laufen zu bringen? &#220;ber Kommentare w&#252;rde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/internet-explorer-6-unter-windows-7-nutzen-mit-dem-windows-xp-mode/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blog oder Website fit machen f&#252;r den IE6</title>
		<link>http://kau-boys.de/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=blog-oder-website-fit-machen-fuer-den-ie6</link>
		<comments>http://kau-boys.de/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6#comments</comments>
		<pubDate>Sat, 30 Jan 2010 16:22:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=662</guid>
		<description><![CDATA[Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support f&#252;r den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigerma&#223;en ansehnlich pr&#228;sentiert bekommen. Das gr&#246;&#223;te Problem ist [...]]]></description>
			<content:encoded><![CDATA[<p>Wie auf vielen News-Seiten zu lesen ist stellt Google ab Mitte des Jahres offiziell den Support f&#252;r den Internet Explorer in der Version 6.0 ein. Unter den Besuchern meines Blog befindet sich zwar nur ein verschwindend geringer Prozentsatz an IE6 Nutzern, aber auch diese sollten meine Website einigerma&#223;en ansehnlich pr&#228;sentiert bekommen.</p>
<p>Das gr&#246;&#223;te Problem ist oft, dass die sch&#246;nen Themes nicht auf den IE6 angepasst wurden und daher zu sehr unsch&#246;nen Darstellungen f&#252;hren. Ich habe in einer virtuellen Maschine noch eine Installation vom Internet Explorer 6 laufen und damit mal selbst meinen Blog getestet. Das Ergebnis sah leider wie folgt aus:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/01/vorher.png" class="thickbox" title="Blog vor der Installation des Plugins"><img src="http://kau-boys.de/wp-content/uploads/2010/01/vorher_small.png" alt="Blog vor der Installation des Plugins" title="Blog vor der Installation des Plugins" /></a></p>
<p><span id="more-662"></span></p>
<p>Wie ihr hier sehen k&#246;nnt sind die transparenten PNG Bilder im IE6 nicht transparent, da dieser nur transparente GIF Bilder unterst&#252;tzt. Viel schlimmer war aber, dass die Sidebar mit den Widgets komplett nach unten gerutscht war. Um das zu beheben h&#228;tte ich sehr viele Dinge im CSS Layout und vermutlich auch im HTML-Quellcode &#228;ndern m&#252;ssen. Daher habe ich &#252;berlegt, was man stattdessen tun k&#246;nnte.</p>
<h2>Die L&#246;sung: Google Chrome Frame</h2>
<p>Schon vor l&#228;ngerer Zeit hatte ich etwas vom <a href="http://code.google.com/intl/de-DE/chrome/chromeframe/">Google Chrome Frame</a> gelesen, der die Webkit Rendering Engine und die JavaScript Engine des Chrome Browsers in den Internet Explorer bringt. Dazu muss der Benutzer lediglich ein Plugin f&#252;r den Internet Explorer installieren und der Website-Betreiber muss dem Plugin mitteilen, dass der Inhalt automatisch damit gerendert werden soll.</p>
<h2>Den Browser zum Rendern mit dem Chrome Frame veranlassen</h2>
<p>Alles was der Website-Betreiber tun muss, ist folgenden Meta-Tag in seinen Quellcode einzuf&#252;gen:</p>
<pre class="brush: xml; gutter: false;">
&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;chrome=1&quot; /&gt;
</pre>
<p>Das <code>X-UA-Compatible</code> Meta-Tag sorgt daf&#252;r, dass das Plugin aktiviert wird und der Benutzer den Inhalt richtig dargestellt bekommt, vorausgesetzt nat&#252;rlich er hat es auch installiert. Um einen Benutzer des Internet Explorers dazu zu bewegen das Plugin zu installieren, hat Google ein kleines JavaScript-Snippet bereitgestellt, mit dem der Benutzer einen Link zur Download-Seite des Plugins bekommt:</p>
<pre class="brush: xml;">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;placeholder&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	CFInstall.check({
		node: &quot;placeholder&quot;,
		destination: &quot;http://www.waikiki.com&quot;
	});
&lt;/script&gt;
</pre>
<p>Damit die Aufforderung zum Download auch nur Benutzern des IE6 angezeigt wird, habe ich zus&#228;tzlich ein <a href="http://de.selfhtml.org/css/layouts/browserweichen.htm#alternative">Conditional Comment</a> benutzt, um das Snippet nur auf IE6 Benutzer anzuwenden, damit Benutzer des Internet Explorer 7 und h&#246;her keine Aufforderung bekommen. Au&#223;erdem m&#252;ssen damit auch alle Nutzer eines andern Browsers nicht die JavaScript-Datei vom Google Server laden.</p>
<h2>Der Blog nach der Installation des Plugins</h2>
<p>F&#252;r diejenigen von euch, die etwas skeptisch sind, ob der ganze Aufwand lohnt, habe ich hier nun das &#8220;nachher&#8221; Bild, damit ihr sehen k&#246;nnt, dass es wirklich funktioniert:</p>
<p><a href="http://kau-boys.de/wp-content/uploads/2010/01/nachher.png" class="thickbox" title="Blog nach der Installation des Plugins"><img src="http://kau-boys.de/wp-content/uploads/2010/01/nachher_small.png" alt="Blog nach der Installation des Plugins" title="Blog nach der Installation des Plugins" /></a></p>
<p>Wie ihr sehen k&#246;nnt, sieht der Blog nun wieder richtig aus. Als kleinen Bonus des Plugins k&#246;nnt ihr auch den Inspektor nutzen, wie man ihn von Chrome oder Safari gew&#246;hnt ist. Aber die Besucher eures Blog werden das wohl eher nicht nutzen.</p>
<p>Ich hoffe, dass euch dieser Tipp helfen konnte. Mich w&#252;rde interessieren, was ihr vom Google Chrome Frame haltet oder was f&#252;r euch dagegen spricht. Hat ihn vielleicht jemand auch im Einsatz und schon echte Probleme oder Nachteile damit feststellen k&#246;nnen? &#220;ber Kommentare w&#252;rde ich mich wie immer sehr freuen &#8230; &#252;ber ein baldiges Aussterben des IE6 aber noch viel mehr <img src='http://kau-boys.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/blog-oder-website-fit-machen-fuer-den-ie6/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Arrays und andere komplexe Daten mit PHP in einer MySQL-Datenbank speichern</title>
		<link>http://kau-boys.de/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern</link>
		<comments>http://kau-boys.de/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern#comments</comments>
		<pubDate>Sun, 24 Jan 2010 00:11:06 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=643</guid>
		<description><![CDATA[Viele von euch werden wohl schon einmal vor dem Problem gestanden haben, dass sie ein Array oder ein Objekt in der Datenbank speichern mussten. Hier m&#246;chte ich ein paar Vorschl&#228;ge unterbreiten, wie man das Problem nicht l&#246;sen sollte und wie es besser gehen kann. Der schlechte Weg Die einfachste und gleichzeitig auch schlechteste Methode w&#228;re [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von euch werden wohl schon einmal vor dem Problem gestanden haben, dass sie ein Array oder ein Objekt in der Datenbank speichern mussten. Hier m&#246;chte ich ein paar Vorschl&#228;ge unterbreiten, wie man das Problem nicht l&#246;sen sollte und wie es besser gehen kann.</p>
<h2>Der schlechte Weg</h2>
<p>Die einfachste und gleichzeitig auch schlechteste Methode w&#228;re es, f&#252;r jeden Index eines Arrays oder jede Eigenschaft eines Objekts eine neue Spalte zu erzeugen. Bei diesem Ansatz werden unter Umst&#228;nden viele Zeilen erzeugt, die nicht immer einen Wert enthalten. Das ist zwar nicht so gravierend, aber durch diesen Ansatz erh&#246;ht sich auch die Anzahl der Spalten schnell auf eine un&#252;bersichtliche Anzahl. Zuletzt ist es hierbei bei jeder &#196;nderung des Arrays oder Objekts notwendig die Datenbanktabelle anzupassen.</p>
<p><span id="more-643"></span></p>
<h2>Eine bessere L&#246;sung gef&#228;llig?</h2>
<p>Etwas besser L&#246;sung, die fast immer funktioniert aber nicht f&#252;r alle F&#228;lle optimal ist, w&#228;re eine Serialisierung des Arrays oder Objekts. Hierbei werden die Daten mit der <a href="http://de.php.net/manual/en/function.serialize.php">serialize()</a> Funktion in einen String konvertiert und k&#246;nnen somit direkt in eine <a href="http://dev.mysql.com/doc/refman/5.1/en/char.html">VARCHAR</a> oder <a href="http://dev.mysql.com/doc/refman/5.1/en/blob.html">TEXT</a> Spalte speichert werden. Dabei muss der String nat&#252;rlich noch durch die Funktion <a href="http://de.php.net/manual/en/mysqli.real-escape-string.php">real_escape_string()</a> (in diesem Beispiel von der MySQLi Klasse) &#8220;escaped&#8221; werden.</p>
<h3>Speichern der Daten</h3>
<pre class="brush: php;">
// Das zu speichernde Array
$array = array('vorname' =&gt; 'Max', 'name' =&gt; 'Mustermann');
// Serialisieren der Daten
$string = serialize($array);
// Speichern der Daten
$mysqli-&gt;query('INSERT INTO table_name (array) VALUES (&quot;'.$mysqli-&gt;real_escape_string($string).'&quot;)'))
</pre>
<p>Das Beispiel setzt nat&#252;rlich voraus, dass die Variable <code>$mysqli</code> eine Instanz der MySQLi Klasse mit einer g&#252;ltige Verbindung zu einer Datenbank enth&#228;lt. Wir haben hier ein einfaches assoziatives Array, das serialisiert wird und anscheinend gespeichert wird. Die serialisierten Daten sehn in diesem Beispiel wie folgt aus:</p>
<h3>Der zu speichernde String</h3>
<pre class="brush: plain; gutter: false;">
a:2:{s:7:&quot;vorname&quot;;s:3:&quot;Max&quot;;s:4:&quot;name&quot;;s:10:&quot;Mustermann&quot;;}
</pre>
<p>Das Auslesen der Daten wird mit der Funktion <a href="http://de.php.net/manual/en/function.unserialize.php">unserialize()</a> durchgef&#252;hrt, die aus dem String wieder ein assoziatives Array erzeugt. Dazu lesen wir zuerst die Daten mit einem gew&#246;hnlichen Query aus und konvertieren anschlie&#223;end die Daten:</p>
<h3>Auslesen der Daten</h3>
<pre class="brush: php;">
// Auslesen der Daten
$result = $mysqli-&gt;query('SELECT array FROM table_name');
$row = $result-&gt;fetch_assoc();
$string = $row['array'];
// Unserialisieren der Daten
$array = unserialize($string);
</pre>
<p>Diese Methode zum Speichern von komplexen Daten funktioniert recht gut, aber der serialisierte String ben&#246;tigt dabei mehr Speicherplatz als f&#252;r ein normales assoziatives Array eigentlich n&#246;tig w&#228;re. Wie es eleganter geht zeige ich euch im n&#228;chsten Beispiel.</p>
<h2>Die elegante L&#246;sung mit JSON</h2>
<p>Das Format <a href="http://de.wikipedia.org/wiki/JSON">JSON</a> entspringt zwar der Skriptsprache JavaScript, aber es wird zu Zeiten von AJAX sehr oft auch serverseitig verwendet und erzeugt. Da die meisten serverseitigen Sprachen also auch JSON unterst&#252;tzen bietet es sich auch f&#252;r die Speicherung von komplexeren Datenstrukturen an. Die Anpassung des vorherigen Quellcodes beschr&#228;nkt sich dabei auch auf eine einzige Zeile. Wir ersetzen lediglich die serialize() durch die <a href="http://de.php.net/manual/en/function.json-encode.php">json_encode()</a> Funktion. Die Zeile 6 aus dem vorherigen Quellcode sieht dann folgt aus:</p>
<h3>Speichern der Daten</h3>
<pre class="brush: php; first-line: 3;">
...
$string = serialize($array);
...
</pre>
<p>Hierbei werden die Datei des assoziativen Arrays in die JSON Notation konvertiert. Hierbei ist der resultierende String kompakter als bei der Serialisierung, da die L&#228;nge der einzelnen Arraywerte nicht und Datentypen nicht gespeichert werden:</p>
<h3>Der zu speichernde String</h3>
<pre class="brush: jscript; gutter: false;">
{&quot;vorname&quot;:&quot;Max&quot;,&quot;name&quot;:&quot;Mustermann&quot;}
</pre>
<p>Beim Lesen der Daten aus der Datenbank m&#252;ssen sie dann selbstverst&#228;ndlich auch wieder in das urspr&#252;ngliche Format zur&#252;ck konvertiert werden. Dabei kommt wie ihr schon vermutet die Funktion <a href="http://de.php.net/manual/en/function.json-decode.php">json_decode()</a> zum Einsatz. Diese erzeugt aber normalerweise ein Standard-Objekt. Um das in unserem Beispiel verwendete assoziative Array zu erhalten, wird als zweiter Paramater &#8220;true&#8221; &#252;bergeben. Der &#196;nderung am Quellcode aus dem vorherigen Beispiel sieht dann wie folgt aus:</p>
<h3>Auslesen der Daten</h3>
<pre class="brush: php; first-line: 5;">...
$array = json_decode($string, true);
</pre>
<p>Die Verwendung von JSON sichert nicht nur die Daten sondern auch die Schl&#252;ssel eines Arrays. Dabei spielt es keine Rolle, ob das Array assoziativ ist oder Zahlen als Schl&#252;ssel verwendet. Auch wird die Sortierung dabei nicht ver&#228;ndert. Wer lediglich die Werte eines Array speichern m&#246;chte, also keine Schl&#252;ssel ben&#246;tigt, kann auch einen noch einfacheren Weg gehen.</p>
<h2>Array in der Datenbank light</h2>
<p>Der einfachste Werte mehrere Daten eines Array in einer Datenbank zu speichern sind die Funktionen <a href="http://de.php.net/manual/en/function.explode.php">explode()</a> und <a href="http://de.php.net/manual/en/function.implode.php">implode()</a>. Hierbei werden die einzelnen Werte des Arrays durch den &#8220;Delimiter&#8221;, den man als ersten Parameter angibt voneinander getrennt bzw. miteinander verbunden. Auch bei dieser Variante m&#252;ssen in den beiden Beispiel-Quellcodes nur die Funktionen f&#252;r die Umwandlung ausgetauscht werden. Zu beachte ist hierbei, dass der &#8220;Delimiter&#8221; nicht in den Werten vorkommen darf. Wer also beispielsweise ein Array mit Datumsangaben im Format 2010-01-23 mit implode verbinden m&#246;chte, darf nicht den Bindestrich als &#8220;Delimiter&#8221; verwenden.</p>
<p>Die Werte k&#246;nnen wie auch zuvor in einer VARCHAR oder TEXT Spalte gespeichert werden. Sehr hilfreich sind die beiden Funktionen aber auch beim Speichern in einer Spalte mit dem Spaltentyp <a href="http://">SET</a>. Da hierbei aber die Werte zus&#228;tzlich von Anf&#252;hrungsstrichen umgeben sein m&#252;ssen, muss der &#8220;Delimiter&#8221; auch die Anf&#252;hrungsstriche enthalten. Die implode Funktion w&#252;rde in der Speicherfunktion dann wie folgt eingesetzt:</p>
<h3>Speichern der Daten in einer SET Spalte</h3>
<pre class="brush: php; first-line: 3;">
...
$string = implode('&quot;, &quot;', $array);
...
</pre>
<h2>Fazit</h2>
<p>Wie ihr also seht, gibt es viele Wege komplexere Daten in einer Datenbank zu speichern. Das Beispiel mit JSON als Repr&#228;sentation sollte in jeder serverseitigen Skriptsprache funktionieren, die JSON unterst&#252;tzt. Solltet ihr PHP verwenden m&#252;sst ihr nat&#252;rlich auch sicherstellen, dass JSON bei euch aktiviert ist. Am einfachsten geht das wie immer mit Hilfe der <a href="http://de.php.net/manual/en/function.phpinfo.php">phpinfo()</a> Funktion, die in der Ausgabe einen &#8220;json&#8221; Abschnitt haben sollte.</p>
<p>Diejenigen von euch, die einen WordPress Blog haben und sich schon einmal die Datenbanktabelle angesehen haben, werden vermutlich die JSON Strings schon gesehen haben. Den WordPress speichert z.B. Arrays eines Plugins automatisch in der JSON Notation in der &#8220;options&#8221; Tabelle ab. Das macht es einem Pluginentwickler sehr einfach das Array zu speichern.</p>
<p>Ich hoffe, dass euch das kleine Tutorial weiterhelfen oder auf neue Ideen bringen konnte. &#220;ber Anregungen w&#252;rde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft tritt der W3C SVG Working Group bei</title>
		<link>http://kau-boys.de/webentwicklung/microsoft-tritt-der-w3c-svg-working-group-bei?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=microsoft-tritt-der-w3c-svg-working-group-bei</link>
		<comments>http://kau-boys.de/webentwicklung/microsoft-tritt-der-w3c-svg-working-group-bei#comments</comments>
		<pubDate>Wed, 06 Jan 2010 13:06:38 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=598</guid>
		<description><![CDATA[Wie Microsoft gestern auf seinem IEBlog mitgeteilt hat, werden sie der W3C SVG Working Group beitreten. Dies bedeutet, dass SVG f&#252;r Microsoft in Zukunft einen h&#246;heren Stellenwert hat und sie sich damit nicht mehr auf VML beschr&#228;nken. F&#252;r uns als Webentwickler wird damit das Thema in Zukunft wohl interessanter werden. Bisher musste man einen Nutzer, [...]]]></description>
			<content:encoded><![CDATA[<p>Wie Microsoft gestern auf seinem <a href="http://blogs.msdn.com/ie/archive/2010/01/05/microsoft-joins-w3c-svg-working-group.aspx">IEBlog mitgeteilt hat</a>, werden sie der W3C SVG Working Group beitreten. Dies bedeutet, dass SVG f&#252;r Microsoft in Zukunft einen h&#246;heren Stellenwert hat und sie sich damit nicht mehr auf VML beschr&#228;nken.</p>
<p>F&#252;r uns als Webentwickler wird damit das Thema in Zukunft wohl interessanter werden. Bisher musste man einen Nutzer, der den Internet Explorer verwendent stets dazu n&#246;tigen sich <a href="http://www.adobe.com/svg/viewer/install/">ein Plugin von Adobe zu installieren</a>, zu welchem aber im letzen Jahr die Weiterentwicklung eingestellt wurde.</p>
<p><span id="more-598"></span></p>
<p>All denjenigen von euch, die bisher noch kein SVG eingesetzt haben, w&#252;rde ich empfehlen es einfach mal auszuprobieren. Aus vielen Vektorprogrammen l&#228;sst sich direkt der SVG Quellcode erzeugen. Dieser kann dann entweder direkt in einem unterst&#252;tzdenden Browser ge&#246;ffnet werden, oder aber in eine Website eingebunden werden. Hier habe ich mal ein kleines Beipspiel integriert. Wer aber keine SVG f&#228;higen Browser hat, wird das Bild leider nicht sehen k&#246;nnen. Diejenigen m&#252;ssen dann wohl bis zum IE9 warten, bis es ohne Plugin angezeigt werden kann:</p>
<p><object data="http://kau-boys.de/wp-content/uploads/2010/01/SVG-Logo.svg" type="image/svg+xml" width="300" height="300"></object><br />
Quelle: <a href="http://de.wikipedia.org/wiki/Datei:SVG-Logo.svg">Wikipedia.de</a></p>
<p>Wikipedia verwendet schon seit l&#228;ngerem SVG Grafiken f&#252;r verschiedene Bilder. Wer mehr &#252;ber SVG und das manuelle Erstellen einer Verktorgrafik lernen m&#246;chte, findet z.B. <a href="http://www.selfsvg.info">auf der Seite selfsvg.info</a> eine recht ausf&#252;hrliche Beschriebung der einzelnen Elemente und deren Eigenschaften.</p>
<p>Habt ihr SVG schon einmal eingesetzt? Welche Tools nutz ihr zur Erstellung und wo seht ihr die Grenzen von SVG? &#220;ber Kommentare w&#252;rde ich mich wie immer freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/microsoft-tritt-der-w3c-svg-working-group-bei/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PDF-Dokument ohne PDFlib mit PHP erzeugen</title>
		<link>http://kau-boys.de/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pdf-dokument-ohne-pdflib-mit-php-erzeugen</link>
		<comments>http://kau-boys.de/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen#comments</comments>
		<pubDate>Mon, 04 Jan 2010 17:45:47 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=581</guid>
		<description><![CDATA[Viele von euch werden wohl XAMPP benutzen, um lokal in PHP zu entwickeln und zu testen. In der Windows-Version enth&#228;lt es auch die PHP-Extension PDFlib, die aber leider auf vielen Hostingpaketen mit Linux als Betriebssystem nicht enthalten ist. Da PDFlib mehrere hundert Euro Lizenzgeb&#252;hren kostet stellen sich viele die Frage, ob es sinnvolle und kostenlose [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von euch werden wohl <a href="http://www.apachefriends.org/">XAMPP</a> benutzen, um lokal in PHP zu entwickeln und zu testen. In der Windows-Version enth&#228;lt es auch die PHP-Extension <a href="http://www.pdflib.com/">PDFlib</a>, die aber leider auf vielen Hostingpaketen mit Linux als Betriebssystem nicht enthalten ist. Da PDFlib mehrere hundert Euro Lizenzgeb&#252;hren kostet stellen sich viele die Frage, ob es sinnvolle und kostenlose Alternativen gibt. Gl&#252;cklicherweise gibt es Alternativen und eine sehr umfangreiche m&#246;chte ich euch kurz vorstellen.</p>
<h2>Die kostenlose TCPDF Library</h2>
<p>Nachdem ich ein paar kostenlose PDF Klassen f&#252;r PHP getestet habe, hat sich ein klarer Sieger herausgestellt. <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf">Die Klasse TCPDF</a> zeichnet sich nicht nur durch seinen gro&#223;en Funktionsumfang, sondern auch durch seine sehr gute Quellcode-Kommentierung und die <a href="http://www.tecnick.com/pagefiles/tcpdf/doc/index.html">gute Dokumentation der Funktionen</a>.</p>
<p><span id="more-581"></span></p>
<h2>Ein einfaches Beispiel</h2>
<p>Um zu zeigen, wie einfach es ist eine PDF zu erzeugen hier ein kleines Beispiel. Und wie man es von einem Programmierbeispiel erwartet schreiben wir einen einfachen Text mit &#8220;Hallo Welt&#8221; in die PDF:</p>
<pre class="brush: php;">
&lt;?php
	require_once('tcpdf/tcpdf.php');

	$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
	$pdf-&gt;setPrintHeader(false);
	$pdf-&gt;setPrintFooter(false); 

	$pdf-&gt;SetFont('times', 'BI', 20);
	$pdf-&gt;AddPage();
	$pdf-&gt;Cell(0, 10, 'Hallo Welt!', 0, 1, 'C', 0, 'http://kau-boys.de');
	$pdf-&gt;Output('example1.pdf', 'I');
?&gt;
</pre>
<p>Zuerst wird die Klasse per <a href="http://de.php.net/manual/de/function.require.php">require</a> eingebunden. Anschlie&#223;end erzeugen wir an neues TCPDF Objekt und weisen ihm als Orientierung Portrait (Hochformat) mit Millimeter als Einheit und einer Seitengr&#246;&#223;e im DIN A4 Format zu. Anschlie&#223;end deaktivieren wir noch die Standard Kopf- und Fu&#223;zeile.</p>
<p>Mit <a href="http://www.tecnick.com/pagefiles/tcpdf/doc/com-tecnick-tcpdf/TCPDF.html#methodSetFont">setFont()</a> k&#246;nnen wir die Schriftart, die Formatierung und die Schriftgr&#246;&#223;e festlegen. Jetzt f&#252;gen wir eine neue Seite hinzu und erzeugen eine Zelle mit unserem Text und einem Link. Zuletzt geben wir die Datei aus und der Browser zeigt sie direkt an. Alternativ kann auch der Download-Dialog erzwungen werden. Das Beispiel k&#246;nnt ihr euch hier ansehen:</p>
<p><a href="http://kau-boys.de/beispiele/tcpdf/example1.php">Beispiel</a></p>
<p>Das Beispiel ist stark vereinfach und nutzt nur die allern&#246;tigsten Funktionen. Auf der Seite von TCPDF findet ihr auch <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples">eine Liste mit vielen weiteren Beispielen</a>, die ihr euch ansehen solltet. Sehr beeindruckend sind auch die Beispiele mit Formularen, die entweder mit Funktionen von TCPDF oder mit einem einfachen HTML-Formular erzeugt werden k&#246;nnen.</p>
<p>Ich hoffe, dass euch das kleine Beispiel weiterhelfen konnte und euch dazu ermutigt hat, es einfach einmal selbst auszuprobieren. &#220;ber Kommentare w&#252;rde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gro&#223;e Rechtschreibreform im WWW: HTML 5 hei&#223;t jetzt HTML5</title>
		<link>http://kau-boys.de/webentwicklung/grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5</link>
		<comments>http://kau-boys.de/webentwicklung/grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5#comments</comments>
		<pubDate>Tue, 20 Oct 2009 21:57:09 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=433</guid>
		<description><![CDATA[Manche werden sich jetzt vermutlich wundern, was mit dem Titel gemeint ist. Heute haben sich die beiden Organisationen WHATWG (Web Hypertext Application Technology Working Group) und W3C (World Wide Web Consortium) auf einen einheitlichen Namen f&#252;r die n&#228;chste HTML Version geeinigt. Das W3C verwendete bisher die Schreibweise mit einem Leerzeichen und die WHATWG entsprechend ohne [...]]]></description>
			<content:encoded><![CDATA[<p>Manche werden sich jetzt vermutlich wundern, was mit dem Titel gemeint ist. Heute haben sich die beiden Organisationen <a href="http://whatwg.org">WHATWG</a> (Web Hypertext Application Technology Working Group) und <a href="http://w3c.org">W3C</a> (World Wide Web Consortium) auf einen einheitlichen Namen f&#252;r die n&#228;chste HTML Version geeinigt.</p>
<p>Das W3C verwendete bisher die Schreibweise mit einem Leerzeichen und die WHATWG entsprechend ohne Leerzeichen. Nachdem die Meldung in vielen Foren und Newsseiten die Runde gemacht hat, wurde heute um 13:43 Uhr bereits der <a href="http://de.wikipedia.org/wiki/HTML5">deutsche Wikipedia Artikel zu HTML5</a> ge&#228;ndert. Auch das W3C hat ihre <a href="http://dev.w3.org/html5/spec/Overview.html">Spezifikation zu HTML5</a> heute bereits angepasst.</p>
<p><span id="more-433"></span></p>
<p>F&#252;r manche von euch scheint das keine gro&#223;e Nachricht zu sein, aber jetzt haben wir endlich Gewissheit, wie wir HTML5 schreiben m&#252;ssen. Ich finde die Schreibweise ohne Leerzeichen auch nur konsequent, da z.B. CSS3 auch keines enth&#228;lt. Aber im Markup-Language Umfeld gibt es ja dann noch XHTML 1.0 und andere, die man mit Leerzeichen schreibt. Aber ohne w&#252;rden die auch komisch aussehen. Ich trauere ja immer noch ein bisschen XHTML 2.0 nach, das zu Gunsten von HTML5 nicht weiter verfolgt wird. Aber hoffentlich lernen alle Web-Entwickler wenigstens in Zukunft validen HTML5 Quellcode zu schreiben.</p>
<p>Was meint ihr zu dem Thema? Ist das wirklich eine Nachricht wert, oder seid ihr der Meinung, das W3C und die WHATWG sollten sich eher um wichtigere Dinge k&#252;mmern? Ich w&#252;rde mir z.B. endlich mal eine endg&#252;ltige CSS3 Spezifikation w&#252;nschen, damit wir endliche Dinge wie Border-Radius und Schatten verwenden k&#246;nnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/grosse-rechtschreibreform-im-www-html-5-heisst-jetzt-html5/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Maps Suggest &#8211; Adress-Autovervollst&#228;ndigung mit Scriptaculous</title>
		<link>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous</link>
		<comments>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous#comments</comments>
		<pubDate>Tue, 06 Oct 2009 22:22:36 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=364</guid>
		<description><![CDATA[Viele nutzen Autovervollst&#228;ndigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zus&#228;tzlich kann sie dazu dienen, dass in einem Formular m&#246;glichst g&#252;ltige Werte gespeichert werden. Selbstverst&#228;ndlich m&#252;ssen alle Daten serverseitig erneut &#252;berpr&#252;ft werden. Ich m&#246;chte heute zeigen, wie einfach es mit Scriptaculous m&#246;glich ist, eine Autovervollst&#228;ndigung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Viele nutzen Autovervollst&#228;ndigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zus&#228;tzlich kann sie dazu dienen, dass in einem Formular m&#246;glichst g&#252;ltige Werte gespeichert werden. Selbstverst&#228;ndlich m&#252;ssen alle Daten serverseitig erneut &#252;berpr&#252;ft werden.</p>
<p>Ich m&#246;chte heute zeigen, wie einfach es mit Scriptaculous m&#246;glich ist, eine Autovervollst&#228;ndigung mit Google-Maps-Adressen umzusetzen. Da man per AJAX nicht auf fremde Website einen AJAX-Request durchf&#252;hren kann, m&#252;ssen wir ein Skript als Schnittstelle zwischen Google Maps und unserer Website verwenden. Fangen wir also dieses Mal mit der serverseitigen Script an:</p>
<p><span id="more-364"></span></p>
<pre class="brush: php;">
$json = json_decode(file_get_contents('http://maps.google.com/maps/geo?output=json&amp;oe=utf8&amp;sensor=false&amp;hl=de&amp;key=DEIN_GOOGLE_MAPS_API_KEY&amp;q='.urlencode($_REQUEST['address'])));

echo '&lt;ul&gt;';
if(!empty($json-&gt;Placemark)){
	foreach($json-&gt;Placemark as $value){
		echo '&lt;li&gt;'.$value-&gt;address.'&lt;/li&gt;';
	}
}
echo '&lt;/ul&gt;';
</pre>
<p>Zuerst stellen wir eine Suchanfrage an Google Maps, wobei wir den zu suchenden Text einfach im Parameter &#8220;q&#8221; &#252;bergeben. Der Parameter &#8220;output&#8221; gibt hierbei das von Google Maps zur&#252;ckgelieferte Format an. Ich habe hier JSON verwendet und wandle die Daten anschlie&#223;end mit der <a href="http://de.php.net/manual/de/function.json-decode.php">json_decode()</a> Funktion in ein Objekt um. Es kann aber genauso gut XML in Kombination mit einer XML Funktion sie <a href="http://de.php.net/manual/de/function.simplexml-load-string.php">simplexml_load_string()</a> verwendet werden. Da JSON da kompaktere Format ist habe ich mich in diesem Beispiel daf&#252;r entschieden.</p>
<p>Ein weiterer interessanter Parameter ist &#8220;hl&#8221;, der die Sprache der Adressen angibt. Viele werden den Parameter auch von der Google Suche kenne. Hier werden die Adressen also in deutsch zur&#252;ckgegeben. Mit Hilfe dieses einen Parameters k&#246;nnt ihr also sehr schnell die Funktion auf andere Spracheversionen eurer Seite anpassen.</p>
<p>Damit ihr &#252;berhaupt eine Anfrage an Google Maps stellen d&#252;rft, ben&#246;tigt ihr einen <a href="http://code.google.com/intl/de-DE/apis/maps/signup.html">kostenlosen Google Maps API Key</a>, den ihr an den &#8220;key&#8221; Parameter anh&#228;ngen m&#252;sst (Danke an paddy, der mich auf das Fehlen des Keys hingewiesen hat).</p>
<p>Nachdem die Daten von Google Maps empfangen wurden und im Objekt vorhanden sind, geben wir sie an die JavaScript Funktion zur&#252;ck. Dazu erzeugen wir einfach eine unsortierte Liste mit einem Eintrag pro gefundener Adresse.</p>
<p>Und jetzt kommen wir zum sehr umfangreichen clientseitigen Script. Dazu m&#252;ssen wir erst einmal ein Formular mit einem Textfeld erzeugen. Au&#223;erdem ben&#246;tigen wir ein DIV, in dem die Ergebnisse ausgegeben werden. Zu guter Letzt kommt dann noch das JavaScript, das den ganzen AJAX-Request und das Behandeln der Empfangenen Daten erledingen muss. Was aber sehr kompliziert klingt, ist recht kurz umgesetzt:</p>
<pre class="brush: xml; gutter: false;">
&lt;input type=&quot;text&quot; id=&quot;address&quot; name=&quot;address&quot; /&gt;
&lt;div id=&quot;adresse_choices&quot; class=&quot;autocomplete&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	new Ajax.Autocompleter('address', 'adresse_choices', 'get_addresses.php');
&lt;/script&gt;
</pre>
<p>Die ganze Sache l&#228;sst sich mit einer einzigen Zeile JavaScript erledigen. Selbstverst&#228;ndlich m&#252;ssen dazu noch im Kopfbereich die &#8220;prototype.js&#8221; sowie anschlie&#223;end die &#8220;scriptaculous.js&#8221; eingebunden werden. Die Funktion <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Ajax.Autocompleter()</a> geh&#246;rt hierbei zum Funktionsumfang von Scriptaculous. Das fertige Resultat sieht dann wie folgt aus:</p>
<p><img src="http://kau-boys.de/wp-content/uploads/2009/10/google_maps_suggest.png" alt="Google Maps Suggest" title="Google Maps Suggest Beispiel Formular" /></p>
<p>Die hier verwendete ABC-Stra&#223;e ist kein Witz, sondern die Adresse von Google Deutschland. Eine weitere sch&#246;ne Eigenschaft von Google Maps ist die automatische Rechtschreibkorrektur, die bei fehlehaften Eingaben durchgef&#252;hrt wird. Selbst eine Eingabe wie &#8220;plazt der luftbl&#246;cke&#8221; f&#252;hrt trotzdem zu dem gew&#252;nschten Platz vor dem ehemaligen Berliner Flughafen. Um die Sache testen zu k&#246;nnen, habe ich hier ein kleines Beipsiel erstellt, dass ihr euch auch gerne im Quellcode runterladen k&#246;nnt. Ich habe zus&#228;tzlich noch eine Funktion verwendet, die den Suchbegriff hervorhebt:</p>
<p><a href="http://kau-boys.de/beispiele/google_maps_suggest/maps.html">Beispiel</a><br />
<a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest.zip">Download</a></p>
<p>Wir ihr also sehen k&#246;nnt, ist es mit der Ajax.Autocompleter() Funktion und einem servreseitigen Skript sehr einfach m&#246;glich, auch Daten von anderen Seiten auszuliefern. Das dazu ben&#246;tigte PHP Skript kann durch kleine Ver&#228;nderungen an die entsprechende extrene Datenquelle und das zur&#252;ckgelieferte Format angepasst werden. Die Funktion l&#228;sst sich aber nat&#252;rlich auch genauso gut mit jQuery oder einem anderen Framework umsetzen. Dazu muss dann aber eventuell das zur&#252;ckgelieferte Format des PHP Skript auch noch angepasst werden.</p>
<p>Ich hoffe das Beispiel hat euch gezeigt, wie vielf&#228;ltig sich eine Autovervollst&#228;ndigung einsetzen l&#228;sst. Habt ihr auch schon einmal mit externen Daten gearbeitet? Oder habt ihr vielleicht eine Idee, konntet sie aber bisher nicht umsetzen? &#220;ber ein Kommentar dazu w&#252;rde ich mich sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Die Grenzen der Frame-Weiterleitung sprengen</title>
		<link>http://kau-boys.de/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=die-grenzen-der-frame-weiterleitung-sprengen</link>
		<comments>http://kau-boys.de/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen#comments</comments>
		<pubDate>Tue, 29 Sep 2009 18:09:29 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=315</guid>
		<description><![CDATA[Viele Hoster bieten g&#252;nstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der M&#246;glichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen. Manch einer wird sich eventuell dar&#252;ber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Hoster bieten g&#252;nstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der M&#246;glichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen.</p>
<p>Manch einer wird sich eventuell dar&#252;ber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen URL hat und durch die Frameweiterleitung den Besuchern immer eine kurze Domain pr&#228;sentieren kann. Doch die Sache hat auch ihre Haken.</p>
<p><span id="more-315"></span></p>
<h2>Das Lesezeichen-Problem</h2>
<p>Das navigieren innerhalb der Seite gestaltet sich f&#252;r den Besucher, wie er es erwartet. Er kann alle Links anklicken und der Hauptframe &#246;ffnet daraufhin die richtige Seite. Auch das Navigieren mit den &#8220;Vor&#8221; und &#8220;Zur&#252;ck&#8221; Buttons funktioniert tadellos. Aber sobald der Benutzer eine Seite gefunden hat, die er seinen Favoriten hinzuf&#252;gen m&#246;chte f&#228;ngt der &#196;rger an. Nicht nur, dass der Name des Lesezeichens oft nur die Domain enth&#228;lt, viel schlimmer ist, dass das Lesezeichen auch auf die selbige zeigt. Wenn der Besucher also sp&#228;ter das Lesezeichen aufruft kommt er nicht auf die gew&#252;nschte Seite, sondern auf die Startseite und muss von dort aus erst wieder m&#252;hsam auf die richtige Seite navigieren.</p>
<h2>Das Suchmaschinen-Problem</h2>
<p>Die meisten Suchmaschinen (Google eingeschlossen) haben Probleme mit framebasierten Seiten. Sie sehen oft nur das Frameset-Konstrukt und nicht die Inhalte der einzelnen Frames. Das bedeutet in den meisten F&#228;llen, das eure Internet-Seiten, die tausende von Seiten haben k&#246;nnen, bei Suchmaschinen genau EINE Seite als Eintrag enthalten. Und das ist die Startseite oder genauer gesagt das Frameset der Domain. Eine M&#246;glichkeit den Suchmaschinen doch die anderen Seiten mitzuteilen ist das Erstellen einer <a href="http://www.sitemaps.org/">Sitemap</a>. Diese solltet ihr dann aber manuell den Suchmaschinen mitteilen, da sie die Datei unter umst&#228;nden auch nicht finden k&#246;nnen. Dabei k&#246;nnt ihr entweder die Domain um die Seitennamen erweitern, oder aber die URL eures Webspace verwenden und um die Seitennamen erweitern.</p>
<h2>Die L&#246;sung</h2>
<p>Beide Probleme zeigen also, dass Frame-Weiterleitungen ein Relikt aus alten Zeiten sind und nicht mehr verwendet werden sollten. Aber was kann man tun, wenn der Hoster keine HTTP-Weiterleitung bietet, oder daf&#252;r einen Aufpreis verlangt? Ganz einfach, man bedient sich eines recht simplen Tricks. Dazu legt man zuerst einen Ordner mit beliebigen Namen auf dem Server an. Dann stellt man die Domain so ein, dass sie als Ziel den Ordner enth&#228;lt. In diesem Ordner erzeugt man dann eine index.php (oder eine Index-Datei einer andern Scriptsprache) mit folgendem Inhalt:</p>
<pre class="brush: xml; gutter: false;">
&lt;script type=&quot;text/javascript&quot;&gt;
	top.location.href = &quot;http://example.com&quot;;
&lt;/script&gt;
</pre>
<p>Dieser einfache JavaScript Snippet &#228;ndert die URL des Top-Frame auf einen neuen Wert. Wenn der Besucher also eure Domain aufruft, die lediglich eine Frame-Weiterleitung unters&#252;tzt, sorgt der Code daf&#252;r, dass das oberste Frameset auf eine andere URL umgeleitet wird. Hierbei m&#252;sste ihr natr&#252;lich &#8220;example.com&#8221; durch eure eigene Domain ersetzen (das &#8220;http://&#8221; dabei nicht vergessen). F&#252;r alle Besucher, die keine JavaScript Unterst&#252;tzung aktiviert haben solltet ihr zus&#228;tzlich einen NOSCRIPT Tag einf&#252;gen der einen Link enth&#228;lt:</p>
<pre class="brush: xml; gutter: false;">
&lt;noscript&gt;
	Sollten Sie nicht weitergeleitet werden, klicken Sie auf den folgenden Link:
	&lt;a href=&quot;http://example.com&quot; target=&quot;top&quot;&gt;http://example.com&lt;/a&gt;
&lt;/noscript&gt;
</pre>
<p>Der Link bekommt dabei das Attribut &#8220;traget&#8221; mit dem Wert &#8220;top&#8221;. Somit wird auch hier der Link im obersren Frameset aufgerufen. Um Benutzern, die ein Lesezeichen auf eure umzuleitende Domain haben, k&#246;nntet ihr auch noch den Request an die Domain anh&#228;ngen. Somit wird der Besucher dann auf die richtige Zielseite auf der anderen Domain umgeleitet. Zusammengesetzt sieht das ganze Beispiel dann wie folgt aus (oder &#228;hnlich in einer anderen Skriptsprache):</p>
<pre class="brush: php; gutter: false;">
&lt;script type=&quot;text/javascript&quot;&gt;
	top.location.href = &quot;http://example.com&quot;.$_SERVER['REQUEST_URI'];
&lt;/script&gt;
&lt;noscript&gt;
	Sollten Sie nicht weitergeleitet werden, klicken Sie auf den folgenden Link:
	&lt;?php echo '&lt;a href=&quot;http://example.com'.$_SERVER['REQUEST_URI'].'&quot; target=&quot;top&quot;&gt;http://example.com'.$_SERVER['REQUEST_URI'].'&lt;/a&gt;'; ?&gt;
&lt;/noscript&gt;
</pre>
<p>Diesen Codeblock platziert Ihr einfach im BODY Tag der Index-Seite. Dabei solltet ihr aber Besuchern ohne JavaScript eine sch&#246;nere Seite pr&#228;sentieren, als eine die nur den Link auf wei&#223;em Untergrund enth&#228;lt.</p>
<p><del datetime="2009-12-06T14:33:09+00:00">Da ich selbst noch eine Domain besitze, die ich leider zur Zeit noch nicht auf ein aktuelles Hostingpaket umziehen kann, k&#246;nnt ihr euch das ganze in einem kleinen Beispiel auch ansehen.</del> <a href="http://kau-boys.de/allgemein/der-blog-hat-eine-neue-domain">Die Domain ist mittlerweile endlich umgezogen</a> und daher habe ich nun das Beispiel auf die alte Subdomain abge&#228;ndert. Dazu solltet ihr einfach JavaScript vor&#252;bergehen deaktivieren, damit ihr auch die Seite und den Quelltext betrachten k&#246;nnt. Wenn ihr dann JavaScript wieder aktiviert und die Seite aktualisiert, solltet ihr auf meinen Blog umgeleitet werden.</p>
<p><a href="http://kau-boys.ramarka.de">Beispiel</a></p>
<p>Mit diesem Trick k&#246;nnt ihr also die Frame-Weiterleitung umgehen, aber ihr pr&#228;sentiert dann dem Besucher die entsprechend andere URL, als sie aufgerufen haben. Dies sollte aber einer sch&#246;nen URL aber daf&#252;r der eingeschr&#228;nkten Suchmaschinenfreundlichkeit und der Verhinderung von Lesezeichen bevorzugt werden. Ihr k&#246;nnt weiterhin die sch&#246;ne URL in Mails verbreiten und den Besucher trotzdem umleiten. Wenn ihr die Domain vollst&#228;ndig nutzen m&#246;chtet bleibt euch leider nichts anderes M&#246;glich, als diese in das Webhosting-Paket zu &#252;bertragen oder zu einem reinen Domain-Anbieter zu wechseln, der auch eine HTTP-Weiterleitung anbietet, auch wenn das eventuell einen Aufpreis bedeutet.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Externe Links kennzeichnen mit CSS3</title>
		<link>http://kau-boys.de/webentwicklung/externe-links-kennzeichnen-mit-css3?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=externe-links-kennzeichnen-mit-css3</link>
		<comments>http://kau-boys.de/webentwicklung/externe-links-kennzeichnen-mit-css3#comments</comments>
		<pubDate>Tue, 08 Sep 2009 20:24:38 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=253</guid>
		<description><![CDATA[Wer kennt nicht das Problem mit externen Links? Man m&#246;chte dem Benutzer kein target=&#8221;_blank&#8221; zumuten und l&#228;sst daher auch externe Links im gleichen Fenster &#246;ffnen. Damit der Benutzer aber sehen kann, dass es sich um einen externen Link handelt, m&#246;chte man die Links gerne markieren. Daruch kann der Benutzer ihn eventuell selbstst&#228;ndig in einem neuen [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt nicht das Problem mit externen Links? Man m&#246;chte dem Benutzer kein target=&#8221;_blank&#8221; zumuten und l&#228;sst daher auch externe Links im gleichen Fenster &#246;ffnen. Damit der Benutzer aber sehen kann, dass es sich um einen externen Link handelt, m&#246;chte man die Links gerne markieren. Daruch kann der Benutzer ihn eventuell selbstst&#228;ndig in einem neuen Fenster/Tab &#246;ffnen.</p>
<p>Bisher habe ich schon viele L&#246;sungen f&#252;r dieses Problem gefunden. Einige davon wurden serverseitig vorgenommen, einige sehr aufw&#228;ndig per JavaScript clientseitig. Meistens wurden dabei alle Links innerhalb einer Seite gesucht und dann per Script angepasst.</p>
<p><span id="more-253"></span></p>
<p>Durch die tollen neuen M&#246;glichkeiten von CSS3 gibt es aber eine sehr elegante Variante, die keinerlei Umbauarbeiten an den Scripten erfordert. Es reicht ein simpler CSS Selektor, der alle externen Links erkennt und anschlie&#223;end entsprechend kennzeichnet.</p>
<pre class="brush: css; gutter: false;">
a[href^='http']:not([href^='http://example.com']):not([href^='https://example.com']){ /* Styles f&#252;r externe Links */ }
</pre>
<p>Der Anfang sollte bekannt sein. Wir selektieren zuerst alle Links mit einem &#8220;href&#8221; Attribut, das mit &#8220;http&#8221; beginnt. Damit schlie&#223;en wir alle Anker, reine Ankerlinks, relative Links sowie &#8220;mailto&#8221;-Links aus. Mit der not() Funktion von CSS3 selektieren wir anschlie&#223;end alle Links, die NICHT die Domain als absoluten Link mit &#8220;http&#8221; oder &#8220;https&#8221; enthalten. Dabei ist nat&#252;rlich &#8220;example.com&#8221; durch die zu suchende Domain zu ersetzen. Sollen auch Subdomains nicht selektriert werden, k&#246;nnen diese ebenfalls in einer weitern not() Funktion angegeben werden. Vereinfacht k&#246;nnte man auch alle Links ausw&#228;hlen, die den Domainnamen und die Toplevel-Domain nicht enthalten:</p>
<pre class="brush: css; gutter: false;">
a[href^='http']:not([href*='example.com']){ /* Styles f&#252;r externe Links */ }
</pre>
<p>Hierbei w&#252;rden aber auch externe Links ausgelassen, die den eigenen Domainnamen im Linktext enthalten wie z.B. bei &#8220;http://www.einblog.de/toller_artikel_auf_example.com&#8221;.</p>
<p>Nachdem nun alle externen Links selektiert wurden, k&#246;nnen sie mit ein paar netten Styles versehen werden. Ich habe hier mal exemplarisch mit dem Pseudoelement &#8220;:after&#8221; einen Text nach dem Link eingef&#252;gt, diesen rot markiert und zus&#228;tzlich ein Icon als Hintergrund eingef&#252;gt. Der Phantasie sind hier aber keine Grenzen gesetzt. </p>
<pre class="brush: css; gutter: false;">
a[href^='http']:not([href^='http://example.com']):not([href^='https://example.com']):after {
	content: ' (external)';
	color: red;
	background: transparent url('external_link.png') center right no-repeat;
	padding-right: 16px;
}
</pre>
<p>Wie das ganze f&#252;r die verschiedenen Linkarten aussieht k&#246;nnt Ihr euch auf der kleinen Beispielseite ansehen. Ihr ben&#246;tigt daf&#252;r aber einen teilweise CSS3 kompatiblen Browser. Ich habe es erfolgreich mit Firefox 3.5, Safari 4.0, Chrome 2.0 und Opera 10.0 getestet. Der Internet Explorer unterst&#252;tzt die not() Funktion auch in Version 8.0 noch nicht.</p>
<p><a href="http://kau-boys.de/beispiele/external/">Beispiel</a></p>
<p>Wenn Ihr Anregungen zu der L&#246;sung habt oder eine andere tolle L&#246;sung kennt w&#252;rde Sie mich sehr interessieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/externe-links-kennzeichnen-mit-css3/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Die magische select() Funktion!</title>
		<link>http://kau-boys.de/webentwicklung/die-magische-select-funktion?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=die-magische-select-funktion</link>
		<comments>http://kau-boys.de/webentwicklung/die-magische-select-funktion#comments</comments>
		<pubDate>Mon, 31 Aug 2009 17:17:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=218</guid>
		<description><![CDATA[Bei meinem vorherigen Post zum Zeilen-Duplizierer stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgew&#228;hlten DOM-Elements finden musste. Da ich hierf&#252;r in den Utility Methods nicht gefunden habe, musste ich die Funktion getElementsByTagName() verwenden. Alleine hiermit konnte ich aber noch immer nicht auf die Elemente zugreifen. Dazu musste ich den [...]]]></description>
			<content:encoded><![CDATA[<p>Bei meinem vorherigen Post zum <a href="http://kau-boys.de/2009/08/27/einfacher-zeilen-duplizierer-mit-prototype/">Zeilen-Duplizierer</a> stand ich vor dem Problem, dass ich Elemente eines bestimmten Tags innerhalb eines ausgew&#228;hlten DOM-Elements finden musste. Da ich hierf&#252;r in den <a href="http://www.prototypejs.org/api/utility">Utility Methods</a> nicht gefunden habe, musste ich die Funktion <a href="http://de.selfhtml.org/javascript/objekte/document.htm#get_elements_by_tag_name">getElementsByTagName()</a> verwenden. Alleine hiermit konnte ich aber noch immer nicht auf die Elemente zugreifen. Dazu musste ich den Aufruf noch mit der <a href="http://www.prototypejs.org/api/utility/dollar-a">$A()</a> Funktion verwenden. Der gesamte Aufruf f&#252;r die drei Formularfelder sah dann wie folgt aus:</p>
<p><span id="more-218"></span></p>
<pre class="brush: jscript;">
$A(newRow.getElementsByTagName('select')).invoke('clear');
$A(newRow.getElementsByTagName('textarea')).invoke('clear');
$A(newRow.getElementsByTagName('input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Heute bin ich durch Zufall dann auf die seit Prototype 1.6 neue Funktion <a href="http://www.prototypejs.org/api/element/select">select()</a> gesto&#223;en. Damit konnte ich in einem ersten Versuch die gleiche Selektion mit folgenden Zeilen nachbilden:</p>
<pre class="brush: jscript;">
newRow.select('select').invoke('clear');
newRow.select('textarea').invoke('clear');
newRow.select('input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Aber selbst diese Vereinfachung ist noch zu umst&#228;ndlich. Die Funktion erlaubt das Selektrieren mit mehreren CSS-Selektoren. Dazu werden die CSS-Selektoren einfach als Parameter der Funktion &#252;bergeben:</p>
<pre class="brush: jscript;">
newRow.select('select', 'textarea', 'input')).each(function(elm){
	elm.clear().checked = '';
});
</pre>
<p>Diese Vereinfachung ist zwar nicht ganz sinnvoll, da hier auch f&#252;r Textfelder das &#8220;checked&#8221; Attribute geleert wird, aber es schadet auch an dieser Stelle nicht weiter.</p>
<p>Wie ihr also sehen k&#246;nnt bietet die select() Funktion eine sehr einfache Selektion innerhalb eines bereits selektierten Elements. Zus&#228;tzlich zu der bereits beschriebenen Funktionalit&#228;t erweitert die select() Funktion die Elemente zus&#228;tzlich noch mit der <a href="http://www.prototypejs.org/api/element/extend">extend()</a> Funktion um weitere Methoden. Sie einfacht also folgenden Aufruf auf lediglich einen Funktionsaufruf:</p>
<pre class="brush: jscript;">
// gew&#246;hnlicher Aufruf mit der getElementsByTagName() Funktion
$A(newRow.getElementsByTagName('input')).map(Element.extend);
// gleicher Aufruf mit Hilfe der select() Funktion
newRow.select('input');
</pre>
<p>Die select() Funktion erm&#246;glicht also im Prinzip das Anwenden der <a href="http://www.prototypejs.org/api/utility/dollar-dollar">$$()</a> Funktion erweitert um das Zusammenfassen der Elemente in einem Array. Dadurch l&#228;sst sich beim Verarbeiten von selektierten Elementen einiges an Mehraufwand einsparen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/webentwicklung/die-magische-select-funktion/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
