<?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; PHP</title>
	<atom:link href="http://kau-boys.de/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Fri, 16 Mar 2012 19:15:48 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>PHP-Soap auf einem 1&amp;1 ROOT-Server mit openSUSE installieren</title>
		<link>http://kau-boys.de/1307/webserver/php-soap-auf-einem-1und1-root-server-mit-opensuse-installieren?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-soap-auf-einem-1und1-root-server-mit-opensuse-installieren</link>
		<comments>http://kau-boys.de/1307/webserver/php-soap-auf-einem-1und1-root-server-mit-opensuse-installieren#comments</comments>
		<pubDate>Tue, 14 Jun 2011 18:27:23 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Betriebssystem]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1307</guid>
		<description><![CDATA[Ich habe vor kurzem mal wieder einen Webservice, der eine SOAP Schnittstelle bot, per PHP ansprechen müssen. Das ist ja mit den Funktionen, die PHP liefert auch kein Problem und funktioniert dann fast genau so einfach wie der Funktionsausruf einer externen Bibliothek. Um SOAP nutzen zu können, muss es über die php.ini Datei aktiviert werden [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe vor kurzem mal wieder einen Webservice, der eine SOAP Schnittstelle bot, per PHP ansprechen müssen. Das ist ja mit den Funktionen, die PHP liefert auch kein Problem und funktioniert dann fast genau so einfach wie der Funktionsausruf einer externen Bibliothek.</p>
<p>Um SOAP nutzen zu können, muss es über die php.ini Datei aktiviert werden oder in das Verzeichnis für die Erweiterungen (z.B. unter <code>/usr/lib64/php5/extensions</code>). Was aber, wenn die SOAP Bibliothek nicht installiert ist? Dann muss man es je nach Betriebssystem nachinstallieren. Unter Linux geht das über die Paketmanager oft am einfachsten.</p>
<p>Für openSUSE könnt ihr hierfür den Paketmanager <a href="http://de.opensuse.org/YaST">YAST</a> verwenden. Der Befehl dazu lautet wie folgt:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
yast -i php5-soap
</pre>
<p>Der Vorteil bei der Installation über den Paketmanager: Die Bibliothek wird auch gleich in die bestehende Konfiguration eingetragen. Somit könnt ihr direkt nach der Ausführung des Befehls loslegen. Solltet ihr noch nie mit Webservices gearbeitet haben, dann findet ihr in der PHP Doku die <a href="http://php.net/manual/en/book.soap.php">wichtigsten Funktionen von SOAP in PHP</a>.</p>
<p>Jetzt viel Spaß oder auch viel Ärger mit SOAP <img src='http://kau-boys.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1307/webserver/php-soap-auf-einem-1und1-root-server-mit-opensuse-installieren/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Shortcut des Monats: STRG + SHIFT + T (Aptana)</title>
		<link>http://kau-boys.de/1225/shortcut/shortcut-des-monats-strg-shift-t-aptana?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=shortcut-des-monats-strg-shift-t-aptana</link>
		<comments>http://kau-boys.de/1225/shortcut/shortcut-des-monats-strg-shift-t-aptana#comments</comments>
		<pubDate>Sun, 23 Jan 2011 14:40:06 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Shortcut]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1225</guid>
		<description><![CDATA[Vor ein paar Tagen war ich gerade dabei in eclipse (bzw. genauer gesagt in Aptana 1.5) an einem Projekt zu arbeiten. Dabei habe ich aus Versehen eine Datei geschlossen, obwohl ich noch nicht fertig war. Um diese Datei jetzt wieder zu öffnen hätte ich die &#8220;Project View&#8221; öffnen können und die Datei über die Verzeichnisliste [...]]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen war ich gerade dabei in <a href="http://www.eclipse.org/">eclipse</a> (bzw. genauer gesagt in Aptana 1.5) an einem Projekt zu arbeiten. Dabei habe ich aus Versehen eine Datei geschlossen, obwohl ich noch nicht fertig war. Um diese Datei jetzt wieder zu öffnen hätte ich die &#8220;Project View&#8221; öffnen können und die Datei über die Verzeichnisliste öffnen können.</p>
<h2>Der Shortcut</h2>
<p>Man kennt aber von vielen Programmen den Shortcut zum Öffnen eines gerade geschlossenen Fensters/Tabs. Wieso sollte dieser also nicht auch in eclipse funktionieren? Also habe ich ihn kurzerhand mal gedrückt und erwartet, dass die gerade geschlossene Datei wieder geöffnet wird:</p>
<p style="text-align: center">
<kbd>STRG</kbd> + <kbd>SHIFT</kbd> + <kbd>T</kbd>
</p>
<p><span id="more-1225"></span></p>
<p>Leider wurde mit diesem Shortcut nicht die zuletzt geschlossene Datei geöffnet, sondern es wurde ein Fenster mit dem Titel &#8220;Open PHP Element&#8221; geöffnet, das wie folgt aussieht:</p>
<p style="text-align: center;">
<img src="http://kau-boys.de/wp-content/uploads/2011/01/open-php-element.png" alt="Open PHP Element" title="Open PHP Element" style="width: 506px; height: 500px;" />
</p>
<p>Es handelt sich hierbei um ein Suchfenster, mit dem man nach Klassen, Funktionen und Konstanten suchen kann. Hierbei wird immer in allen Projekten gleichzeitig gesucht. Wie ihr in meiner Beispielsuche sehen könnt, kann man auch nach Methoden einer Klasse suchen. Wichtig ist aber bei der Suche, dass sie immer am Beginn eines Bezeichners sucht. Man kann allerdings einen Stern voranstellen, um auch innerhalb der Bezeichner nach einem Wort zu suchen:</p>
<p style="text-align: center;">
<img src="http://kau-boys.de/wp-content/uploads/2011/01/open-php-element-wildcard.png" alt="Open PHP Element mit Platzhalter in Suchwort" title="Open PHP Element mit Platzhalter in Suchwort" style="width: 506px; height: 500px;" />
</p>
<p>Das ist auch dann notwendig, wenn man z.B. den Methodennamen einer Klasse kennt, nicht aber den Namen der Klasse, in der die Methode enthalten ist.</p>
<p>Ein Doppelklick auf einen Eintrag des Suchergebnisses öffnet die Datei, in der die Klasse, Funktion oder Konstante definiert wurde und springt zu der entsprechenden Stelle. Das ist vor Allem dann sinnvoll, wenn die entsprechenden Funktionen nicht mit Hilfe von <a href="http://www.phpdoc.org/">PHPDoc</a> beschrieben wurden und man feststellen möchte, was genau die Funktion macht. Gerade bei der Arbeit mit WordPress ist es oft sehr hilfreich nachzusehen, ob es in einer Funktion einen Filter gibt, wann er ausgeführt wird und was er macht.</p>
<p>Der Shortcut lässt sich in meiner aktuellen Installation von eclipse mit dem Aptana Plugin allerdings nur dann ausführen, wenn ich gerade eine Datei geöffnet habe, die mit einem der Aptana Editoren verknüpft ist. Wenn ich also gerade eine Textdatei oder eine SQL-Datei offen habe, die mit einem nativen eclipse Editor verknüpft ist, funktioniert der Shortcut nicht.</p>
<p>Das Indizieren der Dateien für diese Suche läuft im Hintergrund ab. Es wird meistens nach einem Update z.B. aus einem SVN Respository durchgeführt. Mich hat es oft gewundert, was genau Aptana danach immer so lange macht, aber jetzt weiß ich ja wofür das gut ist.</p>
<h2>Verwandter Shortcut und alternatives Plugin</h2>
<p>Es steht übrigens eine Funktion &#8220;Open Ressource&#8221; zur Verfügung, mit der man direkt eine Datei öffnen kann, wobei auch hier Platzhalter verwendet werden können:</p>
<p style="text-align: center">
<kbd>STRG</kbd> + <kbd>SHIFT</kbd> + <kbd>R</kbd>
</p>
<p>Ich verwende aber für die Suche nach Dateien das Plugin <a href="http://muermann.org/gotofile/">GotoFile</a> welches selbst bei Tippfehlern noch die Datei findet. Man kann das Plugin entweder direkt aufrufen, oder aber vorher einen Text in einer Datei markieren, der dann beim Aufruf direkt in das Suchfeld eingetragen wird. Das ist vor allem beim Dateinamen sinnvoll, die z.B. per <a href="http://php.net/manual/de/function.include.php">include()</a> oder <a href="http://php.net/manual/de/function.require.php">require()</a> Funktion in eine Datei eingebunden wurden. Der Shortcut des Plugins lautet wie folgt:</p>
<p style="text-align: center">
<kbd>STRG</kbd> + <kbd>ALT</kbd> + <kbd>N</kbd>
</p>
<p>Das Plugin wird zwar seit 2006 nicht mehr weiterentwickelt, aber es funktioniert auch mit der aktuellsten Version von eclipse (3.6.1) noch ohne Probleme. Es kann allerdings nicht über die Funktion &#8220;Software Updates&#8230;&#8221; hinzugefügt werden. Stattdessen kann man das Zip-Archiv einfach in den Plugins-Ordner der eclipse Installation entpacken.</p>
<h2>Fazit</h2>
<p>Ich bin von der neu entdeckten Funktion sehr begeistert, denn oft weiß ich ja genau wie eine Funktion heißt, aber nicht mehr unbedingt wo sie implementiert wurde. Doch selbst wenn man es weiß, kann man so sehr viel schneller an die entsprechende Stelle springen. Es hat mir schon einiges an Zeit und Sucherei erspart.</p>
<p>Ich hoffe, dass der Shortcut (oder das Plugin) auch bei eurer täglichen Arbeit helfen kann. Wenn jemand von euch einen tollen Vorschlag für einen Shortcut hat, würde ich mich sehr über einen Kommentar freuen. Ich werde ihn dann gerne hier vorstellen oder ihr schreibt selbst einen Gastbeitrag darüber.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1225/shortcut/shortcut-des-monats-strg-shift-t-aptana/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Assoziatives Array als HTML Tabelle ausgeben</title>
		<link>http://kau-boys.de/803/webentwicklung/assoziatives-array-als-html-tabelle-ausgeben?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=assoziatives-array-als-html-tabelle-ausgeben</link>
		<comments>http://kau-boys.de/803/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äufig wird gefordert ein assoziatives Array als HTML Tabelle auszugeben. Ich nutze hier sehr oft die implode() Funktion, um dabei mit möglichst wenig Quellcode zu dem Gewünschten Ergebnis zu kommen. Da ich meine Lösung wirklich sehr schön und genial einfach finde, wollte ich euch kurz die Funktion präsentieren. Als auszugebendes Array nehmen wir das [...]]]></description>
			<content:encoded><![CDATA[<p>Sehr hä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öglichst wenig Quellcode zu dem Gewünschten Ergebnis zu kommen. Da ich meine Lösung wirklich sehr schön und genial einfach finde, wollte ich euch kurz die Funktion präsentieren. Als auszugebendes Array nehmen wir das MySQL-Debugging Array aus meinem vorherigen Artikel <a href="http://kau-boys.de/794/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; title: ; notranslate">
function array_to_table($a){
	$t='&amp;lt;table&amp;gt;';
	$t.='&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;'.implode('&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;', array_keys($a[0])).'&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;';
	foreach($a as $row){
		$t.= '&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'.implode('&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;', $row).'&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;';
	}
	return $t.='&amp;lt;/table&amp;gt;';
}

// Ausgabe der Tabelle
echo array_to_table($mysqli-&amp;gt;queries);
</pre>
<p><span id="more-803"></span></p>
<p>In Zeile 3 werden die Schlüssel des assoziativen Array für die Überschriften der Spalten genutzt. Wir öffnen hier eine Zeile und eine Spalte und fügen dann mit Hilfe der implode() Funktion alle Schlüssel in diese Zeile ein. Die &#8220;Glue&#8221; für die implode() Funktion ist hierbei ein schließendes Tag für die Spalte und ein weiteres öffnendes. Am Ende der Zeile schließ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ässt sich die Funktion trefflich erweitern. So könnte z.B. in einem Parameter ein Array mit Schlüsselnamen übergeben werden, wenn die Schlüssel des Assoziativen Arrays nicht passend für die Tabelle sind. Oder es kö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önnen.</p>
<p>Wir ihr also sehen könnt ihr eure Fantasie bei der Erweiterbarkeit freien Lauf lassen. Ich vergebe meistens die Klassen fü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ä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ä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/803/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/794/webentwicklung/mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql-unter-php-debuggen-mit-einer-eigenen-mysql-klasse</link>
		<comments>http://kau-boys.de/794/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öhnlich langen Ladezeiten eines Formulars. Da hier allerdings auch sehr viele Datenbankabfragen ausgeführt werden müssen und dabei auch noch die Werte per COUNT() gezählt werden wunderten mich die Zeiten nicht wirklich. Nun wollte ich natü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öhnlich langen Ladezeiten eines Formulars. Da hier allerdings auch sehr viele Datenbankabfragen ausgeführt werden mü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ählt werden wunderten mich die Zeiten nicht wirklich.</p>
<p>Nun wollte ich natürlich wissen, welche Abfrage dabei besonders viel Zeit in Anspruch nimmt um dann gezielt optimieren zu kö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öglich diese zu erweiterten. Eine Möglichkeit wäre es natürlich gewesen eine eigene Funktion zu schreiben, aber in diesem Fall hätte ich auch alle Skript anpassen müssen, in denen ich eine Query ausfü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 überschreiben. Hier ein stark vereinfachtes Beispiel, wie so etwas aussehen könnte:</p>
<p><span id="more-794"></span></p>
<pre class="brush: php; title: ; notranslate">
&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 überschreiben wir die query() Funktion der MySQLi Klasse mit unserer Debugging-Klasse. Dort wird zuerst einmal zur Protokollierung der Ausführungszeit der Startzeitpunkt mit Hilfe der <a href="http://de.php.net/manual/en/function.microtime.php">microtime() Funktion</a> ermittelt. Anschließend wird der Query mit dem Aufruf <code>parent::query($query)</code> an die query() Funktion der MySQLi Klasse übergeben. Einen eventuell auftretenden Fehler speichern wir dabei in einer Variablen ab.</p>
<p>In Zeile 23 speichern wir die Endzeit des Query. Anschließend speichern wir alle Werte, die wir zur späteren Auswertung benötigen in einem Array gespeichert. Zusätzlich summieren wir noch alle Zeiten auf, um später die Gesamtdauer aller Statements bestimmen zu kö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 ä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ötigt wird. Das spart im produktiven Einsatz etwas Rechenzeit. Eine mögliche Bedingung könnte wie folgt aussehen:</p>
<pre class="brush: php; gutter: false; title: ; notranslate">
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ö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ällen eure SQL-Statements für Unbefugte sichtbar werden könnten, was unter Umständen die Sicherheit eueres Systems gefährden könnte.</p>
<p>Nachdem wir die Daten gesammelt haben möchten wir sie natürlich auch ausgeben. Das solltet ihr auch wieder die vorherige Bedingung verwenden. Dazu erstellen wir einfach eine Tabelle, die die gesammelten Daten enthält:</p>
<pre class="brush: xml; title: ; notranslate">
&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ürden wir einen SQL-Fehler erhalten. In der Tabelle kö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önnt. Ihr könnt die Klasse natürlich auch noch nach euren Wünschen erweitern und auch andere Funktionen von MySQLi überschreiben. Wenn ihr, so wie ich, zentral an einer Stelle die Datenbankverbindung erzeugt könnt ihr durch die Bedingung aus dem zweiten Quellcode eure gesamte Applikation debuggen.</p>
<p>Ich habe damit in meinem Projekt schon zwei überflüssige Statements finden können und einige andere Statements noch weiter optimieren können. Ich hoffe, dass euch der Debugger auch bei eurer täglichen Arbeit unterstützen kann. Über Anregungen und Kommentare Wrede ich mich wie immer freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/794/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/790/webentwicklung/das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=das-bermudadreieck-des-internet-explorer-oder-wo-zum-teufel-ist-mein-ordner-hin</link>
		<comments>http://kau-boys.de/790/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ß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ß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ürzter Form wie folgt aus: </p>
<pre class="brush: xml; title: ; notranslate">
&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ügung stand enthielt das <code>action</code> Attribut des Formulars nur den Wert <code>form.php</code>.</p>
<p>Das Formular wurde über einen Link aufgerufen und somit befand sich der Nutzer innerhalb des &#8220;formularordner&#8221;. Wenn nun also der Pfad relativ angegeben wird, müsste das Formular in genau diesem Ordner gesucht werden. Einige Nutzer bekamen aber eine schö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 öffnen. Hier war aber natürlich kein Formular zu finden.</p>
<p>Ich konnte den Fehler dann beheben, indem ich das Gleichheitszeichen wieder an seine korrekte Stelle eingefügt habe. Dadurch kam es nicht mehr zu den falschen Aufrufen. Der Vollständigkeit halber hier noch der korrekte Quellcode:</p>
<pre class="brush: xml; title: ; notranslate">
&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ü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ätzlichen Problem bei einem der Nutzer, denn nachdem sie den Browser neu geöffnet hatten funktionierte plö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ärung oder Lösung dafür kennen wü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ält.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/790/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>Zeilen-Duplizierer mit AutoComplete Felder nutzen</title>
		<link>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zeilen-duplizierer-mit-autocomplete-felder-nutzen</link>
		<comments>http://kau-boys.de/697/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ä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/196/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ä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ü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ösen hatte ich die erweiterte Funktion mit den beiden Callback-Funktionen erstellt. Damit ist es möglich die Referenz zum vorherigen Feld zu lö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ügt:</p>
<pre class="brush: jscript; title: ; notranslate">
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önnen benötigt jedes Feld eine eindeutige ID. Nehmen wir also an, wir haben folgendes erstes Feld für unser Formular (hier ein Beispiel aus dem Artikel: <a href="http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous">Google Maps Suggest – Adress-Autovervollständigung mit Scriptaculous</a>):</p>
<pre class="brush: xml; title: ; notranslate">
&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ürlich die eckigen Klammern am Ende des Name Attributs, damit auch alle kopierten Werte mitübertragen werden. Damit wir einer Kopie dieses Feldes eine neue Instanz hinzufügen können, müssen wir beim Kopieren auch die ID verändern. Dazu schreiben wir uns eine kleine Callback-Funktion, die genau das erledigt:</p>
<pre class="brush: jscript; title: ; notranslate">
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ügen wir in der 3. Zeile zusä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ür das Feld deaktiviert. Zu guter Letzt erzeugen wir eine neue Instanz des Ajax.Autocompleter. Wir können dabei als zweiten Parameter dasselbe DIV Element für die Vorschläge verwenden, da es ja nicht mö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ü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öhnlichen Link:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;span class=&quot;add&quot; onclick=&quot;addRow('#addressform dl', {reset : true, afterInsert: activateAutocomplete})&quot;&gt;Adresse hinzufügen&lt;/span&gt;
</pre>
<p>Es wird durch den Selektor <code>"#addressform dl"</code> die gesamte Definition inklusive des Label kopiert. Ihr könnt aber auch eine andere HTML Struktur wie z.B. eine unsortierte Liste verwenden.</p>
<p>Das war auch schon alles. Das Beispiel könnt ihr euch hier ansehen und auch den Quellcode dazu runterladen:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/duplicate.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest_duplicate.zip" class="awesome large breakerbay" style="margin-left:20px;">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ürde ich mich wie immer über einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/697/webentwicklung/zeilen-duplizierer-mit-autocomplete-felder-nutzen/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Backend Localization Plugin funktioniert nun auch mit PHP4</title>
		<link>http://kau-boys.de/687/wordpress/backend-localization-plugin-funktioniert-nun-auch-mit-php4?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=backend-localization-plugin-funktioniert-nun-auch-mit-php4</link>
		<comments>http://kau-boys.de/687/wordpress/backend-localization-plugin-funktioniert-nun-auch-mit-php4#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:40:31 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=687</guid>
		<description><![CDATA[Anfang der Woche bekam ich einen Kommentar zu meinem Backend Localization Plugin mit dem Hinweis, dass es nicht mit PHP4 funktioniert. Da ich schon lange PHP5 nutze und auch versuche meinen Quellcode übersichtlich zu gestalten, habe ich in meinem Plugin einige Funktionen und Eigenschaften genutzt, die es für PHP4 noch nicht gab. Der Kommentator, der [...]]]></description>
			<content:encoded><![CDATA[<p>Anfang der Woche bekam ich einen Kommentar zu meinem <a href="http://kau-boys.de/230/wordpress/kau-boys-backend-localization-plugin">Backend Localization Plugin</a> mit dem Hinweis, dass es nicht mit PHP4 funktioniert. Da ich schon lange PHP5 nutze und auch versuche meinen Quellcode übersichtlich zu gestalten, habe ich in meinem Plugin einige Funktionen und Eigenschaften genutzt, die es für PHP4 noch nicht gab.</p>
<p>Der Kommentator, der den Fehler gefunden hat, konnte auch selbst am nächsten Tag schon eine Lösung finden, die er <a href="http://www.est322.com/2010/02/kau-boys-backend-localization-plugin-wordpress/">auf seinem eigenen Blog</a> sowie als weiteres Kommentar hinterlassen hat. An dieser Stelle nochmals vielen Dank an David.</p>
<p>Ich versuche Fehler, die mir mitgeteilt werden immer innerhalb von wenigen Tagen zu beheben. Dazu bin ich natürlich darauf angewiesen, dass mir diese auch mitgeteilt werden. Bei WordPress kann es sehr oft vorkommen, dass sich zwei Plugins nicht zusammen vertragen. Wenn ihr also mit einem meiner Plugins ein Problem feststellen solltet, dann scheut euch nicht mir das mitzuteilen. Ich werde gerne versuchen das Problem zu beheben.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/687/wordpress/backend-localization-plugin-funktioniert-nun-auch-mit-php4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arrays und andere komplexe Daten mit PHP in einer MySQL-Datenbank speichern</title>
		<link>http://kau-boys.de/643/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern</link>
		<comments>http://kau-boys.de/643/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öchte ich ein paar Vorschläge unterbreiten, wie man das Problem nicht lösen sollte und wie es besser gehen kann. Der schlechte Weg Die einfachste und gleichzeitig auch schlechteste Methode wä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öchte ich ein paar Vorschläge unterbreiten, wie man das Problem nicht lösen sollte und wie es besser gehen kann.</p>
<h2>Der schlechte Weg</h2>
<p>Die einfachste und gleichzeitig auch schlechteste Methode wäre es, für jeden Index eines Arrays oder jede Eigenschaft eines Objekts eine neue Spalte zu erzeugen. Bei diesem Ansatz werden unter Umständen viele Zeilen erzeugt, die nicht immer einen Wert enthalten. Das ist zwar nicht so gravierend, aber durch diesen Ansatz erhöht sich auch die Anzahl der Spalten schnell auf eine unübersichtliche Anzahl. Zuletzt ist es hierbei bei jeder Änderung des Arrays oder Objekts notwendig die Datenbanktabelle anzupassen.</p>
<p><span id="more-643"></span></p>
<h2>Eine bessere Lösung gefällig?</h2>
<p>Etwas besser Lösung, die fast immer funktioniert aber nicht für alle Fälle optimal ist, wä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ö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ü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; title: ; notranslate">
// 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ürlich voraus, dass die Variable <code>$mysqli</code> eine Instanz der MySQLi Klasse mit einer gültige Verbindung zu einer Datenbank enthä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; title: ; notranslate">
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ührt, die aus dem String wieder ein assoziatives Array erzeugt. Dazu lesen wir zuerst die Daten mit einem gewöhnlichen Query aus und konvertieren anschließend die Daten:</p>
<h3>Auslesen der Daten</h3>
<pre class="brush: php; title: ; notranslate">
// 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ötigt dabei mehr Speicherplatz als für ein normales assoziatives Array eigentlich nötig wäre. Wie es eleganter geht zeige ich euch im nächsten Beispiel.</p>
<h2>Die elegante Lö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ützen bietet es sich auch für die Speicherung von komplexeren Datenstrukturen an. Die Anpassung des vorherigen Quellcodes beschrä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; title: ; notranslate">
...
$string = json_encode($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änge der einzelnen Arraywerte nicht und Datentypen nicht gespeichert werden:</p>
<h3>Der zu speichernde String</h3>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
{&quot;vorname&quot;:&quot;Max&quot;,&quot;name&quot;:&quot;Mustermann&quot;}
</pre>
<p>Beim Lesen der Daten aus der Datenbank müssen sie dann selbstverständlich auch wieder in das ursprüngliche Format zurü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; übergeben. Der Ä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; title: ; notranslate">...
$array = json_decode($string, true);
</pre>
<p>Die Verwendung von JSON sichert nicht nur die Daten sondern auch die Schlüssel eines Arrays. Dabei spielt es keine Rolle, ob das Array assoziativ ist oder Zahlen als Schlüssel verwendet. Auch wird die Sortierung dabei nicht verändert. Wer lediglich die Werte eines Array speichern möchte, also keine Schlüssel benö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üssen in den beiden Beispiel-Quellcodes nur die Funktionen fü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öchte, darf nicht den Bindestrich als &#8220;Delimiter&#8221; verwenden.</p>
<p>Die Werte kö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ätzlich von Anführungsstrichen umgeben sein müssen, muss der &#8220;Delimiter&#8221; auch die Anführungsstriche enthalten. Die implode Funktion wü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; title: ; notranslate">
...
$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äsentation sollte in jeder serverseitigen Skriptsprache funktionieren, die JSON unterstützt. Solltet ihr PHP verwenden müsst ihr natü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. Über Anregungen würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/643/webentwicklung/arrays-und-andere-komplexe-daten-mit-php-in-einer-mysql-datenbank-speichern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDF-Dokument ohne PDFlib mit PHP erzeugen</title>
		<link>http://kau-boys.de/581/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pdf-dokument-ohne-pdflib-mit-php-erzeugen</link>
		<comments>http://kau-boys.de/581/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ä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ü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ä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ühren kostet stellen sich viele die Frage, ob es sinnvolle und kostenlose Alternativen gibt. Glücklicherweise gibt es Alternativen und eine sehr umfangreiche möchte ich euch kurz vorstellen.</p>
<h2>Die kostenlose TCPDF Library</h2>
<p>Nachdem ich ein paar kostenlose PDF Klassen fü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ßen Funktionsumfang, sondern auch durch seine sehr gute Quellcode-Kommentierung und die <a href="http://www.tcpdf.org/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; title: ; notranslate">
&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ßend erzeugen wir an neues TCPDF Objekt und weisen ihm als Orientierung Portrait (Hochformat) mit Millimeter als Einheit und einer Seitengröße im DIN A4 Format zu. Anschließend deaktivieren wir noch die Standard Kopf- und Fußzeile.</p>
<p>Mit <a href="http://www.tcpdf.org/doc/classTCPDF.html#af5d40d44c6433913765c780b1589bff0">setFont()</a> können wir die Schriftart, die Formatierung und die Schriftgröße festlegen. Jetzt fü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ö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ö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önnen.</p>
<p>Ich hoffe, dass euch das kleine Beispiel weiterhelfen konnte und euch dazu ermutigt hat, es einfach einmal selbst auszuprobieren. Über Kommentare würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/581/webentwicklung/pdf-dokument-ohne-pdflib-mit-php-erzeugen/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Plesk Cronjob für ein PHP-Skript mit Parametern einrichten</title>
		<link>http://kau-boys.de/490/webserver/plesk-cronjob-fuer-ein-php-skript-mit-parametern-einrichten?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=plesk-cronjob-fuer-ein-php-skript-mit-parametern-einrichten</link>
		<comments>http://kau-boys.de/490/webserver/plesk-cronjob-fuer-ein-php-skript-mit-parametern-einrichten#comments</comments>
		<pubDate>Mon, 23 Nov 2009 21:09:00 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plesk]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=490</guid>
		<description><![CDATA[Bei vielen Webhosting Paketen gibt es die Möglichkeit einen Cronjob einzurichten. Leider musste ich nach dem Umstieg von einem 1&#038;1 Managed Homepage Server auf einen 1&#038;1 Linux Root Server feststellen, dass diese Option im Control Center nicht mehr verfügbar war. Auch meine Suche nach dem &#8220;Crontab&#8221; in Plesk war erst einmal erfolglos, da die Funktion [...]]]></description>
			<content:encoded><![CDATA[<p>Bei vielen Webhosting Paketen gibt es die Möglichkeit einen <a href="http://de.wikipedia.org/wiki/Cronjob">Cronjob</a> einzurichten. Leider musste ich nach dem Umstieg von einem 1&#038;1 Managed Homepage Server auf einen 1&#038;1 Linux Root Server feststellen, dass diese Option im Control Center nicht mehr verfügbar war. Auch meine Suche nach dem &#8220;Crontab&#8221; in Plesk war erst einmal erfolglos, da die Funktion an der beschriebenen Stelle nicht zu finden war. Durch Zufall habe ich sie dann doch gefunden.</p>
<p><img title="Plesk Hauptmenü - Server" alt="Plesk Hauptmenü - Server" src="http://kau-boys.de/wp-content/uploads/2009/11/Plesk-Hauptmenü-Server.png"/></p>
<p><span id="more-490"></span></p>
<p>Um einen Cronjob anzulegen navigiert ihr im Hauptmenü zum Abschnitt Server und wählt dort &#8220;Geplante Aufgaben&#8221;. Anschließend bekommt ihr eine Liste mit allen Benutzern angezeigt, die auf eurem Server vorhanden sind. Jedem dieser Benutzer könnt ihr einen Cronjob zuteilen. Um ein PHP-Skript auszuführen solltet ihr den Benutzer wählen, der auf eurem Server den Apache-Server ausführt. Dies ist meistens der Benutzer namens &#8220;wwwrun&#8221;. Blättert also einfach auf die entsprechende Seite oder sucht nach dem Benutzer:</p>
<p><img title="Geplante Aufgaben" alt="Geplante Aufgaben" src="http://kau-boys.de/wp-content/uploads/2009/11/Geplante-Aufgaben.png"/></p>
<p>Nachdem ihr den Benutzer ausgewählt habt klickt auf &#8220;Weiter&#8221;. Ihr gelangt nun auf die Seite mit den &#8220;Crontab-Aufgaben&#8221; für den entsprechenden Benutzer. Hier hat sich also die Crontab Einstellung versteckt. Ihr könnt nun oben eine &#8220;Neue Aufgabe hinzufügen&#8221;:</p>
<p><img title="Crontab Aufgaben von wwwrun" alt="Crontab Aufgaben von wwwrun" src="http://kau-boys.de/wp-content/uploads/2009/11/Crontab-Aufgaben-von-wwwrun.png"/></p>
<p>In die Felder Minute, Stunde und Tag des Monat könnt ihr entweder eine Zahl eingeben oder einen Stern, um den Cronjob für jeden Wert auszuführen. In dem Beispiel wird als der Cronjob an jedem Tag eines Monat um 00:00 Uhr ausgeführt. Wenn ihr den Cronjob auch jeden Monat und an jedem Tag einer Woche ausführen lassen möchtet, dann tragt unten ebenfalls einen Stern ein.</p>
<p><img title="Bearbeitung der Crontab-Aufgabe von wwwrun" alt="Bearbeitung der Crontab-Aufgabe" src="http://kau-boys.de/wp-content/uploads/2009/11/Bearbeitung-der-Crontab-Aufgabe-von-wwwrun.png"/></p>
<p>Wenn ihr ein lokales Programm oder ein PHP-Skript ohne Parameter starten möchtet, könnt ihr einfach den Befehlsnamen in der Feld &#8220;Befehl&#8221; eintragen. Wenn ihr allerdings etwas in der Form &#8220;php /srv/www/vhosts/example.com/httpdocs/skript.php?var1=value&#8221; eintragt, dann versucht PHP die Datei mit dem Namen &#8220;skript.php?var1=value&#8221; zu finden, die es natürlich nicht gibt. Ein sehr einfacher Trick dies zu lösen ist die Verwendung von <a href="http://de.wikipedia.org/wiki/Wget">wget</a>. Dieser Befehlt wird normalerweise dazu genutzt eine Datei von einer Website zu laden. Damit aber nicht eine Datei mit dem Namen &#8220;skript.php?var1=value&#8221; erzeugt wird, nutzen wir den Parameter &#8220;&#8211;spider&#8221;, der den Download unterdrückt. Wir führen also somit einfach nur ein PHP-Skript auf einer beliebigen URL aus. Sobald alle Einstellungen vorgenommen sind, könnt ihr die Einstellungen mit einem Klick auf &#8220;OK&#8221; speichern.</p>
<p><img title="Crontab-Aufgaben von wwwrun aktualisiert" alt="Crontab-Aufgaben aktualisiert" src="http://kau-boys.de/wp-content/uploads/2009/11/Crontab-Aufgaben-von-wwwrun-aktualisiert.png"/></p>
<p>Ihr solltet nun in der Übersicht euren eben erzeugt Cronjob sehen können. Sobald der Zeitpunkt, den ihr angegeben habt erreicht ist, sollte das Skript ausgeführt werden. Zu den Cronjobs wird ein Bereicht erstellt und an eine E-Mail-Adress verschickt. Diese könnt ihr über &#8220;Einstellungen&#8221; eintragen:</p>
<p><img title="Crontab-Eigenschaften von wwwrun bearbeiten" alt="Crontab-Eigenschaften bearbeiten" src="http://kau-boys.de/wp-content/uploads/2009/11/Crontab-Eigenschaften-von-wwwrun-bearbeiten.png"/></p>
<p>Bei meinen Cronjobs wurde bisher noch keine E-Mail verschickt. Eventuell wird auch nur im Fehlerfall eine Mail mit der Fehlermeldung verschickt. Oder aber mein Server leitet die Mail nicht korrekt an den externen 1&#038;1 Mailserver weiter, da es sich bei der E-Mail-Adresse um eine Domain handelt, die er selbst verwaltet. Sobald ich das Rätsel gelöst habe werde ich euch natürlich davon berichten.</p>
<p>Ich hoffe der Artikel konnte euch weiterhelfen. Kennt ihr vielleicht auch noch eine tollt versteckte Funktion? Oder sucht ihr eine bestimmte Einstellung? Über Kommentare würde ich mich wie immmer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/490/webserver/plesk-cronjob-fuer-ein-php-skript-mit-parametern-einrichten/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Mail Versand per SMTP auf 1&amp;1 Linux Root Server einrichten</title>
		<link>http://kau-boys.de/466/webserver/mail-versand-per-smtp-auf-1un1-linux-root-server-einrichten?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mail-versand-per-smtp-auf-1un1-linux-root-server-einrichten</link>
		<comments>http://kau-boys.de/466/webserver/mail-versand-per-smtp-auf-1un1-linux-root-server-einrichten#comments</comments>
		<pubDate>Thu, 05 Nov 2009 13:17:58 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=466</guid>
		<description><![CDATA[Ich bin auf einen neues Problem mit dem Standard-Setup der 1&#038;1 Linux Root Server getoßen. Vor dem Umzug auf den Root Server wurde ein 1&#038;1 Managed Homepage Server genutzt. Dieser hat keinen eigenen Mailserver installiert. Der Root Server hingegen verschickt die Mails direkt an den Empfänger und nicht wie der Managed Server über den 1&#038;1 [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin auf einen neues Problem mit dem Standard-Setup der 1&#038;1 Linux Root Server getoßen. Vor dem Umzug auf den Root Server wurde ein 1&#038;1 Managed Homepage Server genutzt. Dieser hat keinen eigenen Mailserver installiert. Der Root Server hingegen verschickt die Mails direkt an den Empfänger und nicht wie der Managed Server über den 1&#038;1 SMTP Server. Doch wieso ist das ein Problem?</p>
<p>Nun, durch das zunehmende Problem von SPAM werden bei den meisten Mailanbeitern alle Mails von Severn abgelehnt, die nicht als vertrauerswürdiger Mailserver in einer Whitelist eingetragen sind. Der eigene Root-Server ist in diesen Listen allerdings fast nie gelistet. Beim Versuch eine Mail an einen Freemailer wie z.B. GMX zu senden resultiert dann in einer Ablehnung seitens GMX. Diese sehen in der Regel wie folgt aus:</p>
<p><span id="more-466"></span></p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
Hi. This is the qmail-send program at sXXXXXXXX.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

&lt;user@gmx.de&gt;:
XXX.XXX.XX.XXX does not like recipient.
Remote host said: 550-5.7.1 {mx087} Sorry, your helo has been denied.
550 5.7.1 ( http://portal.gmx.net/serverrules ) Giving up on XXX.XXX.XX.XXX.
</pre>
<p>Die Lösung des Problems ist die Versendung der Mail über den SMTP-Server von 1&#038;1. Hierbei gibt es allerdings ein kleines Problem. Damit der 1&#038;1 Mailserver nicht als SPAM-Verteiler missbraucht werden kann, muss sich das sendende Skript an diesem Server authentifizieren. Dazu ist eine beliebiege E-Mail Adresse eures Servers notwendig. Ich würde euch empfehlen dazu eine spezielle Adresse wie z.B. &#8220;websitesend@example.com&#8221; anzulegen.</p>
<p>Das wäre soweit auch kein Problem, allerdings unterstützen einigen Skriptsprachen nicht von Hause aus die SMTP-Authentifizierung an einem Server. Auch PHP bietet leider keinerlei Einstellungen für die Authentifizierung. Lediglich der Mailserver kann angegeben werden, über den die Mail versendet werden soll. Die <a href="http://de.php.net/manual/de/function.mail.php">mail()</a> Funktion von 1&#038;1 könnt ihr also nicht verwenden. </p>
<p>Abhilfe schafft hier eine Mail-Klasse, die auch eine SMTP-Authentifizierung anbieten. Ich nutze schon seit längerem in allen Projekte die PHP-Klasse <a href="http://phpmailer.worxware.com/">PHPMailer</a>. Diese bietet auch eine SMTP-Authentifizierung. Einfache Beispiele zur <a href="http://phpmailer.worxware.com/index.php?pg=examplebsmtpna">Verwendung der SMTP-Authentifizierung mit PHPMailer</a> findest ihr auch auf der Website von PHPMailer. Ein Beispiel für den Versand einer Mail über den SMTP von 1&#038;1 könnte wie folgt aussehen:</p>
<pre class="brush: php; title: ; notranslate">
require_once('class.phpmailer.php');
$mail = new PHPMailer();
$mail-&gt;CharSet = 'utf-8';
$mail-&gt;IsSMTP();
$mail-&gt;SMTPAuth = true;
$mail-&gt;Host = &quot;smtp.1und1.de&quot;;
$mail-&gt;Username = &quot;websitesend@example.com&quot;;
$mail-&gt;Password = &quot;password_for_websitesend&quot;;
$mail-&gt;AddReplyTo('your_mail_address@example.com');
$mail-&gt;Subject = 'Subject of the mail';
$mail-&gt;AltBody = 'Text for users without a HTML mail viewer';
$mail-&gt;MsgHTML('Text for users with a HTML ready mail viewer');
$mail-&gt;AddAddress('user@gmx.de');
if(!$mail-&gt;Send()) {
	echo &quot;Fehler beim Senden der Mail: &quot; . $mail-&gt;ErrorInfo;
} else {
	echo &quot;Mail wurde erfolgreich versandt!&quot;;
}
</pre>
<p>Zugegebenermaßen sind das sehr vielke Zeilen für den Mailversand einer einzelnen Mail. Aber leider ist es nicht sehr viel kürzen möglich. Damit ihr aber nicht in jedem Skript, in dem ihr eine Mail versenden möchtet, alles von neuem schreiben und bei Änderungen in jedem Skript anpassen müsst, empfiehlt es sich die Zeilen 1.8 in eine PHP-Datei zu exporieren und diese per &#8220;require&#8221; in das Skript zu importieren, in der ihr die Mail verschicken wollt.</p>
<p>Die Verwendung der PHPMailer Klasse bietet aber auch ein paar Vorteile gegenüber der mail() Funktion von PHP. Ihr könnt nämlich sehr einfach weitere Empfänger hinzufügen, indem ihr die &#8220;$mail->AddAddress()&#8221; mehrfach anwendet. Es gibt auch eine Funktion für Kopien: &#8220;$mail->AddCC()&#8221; und blinde Kopien: &#8220;$mail->AddBCC()&#8221; oder auch Anhänge: &#8220;$mail->AddAttachment()&#8221;. Seht euch dazu einfach mal die <a href="http://phpmailer.worxware.com/index.php?pg=methods">Liste der Methoden</a> an.</p>
<p>Ich hoffe, dass euch die kleine Anleitung helfen konnte. Wenn ihr noch Anmerkungen oder Fragen habt, oder auch eine andere gute PHP-Klasse oder eine entsprechende Funktion für andere Skrtipsprachen kennt, würde ich mich über einen Kommentar sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/466/webserver/mail-versand-per-smtp-auf-1un1-linux-root-server-einrichten/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Google Maps Suggest &#8211; Adress-Autovervollständigung mit Scriptaculous</title>
		<link>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous</link>
		<comments>http://kau-boys.de/364/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ändigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zusätzlich kann sie dazu dienen, dass in einem Formular möglichst gültige Werte gespeichert werden. Selbstverständlich müssen alle Daten serverseitig erneut überprüft werden. Ich möchte heute zeigen, wie einfach es mit Scriptaculous möglich ist, eine Autovervollständigung mit [...]]]></description>
			<content:encoded><![CDATA[<p>Viele nutzen Autovervollständigungen auf ihrer Website. Es ist nicht nur eine sehr beeindruckende Technik, sondern zudem eine sehr nutzerfreundliche. Zusätzlich kann sie dazu dienen, dass in einem Formular möglichst gültige Werte gespeichert werden. Selbstverständlich müssen alle Daten serverseitig erneut überprüft werden.</p>
<p>Ich möchte heute zeigen, wie einfach es mit Scriptaculous möglich ist, eine Autovervollständigung mit Google-Maps-Adressen umzusetzen. Da man per AJAX nicht auf fremde Website einen AJAX-Request durchführen kann, mü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; title: ; notranslate">
$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; übergeben. Der Parameter &#8220;output&#8221; gibt hierbei das von Google Maps zurückgelieferte Format an. Ich habe hier JSON verwendet und wandle die Daten anschließ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ü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ückgegeben. Mit Hilfe dieses einen Parameters könnt ihr also sehr schnell die Funktion auf andere Spracheversionen eurer Seite anpassen.</p>
<p>Damit ihr überhaupt eine Anfrage an Google Maps stellen dürft, benö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ängen mü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ü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üssen wir erst einmal ein Formular mit einem Textfeld erzeugen. Außerdem benö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; title: ; notranslate">
&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ässt sich mit einer einzigen Zeile JavaScript erledigen. Selbstverständlich müssen dazu noch im Kopfbereich die &#8220;prototype.js&#8221; sowie anschließend die &#8220;scriptaculous.js&#8221; eingebunden werden. Die Funktion <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter">Ajax.Autocompleter()</a> gehö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ße ist kein Witz, sondern die Adresse von Google Deutschland. Eine weitere schöne Eigenschaft von Google Maps ist die automatische Rechtschreibkorrektur, die bei fehlehaften Eingaben durchgeführt wird. Selbst eine Eingabe wie &#8220;plazt der luftblöcke&#8221; führt trotzdem zu dem gewünschten Platz vor dem ehemaligen Berliner Flughafen. Um die Sache testen zu können, habe ich hier ein kleines Beipsiel erstellt, dass ihr euch auch gerne im Quellcode runterladen könnt. Ich habe zusätzlich noch eine Funktion verwendet, die den Suchbegriff hervorhebt:</p>
<p class="aligncenter">
<a href="http://kau-boys.de/beispiele/google_maps_suggest/maps.html" class="awesome large breakerbay">Beispiel</a> <a href="http://kau-boys.de/beispiele/google_maps_suggest/google_maps_suggest.zip" class="awesome large breakerbay" style="margin-left:20px;">Download</a>
</p>
<p>Wir ihr also sehen könnt, ist es mit der Ajax.Autocompleter() Funktion und einem servreseitigen Skript sehr einfach möglich, auch Daten von anderen Seiten auszuliefern. Das dazu benötigte PHP Skript kann durch kleine Veränderungen an die entsprechende extrene Datenquelle und das zurückgelieferte Format angepasst werden. Die Funktion lässt sich aber natürlich auch genauso gut mit jQuery oder einem anderen Framework umsetzen. Dazu muss dann aber eventuell das zurückgelieferte Format des PHP Skript auch noch angepasst werden.</p>
<p>Ich hoffe das Beispiel hat euch gezeigt, wie vielfältig sich eine Autovervollständigung einsetzen lässt. Habt ihr auch schon einmal mit externen Daten gearbeitet? Oder habt ihr vielleicht eine Idee, konntet sie aber bisher nicht umsetzen? Über ein Kommentar dazu würde ich mich sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/364/webentwicklung/google-maps-suggest-adress-autovervollstaendigung-mit-scriptaculous/feed</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Die Grenzen der Frame-Weiterleitung sprengen</title>
		<link>http://kau-boys.de/315/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=die-grenzen-der-frame-weiterleitung-sprengen</link>
		<comments>http://kau-boys.de/315/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ünstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der Möglichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen. Manch einer wird sich eventuell darüber freuen, da er irgendwo ein kostenloses Hosting mit einer sehr langen [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Hoster bieten günstige Domains ohne Webhosting Komponenten an. Bei einigen Hoster wie z.B. Strato handelt es sich aber leider nur um Domains mit der Möglichkeit der Frame-Weiterleitung. Das ist aber teilweise vor der Bestellung nicht zu sehen.</p>
<p>Manch einer wird sich eventuell darü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ä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ür den Besucher, wie er es erwartet. Er kann alle Links anklicken und der Hauptframe öffnet daraufhin die richtige Seite. Auch das Navigieren mit den &#8220;Vor&#8221; und &#8220;Zurück&#8221; Buttons funktioniert tadellos. Aber sobald der Benutzer eine Seite gefunden hat, die er seinen Favoriten hinzufügen möchte fängt der Ärger an. Nicht nur, dass der Name des Lesezeichens oft nur die Domain enthält, viel schlimmer ist, dass das Lesezeichen auch auf die selbige zeigt. Wenn der Besucher also später das Lesezeichen aufruft kommt er nicht auf die gewünschte Seite, sondern auf die Startseite und muss von dort aus erst wieder mü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ällen, das eure Internet-Seiten, die tausende von Seiten haben können, bei Suchmaschinen genau EINE Seite als Eintrag enthalten. Und das ist die Startseite oder genauer gesagt das Frameset der Domain. Eine Mö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änden auch nicht finden können. Dabei kö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ö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ü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ä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; title: ; notranslate">
&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 ändert die URL des Top-Frame auf einen neuen Wert. Wenn der Besucher also eure Domain aufruft, die lediglich eine Frame-Weiterleitung untersützt, sorgt der Code dafür, dass das oberste Frameset auf eine andere URL umgeleitet wird. Hierbei müsste ihr natrülich &#8220;example.com&#8221; durch eure eigene Domain ersetzen (das &#8220;http://&#8221; dabei nicht vergessen). Für alle Besucher, die keine JavaScript Unterstützung aktiviert haben solltet ihr zusätzlich einen NOSCRIPT Tag einfügen der einen Link enthält:</p>
<pre class="brush: xml; gutter: false; title: ; notranslate">
&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önntet ihr auch noch den Request an die Domain anhä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 ähnlich in einer anderen Skriptsprache):</p>
<pre class="brush: php; gutter: false; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
	top.location.href = &quot;http://example.com&quot;&lt;?php echo $_SERVER['REQUEST_URI']; &gt;
&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önere Seite präsentieren, als eine die nur den Link auf weißem Untergrund enthä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önnt ihr euch das ganze in einem kleinen Beispiel auch ansehen.</del><ins datetime="2009-12-06T14:33:09+00:00"> <a href="http://kau-boys.de/505/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ändert. Dazu solltet ihr einfach JavaScript vorübergehen deaktivieren, damit ihr auch die Seite und den Quelltext betrachten könnt. Wenn ihr dann JavaScript wieder aktiviert und die Seite aktualisiert, solltet ihr auf meinen Blog umgeleitet werden.</ins></p>
<p><a href="http://kau-boys.ramarka.de">Beispiel</a></p>
<p>Mit diesem Trick könnt ihr also die Frame-Weiterleitung umgehen, aber ihr präsentiert dann dem Besucher die entsprechend andere URL, als sie aufgerufen haben. Dies sollte aber einer schönen URL aber dafür der eingeschränkten Suchmaschinenfreundlichkeit und der Verhinderung von Lesezeichen bevorzugt werden. Ihr könnt weiterhin die schöne URL in Mails verbreiten und den Besucher trotzdem umleiten. Wenn ihr die Domain vollständig nutzen möchtet bleibt euch leider nichts anderes Möglich, als diese in das Webhosting-Paket zu ü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/315/webentwicklung/die-grenzen-der-frame-weiterleitung-sprengen/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>CakeFest 2009 in Berlin</title>
		<link>http://kau-boys.de/26/webentwicklung/cakefest-berlin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakefest-berlin</link>
		<comments>http://kau-boys.de/26/webentwicklung/cakefest-berlin#comments</comments>
		<pubDate>Mon, 13 Jul 2009 16:12:44 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[cake]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=26</guid>
		<description><![CDATA[Ich war dabei! Wie ist war und was es alles zu sehen gab seht könnt ihr auf der offiziellen CakeFest website nachlesen. Empfehlenswert ist auch ein Blick auf die Twitter Nachrichten. Auf der Suche nach neuen Inspirationen zur PHP-Programmierung bin ich auf das Buch Webentwicklung mit CakePHP gestoßen. Der Inhalt des Buchs beschrieb ziemlich genau [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cakefest.org"><img class="alignright" title="cakefest Berlin" src="http://kau-boys.de/wp-content/uploads/2009/07/cakefest_berlin_gray_large.png" alt="cakefest 2009 in Berlin" width="222" height="91" /></a>Ich war dabei! Wie ist war und was es alles zu sehen gab seht könnt ihr auf der <a href="http://cakefest.org">offiziellen CakeFest website</a> nachlesen. Empfehlenswert ist auch ein Blick auf die Twitter Nachrichten.</p>
<p>Auf der Suche nach neuen Inspirationen zur PHP-Programmierung bin ich auf das Buch <a href="http://webentwicklung-mit-cakephp.de/">Webentwicklung mit CakePHP</a> gestoßen. Der Inhalt des Buchs beschrieb ziemlich genau das Projekt, dass ich für meine Bachelor-Thesis gewählt hatte. Ich habe mich auch damals an den Prinzipien von Ruby-on-Rails orientiert. Wenn das Buch ein halbes Jahr früher erschienen wäre, hätte ich viel Zeit und Probleme sparen können.</p>
<p><span id="more-26"></span></p>
<p>Ich war von den Prizipien von CakePHP sehr überzeugt. Beim Besuch auf der <a href="http://cakephp.org">Website von CakePHP</a> bin ich dann auf das CakeFest aufmerksam geworden. Und wenn man die einmalige Gelegenheit hat, so ein Event in Berlin erleben zu können muss man die Gelegenheit auch nutzen.</p>
<p>Für alle, die sich schon immer gewünscht haben Programme so leicht wie in Ruby-on-Rails programmieren zu können, aber leider an PHP gebunden sind, ist CakePHP mit Abstand das beste Framework in PHP, da es die besten Ideen von Ruby-on-Rails aufgreift und durch viele weitere geniale Ideen erweitert.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/26/webentwicklung/cakefest-berlin/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kau-Boy&#8217;s AutoCompleter Plugin</title>
		<link>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kau-boys-autocompleter-plugin</link>
		<comments>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin#comments</comments>
		<pubDate>Thu, 02 Jul 2009 16:11:34 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=24</guid>
		<description><![CDATA[Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beiträge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten. Der eingegebene Text kann in den Titel der Beiträge und/oder im Inhalt gesucht werden. Es kann zusätzlich die Formatierung der Ergebnisse über eine eigene CSS Datei an den Blog angepasst werden. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codex.wordpress.org/AJAX_in_Plugins"></a><a href="http://codex.wordpress.org/AJAX_in_Plugins"></a>Dieses Plugin verwendet den Ajax.Autocompleter von script.aculo.us bzw. die jQuery Autocomplete Funktoin um Beiträge zu finden, die den Suchbegriff im Titel oder Inhaltstext enthalten.</p>
<p>Der eingegebene Text kann in den Titel der Beiträge und/oder im Inhalt gesucht werden. Es kann zusätzlich die Formatierung der Ergebnisse über eine eigene CSS Datei an den Blog angepasst werden. Es kann jeweils der Titel oder zusätzlich ein Teil des Inhalts angegeben werden, wobei hier auch die Länge des auszugebenden Inhaltes eingestellt werden kann.</p>
<p><span id="more-24"></span></p>
<h2>Installation:</h2>
<h3>Installation über die WordPress Adminstrator-Seiten:</h3>
<ol>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>Suche nach <code>kau-boy</code> und wähle das Plugin aus</li>
<li>Wähle die Aktion <code>Jetzt installieren</code></li>
<li>Klicke auf <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menüpunkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h3>Installation unter Verwendung der WordPress Adminstrator-Seiten:</h3>
<ol>
<li>Lade die zip-Datei des Plugins herunter: <a href="http://downloads.wordpress.org/plugin/kau-boys-autocompleter.zip">kau-boys-autocompleter.zip</a></li>
<li>Gehe zur Admin-Seite <code>Plugins -&gt; Installieren</code></li>
<li>Wähle den Link <code>Hochladen</code> unter <code>Plugins Installieren</code> Überschrift</li>
<li>Wähle die zip-Datei aus und klicke <code>Jetzt installieren</code></li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menüpunkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h3>Installation unter Verwendung von FTP</h3>
<ol>
<li>Lade die zip-Datei des Plugins herunter: <a href="http://downloads.wordpress.org/plugin/kau-boys-autocompleter.zip">kau-boys-autocompleter.zip</a></li>
<li>Entpacke es und lade es in dein <code>/wp-content/plugins/</code> Verzeichnis hoch</li>
<li>Aktiviere das Plugin über den <code>Plugins</code> Menüpunkt in WordPress</li>
<li>Du musst eventuell die Einstellungen anpassen, gerade wenn dein Suchfeld eine andere ID als <code>s</code> hat</li>
</ol>
<h2>Screenshots:</h2>
<h3>Screenshot des Plugins in einem neuen WordPress blog</h3>
<p><img title="Screenshot des Plugins in einem neuen WordPress blog" src="http://kau-boys.de/wp-content/uploads/2009/08/screenshot-1.png" alt="Screenshot des Plugins" /></p>
<h3>Screenshot der Einstellungsseite (auch in englisch erhältlich)</h3>
<p><img title="Screenshot der Einstellungsseite (auch in englisch erhältlich)" src="http://kau-boys.de/wp-content/uploads/2009/08/screenshot-2-de.png" alt="Screenshot der Einstellungsseite" /></p>
<h2>Versionsgeschichte:</h2>
<ul>
<li><strong>3.1.2</strong> Zurücksetzen der vorherigen Änderungen, da sie das Problem nicht lösen sondern es eher auslösen</li>
<li><strong>3.1.1</strong> Ersetzen von appendTo() mit prependTo() im jquery.autocompleter plugin zum beheben von Überlagerungs-Problemen</li>
<li><strong>3.1</strong> Ausblenden von PHP Warnungen, wenn WP_DEBUG inaktiv ist und Einfügen des Ergebnis-DIV in den Kopf des BODY Tag</li>
<li><strong>3.0.4</strong> Beheben eines Tippfehlers in der jQuery URL</li>
<li><strong>3.0.3</strong> Beheben eines Tippfehlers im jQuery-Selektor</li>
<li><strong>3.0.2</strong> Retag als 3.0.2 aufgrund eines Deploment-Fehlers im Respository</li>
<li><strong>3.0.1</strong> Schneller bugfix für Prototype CSS und JavaScript</li>
<li><strong>3.0</strong> Einsatz von AJAX, so wie es hier beschrieben wird: <a href="http://codex.wordpress.org/AJAX_in_Plugins">http://codex.wordpress.org/AJAX_in_Plugins</a></li>
<li><strong>2.5</strong> Anpassen das Plugin an WordPress Installationen, bei denen die wp-config.php eine Orderebene über dem ROOT Verzeichnis liegt.</li>
<li><strong>2.4</strong> Fehler mit html Entitäten im Filter beheben</li>
<li><strong>2.3</strong> Fehler des JavaScript in IE8 in Verbindung mit Prototype beheben</li>
<li><strong>2.2</strong> Deaktivieren der Suche für Suchfelder im Adminbereich und Ermöglichen der Verwendung zusammen mit dem relevanssi Plugin</li>
<li><strong>2.1</strong> Hinzufügen einer neuen Version von jQuery Autocomplete</li>
<li><strong>2.0.1</strong> Entfernen von &#8220;short open tags&#8221;, die auf blogs die Fehler verursachen die &#8220;short_open_tag&#8221; nicht auf &#8220;On&#8221; gesetzt haben</li>
<li><strong>2.0</strong> Autocompleter mit mehreren Textfelder auf einer Seite nutzbar machen, verbessern der Kürzung des Inhalt von Artikeln</li>
<li><strong>1.9</strong> Beheben von Problemen mit PHP4, funktioniert nun auch mit qTranslate im &#8220;Query-Modus&#8221; (?lang=de)</li>
<li><strong>1.8</strong> Hinzufügen der Einstellung für die Länge des Titels und des Inhalts in den Ergebnissen</li>
<li><strong>1.7</strong> Erstzen von jQuery suggest durch jQuery autocomplete, da das suggest Plugin HTML Auszeichnungen zerstört</li>
<li><strong>1.6.1</strong> Verwendung des id Attributs als Standard anstelle des name Attributs</li>
<li><strong>1.6</strong> Hinzufügen der Möglichkeit das Suchfeldes anhand des name Atrrbiuts auszuwählen</li>
<li><strong>1.5.2</strong> Hinzufügen der richtigen Kodierung zu <code>html_entity_decode()</code> um das Zerteilen von XML Enitäten zu verhindern</li>
<li><strong>1.5.1</strong> Fehler im AJAX repsonse behoben, der die Einstellung für die Ergebnisfelder nicht geladen hat</li>
<li><strong>1.5</strong> Hinzufügen Auswahlmöglichkeiten für die Such- und Ergebnisfelder</li>
<li><strong>1.4.1</strong> Aktualisierung der Übersetzungsdatei</li>
<li><strong>1.4</strong> Kombinieren der Styles für jQuery und script.aculo.us, Hinzufügen  einer Einstellung zur Multibyte-Kodierung</li>
<li><strong>1.3.5</strong> Fehler bei der <code>html_entity_decode()</code> Konvertierung beseitigt</li>
<li><strong>1.3</strong> Enfternen eines Kommentars in autocompleter.js.php, welcher eine PHP header warning  erzeugt hat</li>
<li><strong>1.2</strong> Verwendung von <code>html_entity_decode()</code> um das Zerteilen von Enitäten zu verhindern</li>
<li><strong>1.1</strong> Entfernen von WordPress shortcodes um leere oder falsche Seiten zu verhindern</li>
<li><strong>1.0</strong> Möglichkeit jQuery ODER script.aculo.us zu verwenden, Übersetzen der Einstellungsseite ins Deutsche</li>
<li><strong>0.4</strong> Hinzufügen der Einstellung für die Anzahl der Suchergebnisse und der eigenen CSS Date</li>
<li><strong>0.3</strong> Hinzufügen der Einstellung für die Suchfeld ID</li>
<li><strong>0.2</strong> Erste stabile Version</li>
</ul>
<p>Wenn dir dieses Plugin gefällt oder dir etwas fehlt, würde ich mich freuen es zu erfahren. Hinterlasse einfach ein Kommentar auf dieser Seiter oder auf meiner <a href="http://wordpress.org/tags/kau-boys-autocompleter">WordPress Plugin Seite</a>.</p>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=6104701"><img style="border: 0pt none ;" src="http://kau-boys.de/wp-content/uploads/2009/07/btn_donate_LG_en_US.gif" alt="PayPal - The safer, easier way to pay online!" /></a> <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=6104638"><img style="border: 0pt none ;" src="http://kau-boys.de/wp-content/uploads/2009/07/btn_donate_LG_de_DE.gif" alt="PayPal - The safer, easier way to pay online!" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/24/wordpress/kau-boys-autocompleter-plugin/feed</wfw:commentRss>
		<slash:comments>78</slash:comments>
		</item>
	</channel>
</rss>

