<?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/"
	>

<channel>
	<title>installation.de</title>
	<atom:link href="http://www.installation.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.installation.de</link>
	<description>Ein neues WordPress-Weblog</description>
	<pubDate>Thu, 06 Aug 2009 11:48:53 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP 5.3.0 ist da. Updaten oder lassen?</title>
		<link>http://www.installation.de/2009/08/06/php-530-ist-da-updaten-oder-lassen/</link>
		<comments>http://www.installation.de/2009/08/06/php-530-ist-da-updaten-oder-lassen/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 11:44:41 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[EOF]]></category>

		<category><![CDATA[goto]]></category>

		<category><![CDATA[namespaces]]></category>

		<category><![CDATA[nowdoc]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=80</guid>
		<description><![CDATA[Vor 3 Tagen habe ich mich mit dem update von PHP 5.2.6 auf PHP 5.3.0 beschäftigt. Da das Neue ca. 15% schneller und weniger Resourcen fressen soll habe ich mich dazu entschlossen es zu benutzen.
Vorsicht: Bekannte Funktionen wie split, ereg, eregi und andere sind nun deprecated! Funktionieren aber natürlich somit trotzdem noch. Ein paar neue [...]]]></description>
			<content:encoded><![CDATA[<p>Vor 3 Tagen habe ich mich mit dem update von PHP 5.2.6 auf PHP 5.3.0 beschäftigt. Da das Neue ca. 15% schneller und weniger Resourcen fressen soll habe ich mich dazu entschlossen es zu benutzen.<br />
Vorsicht: Bekannte Funktionen wie split, ereg, eregi und andere sind nun deprecated! Funktionieren aber natürlich somit trotzdem noch. Ein paar neue Feautures gibt es auch wie z.B. goto (sollte man aber nur bedacht einsetzen. Es ist z.B. KEINE alternative zu der Verwendung Funktionen oder Switches), <a href="http://de.php.net/manual/de/language.namespaces.php">namespaces</a> (für komplexere projekte mit vielen dateien und klassen sehr sehr nützlich) und <a href="http://de.php.net/manual/de/language.types.string.php#language.types.string.syntax.nowdoc">nowdoc</a> syntax (&lt;&lt;&lt;EOT &#038; &lt;&lt;&lt;EOD etc. | passend zu meinem Beitrag <a href="http://www.installation.de/2009/05/25/die-ausgabemethode-eof-in-php/">Die Ausgabemethode &lt;&lt;&lt;EOF in PHP</a>)</p>
<p>Alle Neuerungen und Änderungen und Migrations-Guide gibt es bei php.net <a href="http://www.php.net/archive/2009.php#id2009-06-30-1">http://www.php.net/archive/2009.php#id2009-06-30-1</a>.</p>
<p>Eine beschleunigung nach dem Update konnte ich persönlich nicht 100%ig feststellen.</p>
<p>Probleme nach dem Update? Skripte laufen nicht mehr und man sieht nur noch eine weiße Seite?<br />
Dann liegt das vermutlich an Einstellungen in der php.ini. Diese wurde in PHP 5.3 neu strukturiert und kann somit leider nicht einfach durch die bestehende php.ini ersetzt werden. Wer glaubt er habe alle markanten Einstellungen in die neue php.ini übertragen dem rate ich zu einem Dateivergleichprogramm wie ExamDiff.<br />
Dieses zeigt einem alle unterschieder von der alten php.ini gegenüber der neuen php.ini an damit man auch ja nichts vergisst ;). Ich hatte z.B. vergessen short_open_tag wieder auf on zu stellen. Dies ermöglicht das coden mit &lt;? &#8230; statt nur mit &lt;?php &#8230;!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/08/06/php-530-ist-da-updaten-oder-lassen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apache SVN: Auto Update Server Dateien nach Commit</title>
		<link>http://www.installation.de/2009/06/20/apache-svn-auto-update-server-dateien-nach-commit/</link>
		<comments>http://www.installation.de/2009/06/20/apache-svn-auto-update-server-dateien-nach-commit/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 11:49:18 +0000</pubDate>
		<dc:creator>Jan</dc:creator>
		
		<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=70</guid>
		<description><![CDATA[Nach mehreren Tagen des Ärgers und suchen nach Lösungen bin ich endlich auf etwas gestoßen.
Das Problem war, dass wenn mehrere Benutzer commited haben die Benutzerrechte manchmal nicht gestimmt haben und deswegen das Update im Hook nicht ausgeführt werden konnte.

svn: Kann Datei &#34;public/debug/.svn/lock&#34; nicht öffnen: Keine Berechtigung

Die Lösung ist das Passwort und den Benutzernamen hart einzucodieren. [...]]]></description>
			<content:encoded><![CDATA[<p>Nach mehreren Tagen des Ärgers und suchen nach Lösungen bin ich endlich auf etwas gestoßen.</p>
<p>Das Problem war, dass wenn mehrere Benutzer commited haben die Benutzerrechte manchmal nicht gestimmt haben und deswegen das Update im Hook nicht ausgeführt werden konnte.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">svn: Kann Datei &quot;public/debug/.svn/lock&quot; nicht öffnen: Keine Berechtigung</pre></div></div>

<p>Die Lösung ist das Passwort und den Benutzernamen hart einzucodieren. Ist zwar nicht die schönste Lösung, aber funktioniert super. In der &#8220;post-commit&#8221; Datei steht also:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">svn update 'Pfad zu Repository'  --username 'Benutzer'  --password 'Passwort'</pre></div></div>

<p>Es gibt also nur einen Benutzer, der immer alle Dateien updated. Stellt dementsprechen den Benuzter des Ordners eurer Dateien um. Funktioniert perfekt bei mir.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">cp post-commit.tmpl post-commit
chmod +x post-commit</pre></div></div>

<p>Solltet ihr das Hookscript noch nicht ausführbar geschaltet haben.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/06/20/apache-svn-auto-update-server-dateien-nach-commit/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL Views, Procedures &#38; Functions (Trigger)</title>
		<link>http://www.installation.de/2009/06/19/mysql-views-procedures-functions-trigger/</link>
		<comments>http://www.installation.de/2009/06/19/mysql-views-procedures-functions-trigger/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 16:17:31 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Function]]></category>

		<category><![CDATA[Procedure]]></category>

		<category><![CDATA[SQL]]></category>

		<category><![CDATA[Trigger]]></category>

		<category><![CDATA[View]]></category>

		<guid isPermaLink="false">http://www.installation.de/2009/06/19/mysql-views-procedures-functions-trigger/</guid>
		<description><![CDATA[Ich zitiere hier lediglich zwei interessante Artikel zu dem oben genannten Thema:
VON: http://www.fractalcenter.de/?p=11
Bevor ich bei meiner jetzigen Firma angestellt war, habe ich mir eingebildet etwas über SQL (MySQL) zu wissen. Dann habe ich jedoch den Microsoft-SQL-Server kennen gelernt. Ich bin generell kein Microsoft Fan, der SQL-Server ist aber schon ein sehr leistungsfähiger Server. Durch die [...]]]></description>
			<content:encoded><![CDATA[<p>Ich zitiere hier lediglich zwei interessante Artikel zu dem oben genannten Thema:</p>
<p><strong>VON: </strong><a title="http://www.fractalcenter.de/?p=11" href="http://www.fractalcenter.de/?p=11"><strong>http://www.fractalcenter.de/?p=11</strong></a></p>
<p>Bevor ich bei meiner jetzigen Firma angestellt war, habe ich mir eingebildet etwas über SQL (MySQL) zu wissen. Dann habe ich jedoch den Microsoft-SQL-Server kennen gelernt. Ich bin generell kein Microsoft Fan, der SQL-Server ist aber schon ein sehr leistungsfähiger Server. Durch die bereits vorhandenen Strukturen musste ich mich erst einmal durchfitzen unter anderem auch durch Sichten und Prozeduren. Aus heutiger Sicht weiß ich nicht, wie ich ohne diese SQL Werkzeuge auskommen konnte.</p>
<p>Kommen wir als erstes zu den Sichten (Views):</p>
<p>Um den Sinn einer Sicht zu verstehen, versuche ich es einmal mit einem Beispiel. (dies ist ein MySQL-Code in anderen SQL-Sprachen weicht dieser aber nicht allzu sehr ab)</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> terms <span style="color: #993333; font-weight: bold;">AS</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> term<span style="color: #66cc66;">.</span>term_id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">,</span> slug<span style="color: #66cc66;">,</span> term_group<span style="color: #66cc66;">,</span>
taxonomy<span style="color: #66cc66;">,</span> description<span style="color: #66cc66;">,</span> parent<span style="color: #66cc66;">,</span> count
<span style="color: #993333; font-weight: bold;">FROM</span> wp_terms <span style="color: #993333; font-weight: bold;">AS</span> term
<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> wp_term_taxonomy <span style="color: #993333; font-weight: bold;">AS</span> tax
<span style="color: #993333; font-weight: bold;">ON</span> term<span style="color: #66cc66;">.</span>term_id <span style="color: #66cc66;">=</span> tax<span style="color: #66cc66;">.</span>term_id</pre></div></div>

<p>Mit <code>CREATE VIEW * AS</code> wird eine Sicht eingeleitet. Ich habe hier mal als Beispiel die Wordpress Datenbank genommen um einen <code>JOIN</code> über die Tabellen wp_term_taxonomy und wp_terms zu erstellen. Die Frage die ich mir am Anfang gestellt habe war: <strong>“Wozu soll ich das so umständlich machen?”</strong>. Man kann die SQL ja auch direkt in den PHP-Quellcode schreiben. Das mag zwar fürs erste stimmen, wenn man das Ganze aber etwas weiter spinnt, wird es vielleicht deutlicher. In<a href="http://www.wordpress.org"> Wordpress</a> ist es prinzipiell möglich den Tabellenpräfix zu ändern. Wenn ich das im Nachhinein ändere, wird das in der Wordpress-Programmierung automatisch erledigt, nehmen wir jetzt aber weiter an, dass ich mir ein Plugin oder eine eigene Seite mit SQL-Abfragen geschrieben habe. Ich müsste jetzt manuell durch alle Abfragen durchgehen und die Tabellen umbenennen. Wenn ich aber Sichten einsetzte muss ich dies nur einmalig zentral ändern und alle Scripte die auf die Sicht zugreifen funktionieren weiterhin. Sichten helfen Redundanz zu vermeiden. Ich muss den SQL-Code nicht mehrmals hinterlegen, sondern kann ihn an einer Stelle ändern. Für Webmaster, die sich bis jetzt nur mit “kleinen” Seiten auseinander gesetzt haben, ist der Sinn vielleicht nicht offensichtlich, wenn man jedoch eine Webanwendung mit dutzenden von Tabellen hat, lernt man Views sehr schnell zu schätzen.</p>
<p>Als zweites möchte  ich <strong>Prozeduren</strong> vorstellen.</p>
<p>Eine Prozedur ist ein universelle Werkzeug in der täglichen Arbeit mit SQL. Eine Prozedur ermöglicht es viele SQL-Anweisungen in einer Anweisung zusammen zu fassen. Nehmen wir an, dass ich den Umsatz pro Kunde und Monat ermitteln will. Das geht sicherlich recht einfach mit einigen <code>JOINS</code> und einer <code>GROUP BY</code> Klausel. Jedoch müsste ich diese Werte bei jeder Abfrage erneut generieren. Bei 10.000 Kunden mag das vielleicht noch gehen. Bei 1.000.00 Kunden wird es schon recht aufwendig für den SQL-Server. Die Last ist auf jeden Fall enorm hoch. Am einfachsten wäre es doch, diese Zahlen einmal in der Woche (oder täglich) in eine gesonderte Tabelle weg zu schreiben. Genau dass kann man mit Hilfe einer Prozedur und eines Cronjobs machen.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">DELIMITER $$
<span style="color: #993333; font-weight: bold;">DROP</span> PROCEDURE <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`proc_umsatz_monatlich`</span>$$
<span style="color: #993333; font-weight: bold;">CREATE</span> PROCEDURE <span style="color: #ff0000;">`proc_umsatz_monatlich`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
BEGIN
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> umsatz_monatlich
<span style="color: #993333; font-weight: bold;">SELECT</span> kunde_id<span style="color: #66cc66;">,</span> umsatz
<span style="color: #993333; font-weight: bold;">FROM</span> rechnungen
<span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> YEAR<span style="color: #66cc66;">&#40;</span>datum<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> MONTH<span style="color: #66cc66;">&#40;</span>datum<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> kunde_id
END$$
DELIMITER ;</pre></div></div>

<p><strong>Der Vorteil von Prozeduren liegt auf der Hand.</strong> Man kann sie mit Variablen füttern und somit das Ergebnis beeinflussen (In einer Prozedur kann man z.B. auch<strong> <code>IF</code> Abfragen</strong> verwenden). Die Prozedur selbst kann beliebig verwandelt und an neue Gegebenheiten angepasst werden, ohne dass sämtlicher SQL-Code umgeschrieben werden muss. Das hat vor allem Vorteile für z.B. die Suche einer Seite. Diese wir normalerweise mit wenigen Parametern angesprochen (Suchbegriff und ggf. Einschränkungen wie Zeitraum o.ä.) und gibt als Ergebnis eine Tabelle zurück. Ich musste in unsere Suche eine Tabelle zusätzlich einbinden. Das ging ohne eine Zeile im PHP-Quellcode zu verändern, nur indem ich die Prozedur verändert habe. Es gibt Programmierer, vor allem in der professionellen Programmierung, die der Meinung sind, dass ein Client (das Clientprogramm) <strong>keinen direkten Zugriff</strong> auf die Datenbank haben darf. Das ist ein recht radikaler Ansatz, dem ich mich nicht anschließen möchte. Sinnvoll wäre es aber z.B. dass man dem Client, im Falle der Webprogrammierung dürfte das zumeist “www-data” sein, <strong>nur <code>SELECT</code> oder <code>UPDATE</code> Befehle erlaubt</strong>. <code>DROP</code> und <code>DELETE</code> sind nur Prozeduren vorbehalten. Das würde dem Schutz vor SQL-Injection einigen Vorschub leisten. Wenn man sogar soweit geht, die Einschränkung auf <code>UPDATE</code> Befehle auszuweiten, wäre das ein großer Sicherheitsgewinn.<br />
Eine weitere wichtige Funktion von Prozeduren soll das nachfolgende Beispiel verdeutlichen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> PROCEDURE curdemo<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
BEGIN
DECLARE done INT <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #cc66cc;">0</span>;
DECLARE a CHAR<span style="color: #66cc66;">&#40;</span>16<span style="color: #66cc66;">&#41;</span>;
DECLARE b<span style="color: #66cc66;">,</span>c INT;
DECLARE cur CURSOR <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">DATA</span> <span style="color: #993333; font-weight: bold;">FROM</span> test<span style="color: #66cc66;">.</span>t1;
DECLARE CONTINUE HANDLER <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">NOT</span> FOUND <span style="color: #993333; font-weight: bold;">SET</span> done <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>;
OPEN cur1;
REPEAT
FETCH cur1 <span style="color: #993333; font-weight: bold;">INTO</span> a<span style="color: #66cc66;">,</span> b;
<span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> done THEN
<span style="color: #993333; font-weight: bold;">IF</span> b &amp;lt; c THEN
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> test<span style="color: #66cc66;">.</span>t3 <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span>a<span style="color: #66cc66;">,</span>b<span style="color: #66cc66;">&#41;</span>;
ELSE
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> test<span style="color: #66cc66;">.</span>t3 <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span>a<span style="color: #66cc66;">,</span>c<span style="color: #66cc66;">&#41;</span>;
END <span style="color: #993333; font-weight: bold;">IF</span>;
END <span style="color: #993333; font-weight: bold;">IF</span>;
UNTIL done END REPEAT;
CLOSE cur;
END</pre></div></div>

<p>Man kann in einer Prozedur durch ein Ergebnis einer SQL, Zeile für Zeile durchgehen und die Datenwerte für <strong>Bedingungen, <code>INSERT</code>, <code>DELETE</code> oder <code>UPDATE</code> Befehle</strong> nutzen. Man kann einen <code>CURSOR</code> ähnlich einer <code>while</code> Schleife benutzen. Das zu den Vorteilen. Der Entscheidende Nachteil ist, die <strong>Geschwindigkeit</strong>. Wenn ich ein <code>UPDATE</code> Befehle ausführe, selbst wenn es zehntausende Zeilen betrifft, ist der Server in meist weniger als einer Sekunde fertig (Abhängig von der Tabelle, dem Index und weiterer Faktoren). Mit einer <code>CURSOR</code> Operation kann ich prinzipiell die gleiche Funktion ausführen, wie mit dem <code>UPDATE</code> Befehl, diese würde jedoch erheblich länger Dauern. <strong>Deshalb ein Wort der Warnung</strong>. <code>CURSOR</code> Operationen nur mit Bedacht einsetzen und alle Alternativen vorher ausschöpfen. Als bewährtes Mittel um diesen SQL Befehl zu vermeiden, haben sich für mich <strong>temporäre Tabellen</strong> erwiesen. Man kann das Ergebnis einer <code>SELECT</code> Anweisung in eine Tabelle speichern und diese dann für weiter gehende Aktionen benutzen.<br />
Dazu fällt mir wieder meine Suche ein. Als erstes erstelle ich eine Temporäre Tabelle mit bestimmten IDs die ich aus den Einschränkungen <em>Zeitraum</em> bzw. <em>Thema</em> gewinne. Diese IDs benutze ich dann als Grundlage für die weitere Recherche nach dem Suchwort. Anfänglich hat die Ausführung ca. 30 Sekunden gedauert.</p>
<p>Das ist auch noch ein wichtiger Punkt, den ich ansprechen möchte, obwohl es die meisten Programmierer wissen sollten. Man sollte erst seinen Code schreiben, so dass er einfach zu warten ist und den Anforderungen entspricht. Erst dann sollte man sich auf den Weg von Flaschenhälsen machen, sprich optimieren. Ein gutes Beispiel ist eine Webseite, die mehrere Zehntausend Zugriffe pro Stunde hat. Wenn man diese versucht von Anfang an zu optimieren ohne eine entsprechende Serverlast zum Testen zu haben, ist das bestenfalls verschwendete Zeit, schlimmsten Falls hat man sich auf eine falsche Annahme verlassen und die Optimierung kostet mehr Ausführungszeit als der eigentlich Code.</p>
<p>Zurück zur SQL. Durch schrittweises optimieren, z.B. einen zusätzlichen Index auf die durchsuchten Tabellen und dem Einsatz von <strong>temporären Tabellen</strong> konnte ich die Ausführung auf, je nach Aufruf, 0.7 - 1.5 Sekunden herunterschrauben. Die Suche geht dabei über 14 Tabellen, von denen 7 durchsucht und 7 für die Ausgabe (z.B. Bilder, Titel, Sortierung etc.) ausgewertet werden.</p>
<p><strong>VON: </strong><a title="http://www.strassenprogrammierer.de/mysql-stored-procedures-trigger_tipp_469.html" href="http://www.strassenprogrammierer.de/mysql-stored-procedures-trigger_tipp_469.html"><strong>http://www.strassenprogrammierer.de/mysql-stored-procedures-trigger_tipp_469.html</strong></a></p>
<p>Mit der Version 5 ist MySQL den großen Datenbanken wie MS-SQL oder Oracle wieder ein Stück näher gerückt. Die wichtigsten neuen Fähigkeiten sollten Sie kennen, denn sie machen Ihre Programme sicherer und effizienter.<br />
Mit den Stored Procedures von MySQL können Sie Programmcode innerhalb des Datenbankservers ausführen lassen. Das macht MySQL um einiges mächtiger. Ein typisches Beispiel: Bislang erforderte der Umgang mit hierarchischen Datenstrukturen, etwa dem Seitenbaum einer Website, einigen Aufwand in der verwendeten Skriptsprache.<br />
So ist etwa die Abfrage &#8220;gib mir den Pfad von einer bestimmten Inhaltsseite hoch bis zur Startseite&#8221; in SQL nicht auszudrücken. Denn zur Beantwortung müsste eine variable Anzahl von Joins eingesetzt werden - je nachdem, wie viele Ebenen über der gewünschten Seite existieren.<br />
Mit der Hilfe der Stored Procedures kann man ein kleines Programm schreiben, das das Problem elegant löst. Es geht von der angegebenen Seite aus immer einen Schritt nach oben, bis der Wurzelknoten erreicht ist. Die Id-Nummern der dabei durchlaufenen Seiten werden als String zurückgeliefert. Das aufrufende Programm kann diese Information dann für weitere Auswertungen nutzen, etwa für die Anzeige des Seitenpfades (&#8221;Breadcrumbs&#8221;) in der Navigation.<br />
Angenommen, der Seitenbaum liegt in der Tabelle <em>pages </em>vor. Alle Seiten besitzen im Feld <em>uid </em>eine eindeutige Id und im Feld <em>pid </em>ist die Id ihrer übergeordneten Seite vermerkt. Die Wurzelseite hat die <em>pid </em>0. Dann erledigt folgende Funktion die gestellte Aufgabe:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">DELIMITER <span style="color: #ff0000;">'$'</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> f_rootpath <span style="color: #66cc66;">&#40;</span>param_id INT<span style="color: #66cc66;">&#41;</span> RETURNS
CHAR<span style="color: #66cc66;">&#40;</span>255<span style="color: #66cc66;">&#41;</span>
BEGIN
DECLARE retval CHAR<span style="color: #66cc66;">&#40;</span>255<span style="color: #66cc66;">&#41;</span>;
DECLARE father_id INT;
<span style="color: #993333; font-weight: bold;">SET</span> retval<span style="color: #66cc66;">=</span>param_id;
<span style="color: #993333; font-weight: bold;">SET</span> father_id<span style="color: #66cc66;">=</span>param_id;
WHILE father_id&amp;lt;&amp;gt;0 DO
<span style="color: #993333; font-weight: bold;">SELECT</span> pid <span style="color: #993333; font-weight: bold;">INTO</span> father_id
<span style="color: #993333; font-weight: bold;">FROM</span> pages <span style="color: #993333; font-weight: bold;">WHERE</span> uid<span style="color: #66cc66;">=</span>father_id;
<span style="color: #993333; font-weight: bold;">SET</span> retval <span style="color: #66cc66;">=</span>
CONCAT<span style="color: #66cc66;">&#40;</span>retval<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'-'</span><span style="color: #66cc66;">,</span>father_id<span style="color: #66cc66;">&#41;</span>;
END WHILE;
<span style="color: #993333; font-weight: bold;">RETURN</span> retval;
END$
DELIMITER ;</pre></div></div>

<p>Die Funktion führt in einer Schleife solange die Ermittlung der übergeordneten Seite durch, bis sie an der Wurzel angekommen ist und baut dabei in der Variablen <em>retval </em>nach und nach das Ergebnis auf. Das Ganze ließe sich eleganter über eine Rekursion lösen, aber die unterstützt MySQL in der aktuellen Version noch nicht. Ein Trost: Diese iterative Variante ist schneller als eine Rekursion.<br />
Die Änderung des Delimiters vom standardmäßigen Semikolon zu einem Dollarzeichen ist notwendig, sonst würden die trennenden Strichpunkte innerhalb der Funktion von MySQL als Endemarke für den aktuellen Befehl angesehen. Der letzte Befehl stellt wieder den normalen Zustand her.<br />
Um nun beispielsweise den Pfad für die Seite mit der <em>id </em>11 zu ermitteln, geben Sie ein:<br />
<code>SELECT f_rootpath(11);</code><br />
Ein Ergebnis könnte dann so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-----------------+</span>
<span style="color: #66cc66;">|</span> f_rootpath<span style="color: #66cc66;">&#40;</span>11<span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-----------------+</span>
<span style="color: #66cc66;">|</span> 11<span style="color: #66cc66;">-</span>2<span style="color: #66cc66;">-</span>1<span style="color: #66cc66;">-</span>0        <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-----------------+</span>
1 row <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><strong>Trigger arbeiten automatisch<br />
</strong><br />
Wie Stored Procedures sind auch Trigger sind serverseitige Routinen, werden aber nicht vom Programmierer aufgerufen, sondern von einem Event angestoßen, etwa dem Löschen oder Ändern eines Datensatzes.<br />
Ein Beispiel für den Einsatzzweck: Bei einer Kundenverwaltung möchte der Anwender jede Änderung im Datenbestand nachvollziehen können. Sobald also jemand in der Tabelle <em>kunden </em>ein Feld ändert, sollen die vorherigen Feldwerte in der Tabelle <em>kunden_changes</em> vermerkt werden, die denselben Satz an Feldern aufweist und zusätzlich ein Feld für den Zeitpunkt der Änderung besitzt.<br />
Beschränken wir uns bei den Kundendaten auf die Felder <em>id</em>, <em>strasse </em>und<br />
<em>name</em>, dann würde der dazu notwendige Befehl so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> kunden_change
AFTER <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #993333; font-weight: bold;">ON</span> kunden
<span style="color: #993333; font-weight: bold;">FOR</span> EACH ROW
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> kunden_changes
<span style="color: #66cc66;">&#40;</span> id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">,</span> strasse<span style="color: #66cc66;">,</span> datechanged<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">VALUES</span>
<span style="color: #66cc66;">&#40;</span>old<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">,</span> old<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> old<span style="color: #66cc66;">.</span>strasse<span style="color: #66cc66;">,</span> NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
;</pre></div></div>

<p>Sobald nun bestehende Kunden-Einträge geändert werden, startet die Trigger-Prozedur. Für jeden geänderten Satz wird in der Tabelle <em>kunden_changes</em> der Zustand vor der Änderung als neuer Datensatz abgespeichert. Um die Werte vor dem <em>UPDATE </em>zu referenzieren, dient der vordefinierte Präfix <em>old</em> bei den Feldbezeichnern.<br />
Sie könnten sich mit dieser Methode zu jedem Kunden eine Änderungshistorie ausgeben lassen, die auflistet, welche Überarbeitungen in seinen Daten stattgefunden haben.</p>
<p><ins><ins></ins></ins></p>
<p>Andere Einsatzgebiete für Trigger sind das Behandeln von in einer anderen Tabelle gespeicherten Detaildaten. So könnten Sie damit beispielsweise beim Deaktivieren eines Lieferanten automatisch alle seine Artikel im eigenen Sortiment ausblenden lassen.<br />
<strong>Views vereinfachen und schotten ab</strong><br />
Views sind eine weitere Neuerung in MySQL 5. Ein View benimmt sich wie ein Tabelle, tatsächlich steckt dahinter aber eine von Ihnen definierte Abfrage, die ihre Ergebnisse nur wie eine neue Tabelle darstellt.<br />
Ein einfaches Beispiel bei einem Content-Management-System wäre ein<br />
View, der alle derzeit gültigen Artikel ausgibt, also gelöschte oder zeitlich eingeschränkte Artikel unterdrückt. Er könnte so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> v_akt_artikel <span style="color: #993333; font-weight: bold;">AS</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> artikel
<span style="color: #993333; font-weight: bold;">WHERE</span> deleted<span style="color: #66cc66;">=</span>0 <span style="color: #993333; font-weight: bold;">AND</span>
publish_until &amp;lt; NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Weil der View sich wie eine Tabelle einsetzen lässt, könnten Sie beispielsweise schreiben:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> v_akt_artikel <span style="color: #993333; font-weight: bold;">WHERE</span> stichwort<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'Heimwerken'</span>;</pre></div></div>

<p>Auch das Rechtesystem von MySQL behandelt Views wie Tabellen, und erlaubt deshalb eine Freigabe auf View-Ebene. Das ermöglicht zum Beispiel folgendes Szenario: Sie haben geschäftliche Kundendaten in Ihrer Datenbank und möchten die einem Geschäftspartner zugänglich machen. Allerdings soll er manche Felder nicht sehen dürfen, etwa die Umsatzdaten.<br />
Um den eingeschränkten Zugriff zu ermöglichen, definieren Sie einen View, der nur die notwendigen Felder ausgibt und erlauben dem Partner lediglich darauf den Zugriff:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> v_kunden_restr <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">SELECT</span>
kundennr<span style="color: #66cc66;">,</span>name<span style="color: #66cc66;">,</span>plz<span style="color: #66cc66;">,</span>strasse<span style="color: #66cc66;">,</span>ort <span style="color: #993333; font-weight: bold;">FROM</span> kunden;
<span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">ON</span> v_kunden <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'kunde'</span>@<span style="color: #ff0000;">'%'</span> <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span>
<span style="color: #ff0000;">'geheim'</span>;</pre></div></div>

<p><strong>Stored Procedures als Abstraktionsebene</strong><br />
Bei Applikationen im großen Stil sichern Stored Procedures die Integrität von Daten. Betrachten Sie beispielsweise das Verarbeiten von Bestellungen in einem Online-Shop. Der Kunde soll eine Bestellung stornieren dürfen, solange sie noch nicht ausgeführt ist. Ein Weg wäre, die Freigabe der bestellten Artikel und die Deaktivierung des Datensatzes in der BestellungsTabelle einzeln in der ShopApplikation zu lösen.<br />
Würde man diese Aktionen aber in einer Stored Procedure zusammenfassen, die alle Validierungen durchführt und die Teilaspekte des Stornos erledigt, ergäben sich einige Vorteile. Ein Zugriff von einer anderen Plattform als dem Webshop könnte sich auch dieser existierenden Prozedur bedienen. Man würde sich also ersparen, alle Tabellenoperationen nochmals in einem anderen Kontext zu programmieren.<br />
<strong>Varianten serverseitiger Routinen</strong><br />
Genau genommen handelt es sich bei der im Artikel gezeigten Routine <em>f_rootpath() </em>gar nicht um eine Stored Procedure, sondern um eine Stored Function. Diese Variante wurde verwendet, weil für die Aufgabenstellung ein Rückgabewert benötigt wird.<br />
Die echten Procedures werden im Gegensatz dazu mit <em>CREATE PROCEDURE </em>definiert und haben einen leicht abweichenden Aufbau. So verzichten sie beispielsweise auf das <em>RETURN</em>, das bei den Funktionen den Rücksprung zum Aufrufer und die Übermittlung des Funktionswerts bewirkt.<br />
Ein weiterer wichtiger Unterschied: Stored Procedures werden nicht per <em>SELECT </em>sondern über <em>CALL </em>aufgerufen<br />
Rückgabewerte sind hier prinzipiell auch vorgesehen. Dann allerdings müssen Sie SQL-Variablen als Rückgabeparameter einsetzen. Die Verwendung einer als Stored Procedure realisierten <em>sp_rootpath()</em> mit einem zusätzlichen Parameter zur Rückgabe würde dann so aussehen:<br />
<em>CALL sp_rootpath(11,@pfad);<br />
SELECT @pfad; Stored<br />
</em><br />
<strong>Procedures mit phpMyAdmin </strong><br />
Mit phpMyAdmin klappt die Definition einer Stored Procedure in der Grundkonfiguration nicht. Erst, wenn Sie vom aktiviertem mysql-Interface auf die neuere Variante mysqli umschalten, lässt sich phpMyAdmin einsetzen.<br />
Dazu ändern Sie in der Datei config.inc.php die Zeile, die die &#8220;Server-Extension&#8221; definiert. Fügen Sie dort ein &#8220;i&#8221; hinzu, so dass dort steht:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #678DB4">$cfg</span><span style="color: #000000;">&#91;</span><span style="color: #0000ff; font-weight: bold;">'Servers'</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#91;</span><span style="color: #678DB4">$i</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#91;</span><span style="color: #0000ff; font-weight: bold;">'extension'</span><span style="color: #000000;">&#93;</span><span style="color: #339933;">=</span><span style="color: #0000ff; font-weight: bold;">'mysqli'</span></pre></div></div>

<p>Noch besser geeignet ist der Query-Browser von MySQL, der Stored Procedures mit Funktionen wie Syntax-Highlighting unterstützt. Dieses kostenlose Programm können Sie einfach von der <a href="http://dev.mysql.com/downloads/gui-tools/5.0.html">MySQL-Homepage</a> als Teil des Pakets &#8220;GUI-Tools&#8221; herunterladen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/06/19/mysql-views-procedures-functions-trigger/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apache Module DEFLATE zur gzip Ausgabe</title>
		<link>http://www.installation.de/2009/06/16/apache-module-deflate-zur-gzip-ausgabe/</link>
		<comments>http://www.installation.de/2009/06/16/apache-module-deflate-zur-gzip-ausgabe/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 17:04:04 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[Apache]]></category>

		<category><![CDATA[Web-/Tipps&Tricks]]></category>

		<category><![CDATA[deflate]]></category>

		<category><![CDATA[gzip]]></category>

		<category><![CDATA[http.conf]]></category>

		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=61</guid>
		<description><![CDATA[Vor kurzem habe ich einen Webserver zur komprimierten Inhaltsausgabe im gzip Format flott gemacht.
Die Folgen sind: Website ist schlanker &#8211;&#62; Website wird schneller runtergeladen &#8211;&#62; super  
Ausgangslage ist ein Windows 2003 Server mit Apache 2.2.
Das mod_deflate wird standardmässig beim Apache 2.x mitgeliefert und muss in der http.conf nur aktiviert werden.
Also so sollte es sein:

LoadModule [...]]]></description>
			<content:encoded><![CDATA[<p>Vor kurzem habe ich einen Webserver zur komprimierten Inhaltsausgabe im gzip Format flott gemacht.<br />
Die Folgen sind: Website ist schlanker &#8211;&gt; Website wird schneller runtergeladen &#8211;&gt; super <img src='http://www.installation.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ausgangslage ist ein Windows 2003 Server mit Apache 2.2.</p>
<p>Das mod_deflate wird standardmässig beim Apache 2.x mitgeliefert und muss in der http.conf nur aktiviert werden.<br />
Also so sollte es sein:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">LoadModule deflate_module modules/mod_deflate.so</pre></div></div>

<p>Zusätzlich benötigt man dann noch folgendes in der http.conf</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;IfModule</span> mod_deflate<span style="color: #000000; font-weight: bold;">&gt;</span></span>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/x-httpd-php application/rss+xml application/atom_xml text/javascript
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
&nbsp;
  deflate.enabled = &quot;enable&quot; 
  deflate.compression-level = 9
  deflate.mem-level = 9
  deflate.window-size = 15
  # deflate.bzip2 only in patch for 1.4.x
  deflate.bzip2 = &quot;enable&quot; 
  # deflate.allowed_encodings only in 1.5.x
  deflate.allowed_encodings = ( &quot;bzip2&quot;, &quot;gzip&quot;, &quot;deflate&quot; )
  deflate.min-compress-size = 200
  #deflate.sync-flush = &quot;enable&quot; 
  #deflate.output-buffer-size = 8192
  deflate.work-block-size = 512
  deflate.mimetypes = (&quot;text/html&quot;, &quot;text/plain&quot;, &quot;text/css&quot;, &quot;text/javascript&quot;, &quot;application/javascript&quot;, &quot;application/x-javascript&quot;, &quot;application/x-httpd-php&quot;, &quot;text/xml&quot;)
  #deflate.debug = &quot;enable&quot; 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/IfModule<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Nun werden werden die Inhalte die den oben genannten Typen und Größe entsprechen komprimiert ausgegeben. Da ältere Browser gzip nicht entschlüsseln können ist zusätzlich eine Browserweiche am werk.</p>
<p>Genaue Infos zu den Einstellmöglichkeiten gibt es bei<br />
<a href="http://redmine.lighttpd.net/projects/lighttpd/wiki/Mod_Deflate">http://redmine.lighttpd.net/projects/lighttpd/wiki/Mod_Deflate</a><br />
und bei<br />
<a href="http://blog.netways.de/2009/04/21/serie-high-performance-websites-teil-4-komprimierung-der-seiten/">http://blog.netways.de/2009/04/21/serie-high-performance-websites-teil-4-komprimierung-der-seiten/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/06/16/apache-module-deflate-zur-gzip-ausgabe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ladezeiten der Website verbessern Teil 1</title>
		<link>http://www.installation.de/2009/06/16/ladezeiten-der-website-verbessen/</link>
		<comments>http://www.installation.de/2009/06/16/ladezeiten-der-website-verbessen/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 16:13:12 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[Web-/Tipps&Tricks]]></category>

		<category><![CDATA[add-on]]></category>

		<category><![CDATA[compressor]]></category>

		<category><![CDATA[page-speed]]></category>

		<category><![CDATA[performance-rules]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=55</guid>
		<description><![CDATA[Was kann man alles verbessen um die eigene Website schneller zu machen beziehungsweise den Webserver leistungsfähiger zu machen?
Was folgt sind ein paar sehr nützliche Plugins und Tipps von Google und Yahoo.
Performance Rules von Yahoo Developer &#8211;&#62; http://developer.yahoo.com/performance/rules.html
Performance Rules von Google Code &#8211;&#62; http://code.google.com/intl/de-DE/speed/page-speed/docs/rules_intro.html
Beides ist recht umfangreich und auf englisch. Ein paar der behandelten Punkte werde [...]]]></description>
			<content:encoded><![CDATA[<p>Was kann man alles verbessen um die eigene Website schneller zu machen beziehungsweise den Webserver leistungsfähiger zu machen?<br />
Was folgt sind ein paar sehr nützliche Plugins und Tipps von Google und Yahoo.</p>
<p>Performance Rules von Yahoo Developer &#8211;&gt; <a href="http://developer.yahoo.com/performance/rules.html">http://developer.yahoo.com/performance/rules.html</a><br />
Performance Rules von Google Code &#8211;&gt; <a href="http://code.google.com/intl/de-DE/speed/page-speed/docs/rules_intro.html">http://code.google.com/intl/de-DE/speed/page-speed/docs/rules_intro.html</a></p>
<p>Beides ist recht umfangreich und auf englisch. Ein paar der behandelten Punkte werde ich deshalb auf Deutsch etwas zusammenfassend zu einem späteren Zeitpunkt erläutern. Zunächst aber kommen wir zu den Add On&#8217;s die auf die Performance Rules aufbauen. Wer nämlich keine Lust hat sich die ganzen Performance Rules durchzulesen ist mit den Add On&#8217;s letztlich schneller am Ziel:</p>
<p>Es gibt 2 Firefox Add On&#8217;s welche die Website analysiert und untersucht uns anschließend sagt was man gut bzw. schlecht gelöst hat. Zusätzlich wird über weiterführende Texte (auf englisch) gut erklärt wie man es besser macht bzw. die Fehler behebt. Beide Add On&#8217;s sind ein zusätzlicher Aufsatz für das benötigte und sehr bekannte Add On &#8220;Firebug&#8221;. Falls sie das nicht kennen wird es höchste Zeit: <a href="https://addons.mozilla.org/de/firefox/addon/1843">https://addons.mozilla.org/de/firefox/addon/1843</a></p>
<p>1.) <strong>YSlow </strong>(aktuelle Version 2.0.0b3) <strong>Entwicker ist Yahoo!</strong> <a href="https://addons.mozilla.org/de/firefox/addon/5369">https://addons.mozilla.org/de/firefox/addon/5369</a><br />
Analyse, Tipps und weiterführende Hilfen(http://developer.yahoo.com/) kommen von keinen geringeren als von der Yahoo! inc.</p>
<p>2.) <strong>Page-Speed Entwicker ist Google!</strong> <a href="http://code.google.com/intl/de-DE/speed/page-speed/">http://code.google.com/intl/de-DE/speed/page-speed/</a><br />
Analysiert und testet prinzipiell die gleichen Punkte wie YSlow.<br />
Ich persönlich nutzte alle der genannten Add On&#8217;s.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/06/16/ladezeiten-der-website-verbessen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Charset/Encoding Probleme? Diverse Möglichkeiten zur Abhilfe!</title>
		<link>http://www.installation.de/2009/06/04/charsetencoding-probleme-diverse-moglichkeiten-zur-abhilfe/</link>
		<comments>http://www.installation.de/2009/06/04/charsetencoding-probleme-diverse-moglichkeiten-zur-abhilfe/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 14:26:03 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web-/Tipps&Tricks]]></category>

		<category><![CDATA[charset]]></category>

		<category><![CDATA[encoding]]></category>

		<category><![CDATA[iso-8859-1]]></category>

		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=45</guid>
		<description><![CDATA[Wer kennt das nicht, Umlaute und Sonderzeichen werden falsch angezeigt obwohl man die Standards eingetragen hat:

&#60;?xml version=&#34;1.0&#34; encoding=&#34;iso-8859-1&#34;?&#62;
&#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&#62;
&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34; lang=&#34;en&#34; xml:lang=&#34;en&#34;&#62;
&#60;head&#62;
&#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=iso-8859-1&#34; /&#62;
...

Nun kann man auch ein Default-Charset für diverse Dateien schon in der Apache-Conf oder in einer seperaten .htaccess angeben. Dieses zieht aber meistens nur [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt das nicht, Umlaute und Sonderzeichen werden falsch angezeigt obwohl man die Standards eingetragen hat:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;iso-8859-1&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span style="color: #000066;">lang</span>=<span style="color: #ff0000;">&quot;en&quot;</span> <span style="color: #000066;">xml:lang</span>=<span style="color: #ff0000;">&quot;en&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">http-equiv</span>=<span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">&quot;text/html; charset=iso-8859-1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
...</pre></div></div>

<p>Nun kann man auch ein Default-Charset für diverse Dateien schon in der Apache-Conf oder in einer seperaten .htaccess angeben. Dieses zieht aber meistens nur dann wenn man sonst kaum angaben gemacht hat.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;files</span> <span style="color: #ff0000;">&quot;*.*&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
AddDefaultCharset iso-8859-1
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/files<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Wer mit PHP arbeitet und immernoch Probleme hat der sollte einmal diese Zeile direkt zu Begin der Seite (or dieser Funktion kann keine andere Ausgabe gemacht werden) einfügen!</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #A77879;">header</span><span style="color: #000000;">&#40;</span><span style="color: #0000ff; font-weight: bold;">'Content-Type: text/html; charset=iso-8859-1'</span><span style="color: #000000;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Manchmal bekommt man Text, z.B. aus der Datenbank oder aus einer anderen Datei, welcher in UTF-8 geschrieben wurde und man ihn nun aber in einer ISO-8859-1 Seite ausgeben möchte. In diesem Fall kann man den Text konvertieren. Dazu sollte man sich einmal diese Funktionen genauer anschauen.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #7F0055; font-weight: bold;">echo</span> <span style="color: #A77879;">iconv</span><span style="color: #000000;">&#40;</span><span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;ISO-8859-1&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;Dies ist ein Test üöä.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #3F7F5F; font-style: italic;">// ODER</span>
<span style="color: #7F0055; font-weight: bold;">echo</span> <span style="color: #A77879;">utf8_decode</span><span style="color: #000000;">&#40;</span><span style="color: #0000ff;">&quot;Dies ist ein Test üöä.&quot;</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>Zu iconv gibt es eine ganze Reihe von Funktionen und zu utf8_decode gibt es auch das gegenstück utf8_encode.</p>
<p>Viel Erfolg!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/06/04/charsetencoding-probleme-diverse-moglichkeiten-zur-abhilfe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Welche Funktionen werden bei welchen Hooks ausgeführt?</title>
		<link>http://www.installation.de/2009/06/04/welche-funktionen-werden-bei-welchen-hooks-ausgefuhrt/</link>
		<comments>http://www.installation.de/2009/06/04/welche-funktionen-werden-bei-welchen-hooks-ausgefuhrt/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 11:11:15 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[Wordpress]]></category>

		<category><![CDATA[hooks]]></category>

		<category><![CDATA[wp]]></category>

		<category><![CDATA[wp_head]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=37</guid>
		<description><![CDATA[Dies Frage lässt sich mit folgenden Zeilen beantworten:

&#60;?php global $wp_filter;
echo '&#60;!-- &#60;pre&#62;';
var_dump&#40;$wp_filter&#91;'wp_head'&#93;&#41;;
echo &#34;\n ############################################# \n&#34;;
/* Um einfach nur zu schauen welche Funktionen aufgerufen werden ist die ausgabe mit print_r übersichtlicher: */
print_r&#40;$wp_filter&#91;'wp_head'&#93;&#41;;
echo '&#60;/pre &#62; --&#62;'; ?&#62;

Wozu muss man das wissen? Unter anderem ist es nützlich wenn man sein Wordpress schneller machen möchte und nachschauen will welche [...]]]></description>
			<content:encoded><![CDATA[<p>Dies Frage lässt sich mit folgenden Zeilen beantworten:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #FF0080; font-weight: bold;">&lt;?php</span> <span style="color: #FF0080; font-weight: bold;">global</span> <span style="color: #678DB4">$wp_filter</span><span style="color: #339933;">;</span>
<span style="color: #7F0055; font-weight: bold;">echo</span> <span style="color: #0000ff; font-weight: bold;">'&lt;!-- &lt;pre&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #A77879;">var_dump</span><span style="color: #000000;">&#40;</span><span style="color: #678DB4">$wp_filter</span><span style="color: #000000;">&#91;</span><span style="color: #0000ff; font-weight: bold;">'wp_head'</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #7F0055; font-weight: bold;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span> ############################################# <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #3F7F5F; font-style: italic;">/* Um einfach nur zu schauen welche Funktionen aufgerufen werden ist die ausgabe mit print_r übersichtlicher: */</span>
<span style="color: #A77879;">print_r</span><span style="color: #000000;">&#40;</span><span style="color: #678DB4">$wp_filter</span><span style="color: #000000;">&#91;</span><span style="color: #0000ff; font-weight: bold;">'wp_head'</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #7F0055; font-weight: bold;">echo</span> <span style="color: #0000ff; font-weight: bold;">'&lt;/pre &gt; --&gt;'</span><span style="color: #339933;">;</span> <span style="color: #FF0080; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Wozu muss man das wissen? Unter anderem ist es nützlich wenn man sein Wordpress schneller machen möchte und nachschauen will welche Funktionen alles die Geschwindigkeit ausbremsen weil sie bei jedem aufruf geladen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/06/04/welche-funktionen-werden-bei-welchen-hooks-ausgefuhrt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Crossbrowser Copy-to-Clipboard Script</title>
		<link>http://www.installation.de/2009/05/28/crossbrowser-copy-to-clipboard-script/</link>
		<comments>http://www.installation.de/2009/05/28/crossbrowser-copy-to-clipboard-script/#comments</comments>
		<pubDate>Thu, 28 May 2009 10:32:41 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Websiteplugins]]></category>

		<category><![CDATA[clipboard]]></category>

		<category><![CDATA[crossbrowser]]></category>

		<category><![CDATA[zwischenablage]]></category>

		<guid isPermaLink="false">http://www.installation.de/2009/05/28/crossbrowser-copy-to-clipboard-script/</guid>
		<description><![CDATA[Was mit JavaScript leider bisher nicht möglich ist geht mit einer kleinen Flashanwendung: Ein kleiner netter Button der einen beliebigen Text in die Zwischenablage des Surfers setzt. Dies geht mit JS nur im IE. Dieses nette Teil funktioniert neben dem IE natürlich auch in den gängigen Browsern wie Firefox und Safari.
Project-URI: http://github.com/mojombo/clippy/tree/master/
Wenn man mit dem [...]]]></description>
			<content:encoded><![CDATA[<p>Was mit JavaScript leider bisher nicht möglich ist geht mit einer kleinen Flashanwendung: Ein kleiner netter Button der einen beliebigen Text in die Zwischenablage des Surfers setzt. Dies geht mit JS nur im IE. Dieses nette Teil funktioniert neben dem IE natürlich auch in den gängigen Browsern wie Firefox und Safari.</p>
<p>Project-URI: <a title="http://github.com/mojombo/clippy/tree/master/" href="http://github.com/mojombo/clippy/tree/master/">http://github.com/mojombo/clippy/tree/master/</a></p>
<p>Wenn man mit dem Standard-Layout zufrieden ist reicht es die Datei <u><a href="http://github.com/mojombo/clippy/blob/7329b72360100b9484bc6cc9f097ea35f08421ad/build/clippy.swf">clippy.swf</a></u> herunterzuladen und mittels folgendem Code an die entsprechenden Stellen einzubauen:</p>
<p><code>&lt;p&gt;http://www.meinLinktoClipboard.de/      <br />&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; class=&quot;clippy&quot; id=&quot;clippy&quot; width=&quot;110&quot; height=&quot;14&quot;&gt;       <br />&lt;param name=&quot;movie&quot; value=&quot;clippy.swf&quot;&gt;       <br />&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;       <br />&lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;       <br />&lt;param name=&quot;scale&quot; value=&quot;noscale&quot;&gt;       <br />&lt;param name=&quot;FlashVars&quot; value=&quot;text=http://www.meinLinktoClipboard.de/&quot;&gt;       <br />&lt;param name=&quot;bgcolor&quot; value=&quot;#FFF&quot;&gt;       <br />&lt;param name=&quot;wmode&quot; value=&quot;opaque&quot;&gt; &lt;embed src=&quot;clippy.swf&quot; name=&quot;clippy&quot; quality=&quot;high&quot; allowscriptaccess=&quot;always&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; flashvars=&quot;text=http://www.meinLinktoClipboard.de/&quot; bgcolor=&quot;#FFF&quot; wmode=&quot;opaque&quot; width=&quot;110&quot; height=&quot;14&quot;&gt;       <br />&lt;/object&gt;       <br />Zeilen-Ende&lt;/p&gt; </code></p>
<p><strong>Nachtrag:</strong><br />
Wer seinen Button lieber selbst gestalltet oder einfach nur die funtkion auf einen Link setzen möchte der sollte sie diese Methode einmal anschauen:<br />
<a href="http://code.mavrickdesign.com.au/mootools/cross-browser-copy-to-clipboard.htm">http://code.mavrickdesign.com.au/mootools/cross-browser-copy-to-clipboard.htm</a><br />
Funktioniert letztlich auch über Flash, aber man kann die Funktion via js irgendwo anhängen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/05/28/crossbrowser-copy-to-clipboard-script/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Die Ausgabemethode &#60;&#60;&#60;EOF in PHP</title>
		<link>http://www.installation.de/2009/05/25/die-ausgabemethode-eof-in-php/</link>
		<comments>http://www.installation.de/2009/05/25/die-ausgabemethode-eof-in-php/#comments</comments>
		<pubDate>Mon, 25 May 2009 17:18:14 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Ausgabe]]></category>

		<category><![CDATA[EOF]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=15</guid>
		<description><![CDATA[Die meisten nutzen sie nicht oder kennen sie erst gar nicht. Die etwas andere Methode innerhalt eines PHP-Dokuments wieder Text/HTML auszugeben.
Statt z.B. diese Methode:         &#60;?php /* codestuff */ ?&#62;       &#60;p&#62;Mein Text&#60;/p&#62;       &#60;?php /* more code [...]]]></description>
			<content:encoded><![CDATA[<p>Die meisten nutzen sie nicht oder kennen sie erst gar nicht. Die etwas andere Methode innerhalt eines PHP-Dokuments wieder Text/HTML auszugeben.</p>
<p>Statt z.B. diese Methode:    <br /><code>     <br />&lt;?php /* codestuff */ ?&gt;       <br />&lt;p&gt;Mein Text&lt;/p&gt;       <br />&lt;?php /* more code */ ?&gt;       <br /></code></p>
<p>kann man es auch so machen:    <br /><code>     <br />&lt;?php /* codestuff */ echo       <br />&lt;&lt;&lt;EOF       <br />&lt;p&gt;Mein Text&lt;/p&gt;       <br />EOF;       <br />/* more code */ ?&gt;       </code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/05/25/die-ausgabemethode-eof-in-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP Ausgabemethoden im Vergleich: Mit &#8216; doppelt so schnell als mit &#8220;</title>
		<link>http://www.installation.de/2009/05/15/php-ausgabemethoden-im-vergleich-mit-doppelt-so-schnell-als-mit/</link>
		<comments>http://www.installation.de/2009/05/15/php-ausgabemethoden-im-vergleich-mit-doppelt-so-schnell-als-mit/#comments</comments>
		<pubDate>Fri, 15 May 2009 10:40:35 +0000</pubDate>
		<dc:creator>Stefan</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Ausgabe]]></category>

		<category><![CDATA[String]]></category>

		<guid isPermaLink="false">http://www.installation.de/?p=3</guid>
		<description><![CDATA[Gerade fand ich einen interessanten Abschnitt in einem Artikel wo es über Zeitmessung von PHP-Skripten auf dem Apache ging. Speziell in dem darin enthaltenen Testskript geht um die Geschwindigkeit der Ausgaben der verschiedensten Möglichkeiten in PHP einen String in Kombination mit einer Variablen auszugeben.
Hier der Abschnitt:
- String und Variable in einen echo-Befehl mit doppelten Anführungszeichen [...]]]></description>
			<content:encoded><![CDATA[<p>Gerade fand ich einen interessanten Abschnitt in einem Artikel wo es über Zeitmessung von PHP-Skripten auf dem Apache ging. Speziell in dem darin enthaltenen Testskript geht um die Geschwindigkeit der Ausgaben der verschiedensten Möglichkeiten in PHP einen String in Kombination mit einer Variablen auszugeben.</p>
<p>Hier der Abschnitt:</p>
<blockquote><p>- String und Variable in einen echo-Befehl mit doppelten Anführungszeichen packen und den fixen Teil mit der Variable zu mischen, etwa</p>
<p><code>&lt;?php<br />
$teststring = "Erde";<br />
echo "Hallo $teststring";<br />
?&gt;<br />
</code></p>
<p>Das ist die meiner Ansicht nach bequemste Methode, Strings mit variablen Inhalten zu schreiben. Aber ist das auch die schnellste? Es gibt noch andere Möglichkeiten:</p>
<p><code>&lt;?php<br />
$teststring = "Erde";<br />
echo 'Hallo '.$teststring;<br />
?&gt;</code></p>
<p>Hier haben wir es mit einfachen Anführungszeichen zu tun. Das bedeutet für PHP: Variablen innerhalb der einfachen Anführungszeichen werden nicht interpretiert. Also muss die Variable mit einem Punkt hinten angehängt werden.</p>
<p>Oder wie wäre es mit dieser Variante:</p>
<p><code>&lt;?php<br />
$teststring = "Erde";<br />
?&gt;<br />
Hallo &lt;?=$teststring?&gt;</code></p>
<p>Hier wird &#8220;Hallo&#8221; allein von HTML ausgegeben, nur für die Ausgabe der Variablen macht sich der PHP-Interpreter an die Arbeit.</p>
<p>Zuletzt hätten wir noch diese Variante:</p>
<p><code>&lt;?php<br />
$teststring = "Erde";<br />
printf("Hallo %s", $teststring);<br />
?&gt;</code></p>
<p>Für die formatierte Ausgabe von Strings.</p>
<p>Welche Methode ist also die schnellste? Ausprobieren. Vom Gefühl her würde man printf und echo&#8221;" die schlechtesten Prognosen geben.</p>
<p>Damit der Benchmark mit so einer simplen Programmzeile messbare Ergebnisse liefert, packen wir die Ausgabe noch in eine Schleife. Jede Zeile soll 5000mal ausgegeben werden. Das sieht dann im ersten Beispiel so aus:</p>
<p><code>&lt;?php<br />
$teststring = "Erde";<br />
for ($i=0; $i &lt; 5000; $i++)<br />
{<br />
echo "Hallo $teststring";<br />
}<br />
?&gt;</code></p>
<p>Auch die anderen Testdateien müssen mit der Schleife ausgestattet sein.</p>
<p>Das Ergebnis meines kleinen Tests: Wie erwartet belegt printf den letzten Platz mit rund 78 Millisekunden pro Abruf auf einem P450 mit Suse Linux und 192 MByte Speicher. Kein Wunder: printf ist zu mächtig und vollkommen fehl am Platze, um einfach nur einen Text und eine Variable zu mixen.</p>
<p>Auf dem dritten Platz liegt echo mit den doppelten Anführungszeichen. Etwas schneller als printf braucht es dennoch satte 71 Millisekunden pro Abruf.</p>
<p>Deutlich schneller ist schon der Echo-Befehl mit einfachen Anführungszeichen. Er schafft die Seite in durchschnittlich 32 Millisekunden.</p>
<p>Die Mischung aus HTML mit der eingebetteten PHP-Variablen erweist sich aber als schnellste Lösung. Nur 25 Millisekunden brauchte der Server für den Abruf des PHP-Dokuments mit seinem 5000fachen &#8220;Hallo Erde&#8221;. Alle Angaben ohne Gewähr – probieren Sie es einfach mal selbst aus.</p>
<p>Übrigens: Führen Sie solche Benchmarks nur zu Hause oder einem Testserver durch. Ihr Produktiv-Server sollte nicht mit solchen Versuchen belastet werden.</p></blockquote>
<p>Hier der Link zum vollen Artikel:<br />
<a href="http://www.goldmann.de/apache-benchmark-misst-geschwindigkeit-von-php-programm_tipp_98.html">http://www.goldmann.de/apache-benchmark-misst-geschwindigkeit-von-php-programm_tipp_98.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.installation.de/2009/05/15/php-ausgabemethoden-im-vergleich-mit-doppelt-so-schnell-als-mit/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
