<?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>ebene7 &#187; Datenbank</title>
	<atom:link href="http://blog.ebene7.com/kategorie/entwicklung/datenbank/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ebene7.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 18:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MySQL: Datenbank kopieren</title>
		<link>http://blog.ebene7.com/2013/02/05/mysql-datenbank-kopieren/</link>
		<comments>http://blog.ebene7.com/2013/02/05/mysql-datenbank-kopieren/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 13:00:22 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[kopieren]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=4005</guid>
		<description><![CDATA[Bestehende Datenbank in Datei schreiben: mysqldump datenbank_orig &#62; datenbank_orig.sql -ubenutzername -p Neue Datenbank aus Datei befüllen: mysql -ubenutzername -p datenbank_kopie &#60; datenbank_orig.sql]]></description>
			<content:encoded><![CDATA[<p>Bestehende Datenbank in Datei schreiben:</p>
<pre>mysqldump datenbank_orig &gt; datenbank_orig.sql -ubenutzername -p</pre>
<p>Neue Datenbank aus Datei befüllen:</p>
<pre>mysql -ubenutzername -p datenbank_kopie &lt; datenbank_orig.sql</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2013/02/05/mysql-datenbank-kopieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: Doppelte Datensätze löschen</title>
		<link>http://blog.ebene7.com/2011/01/12/mysql-doppelte-datensaetze-loeschen/</link>
		<comments>http://blog.ebene7.com/2011/01/12/mysql-doppelte-datensaetze-loeschen/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 05:00:20 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Duplikat]]></category>
		<category><![CDATA[Löschen]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Query]]></category>
		<category><![CDATA[Selbstreferenz]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2552</guid>
		<description><![CDATA[Hin und wieder kann es vorkommen, dass sich Datensätze ungewollt doppelt in der Datenbank wiederfinden. Hier ein kleiner Spickzettel, wie sich die Doubletten wieder entfernen lassen. Die Struktur der Testtabelle sieht folgendermaßen aus: CREATE TABLE `sqltest`.`duplicates` ( `id` INT(11) UNSIGNED &#8230; <a href="http://blog.ebene7.com/2011/01/12/mysql-doppelte-datensaetze-loeschen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hin und wieder kann es vorkommen, dass sich Datensätze ungewollt doppelt in der Datenbank wiederfinden.</p>
<p>Hier ein kleiner Spickzettel, wie sich die Doubletten wieder entfernen lassen.</p>
<p><span id="more-2552"></span>Die Struktur der Testtabelle sieht folgendermaßen aus:</p>
<pre><code>CREATE TABLE `sqltest`.`duplicates` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `a` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `b` INT(11) NOT NULL ,
  `c` DATETIME NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;</code></pre>
<p>Noch ein paar Daten rein und fertig ist die Spielwiese.</p>
<pre>mysql&gt; select * from duplicates;
+----+--------+-----+---------------------+
| id | a      | b   | c                   |
+----+--------+-----+---------------------+
|  1 | Apfel  | 123 | 2011-01-11 17:00:00 |
|  2 | Apfel  | 123 | 2011-01-11 17:00:00 |
|  3 | Banane | 234 | 2011-01-12 17:00:00 |
|  4 | Banane | 234 | 2011-01-12 17:00:00 |
|  5 | Birne  | 456 | 2011-01-15 17:00:00 |
|  6 | Birne  | 456 | 2011-01-15 17:00:00 |
+----+--------+-----+---------------------+
6 rows in set (0.00 sec)</pre>
<p>Die erste Abfrage macht einen JOIN auf sich selbst, dafür die Aliasse d1 und d2 und dient zunächst der Prüfung, ob wir die gewünschten Datensätze geliefert bekommen.</p>
<pre>SELECT d1.* FROM duplicates d1, duplicates d2
 WHERE d1.id != d2.id
   AND d1.a = d2.a
   AND d1.b = d2.b
   AND d1.c = d2.c
   AND d1.id &lt; d2.id</pre>
<p>Das Ergebnis:</p>
<pre>+----+--------+-----+---------------------+
| id | a      | b   | c                   |
+----+--------+-----+---------------------+
|  1 | Apfel  | 123 | 2011-01-11 17:00:00 |
|  3 | Banane | 234 | 2011-01-12 17:00:00 |
|  5 | Birne  | 456 | 2011-01-15 17:00:00 |
+----+--------+-----+---------------------+
3 rows in set (0.00 sec)</pre>
<p>MySQL kann offensichtlich keine Daten löschen, wenn die Löschaktion auf derselben Tabelle wie die Subquery gemacht wird. Darum schreiben wir die Ids in eine temporäre Tabelle.</p>
<pre>CREATE TABLE duplicates_ids AS (
  SELECT d2.id FROM duplicates d1, duplicates d2
   WHERE d1.id != d2.id
     AND d1.a = d2.a
     AND d1.b = d2.b
     AND d1.c = d2.c
     AND d1.id &lt; d2.id
)</pre>
<p>Im letzten Schritt löschen wir die zuvor ausgewählten Datensätze und auch die temporäre Tabelle. Je nachdem was wir behalten wollen, noch ggf. ein &#8220;NOT&#8221; vor das &#8220;IN&#8221; schreiben.</p>
<pre>DELETE FROM duplicates WHERE id [NOT] IN (SELECT * FROM duplicates_ids);
DROP TABLE duplicates_ids;</pre>
<p>Achtung! Ich hafte nicht bei Datenverlust oder sonstigen Fehlern. Ein Backup sollte sicherheitshalber vorher gemacht werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2011/01/12/mysql-doppelte-datensaetze-loeschen/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Aufzählungen mit GROUP_CONCAT()</title>
		<link>http://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/</link>
		<comments>http://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 05:00:13 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Formatierung]]></category>
		<category><![CDATA[Funktion]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2159</guid>
		<description><![CDATA[Für verschiedene Anwendungsfälle ist es übersichtlicher, wenn 1:n Beziehungen als Aufzählung angezeigt werden. Für dieses Beispiel verwende ich eine kleine, übersichtliche Tabelle mit Emailadressen und deren Aliase. CREATE TABLE `mails` ( `id` int(11) NOT NULL auto_increment, `parent_id` int(11) NOT NULL, &#8230; <a href="http://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für verschiedene Anwendungsfälle ist es übersichtlicher, wenn 1:n Beziehungen als Aufzählung angezeigt werden. Für dieses Beispiel verwende ich eine kleine, übersichtliche Tabelle mit Emailadressen und deren Aliase.<span id="more-2159"></span></p>
<pre>CREATE TABLE `mails` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL,
  `addy` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8</pre>
<p>Jede Emailadresse hat eine Id und eine ParentId. Sind beide Ids identisch, dann ist es die Originaladresse, ansonsten ein Alias.</p>
<pre>mysql&gt; select * from mails;
+----+-----------+------------------+
| id | parent_id | addy             |
+----+-----------+------------------+
|  1 |         1 | m1@example.com   |
|  2 |         1 | a1m1@example.com |
|  3 |         3 | m2@example.com   |
|  4 |         1 | a2m1@example.com |
|  5 |         3 | a1m2@example.com |
+----+-----------+------------------+
5 rows in set (0.00 sec)
</pre>
<p>Mit einem selbstreferenzierenden Join werden die Daten nun wieder aus der Tabelle ausgelesen. Dabei wird die Tabelle &#8216;mails&#8217; durch Aliasnamen wie zwei Tabellen behandelt. Wir selektieren die &#8216;addy&#8217; aus der Tabelle &#8216;m1&#8242; und die gejointen Aliase aus &#8216;m2&#8242;. Durch <a href="http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat" target="_blank">GROUP_CONCAT()</a> werden die Werte nun kommasepariert in der Spalte &#8216;aliases&#8217; ausgegeben.</p>
<pre>mysql&gt; SELECT m1.addy, GROUP_CONCAT(m2.addy SEPARATOR ', ') AS aliases
 -&gt;   FROM mails m1
 -&gt;   JOIN mails m2 ON m2.parent_id = m1.id
 -&gt;  WHERE m2.id &lt;&gt; m2.parent_id
 -&gt;  GROUP BY m1.id;
+----------------+--------------------------------------+
| addy           | aliases                              |
+----------------+--------------------------------------+
| m1@example.com | a1m1@example.com, a2m1@example.com   |
| m2@example.com | a1m2@example.com                     |
+----------------+--------------------------------------+
2 rows in set (0.00 sec)
</pre>
<p>Das funktioniert natürlich auch mit den Ids der Alias-Adressen. In diesem Fall muss dann aber der Rückgabewert von GROUP_CONCAT() gecastet werden, da sonst entweder nur die erste Id oder [BLOB] in der Ausgabe stehen würde.</p>
<pre>mysql&gt; SELECT m1.addy,
 -&gt;           CAST(GROUP_CONCAT(m2.id SEPARATOR ', ') AS char) AS alias_ids
 -&gt;   FROM mails m1
 -&gt;   JOIN mails m2 ON m2.parent_id = m1.id
 -&gt;  WHERE m2.id &lt;&gt; m2.parent_id
 -&gt;  GROUP BY m1.id;
+----------------+-----------+
| addy           | alias_ids |
+----------------+-----------+
| m1@example.com | 2, 4      |
| m2@example.com | 5         |
+----------------+-----------+
2 rows in set (0.00 sec)
</pre>
<p>Die Funktion kann nicht nur gruppieren und mit beliebigen Trennzeichen aufzählen, es ist auch möglich, eine Sortierrichtung mit anzugeben. Mehr dazu im MySQL-Manual.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2010/11/02/aufzaehlungen-mit-group-concat/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Speicherproblem bei sehr großen InnoDB-Tabellen</title>
		<link>http://blog.ebene7.com/2010/10/18/speicherproblem-bei-sehr-grossen-innodb-tabellen/</link>
		<comments>http://blog.ebene7.com/2010/10/18/speicherproblem-bei-sehr-grossen-innodb-tabellen/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 11:00:35 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Notiz an mich]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Speicherproblem]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2090</guid>
		<description><![CDATA[Heute hatte ich das Problem, dass ich verschiedene Aktionen auf einer InnoDB-Tabelle nicht ausführen konnte, weil die zugewiesende Buffergröße zu niedrig war bei ca. 24 Millionen Datensätzen. The total number of locks exceeds the lock table size Nach kurzem googlen &#8230; <a href="http://blog.ebene7.com/2010/10/18/speicherproblem-bei-sehr-grossen-innodb-tabellen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute hatte ich das Problem, dass ich verschiedene Aktionen auf einer InnoDB-Tabelle nicht ausführen konnte, weil die zugewiesende Buffergröße zu niedrig war bei ca. 24 Millionen Datensätzen.</p>
<pre><code>The total number of locks exceeds the lock table size</code></pre>
<p>Nach kurzem googlen fand ich den <a href="http://cyrilmazur.com/2010/04/mysql-error-the-total-number-of-locks-exceeds-the-lock-table-size.html" target="_blank">Artikel von Cyril</a>, der offensichtlich die selben Schwierigkeiten hatte.</p>
<p>Die Lösung war zum Glück recht einfach. In der Datei my.cnf muss der folgende Wert erhöht werden, bzw. die Konfigurationseinstellung hinzugefügt werden.</p>
<pre><code>innodb_buffer_pool_size = 16M</code></pre>
<p>Die neue Einstellung sollte dann die Arbeit mit der großen Tabelle ermöglichen.</p>
<pre><code>innodb_buffer_pool_size = 268435456</code></pre>
<p>Zum Schluss dann noch den MySQL-Server neu starten, damit die Änderungen auch wirksam werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2010/10/18/speicherproblem-bei-sehr-grossen-innodb-tabellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Attachment in CouchDB speichern</title>
		<link>http://blog.ebene7.com/2010/10/07/attachment-in-couchdb-speichern/</link>
		<comments>http://blog.ebene7.com/2010/10/07/attachment-in-couchdb-speichern/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 05:00:21 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[Attachment]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Zend_Http_Client]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1532</guid>
		<description><![CDATA[Letzte Woche habe ich ja schon etwas über CouchDB berichtet und wie unkompliziert man damit arbeiten kann. In den Dokumenten können aber nicht nur beliebige Daten in beliebiger Struktur gespeichert werden, es ist auch sehr einfach Dateianhänge zu speichern. Dieser &#8230; <a href="http://blog.ebene7.com/2010/10/07/attachment-in-couchdb-speichern/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Letzte Woche habe ich ja schon etwas über <a href="http://blog.ebene7.com/2010/09/30/couchdb-kann-mehr-als-nur-moebel-speichern/" target="_self">CouchDB</a> berichtet und wie unkompliziert man damit arbeiten kann. In den Dokumenten können aber nicht nur beliebige Daten in beliebiger Struktur gespeichert werden, es ist auch sehr einfach Dateianhänge zu speichern. Dieser Code-Schnipsel ist ein einfaches Beispiel, wie es mit dem Zend_Http_Client funktioniert. Wichtig ist nur, dass immer die _rev(Id) des jeweiligen Dokumentes mit übergeben wird, da sonst nichts gespeichert wird und ein Konflikt auftritt.</p>
<pre><code>$image = 'bild.jpg'; $mimeType = mime_content_type($image); $content = file_get_contents($image); $url = 'http://developer:5984/database/document/path?rev=xx-xxxxx'; $client = new Zend_Http_Client(); $response = $client-&gt;setUri($url) -&gt;setMethod('PUT') -&gt;setHeaders(array('Content-Type' =&gt; $mimeType)) -&gt;setRawData($content, $mimeType) -&gt;request() </code></pre>
<p>Die Anhänge könnten auch mit dem Dokument im JSON-Format übertragen werden. Dafür müsste $content dann aber erst base64_encoded werden. Hierbei werden bestehende Anhänge aber gelöscht!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2010/10/07/attachment-in-couchdb-speichern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchDB: kann mehr als nur Möbel speichern</title>
		<link>http://blog.ebene7.com/2010/09/30/couchdb-kann-mehr-als-nur-moebel-speichern/</link>
		<comments>http://blog.ebene7.com/2010/09/30/couchdb-kann-mehr-als-nur-moebel-speichern/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 05:00:23 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Datenstruktur]]></category>
		<category><![CDATA[Futon]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Rest-API]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1514</guid>
		<description><![CDATA[CouchDB klingt nicht nur bequem, es ist bequem! CouchDB ist eine dokumentenbasierte Datenbank mit REST-API, serverseitigen JavaScript-Views, Datenaustausch im JSON-Format und weil das noch nicht genug ist gibt es das Admin-Webinterface Futon gleich noch mit der Installation dazu. Die Anbindung &#8230; <a href="http://blog.ebene7.com/2010/09/30/couchdb-kann-mehr-als-nur-moebel-speichern/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>CouchDB klingt nicht nur bequem, es ist bequem! CouchDB ist eine dokumentenbasierte Datenbank mit REST-API, serverseitigen JavaScript-Views, Datenaustausch im JSON-Format und weil das noch nicht genug ist gibt es das Admin-Webinterface Futon gleich noch mit der Installation dazu.</p>
<p>Die Anbindung an eine (PHP-)Anwendung ist bei den Voraussetzungen nun denkbar einfach. Aber eins nach dem anderen.<span id="more-1514"></span></p>
<p>Was macht CouchDB denn aber nun zu einer &#8220;bequemen&#8221; Datenbank? Eigentlich fast alles. CouchDB arbeitet mit Dokumenten und eignet sich dadurch besonders für variable Strukturen und jegliche Daten, die eigentlich nicht in eine relationale Datenbank passen und nur mit viel Mühe geschrieben und gelesen werden können.</p>
<p>In RDBM-Systemen werden derartige Daten im besten Fall im EAV-Datenbankmodel (EAV = Entity-Attribute-Value) abgelegt. Das ist nicht nur sehr CPU-lastig, sondern auch für Menschen schwer bis garnicht lesbar. In CouchDB-Dokumenten liegen die Daten quasi im Stück vor, sind schnell geladen und können auch über Futon einfach bearbeitet werden.</p>
<p>Eigentlich macht alles einen sehr einfachen und leichten Eindruck. Die Installation dauerte mit ein paar Einstellungen nicht länger als zehn Minuten und das System war zumindest als Entwicklungsserver einsatzbereit. Das Admintool Futon und die REST-API sind unter &#8220;http://localhost:5984&#8243; direkt nach dem Start verfügbar.</p>
<p>Futon überrascht mit einer eher schlichten Oberfläche ohne unnötigen Schnickschnack, bietet aber alles Nötige, um damit arbeiten zu können.</p>
<p>Die Verbindung aus der PHP-Anwendung heraus habe ich mit <code>Zend_Http_Client</code> umgesetzt, es funktioniert aber auch mit curl oder anderen HTTP-Clients. Die Daten werden im JSON-Format gelesen und auch wieder geschrieben, daher lassen sich auch komplexere Strukturen einfach mit <code>json_encode()</code> und <code>json_decode()</code> verarbeiten.</p>
<p>Im Gespräch mit einem bekannten Entwickler bekam ich die Antwort, CouchDB sei doch nur ein einfacher Key-Value-Speicher und nicht mächtig genug.</p>
<p>Dem ersten Punkt möchte ich nicht widersprechen. Grob betrachtet haben wir einen Key-Value-Speicher, der jedoch durch seine Views die Daten in beliebiger Form zusammenstellen kann (habe ich eigentlich schon erwähnt, dass die Views mit einfachen JavaScript funktionieren?). Und gegen einfach ist aus meiner Sicht auch garnichts einzuwänden. Warum sollte man auch ein Tool nutzen wollen, welches die Arbeit komplizierter statt einfacher macht?</p>
<p>Fazit: Auch Zahnarztfrauen, ähm&#8230; Möbelhändler empfehlen <a href="http://couchdb.apache.org/" target="_self">CouchDB</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2010/09/30/couchdb-kann-mehr-als-nur-moebel-speichern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Stringumwandlung Underscore/CamelCase</title>
		<link>http://blog.ebene7.com/2010/07/23/stringumwandlung-underscore-camelcase/</link>
		<comments>http://blog.ebene7.com/2010/07/23/stringumwandlung-underscore-camelcase/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 05:00:27 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[CamelCase]]></category>
		<category><![CDATA[Custom_Model]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Umwandlung]]></category>
		<category><![CDATA[Underscore]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=1096</guid>
		<description><![CDATA[Häufig ist beim Umgang mit Datenquellen eine Stringumwandlung zwischen der Underscore- und CamelCase-Schreibweise erforderlich. Wo das sinnvoll ist und wie man es einfach anwendet, ist das Thema des heutigen Artikels. Die Underscore-Schreibart (z.B. &#8220;user_id&#8221;) findet man sehr oft als Spaltenbezeichner &#8230; <a href="http://blog.ebene7.com/2010/07/23/stringumwandlung-underscore-camelcase/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Häufig ist beim Umgang mit Datenquellen eine Stringumwandlung zwischen der Underscore- und CamelCase-Schreibweise erforderlich. Wo das sinnvoll ist und wie man es einfach anwendet, ist das Thema des heutigen Artikels.</p>
<p><span id="more-1096"></span>Die Underscore-Schreibart (z.B. &#8220;user_id&#8221;) findet man sehr oft als Spaltenbezeichner in Datenbanken oder auch in XML-Dateien, im PHP-Model (siehe auch mein <a href="http://blog.ebene7.com/2010/04/29/es-ist-ein-model-und-es-sieht-gut-aus/" target="_self">Artikel zum Custom_Model</a>) hingegen wird oft CamelCase (z.B. &#8220;userId&#8221;) verwendet.</p>
<p>Es wird also an der Schnittstelle zwischen dem Model und der Datenquelle eine Art Key-Mapping benötigt. Das lässt sich zwar recht einfach mit regulären Ausdrücken erschlagen, aber man kann sich auch der Zend_Filter-Klassen bedienen, wenn man in einem ZF-Umfeld arbeitet.</p>
<p>Die Anwendung ist wie so vieles beim Zend Framework recht einfach:</p>
<pre>&lt;?php
$toCamelCaseFilter = new Zend_Filter_Word_UnderscoreToCamelCase();
echo $toCamelCaseFilter-&gt;filter('user_id');

// Ausgabe: UserId</pre>
<p>Umgekehrt, wen wird es wundern, ist das natürlich genauso leicht:</p>
<pre>&lt;?php
$toUnderscoreFilter = new Zend_Filter_Word_CamelCaseToUnderscore();
echo $toUnderscoreFilter-&gt;filter('UserId');

// Ausgabe: User_Id</pre>
<p>Wenn man nicht extra eine Instanz erzeugen will, dann lassen sich die Zend Filter auch mit einem statischen Aufruf nutzen.</p>
<pre>&lt;?php
echo Zend_Filter::filterStatic('bitte_einmal_camel_case',
                               'Word_UnderscoreToCamelCase');

// Ausgabe: BitteEinmalCamelCase</pre>
<p>Das war es dann auch schon wieder für heute. Ich hoffe, dass euch der Artikel gefallen hat und ihr viele kreative Ideen zum Arbeiten mit den Filtern habt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebene7.com/2010/07/23/stringumwandlung-underscore-camelcase/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
