<?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>phpundmysql.de</title>
	<atom:link href="http://www.phpundmysql.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpundmysql.de</link>
	<description></description>
	<lastBuildDate>Mon, 30 Apr 2012 21:00:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CDN für Vernachlässigte: JavaScript aus dem Content Network</title>
		<link>http://www.phpundmysql.de/2012/04/30/cdn-fur-vernachlassigte-javascript-aus-dem-content-network/</link>
		<comments>http://www.phpundmysql.de/2012/04/30/cdn-fur-vernachlassigte-javascript-aus-dem-content-network/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 16:26:52 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=1054</guid>
		<description><![CDATA[Webriesen wie Google und Microsoft haben jeweils eigene Content Delivery Networks (CDN) aufgebaut, um viel beachtete Libraries effizient zum Browser zu befördern und aufgrund ihrer häufigen Verwendung möglichst dauerhaft in deren Caches zu hinterlegen. Die Anzahl der Bibliotheken ist aber vergleichsweise gering. CDNJS möchte das ändern.]]></description>
			<content:encoded><![CDATA[<p>jQuery gehört zu den Vorzeigeprojekten, die in unzähligen Webseiten zum Einsatz kommen. Viele Webserver binden die Bibliothek aus dem Google CDN (Content Delivery Network) ein. Davon profitieren alle Anwender, denn eine aktuelle Datei befindet sich zumeist schon im Browsercache und muss nicht erneut aus dem Netz geladen werden. Und wenn doch, dann kommt sie von einem Server "in der Nähe". Google hält aber nur eine Hand voll der am meisten benutzten Bibliotheken für den Zugriff parat.<br />
CDNJS möchte diese Lücke füllen und hat eine Sammlung weniger bekannter Libraries zusammengestellt, die auf einem CDN gehostet wird. Wobei "weniger bekannt" schon fast eine Beleidigung ist. Immerhin finden sich auch <a href="http://developer.yahoo.com/yui">Yahoos YUI</a>, <a href="http://modernizr.com/">Modernizr</a> und <a href="http://twitter.github.com/bootstrap/">Twitters Bootstrap</a> darunter. In der zweiten Reihe stehen underscore, zepto, backbone und eine ganze Menge jQuery Plugins.</p>
<p style="text-align: center;"><a href="http://www.phpundmysql.de/wp-content/uploads/2012/04/GoogleLibrariesAPI.jpg" rel="lightbox[1054]"><img class="size-medium wp-image-1057 aligncenter" title="Google Libraries API" src="http://www.phpundmysql.de/wp-content/uploads/2012/04/GoogleLibrariesAPI-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>Die Zusammenstellung der Bibliotheken kommt durch Abstimmung aus der Community zustande. Es besteht eine ständige Diskussion direkt auf der Webseite, wo Vorschläge für potentielle Neuzugänge gesammelt werden und das Votum per Mausklick stattfindet (Authentifizierung erfolgt mit einer Emailadresse oder per Facebook/Google Account). Das Hosting der aktuellen Auswahl übernimmt freundlicherweise <a title="Cloudflare" href="http://www.cloudflare.com/" target="_blank">Cloudflare</a>, ein Unternehmen aus San Francisco, Kalifornien.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpundmysql.de/2012/04/30/cdn-fur-vernachlassigte-javascript-aus-dem-content-network/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redis Datenbank jetzt auch für Windows</title>
		<link>https://github.com/MSOpenTech</link>
		<comments>https://github.com/MSOpenTech#comments</comments>
		<pubDate>Sat, 28 Apr 2012 13:04:40 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[In-Memory]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=1049</guid>
		<description><![CDATA[Wenn man sich mit NoSQL auseinandersetzt, wird man derzeit bei der Einarbeitung von allen Seiten mit neuen Themen überholt. Heute lässt Microsoft verlautbaren, dass die in-memory key-value Datenbank Redis ab sofort auch für Windows Systeme verfügbar ist. Unter http://redis.io/clients finden sich Schnittstellen zu PHP oder Node.js]]></description>
			<content:encoded><![CDATA[Wenn man sich mit NoSQL auseinandersetzt, wird man derzeit bei der Einarbeitung von allen Seiten mit neuen Themen überholt. Heute lässt Microsoft verlautbaren, dass die in-memory key-value Datenbank Redis ab sofort auch für Windows Systeme verfügbar ist. Unter http://redis.io/clients finden sich Schnittstellen zu PHP oder Node.js]]></content:encoded>
			<wfw:commentRss>https://github.com/MSOpenTech/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chrome unterstützt den HTML5 Datepicker</title>
		<link>http://www.phpundmysql.de/2012/04/18/google-chrome-unterstutzt-den-html5-datepicker/</link>
		<comments>http://www.phpundmysql.de/2012/04/18/google-chrome-unterstutzt-den-html5-datepicker/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 20:10:43 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=1038</guid>
		<description><![CDATA[HTML5 definiert eine ganze Reihe neuer Elemente und Funktionen für Formulare, darunter etwa obligatorische Elemente, Emailadress-Felder mit Syntaxprüfung, Slider - und auch einen Datepicker. Und genau diesen unterstützt Googles Chrome Browser in seiner neuesten Version.]]></description>
			<content:encoded><![CDATA[<p>Bislang ist die Unterstützung für neue Input-Typen eher mau. Allein Opera (kennt den noch wer?!) hat sich bisher daran gemacht, alle neuen Eingabemöglichkeiten auch zu implementieren (eine Übersicht bietet wie immer <a href="http://caniuse.com/#feat=forms">caniuse.com</a>) Langsam scheint sich das aber zu ändern. Wie Google verlautbaren lässt, unterstützt Chrome in der Version 20 einige der neuen Funktionen, namentlich den Datepicker. Wenn man sich allerdings eine Beispielseite ansieht, etwa <a href="http://slides.html5rocks.com/#new-form-types">HTML5rocks.com</a>, dann sieht man, dass schon weitaus mehr implementiert ist:
</p>
<p>- "required" Felder<br />
- Emails<br />
- Slider<br />
- Placeholder<br />
- Numerische Eingaben</p>
<p>Die neuen HTML5 Eingabefelder sollen die Workarounds ersetzen, die in den vergangenen Jahren vornehmlich mit JavaScript, z.B. mit JQuery UI umgesetzt worden sind. Zukünftig wird die Syntax kürzer und einfacher, es bedarf keiner JS-Bibliotheken mehr, die Bandbreite fressen, dafür unterwirft man sich aber auch den Optik der Elemente, wie sie der Browserhersteller definiert. Ein Datepicker sieht in Zukunft so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;date&quot; min=&quot;2010-04-18&quot; max=&quot;2017-04-18&quot; value=&quot;2012-04-18&quot;/&gt;</pre></div></div>

<p><a href="http://www.phpundmysql.de/wp-content/uploads/2012/04/html5rocks_datepicker.png" rel="lightbox[1038]"><img src="http://www.phpundmysql.de/wp-content/uploads/2012/04/html5rocks_datepicker-300x203.png" alt="" title="html5rocks_datepicker" width="300" height="203" class="alignnone size-medium wp-image-1044" /></a></p>
<p>Simpel, oder? Wer mit den neuen Elemente herumspielen möchte oder einfach prüfen will, inwieweit der eigene Browser schon kann, was HTML5 bezüglich Eingabefeldern verspricht, dem empfehlen wir obigen Link zu HTML5rocks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpundmysql.de/2012/04/18/google-chrome-unterstutzt-den-html5-datepicker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick Tipp: Syntax Highlighting mit CodeMirror</title>
		<link>http://www.phpundmysql.de/2012/04/13/quick-tipp-syntax-highlighting-mit-codemirror/</link>
		<comments>http://www.phpundmysql.de/2012/04/13/quick-tipp-syntax-highlighting-mit-codemirror/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 16:09:25 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Editor]]></category>
		<category><![CDATA[Syntax Highlighting]]></category>
		<category><![CDATA[Textarea]]></category>
		<category><![CDATA[WYSIWYG]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=1023</guid>
		<description><![CDATA[On-the-Fly Syntax Highlighting für HTML Textfelder? Mit CodeMirror kein Problem! Und ja nicht von dem Affen mit dem roten Hintern ablenken lassen...]]></description>
			<content:encoded><![CDATA[<p>Für ein Projekt habe ich einen möglichst schlanken, frei verfügbaren JavaScript Syntax Highlighter gebraucht, der mir PHP Code in einem Textfeld on-the-fly einfärbt. Fündig geworden bin ich bei CodeMirror, einen MIT-lizensierten Bibliothek, die sich genau auf diesen Anwendungsfall spezialisiert hat.</p>
<p>Man nehme eine HTML Textarea, spezifiziere in zwei Zeilen Code, wie der Editor aussehen soll und welche Programmiersprache darin eingetippt wird, und schon verwandelt CodeMirror das mehrzeilige Textfeld in einen ansehnlichen Editor. Viel Funktionalität ist nicht enthalten, immerhin ist CodeMirror nicht als WYSIWYG Editor gedacht. Dennoch ist der Editor nicht zu unterschätzen, wie zum Beispiel diese <a title="HTML Editor mit Preview" href="http://codemirror.net/demo/preview.html" target="_self">HTML Demo</a> zeigt. Oder der <a title="Fullscreen-Modus" href="http://codemirror.net/demo/fullscreen.html" target="_self">FullScreen-Modus</a>.</p>
<p><a href="http://www.phpundmysql.de/wp-content/uploads/2012/04/CodeMirror.jpg" rel="lightbox[1023]"><img class="alignnone size-medium wp-image-1024" title="CodeMirror" src="http://www.phpundmysql.de/wp-content/uploads/2012/04/CodeMirror-300x119.jpg" alt="" width="300" height="119" /></a><br />
<strong>Nicht von dem Affen mit dem roten Hintern auf <a title="CodeMirror" href="http://codemirror.net/" target="_self">CodeMirror.net</a> ablenken lassen!</strong></p>
<p>CodeMirror unterstützt mehr als 40 Sprachen und Dialekte. Entsprechend wuchtig kommt der Download daher - glücklicherweise kann man sich ein maßgeschneiderten Build selbst zusammenklicken. Für PHP liegt man dann bei etwa 70kb, für MySQL sind es weniger als 60. Das Gros macht jecoch immer der Kern der Library aus.</p>
<p>Um Codemirror zu verwenden, muss wie üblich die JavaScript Datei in die eigene Seite eingebunden werden. Damit das Syntax Highlighting auch sichtbar wird, bedarf es zusätzlich eines Cascading Stylesheets.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;!-- wir befinden uns im Header, das JS kann wahlweise auch vor das /body Tag --&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;codemirror.css&quot;&gt;
&lt;script src=&quot;codemirror.js&quot;&gt;&lt;/script&gt;</pre></div></div>

<p>Die Initialisierung erfolgt über einen weiteren JavaScript Aufruf</p>

<div class="wp_syntax"><div class="code"><pre class="js" style="font-family:monospace;">var editor = CodeMirror.fromTextArea(document.getElementById(&quot;code&quot;), {
        lineNumbers: true,
        mode: &quot;application/x-httpd-php&quot;
      });</pre></div></div>

<p>Dieses Kommando greift auf die Textarea mit der ID <code>code</code> zu, der Modus ist PHP. Bei der Initialisierung wird das eigentliche <code>textarea</code> Element ausgeblendet und durch eine Struktur aus <code>div</code> Elementen ersetzt. Eine mittelmäßig ausführliche Dokumentation findet sich im <a href="http://codemirror.net/doc/manual.html" target="_blank">Manual</a> der Bibliothek.</p>
<p>P.S.: Das Icon stammt aus dem <a href="http://www.smashingmagazine.com/2009/05/20/flavour-extended-the-ultimate-icon-set-for-web-designers/" target="_blank">Flavours Icon Set</a> von <a href="http://www.addictedtocoffee.de/" target="_blank">Oliver Twardowski</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpundmysql.de/2012/04/13/quick-tipp-syntax-highlighting-mit-codemirror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Es nieselt wieder: Drizzle 7.1</title>
		<link>http://hackdrizzle.com/drizzle-7-1-released/</link>
		<comments>http://hackdrizzle.com/drizzle-7-1-released/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 16:48:46 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Drizzle]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=1019</guid>
		<description><![CDATA[Bei der neuen Version des MySQL Ableger Drizzle zeigen sich die Entwickler alles andere als bescheiden: "everyone should upgrade to 7.1 because it is far superior." Also los, Downloads für verschiedene Linux-Distributionen gibt es auf der Projektseite.
An gleicher Stelle findet sich übrigens auch ein PECL-Paket, um Drizzle per PHP anzusprechen. Und zu guter letzt lassen die Autoren von phpMyAdmin verlauten, dass die neue Version 3.5 neben MySQL jetzt auch mit Drizzle zurecht kommt.]]></description>
			<content:encoded><![CDATA[Bei der neuen Version des MySQL Ableger Drizzle zeigen sich die Entwickler alles andere als bescheiden: "everyone should upgrade to 7.1 because it is far superior." Also los, Downloads für verschiedene Linux-Distributionen gibt es auf der Projektseite.
An gleicher Stelle findet sich übrigens auch ein PECL-Paket, um Drizzle per PHP anzusprechen. Und zu guter letzt lassen die Autoren von phpMyAdmin verlauten, dass die neue Version 3.5 neben MySQL jetzt auch mit Drizzle zurecht kommt.]]></content:encoded>
			<wfw:commentRss>http://hackdrizzle.com/drizzle-7-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rundumerneuerung: Neue XAMPP Beta mit PHP 5.4 und MySQL 5.5</title>
		<link>http://www.apachefriends.org/en/xampp-beta.html</link>
		<comments>http://www.apachefriends.org/en/xampp-beta.html#comments</comments>
		<pubDate>Wed, 28 Mar 2012 18:58:37 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=1000</guid>
		<description><![CDATA[Mehrere Leser unserer vierten Auflage haben sich gemeldet und gefragt, wann kommt XAMPP mit PHP 5.4 und MySQL 5.5 - passend zum Buch. Jetzt können wir Vollzug melden, zumindest eine Beta für Linux und Windows ist da. Und wo die Apachen-Freunde schon dabei waren, haben sie auch noch die neue Webserver-Version 2.4 dazugelegt.]]></description>
			<content:encoded><![CDATA[Mehrere Leser unserer vierten Auflage haben sich gemeldet und gefragt, wann kommt XAMPP mit PHP 5.4 und MySQL 5.5 - passend zum Buch. Jetzt können wir Vollzug melden, zumindest eine Beta für Linux und Windows ist da. Und wo die Apachen-Freunde schon dabei waren, haben sie auch noch die neue Webserver-Version 2.4 dazugelegt.]]></content:encoded>
			<wfw:commentRss>http://www.apachefriends.org/en/xampp-beta.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UPSERT in MySQL: INSERT &#8230; ON DUPLICATE KEY UPDATE</title>
		<link>http://www.phpundmysql.de/2012/03/28/upsert-in-mysql-insert-on-duplicate-key-update/</link>
		<comments>http://www.phpundmysql.de/2012/03/28/upsert-in-mysql-insert-on-duplicate-key-update/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 14:42:09 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Codebeispiel]]></category>
		<category><![CDATA[INSERT]]></category>
		<category><![CDATA[Key]]></category>
		<category><![CDATA[Schlüssel]]></category>
		<category><![CDATA[Subselect]]></category>
		<category><![CDATA[Syntax]]></category>
		<category><![CDATA[Unique]]></category>
		<category><![CDATA[UPDATE]]></category>
		<category><![CDATA[UPSERT]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=974</guid>
		<description><![CDATA[Um herauszufinden, ob ein Datensatz in die Datenbank eingefügt oder darin aktualisiert werden muss, bedarf es in MySQL keiner vorigen SELECT Abfrage. Die Datenbank erlaubt, ein INSERT Statement so zu erweitern, dass dabei bei einer Schlüsselverletzung (Primary oder Unique Key) automatisch zu einem UPDATE wird. Wie das landläufig als UPSERT bekannte Statement in MySQL zu implementieren ist, zeigen wir in einem Codebeispiel.]]></description>
			<content:encoded><![CDATA[<p>Wer die Feinheiten der Syntax kennt, kann sich ihne viel Arbeit oft selbst aus der Patsche helfen. Das INSERT ... ON DUPLICATE KEY UPDATE, kurz UPSERT, ist so ein Fall. Ohne UPSERT hat man in der Regel zwei Wege herauszufinden, ob man beim Befüllen der Datenbank ein INSERT oder ein UPDATE benötigt:</p>
<p>
1. Ein SELECT absetzen, das genau nach der Kombination von Schlüsselattributen sucht, die man einfügen möchte. Liefert das SELECT einen Datensatz zurück, dann macht man ein UPDATE, sonst ein INSERT. Oder<br />
2. Gleich ein INSERT absetzen und prüfen, ob ein <code>ERROR 1062 (23000): Duplicate entry...</code> zurückkommt. Wenn ja, dann ein UPDATE hinterherschieben.
</p>
<p>Beides erzeugt wesentlich zu viel Aufwand. Nehmen wir beispielsweise folgende MySQL-Tabelle</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;">TABLE</span> upsert <span style="color: #66cc66;">&#40;</span>
id INT<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
updated_on TIMESTAMP <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
value VARCHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Die Tabelle ist sehr einfach strukturiert: <code>id</code> dient als Primärschlüssel (ohne <code>AUTO INCREMENT</code>), <code>updated_on</code> hält den Zeitpunkt der letzten Änderung fest und <code>value</code> speichert irgendeinen Wert. Mit</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> upsert <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> updated_on<span style="color: #66cc66;">,</span> value<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CURRENT_TIMESTAMP<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'abc'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>wird ein erster Datensatz eingefügt. Wird dasselbe Statement noch einmal abgesetzt, kommt es zum oben beschriebenen Fehler 1062. Ist der Tabelleninhalt beim Einfügen nicht bekannt, hilft uns das <strong>UPSERT </strong>weiter:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> upsert <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> updated_on<span style="color: #66cc66;">,</span> value<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CURRENT_TIMESTAMP<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'abc'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">ON</span> DUPLICATE <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> updated_on <span style="color: #66cc66;">=</span> CURRENT_TIMESTAMP<span style="color: #66cc66;">,</span> value <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'abc'</span>;</pre></div></div>

<p>Die Schlüsselattribute müssen im zweiten Teil des Befehls natürlich nicht mit angegeben werden, denn bei dem alternativen UPDATE verändern sie sich naturgemäß nicht. Anstatt im <code>UPDATE</code> dieselben Parameter wie im <code>INSERT</code> zu nutzen, kann man auch andere Werte zuweisen.<br />
Noch einfacher ist natürlich, wenn man die Parameter (<code>CURRENT_TIMESTAMP</code> und 'abc') nicht zweimal in seinen Befehl einbauen muss. Das hilft besonders bei der Verwendung von Prepared Statements. Diesen Komfort erreicht man durch die Verwendung des <strong><code>VALUES()</code></strong> innerhalb des <code>UPDATE</code>-Teils. Damit hat man Zugriff auf die Werte, die man im vorderen Teil des Befehls festgelegt hat.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> upsert <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> updated_on<span style="color: #66cc66;">,</span> value<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CURRENT_TIMESTAMP<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'abc'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">ON</span> DUPLICATE <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> updated_on <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span>updated_on<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> value <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p><strong>2 ROWS AFFECTED???</strong></p>
<p>Bei genauerer Betrachtung fällt noch eine Eigenheit des UPSERT auf. Auch wenn sich nur ein Datensatz in der Tabelle befindet, vermeldet MySQL die erfolgreiche Ausführung des UPSERT mit</p>
<p><code>Query OK, 2 rows affected (0.00 sec) </code></p>
<p>Das ist kein Fehler, sondern ein gewünschtes und <a href="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html">dokumentiertes</a> Verhalten. Wird bei einem UPSERT eine Zeile eingefügt, meldet MySQL <code>1 row affected</code>, muss stattdessen eine Aktualisierung vorgenommen werden, sind es eben 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpundmysql.de/2012/03/28/upsert-in-mysql-insert-on-duplicate-key-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gehversuche mit OAuth</title>
		<link>http://it-republik.de/php/artikel/Wie-Sie-OAuth-zur-Autorisierung-verwenden-4531.html</link>
		<comments>http://it-republik.de/php/artikel/Wie-Sie-OAuth-zur-Autorisierung-verwenden-4531.html#comments</comments>
		<pubDate>Mon, 19 Mar 2012 17:10:25 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Authentifizierung]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Sicherheit]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=970</guid>
		<description><![CDATA[Die Kollegen vom PHP Magazin haben heute einen Artikel über Authentifizierung mit OAuth ins Netz gestellt. Darin vermittelt Carsten Eilers die Grundlagen des Standards und wirft einen Blick auf aktuellen OAuth PHP-Bibliotheken]]></description>
			<content:encoded><![CDATA[Die Kollegen vom PHP Magazin haben heute einen Artikel über Authentifizierung mit OAuth ins Netz gestellt. Darin vermittelt Carsten Eilers die Grundlagen des Standards und wirft einen Blick auf aktuellen OAuth PHP-Bibliotheken]]></content:encoded>
			<wfw:commentRss>http://it-republik.de/php/artikel/Wie-Sie-OAuth-zur-Autorisierung-verwenden-4531.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 erschienen</title>
		<link>http://php.net/downloads.php#v5.4.0</link>
		<comments>http://php.net/downloads.php#v5.4.0#comments</comments>
		<pubDate>Thu, 01 Mar 2012 22:17:22 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=968</guid>
		<description><![CDATA[Der achte Release Candidate war dann letztlich ausgereift genug: ab sofort steht PHP 5.4 in finaler Version zum Download bereit.]]></description>
			<content:encoded><![CDATA[Der achte Release Candidate war dann letztlich ausgereift genug: ab sofort steht PHP 5.4 in finaler Version zum Download bereit.]]></content:encoded>
			<wfw:commentRss>http://php.net/downloads.php#v5.4.0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NoSQL: HANDLER Statement in MariaDB</title>
		<link>http://www.phpundmysql.de/2012/02/21/nosql-handler-statement-in-mariadb/</link>
		<comments>http://www.phpundmysql.de/2012/02/21/nosql-handler-statement-in-mariadb/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 06:39:23 +0000</pubDate>
		<dc:creator>(sr)</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[Index]]></category>
		<category><![CDATA[Table Scan]]></category>

		<guid isPermaLink="false">http://www.phpundmysql.de/?p=956</guid>
		<description><![CDATA[Lange mussten sich relationale Datenbanken wenig um den Abstand zur Konkurrenz kümmern. NoSQL hat das geändert und jetzt fühlen sich MySQL, MariaDB und Co. genötigt, NoSQL-Features in die eigene Architektur einzubauen.]]></description>
			<content:encoded><![CDATA[<p>Ende 2010 haben wir über <a title="Handlersocket" href="http://www.phpundmysql.de/2010/12/22/handlersocket-mysql-wird-nosql/" target="_self">HandlerSocket für MySQL</a> berichtet. Mit dem Plugin lassen sich Teile der MySQL Architektur umgehen, was direkten und somit deutlich schnelleren Zugriff auf die Daten erlaubt.</p>
<p>MariaDB, der MySQL Fork von Monty Widenius, ist zwar immer noch so nah am Original, damit auch Handlersocket darin läuft, bietet allerdings eigene Funktionen an, um das gleiche ohne Plugin zu erreichen: <a title="Handler Commands" href="http://kb.askmonty.org/en/handler-commands" target="_blank">HANDLER Kommandos</a>. Darunter sind alternative SQL Kommandos zu <code>SELECT</code>s zu verstehen, die dem Server sagen: Ich will Datensatz xy im Index abc suchen. Der explizite Verweis auf den Index-Eintrag beschleunigt die Abfrage natürlich. </p>
<p><strong>Index Scans</strong><br />
Im Folgenden nutzen wir die Beispieldatenbank employees-db aus dem <a href="https://launchpad.net/test-db">Launchpad</a>. Anstatt</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> employees <span style="color: #993333; font-weight: bold;">WHERE</span> emp_no<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">100000</span>;</pre></div></div>

<p>steht dann</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">HANDLER employees OPEN;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx<span style="color: #66cc66;">=</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100000</span><span style="color: #66cc66;">&#41;</span>;
HANDLER employees CLOSE;</pre></div></div>

<p>Statt einem Statement braucht ein Handler zusätzliche <code>OPEN</code> und <code>CLOSE</code> Anweisungen. Der Vorteil des Handlers wird hieraus nicht sichtbar. Das Ergebnis ist nämlich das gleiche wie im obigen <code>SELECT</code>: Es werden alle Spalten des Datensatzes zurückgegeben, in dem die ID gleich 100000 ist. Allerdings erlaubt der Handler, den Index zu durchwandern:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">HANDLER employees OPEN;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx<span style="color: #66cc66;">=</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100000</span><span style="color: #66cc66;">&#41;</span>;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx NEXT;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx PREV;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx LAST;
HANDLER employees CLOSE;</pre></div></div>

<p>Es lassen sich also mehrere Abfragen innerhalb des Handlers abfackeln. Vorsicht ist allerdings geboten, wenn es um den Index geht. Im obigen Beispiel wird <code>unique_idx</code> verwendet, der in der employees-db nicht von Vornherein angelegt ist. Wir hatten Schwierigkeiten, den Handler mit dem Primary Key zu verwenden, der auch PRIMARY heißt. Hier scheint es einen Konlikt mit dem reservierten Wort zu geben.</p>
<p><strong>Table Scans</strong><br />
Ein Handler muss nicht zwangsläufig auf einen Index verweisen. Es lassen sich auch ganze einfache Tabellen durchlaufen. In den Statements entfallen dann logischerweise nur die Index-Zusätze, der Rest bleibt identisch:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">HANDLER employees OPEN;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> FIRST;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> NEXT;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> PREV;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> LAST;
HANDLER employees CLOSE;</pre></div></div>

<p><strong>Pagination</strong><br />
Handler lassen sich wunderbar dafür einsetzen, Ergebnisse aus Datenbanktabellen seitenweise anzuzeigen. Da sie die Ordnung aus dem Index ausnutzen, können Sie in Verbindung mit LIMIT gleich große Mengen Daten z.B. für eine tabellarisch Darstellung liefern:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">HANDLER employees OPEN;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx<span style="color: #66cc66;">=</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100000</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">10</span>;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx NEXT <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">10</span>;
HANDLER employees <span style="color: #993333; font-weight: bold;">READ</span> unique_idx LAST <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">10</span>;
HANDLER employees CLOSE;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.phpundmysql.de/2012/02/21/nosql-handler-statement-in-mariadb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

