<?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>Onlinemagazin: devmag.net</title>
	<atom:link href="http://www.devmag.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.devmag.net</link>
	<description>Regelmäßig neue Artikel rund um das Homepage Bauen mit HTML, CSS, AJAX, PHP und XML.</description>
	<lastBuildDate>Sun, 08 Apr 2012 09:00:35 +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>href Attribut auslesen</title>
		<link>http://www.devmag.net/php/1157-href-attribut-einlesen.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=href-attribut-einlesen</link>
		<comments>http://www.devmag.net/php/1157-href-attribut-einlesen.html#comments</comments>
		<pubDate>Sun, 08 Apr 2012 09:00:24 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reguläre Ausdrücke]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1157</guid>
		<description><![CDATA[Nur ein kleiner und schneller Tipp: so können Sie das href Attribut eines Tags auslesen über einen einfachen regulären Ausdruck: preg_match( "&#60;link rel=\"openid.server\" href=\"(.*?)\" \/&#62;", $quelle, $found ); $url = $found[1]; Falls Sie alle href Attribute von Links auslesen möchten: preg_match_all( "&#60;link rel=\"openid.server\" href=\"(.*?)\" \/&#62;", $quelle, $found ); var_dump($found); No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p style="float: right;margin: 4px;"><div class="adslot-468" >
<script type="text/javascript"><!--
google_ad_client = "pub-7748812030658677";
/* 468x60, Erstellt 20.08.09 */
google_ad_slot = "9850520828";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p> <p>Nur ein kleiner und schneller Tipp: so können Sie das href Attribut eines Tags auslesen über einen einfachen regulären Ausdruck:</p>
<p><code><br />
preg_match( "&lt;link rel=\"openid.server\" href=\"(.*?)\" \/&gt;", $quelle, $found );<br />
$url = $found[1];<br />
</code></p>
<p>Falls Sie alle href Attribute von Links auslesen möchten:</p>
<p><code><br />
preg_match_all( "&lt;link rel=\"openid.server\" href=\"(.*?)\" \/&gt;", $quelle, $found );<br />
var_dump($found);<br />
</code></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/1157-href-attribut-einlesen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPad &#8211; Alle Bilder von iPad auf PC übertragen, ohne iTunes und mit ein wenig PHP</title>
		<link>http://www.devmag.net/php/1189-ipad-alle-bilder-von-ipad-auf-pc-ubertragen-ohne-itunes-und-mit-in-wenig-php.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ipad-alle-bilder-von-ipad-auf-pc-ubertragen-ohne-itunes-und-mit-in-wenig-php</link>
		<comments>http://www.devmag.net/php/1189-ipad-alle-bilder-von-ipad-auf-pc-ubertragen-ohne-itunes-und-mit-in-wenig-php.html#comments</comments>
		<pubDate>Sun, 30 Oct 2011 17:02:28 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1189</guid>
		<description><![CDATA[In den vergangenen Tagen stand ich vor folgendem Problem. Ich hatte eine Menge an Photos über iTunes auf mein iPad überspielt. Leider musste der Laptop, auf dem ich die Bilder gespeichert hatte, in die Reparatur.  Der Laptop kam mit einer leeren Festplatte zurück und ich hatte davor doch glatt vergessen, die Bilder sicherzustellen. Aber kein [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/software/186-dreamweaver-bilder-vorausladen.html' rel='bookmark' title='Permanent Link: Dreamweaver &#8211; Bilder vorausladen'>Dreamweaver &#8211; Bilder vorausladen</a></li>
<li><a href='http://www.devmag.net/html-tricks/253-lowsrc-fur-bilder.html' rel='bookmark' title='Permanent Link: Lowsrc für Bilder&#8230;'>Lowsrc für Bilder&#8230;</a></li>
<li><a href='http://www.devmag.net/html-tricks/249-bilder-horizontal-oder-vertikal-spiegeln.html' rel='bookmark' title='Permanent Link: Bilder horizontal oder vertikal spiegeln'>Bilder horizontal oder vertikal spiegeln</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div id="post-610">
<div>
<div>
<p><img class="illu alignright" style="border-style: initial; border-color: initial;" title="Logo of the Wifi Transfer app" src="http://freigeist.devmag.net/wp-content/wifi-photo-transfer-app.png" alt="Logo of the Wifi Transfer app" width="54" height="52" />In den vergangenen Tagen stand ich vor folgendem Problem. Ich hatte eine Menge an Photos über iTunes auf mein iPad überspielt. Leider musste der Laptop, auf dem ich die Bilder gespeichert hatte, in die Reparatur.  Der Laptop kam mit einer leeren Festplatte zurück und ich hatte davor doch glatt vergessen, die Bilder sicherzustellen. Aber kein Problem &#8211; dachte ich &#8211; die Bilder sind ja gut aufgehoben auf dem iPad. Nichts da!</p>
<p>Eine Synchronisation der Bilder &#8220;zurück&#8221; funktioniert über iTunes leider nicht. Auch kann man nicht direkt auf die Bilder in den Alben zugreifen, wenn man das iPad an einen Windows PC anschließt. Man hat lediglich Zugriff auf die Bilder, die mit der iPad oder iPhone Kamera gemacht wurden.</p>
<p>Da war das Dilemma, wie komme ich an die Bilder?  Es gibt natürlich eine kostenpflichtige app dazu, mit der das möglich gewesen wäre. Aber tut mir Leid, für eine solche einfache Kernfunktion zahle ich keinen Pfennig. In diesem Artikel möchte ich beschreiben, wie ich doch noch an alle Bilder gekommen bin &#8211; mit etwas PHP, einer kostenfreien app und ohne iTunes.</p>
<p><span id="more-1189"></span></p>
<p>Damit alles funktioniert benötigen sie die kostenfreie app <a href="http://itunes.apple.com/de/app/wifi-photo-transfer/id380326191?mt=8">WiFi Photo Transfer</a> auf ihrem iPad, zudem müssen sie in der Lage sein PHP Skripte auf ihrem Hauptrechner, also den Rechner auf den Sie die Bilder kopieren möchten, ausführen zu können. Wenn das möglich ist, dann ist die Arbeit wirklich ein Kinderspiel.</p>
<p><strong>Installation der app &#8220;WiFi Photo Transfer&#8221;<br />
</strong></p>
<p>Diese einfache app erlaubt es Ihnen, ihre Bilder auf dem iPad über einen URL zu erreichen und durch diese Bilder zu browsen. Damit könnten sie rein theoretisch manuell alle Bilder herunterladen. Ein Download von 100 Bildern auf einmal is auch möglich, leider sind diese Bilder dann nicht in der vollen Auflösung.</p>
<p>Um das zu automatisieren, benötigen wir nur einige Zeilen PHP Code.  Nach der Installation der app auf ihrem iPad oder iPhone, öffnen sie einfach die URL, welche die App anzeigt. In der Regel hat die URL ein Format wie folgt:</p>
<p><strong>http://192.168.1.6:15555/0/fr_564.jpg</strong></p>
<p>Die erste &#8220;0&#8243; im URL steht für die ID des Fotoalbums. Wenn Sei also zwei Alben auf ihrem iPad oder iPhone haben, kann in der URL nur die Werte 0 und  1 vorkommen. Der letzte Teil der URL is der direkte Link zu dem Bild mit der Nummer 564 in voller Auflösung (full resolution). Wir nutzen diese Struktur des URLs um die Bilder automatisch herunterzuladen.</p>
<p><a href="http://freigeist.devmag.net/wp-content/screenshot-wifi-transfer-app.jpg"><img title="Screnshot of the Wifi Transfer app Image Browser" src="http://freigeist.devmag.net/wp-content/screenshot-wifi-transfer-app.jpg" alt="" width="430" height="252" /></a></p>
<p>&nbsp;</p>
<p><strong>Automatisiertes Herunterladen mit einem PHP Skript</strong></p>
<p>Die folgenden Zeilen PHP Code bewerkstelligen das herunterladen und abspeichern der Bilder auf ihrem lokalen Rechner.</p>
<p><code><br />
for($k=0;$k</code></p>
<p>for($i=1;$i</p>
<p>//adjust this<br />
$url = &#8220;http://192.168.1.9:15555/&#8221;.$k.&#8221;/fr_&#8221;.$i.&#8221;.jpg&#8221;;</p>
<p>//adjust this<br />
$fn = &#8220;C:/Dokumente und Einstellungen/Thiemo/Desktop/Kolumbien/&#8221;.$k.&#8221;-&#8221;.$i.&#8221;.jpg&#8221;;</p>
<p>//to make sure you dont redownload a file already downloaded if you want<br />
//to run the script several times<br />
if(!file_exists($fn)) {<br />
if($content = file_get_contents($url)) {<br />
$fp = fopen($fn,&#8221;a+&#8221;);<br />
fwrite($fp, $content);<br />
fclose($fp);<br />
}<br />
}<br />
}</p>
<div>
<div><span style="font-size: small;"><span class="Apple-style-span" style="line-height: normal;">Das Skript hier ist an für sich nicht kompliziert. Es iteriert durch die Anzahl der Alben, die ich auf meinem iPad habe &#8211; in dem Fall sind das vier Alben. Die nächste Schleife iteriert durch maximal 1000 Bilder. Das muss man gegebenenfalls anpassen, falls ein Album mehr als 1000 Bilder hat. Man könnte das ganze jetzt noch klüger machen und in einem ersten Schritt feststellen lassen, wieviele Bilder ein einem Album sind. Aber das überlasse ich anderen.</span></span></div>
</div>
<div>
<div>Auch empfiehlt sich das Skript <strong>mehrere Male durchlaufen</strong> zu lassen, da ab und an ein paar Bilder nicht geladen werden können. Durch das überprüfen, ob ein Bild bereits existiert mit &#8220;file_exists&#8221;, werden bereits heruntergeladene Bilder nicht noch einmal heruntergeladen.</div>
</div>
</div>
</div>
</div>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/software/186-dreamweaver-bilder-vorausladen.html' rel='bookmark' title='Permanent Link: Dreamweaver &#8211; Bilder vorausladen'>Dreamweaver &#8211; Bilder vorausladen</a></li>
<li><a href='http://www.devmag.net/html-tricks/253-lowsrc-fur-bilder.html' rel='bookmark' title='Permanent Link: Lowsrc für Bilder&#8230;'>Lowsrc für Bilder&#8230;</a></li>
<li><a href='http://www.devmag.net/html-tricks/249-bilder-horizontal-oder-vertikal-spiegeln.html' rel='bookmark' title='Permanent Link: Bilder horizontal oder vertikal spiegeln'>Bilder horizontal oder vertikal spiegeln</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/1189-ipad-alle-bilder-von-ipad-auf-pc-ubertragen-ohne-itunes-und-mit-in-wenig-php.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Query &#8211; Anzahl der Einträge in einer Gruppe ermitteln</title>
		<link>http://www.devmag.net/datenbank/1177-sql-query-anzahl-der-eintrage-in-einer-gruppe-ermitteln.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sql-query-anzahl-der-eintrage-in-einer-gruppe-ermitteln</link>
		<comments>http://www.devmag.net/datenbank/1177-sql-query-anzahl-der-eintrage-in-einer-gruppe-ermitteln.html#comments</comments>
		<pubDate>Tue, 20 Sep 2011 07:20:13 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Query]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1177</guid>
		<description><![CDATA[Hier ein paar Zeilen SQL Code, mit dem man die Anzahl der Einträge einer jeweiligen Gruppe ermitteln kann.  Das heißt, wenn sie feststellen möchten, wieviele ihrer Nutzer aus verschiedenen Ländern stammen oder bei ähnlichen Problemstellungen (e.g. wieviele ihrer Newsletter Abonnenten bei Gmail oder Hotmail sind), können sie auf folgendes Query zurückgreifen. SELECT  distinct(location) as loc, [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/41-besucher-user-online-ermitteln-und-anzeigen.html' rel='bookmark' title='Permanent Link: Besucher, User online ermitteln und anzeigen'>Besucher, User online ermitteln und anzeigen</a></li>
<li><a href='http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html' rel='bookmark' title='Permanent Link: PHP und Google Maps : Die Geokordinaten ermitteln'>PHP und Google Maps : Die Geokordinaten ermitteln</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Hier ein paar Zeilen SQL Code, mit dem man die Anzahl der Einträge einer jeweiligen Gruppe ermitteln kann.  Das heißt, wenn sie feststellen möchten, wieviele ihrer Nutzer aus verschiedenen Ländern stammen oder bei ähnlichen Problemstellungen (e.g. wieviele ihrer Newsletter Abonnenten bei Gmail oder Hotmail sind), können sie auf folgendes Query zurückgreifen.</p>
<p><code>SELECT  distinct(location) as loc, count(*) as nobs FROM `coztias` GROUP BY loc ORDER BY `nobs` DESC</code></p>
<p>Das heißt hier ermitteln sie zunächst die verschiedenen Orte oder Länder aus denen ihre Mitglieder sind über die distinct() Funktion. Durch das Group by Statement wird sichergestellt, dass die count() Funktion auf diese Gruppen angewendet wird.</p>
<table id="table_results">
<thead>
<tr>
<th>loc</th>
<th>nobs</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td align="right">279</td>
</tr>
<tr>
<td>china</td>
<td align="right">237</td>
</tr>
<tr>
<td></td>
<td align="right">188</td>
</tr>
<tr>
<td>singapore</td>
<td align="right">88</td>
</tr>
<tr>
<td>gibraltar</td>
<td align="right">88</td>
</tr>
<tr>
<td>japan</td>
<td align="right">80</td>
</tr>
<tr>
<td>us gulf</td>
<td align="right">73</td>
</tr>
<tr>
<td>far east</td>
<td align="right">72</td>
</tr>
<tr>
<td>shanghai</td>
<td align="right">67</td>
</tr>
<tr>
<td>xingang</td>
<td align="right">59</td>
</tr>
<tr>
<td>north china</td>
<td align="right">58</td>
</tr>
</tbody>
</table>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/41-besucher-user-online-ermitteln-und-anzeigen.html' rel='bookmark' title='Permanent Link: Besucher, User online ermitteln und anzeigen'>Besucher, User online ermitteln und anzeigen</a></li>
<li><a href='http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html' rel='bookmark' title='Permanent Link: PHP und Google Maps : Die Geokordinaten ermitteln'>PHP und Google Maps : Die Geokordinaten ermitteln</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/datenbank/1177-sql-query-anzahl-der-eintrage-in-einer-gruppe-ermitteln.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reguläre Ausdrücke: Leerzeichen zwischen Worte einfügen</title>
		<link>http://www.devmag.net/php/1173-regulare-ausdrucke-leerzeichen-zwischen-worte-einfugen.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=regulare-ausdrucke-leerzeichen-zwischen-worte-einfugen</link>
		<comments>http://www.devmag.net/php/1173-regulare-ausdrucke-leerzeichen-zwischen-worte-einfugen.html#comments</comments>
		<pubDate>Fri, 16 Sep 2011 10:39:54 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Tricks]]></category>
		<category><![CDATA[Reguläre Ausdrücke]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1173</guid>
		<description><![CDATA[Ich hatte folgendes Problem: zwei Strings die leider zusammengepackt wurden, d.h. der String sah in etwa so aus: BlackSeaRedel oder SouthWestPassage. Mit folgendem regulärem Ausdruck, kann man automatisch Leerzeichen zwischen Worte einfügen. Das funktioniert leider nur, wenn das folgende Wort mit einem Großbuchstaben funktioniert. In PHP wäre die Umsetzung über die preg_replace Funktion, etwa wie [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/83-regulaere-ausdruecke.html' rel='bookmark' title='Permanent Link: Reguläre Ausdrücke und PHP'>Reguläre Ausdrücke und PHP</a></li>
<li><a href='http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html' rel='bookmark' title='Permanent Link: Alle img-Tags mit regulären Ausdrücken ermitteln'>Alle img-Tags mit regulären Ausdrücken ermitteln</a></li>
<li><a href='http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html' rel='bookmark' title='Permanent Link: Twitter API &#8211; Nachrichten senden'>Twitter API &#8211; Nachrichten senden</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Ich hatte folgendes Problem: zwei Strings die leider zusammengepackt wurden, d.h. der String sah in etwa so aus: BlackSeaRedel oder SouthWestPassage. Mit folgendem regulärem Ausdruck, kann man automatisch Leerzeichen zwischen Worte einfügen. Das funktioniert leider nur, wenn das folgende Wort mit einem Großbuchstaben funktioniert.</p>
<p>In PHP wäre die Umsetzung über die preg_replace Funktion, etwa wie folgt:</p>
<p><code><br />
$dely = preg_replace('/([a-z])([A-Z])/', '$1 $2', $dely);<br />
</code><br />
Man kann das noch etwas variieren, sodass auch Worte, die etwa direkt auf Zahlen folgen, mit einem Leerzeichen getrennt werden.</p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/83-regulaere-ausdruecke.html' rel='bookmark' title='Permanent Link: Reguläre Ausdrücke und PHP'>Reguläre Ausdrücke und PHP</a></li>
<li><a href='http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html' rel='bookmark' title='Permanent Link: Alle img-Tags mit regulären Ausdrücken ermitteln'>Alle img-Tags mit regulären Ausdrücken ermitteln</a></li>
<li><a href='http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html' rel='bookmark' title='Permanent Link: Twitter API &#8211; Nachrichten senden'>Twitter API &#8211; Nachrichten senden</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/1173-regulare-ausdrucke-leerzeichen-zwischen-worte-einfugen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP und Google Maps : Die Geokordinaten ermitteln</title>
		<link>http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-und-google-maps-die-geokordinaten-ermitteln</link>
		<comments>http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html#comments</comments>
		<pubDate>Sun, 04 Sep 2011 09:06:06 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[PHP Tricks]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1168</guid>
		<description><![CDATA[Hier eine hilfreiche Funktion, mit der man über die Google MAPS API die Geokordinaten zu einer Adresse ermitteln kann. Diese Daten können dann wiederum in anderen Kartensystemen, wie der Openstreet Map verwendet werden. function ResponseToArray($response) { return json_decode($response,true); } function findLocation($string) { $url = "http://maps.google.com/maps/geo?q=".urlendcode($string) ."&#38;output=json&#38;sensor=true_or_false&#38;key=your_api_key"; $raw = file_get_contents($url); $geodata = ResponseToArray($raw); $point = $geodata["Placemark"][0]["Point"]["coordinates"]; return [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php-tricks/237-genau-einen-datensatz-oder-ein-datenfeld.html' rel='bookmark' title='Permanent Link: Genau einen Datensatz oder ein Datenfeld'>Genau einen Datensatz oder ein Datenfeld</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Hier eine hilfreiche Funktion, mit der man über die <a title="Link zur Google MAPS API" href="http://code.google.com/intl/de/apis/maps/" target="_blank">Google MAPS API</a> die Geokordinaten zu einer Adresse ermitteln kann. Diese Daten können dann wiederum in anderen Kartensystemen, wie der <a href="http://wiki.openstreetmap.org/wiki/API" target="_blank">Openstreet Map</a> verwendet werden.</p>
<pre>function ResponseToArray($response) {

	return json_decode($response,true);
}

function findLocation($string) {

$url = "http://maps.google.com/maps/geo?q=".urlendcode($string)
       ."&amp;output=json&amp;sensor=true_or_false&amp;key=your_api_key";

$raw = file_get_contents($url);

$geodata = ResponseToArray($raw);

$point = $geodata["Placemark"][0]["Point"]["coordinates"];

return $point;

}</pre>
<p>Die Verwendung ist relativ simpel, der Funktion muss lediglich eine Adresse als String übergeben werden. Ein Aufruf der Funktion könnte wie folgt aussehen:</p>
<pre>$points = findLocation("Tiergarten Berlin");</pre>
<p><span id="more-1168"></span></p>
<p>Zurückgegeben wird der Längen- und der Breitengrad der Adresse.  Das JSON Object, wird über die Funktion ResponseToArray in ein leicht verwendbares Array umgewandelt. Die komplete JSON Antwort beinhaltet auch noch zusätzliche Informationen, die eventuell für ein Kartensystem wie ARCGIS verwendet werden kann. So etwa die nächstgrößere administrative Einheit, i.e. das Bundesland.</p>
<pre>{
  "name": "Tiergarten Berlin",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "Tiergarten, Berlin, Deutschland",
    "AddressDetails": {
   "Accuracy" : 4,
   "Country" : {
      "AdministrativeArea" : {
         "AdministrativeAreaName" : "Berlin",
         "SubAdministrativeArea" : {
            "Locality" : {
               "DependentLocality" : {
                  "DependentLocalityName" : "Tiergarten"
               },
               "LocalityName" : "Berlin"
            },
            "SubAdministrativeAreaName" : "Berlin"
         }
      },
      "CountryName" : "Deutschland",
      "CountryNameCode" : "DE"
   }
},
    "ExtendedData": {
      "LatLonBox": {
        "north": 52.5414820,
        "south": 52.4987120,
        "east": 13.3775360,
        "west": 13.3112690
      }
    },
    "Point": {
      "coordinates": [ 13.3427399, 52.5254980, 0 ]
    }
  } ]
}</pre>
<pre></pre>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php-tricks/237-genau-einen-datensatz-oder-ein-datenfeld.html' rel='bookmark' title='Permanent Link: Genau einen Datensatz oder ein Datenfeld'>Genau einen Datensatz oder ein Datenfeld</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter API &#8211; Nachrichten senden</title>
		<link>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=twitter-api-nachrichten-senden</link>
		<comments>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html#comments</comments>
		<pubDate>Tue, 25 Aug 2009 08:18:33 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webservices]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1138</guid>
		<description><![CDATA[Twittern ist doch sehr trendig. Seit 2007 gibt es die Twitter API &#8211; hier soll ein kleines Script vorgestellt werden, mit welchem ihr munter von eurer Webseite loszwitschern könnt. Das alles läuft mit ein paar Zeilen PHP Code und einem Zugang zur Twitter API. Die API von Twitter wurde 2007 veröffentlicht. Mittlerweile gibt es natürlich [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/42-diese-seite-weiterempfehlen.html' rel='bookmark' title='Permanent Link: Diese Seite weiterempfehlen&#8230;'>Diese Seite weiterempfehlen&#8230;</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devmag.net/wp-content/uploads/illu_php_twitter.jpg"><img class="illu alignright" title="Twitter Status mit PHP und der Twitter API updaten" src="http://www.devmag.net/wp-content/uploads/illu_php_twitter.jpg" alt="Twitter Status mit PHP und der Twitter API updaten" width="50" height="50" /></a>Twittern ist doch sehr trendig. Seit 2007 gibt es die Twitter API &#8211; hier soll ein kleines Script vorgestellt werden, mit welchem ihr munter von eurer Webseite loszwitschern könnt. Das alles läuft mit ein paar Zeilen PHP Code und einem Zugang zur Twitter API.<span id="more-1138"></span></p>
<p>Die API von Twitter wurde 2007 veröffentlicht. Mittlerweile gibt es natürlich auch eine PHP Programmbibliothek, mit der Sie Twitter z.B. in Ihr Blog integrieren können. Auf Dr.Web.de wurde ein kleines <a title="Dr.Web Twitter Plugin" href="http://www.drweb.de/magazin/twittern-mit-wordpress-und-dr-web/" target="_blank">WordPress Plugin </a>vorgestellt, mit dem man automatisch Nachrichten an Twitter senden kann. Das ganze Skript können Sie <a title="Twitter PHP Script" href="http://www.box.net/shared/trnomoyh15" target="_blank">hier</a> herunterladen.</p>
<p>Es besteht aus einer Datei. Einem Script, um die Nachrichten an Twitter zu senden und einem Formular, über welches die Nachrichten eingegeben werden.</p>
<p>Der PHP Code für das Senden der Message ist wie folgt:</p>
<p>insertTwitterMsg.php<br />
<code>&lt;?php<br />
$twitter_username ='yourTwitterUserName';<br />
$twitter_psw ='yourTwitterPassword';<br />
require('twitterAPI.php');<br />
if(isset($_POST['twitter_msg']))<br />
{<br />
$twitter_message=$_POST['twitter_msg'];<br />
if(strlen($twitter_message)&lt;1){<br />
$error=1;<br />
} else {<br />
$twitter_status=postToTwitter($twitter_username, $twitter_psw, $twitter_message);<br />
}<br />
}<br />
?&gt;</code></p>
<p>Hier müssen Sie lediglich ihren Twitter-Benutzername sowie ihr Twitter Passwort anpassen. In der ersten Zeile wird die Twitter API eingefügt. Diese ist ebenfalls in der ZIP Datei enthalten. Daraufhin folgt eine Überprüfung ob die Message auch mindestens ein Zeichen enthält. Wenn nicht, spuckt das Skript eine Fehlermeldung us.</p>
<p>Ansonsten wird die Nachricht an Twitter über die Funktion <code>postToTwitter() </code>gesendet; diese steckt in der Twitter API. Das Formular, über welches die Messages eingegeben werden ist ebenfalls in der insertTwitterMsg.php implementiert.</p>
<p><code>&lt;!-- Send message to Twitter --&gt;<br />
&lt;?php<br />
if(isset($_POST['twitter_msg']) &amp;&amp; !isset($error)){?&gt;<br />
&lt;div&gt;&lt;?php echo $twitter_status ?&gt;&lt;/div&gt;<br />
&lt;?php } else if(isset($error)){?&gt;<br />
&lt;div&gt;Error: please insert a message!&lt;/div&gt;<br />
&lt;?php }?&gt;<br />
&lt;p&gt;&lt;strong&gt;What are you doing?&lt;/strong&gt;&lt;/p&gt;<br />
&lt;form action="insertTwitterMsg.php" method="post"&gt;<br />
&lt;input name="twitter_msg" type="text" id="twitter_msg" size="40" maxlength="140"/&gt;<br />
&lt;input type="submit" name="button" id="button" value="post" /&gt;<br />
&lt;/form&gt;</code></p>
<p>Sofern in der Umgebungsvariable <code>$_POST['']</code> die Message noch nicht definiert ist, oder ein Fehler entstanden ist &#8211; etwa weil die Nachricht weniger als ein Zeichen hatte, so wird die Fehlermeldung ausgegeben. Ansonsten wird der Twitter Status ausgegeben, welcher besagt, ob die Message erfolgreich übertragen wurde. Daruner wird das Formular ausgegeben. So einfach gehts!</p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/42-diese-seite-weiterempfehlen.html' rel='bookmark' title='Permanent Link: Diese Seite weiterempfehlen&#8230;'>Diese Seite weiterempfehlen&#8230;</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/1138-twitter-api-nachrichten-senden.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Alle img-Tags mit regulären Ausdrücken ermitteln</title>
		<link>http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=img-tags-regularen-ausdrucken</link>
		<comments>http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html#comments</comments>
		<pubDate>Sun, 16 Aug 2009 20:07:49 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP Tricks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reguläre Ausdrücke]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=1120</guid>
		<description><![CDATA[Mit diesem kleinen Trick können Sie alle src Werte von img-Tags über einen regulären Ausdruck mit PHP auslesen und ändern. Das ist hilfreich, wenn Sie einmal in viel HTML Code die URLs in dem img-Tag anpassen oder ändern müssen. Reguläre Ausdrücke machen es möglich. Vielleicht kennen Sie das Problem? Sie möchten, dass in viel HTML [...]


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/html/4-browserkompatibilitat-problematische-tags.html' rel='bookmark' title='Permanent Link: Browserkompatibilität &#8211; Problematische Tags'>Browserkompatibilität &#8211; Problematische Tags</a></li>
<li><a href='http://www.devmag.net/html/14-meta-tags-nach-dublin-core.html' rel='bookmark' title='Permanent Link: Meta Tags nach Dublin Core'>Meta Tags nach Dublin Core</a></li>
<li><a href='http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html' rel='bookmark' title='Permanent Link: PHP und Google Maps : Die Geokordinaten ermitteln'>PHP und Google Maps : Die Geokordinaten ermitteln</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="illu alignleft" title="illu_regulaere_ausdruecke" src="http://www.devmag.net/wp-content/uploads/illu_regulaere_ausdruecke.gif" alt="illu_regulaere_ausdruecke" width="60" height="60" />Mit diesem kleinen Trick können Sie alle src Werte von img-Tags über einen regulären Ausdruck mit PHP auslesen und ändern. Das ist hilfreich, wenn Sie einmal in viel HTML Code die URLs in dem img-Tag anpassen oder ändern müssen. Reguläre Ausdrücke machen es möglich.<span id="more-1120"></span></p>
<p>Vielleicht kennen Sie das Problem? Sie möchten, dass in viel HTML Code, z.B. aus einer Datenbank, automatisch die src-Attribute an img-Tags angepasst werden. Sei es z.B., dass aus</p>
<p><code>&lt;img src="/images/bild.jpg" alt="Ein Bild" /&gt; automatisch &lt;img src="http://www.testseite.de/images/bild.jpg" alt="Ein Bild" /&gt;</code> werden soll.</p>
<p>Jetzt sind Sie sich aber nicht sicher, ob sie wirklich nur valides HTML verwendet haben? Also es soll auch folgendes ersetzt werden:</p>
<p><code>&lt;IMG src="test/images/bild.jpg" alt="Ein Bild" /&gt;</code> oder</p>
<p><code>&lt;imG SRC='mein_blog/images/bild.jpg' alt="Ein Bild"&gt;</code></p>
<p>Folgende Zeilen PHP Code erledigen das gewünschte:</p>
<p><code><br />
$old = "Alter HTML Code, etwa &lt;img src="/images/bild.jpg" alt="Ein Bild" /&gt;<br />
$neue_url = "http://www.testseite.de";<br />
$pattern = '/(&lt;img.+?src=)(["\']?)([^\'"]+?)([^\/]+)(\2.*?\/?&gt;)/is';<br />
$replace = "$1$2".$neue_url."$4$5";<br />
$new = preg_replace($pcre, $replace, $old); </code></p>
<p>Zu dem Code gibt es noch eine kurze Erklärung. Das zweite Subpattern fängt das linke Quote-Zeichen auf, oder eben keins, wenn keins da ist &#8211; falls der HTML code nicht valide ist. Das dritte passt auf den Pfad und wird deshalb ersetzt. Das vierte Subpattern erfasst alles nach dem letzten Slash bis zum Ende des Dateinamens. &#8216;\2&#8242; ist eine Rückreferenz (&#8220;back reference&#8221;) und passt auf exakt das gleiche Zeichen wie das zweite Subpattern, also &#8216;&#8221;&#8216;, &#8220;&#8216;&#8221; oder kein Zeichen. Der Rest versucht alle möglichen Arten von img-Tags zu erfassen: &#8220;&lt;img &#8230;&gt;&#8221;, &#8220;&lt;img &#8230;/&gt;&#8221; und &#8220;&lt;img &#8230; /&gt;&#8221;.</p>
<p>So sollte es fuktioieren</p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/html/4-browserkompatibilitat-problematische-tags.html' rel='bookmark' title='Permanent Link: Browserkompatibilität &#8211; Problematische Tags'>Browserkompatibilität &#8211; Problematische Tags</a></li>
<li><a href='http://www.devmag.net/html/14-meta-tags-nach-dublin-core.html' rel='bookmark' title='Permanent Link: Meta Tags nach Dublin Core'>Meta Tags nach Dublin Core</a></li>
<li><a href='http://www.devmag.net/php-tricks/1168-php-und-google-maps-die-geokordinaten-ermitteln.html' rel='bookmark' title='Permanent Link: PHP und Google Maps : Die Geokordinaten ermitteln'>PHP und Google Maps : Die Geokordinaten ermitteln</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php-tricks/1120-img-tags-regularen-ausdrucken.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX: Ein einfacher Chat wie bei Facebook und co!</title>
		<link>http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ajax-ein-einfacher-chat-wie-bei-facebook-und-co</link>
		<comments>http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html#comments</comments>
		<pubDate>Wed, 22 Jul 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=61</guid>
		<description><![CDATA[Weiterf&#252;hrende Links:AJAX: Die Zukunft des Webs?


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html' rel='bookmark' title='Permanent Link: AJAX: Die Zukunft des Webs?'>AJAX: Die Zukunft des Webs?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_ajax_anwendung_chat.jpg" class="illu" width="60" height="60" align="left" alt="AJAX - Workshop Chat Anwendung Tutorial" />
Ein Online-Chat braucht nicht unbedingt Java, wie Facebook und co zeigen. Mit der Integration verschiedener Techniken in AJAX ist es jedoch möglich, einen einfachen Onlinechat auf schnelle Weise in eine gewöhnliche Webseite zu integrieren. Wir zeigen Ihnen, wie es geht!<span id="more-61"></span><P>Ein schlichter Onlinechat ist eigentlich schwierig zu realisieren, da die neu
eingegangenen Messages stets vom Server geladen werden müssen. Dies bedeutete
bisher, dass die Seite neu geladen werden musste. Um dies zu umgehen, hat man
auf andere Möglichkeiten gesetzt, wie zum Beispiel <STRONG>JavaApplets</STRONG>.
Mit AJAX wird die Sache erleichtert, da man die Seiten nicht mehr neu im Browser
laden muss. Die periodische Überprüfung nach neuen Messages kann über JavaScript
und XMLHttpRequests mit der setTimeOut-Funktion gesteuert werden.</P>
<P>Hört sich einfach an – ist es im Grunde auch so. Bei Dr.Web wurde bereits
einmal von mir ein Skript vorgestellt, mit dem auf einfache Art eine Shoutbox
programmiert wurde. Dieses Skript soll nun Schritt-für-Schritt AJAX tauglich
gemacht werden und zu einem Chat umfunktioniert werden. </P>
<P>Im Internet gibt es bereits OpenSource-AJAX-Chat-Anwendungen, zum Beispiel <A
href="http://socket7.net/lace/" target=_blank>Lace</A> und <A
href="http://treehouse.ofb.net/chat/" target=_blank>Treehouse</A>. Unser
Beispiel wurde entwickelt, um im Rahmen dieser Artikelserie AJAX näher zu
bringen. Das Beispiel weist längst nicht alle Features auf, die möglich wären,
ist so aber besser verständlich.</P>
<P>Rollen wir das Feld von hinten auf und beginnen wir mit dem so genannten
<STRONG>Server Backend</STRONG>. In unserem Fall ist das eine MySQL Datenbank.
Für unsere kleine Anwendung verwenden wir eine Tabelle Namens "ajaxChat", welche
die Felder id, name, nachricht und date hat; diese kann mit folgender
SQL-Anweisung erzeugt werden:</P>
<P><CODE>CREATE TABLE `ajaxChat` (<BR>`id` LONGINT NOT NULL AUTO_INCREMENT
,<BR>`name` VARCHAR( 60 ) NOT NULL ,<BR>`nachricht` VARCHAR( 120 ) NOT NULL
,<BR>`date` VARCHAR( 30 ) NOT NULL ,<BR>PRIMARY KEY ( `id` ) <BR>);</CODE></P>
<P><IMG height=212 alt=Screenshot
src="http://www.devmag.net/wp-content/uploads/ajax-chat-schritt-1.gif"
width=356><SPAN class=leg><BR>Zunächst wird das Backend angegangen; zum einen
die Datenbank, zum anderen das PHP-Skript, welches die XML-Antworten auf die
http-Anfragen erzeugt.</SPAN></P>
<P>Das PHP-Skript (nennen wir es ajaxchat.php) auf der Serverseite muss folgende
Funktionalitäten aufweisen:</P>
<UL>
  <LI>Verbindung zur Datenbank öffnen und schließen.
  <LI>Nneue Einträge müssen in die Datenbank eingefügt werden können.
  <LI>Neue Einträge müssen abgeholt werden können; als Erkennung dient eine
  eindeutige ID. </LI></UL>
<P>Die Ausgabe der Daten, das heißt die <STRONG>asynchrone Antwort</STRONG> des
Servers erfolgt über XML; dieses wird dann über JavaScript und CSS im Browser
dargestellt.</P>
<P>Die Datenbankverbindung kann über folgenden Zeilen-Code geöffnet werden; die
Variablen müssen an die jeweilige Serverumgebung angepasst werden. </P>
<P><CODE>&lt;?php<BR>//wichtig; damit nicht gecached wird!<BR>header(
"Cache-Control: no-cache, must-revalidate" ); <BR>header( "Pragma: no-cache"
);<BR>//damit unser JavaScript die Daten auch als XML
erkennt<BR>header("Content-Type: text/xml");<BR><BR>$db_host = "localhost"; //
Host <BR>$db_user = "root"; // User <BR>$db_password = ""; //
Passwort<BR>$db_name = "test"; //
Datenbank<BR><BR>mysql_connect($db_host,$db_user,$db_password) or
die(mysql_error()); <BR>mysql_select_db($db_name) or die(mysql_error());
</CODE></P>
<P><STRONG>Nachrichten auslesen</STRONG><BR>Die Funktion, mit der stets die
aktuellsten Nachrichten aus der Datenbank extrahiert werden:</P>
<P><CODE>function getLatestEntries($latestID) {<BR><BR>$query = "SELECT id,
name, nachricht, date FROM ajaxchat WHERE id &gt; $latestID ORDER BY id DESC
LIMIT 20"; <BR>$erg = mysql_query($query); <BR>echo "&lt;?xml version=\"1.0\"
encoding=\"UTF-8\" standalone=\"yes\"?&gt;";<BR>echo
"&lt;messages&gt;";<BR>while($erg2=mysql_fetch_array($erg)) //Erzeugung der XML
Ausgabe<BR>{ <BR>echo "&lt;message&gt;&lt;id&gt;".$erg2['id'];<BR>echo
"&lt;/id&gt;&lt;name&gt;".$erg2['name'];<BR>echo
"&lt;/name&gt;&lt;nachricht&gt;".$erg2['nachricht'];<BR>//Formatierung des
Timestamps<BR>echo "&lt;/nachricht&gt;&lt;date&gt;".date("d.m.Y
H:i",$erg2['date']); <BR>echo "&lt;/date&gt;&lt;/message&gt;";<BR>}<BR>echo
"&lt;/messages&gt;";<BR>}</CODE> </P>
<P>Bei dieser Funktion kommt es insbesondere auf die
<STRONG>SQL-Abfrage</STRONG> an; über die Bedingung id &gt; $latestID, werden
lediglich die Einträge ermittelt, deren ID größer (d.h. deren Einträge
"frischer" sind), ermittelt. Die Variable latestID wird, wie wir weiter unten
sehen werden, bei dem http Requests über JavaScript übergeben. </P>
<P>Durch den Zusatz ORDER BY id DESC in der SQL Abfrage wird sichergestellt,
dass die Einträge absteigend ausgegeben werden; LIMIT 20 beschränkt die Ausgabe
auf die letzten zwanzig Einträge. Die Erzeugung des XML-Codes erfolgt schlicht
über die echo-Funktion (eine Verwendung der DOMXML Funktionen von PHP wäre bei
dem geringen Aufwand nicht gerechtfertigt).</P>
<P><STRONG>Neue Einträge</STRONG><BR>Das erzeugen von neuen Einträgen in die
Tabelle erfolgt über folgende Funktion:<BR><BR><CODE>function
createNewEntry($name, $nachricht) {<BR><BR>//HTML Tags entfernen<BR>$name =
strip_tags($name, '');<BR>$nachricht = strip_tags($nachricht,''); <BR><BR>$query
= "INSERT INTO ajaxchat(name, nachricht, date) <BR>VALUES
('$name','$nachricht','".time()."')";<BR>echo "&lt;?xml version=\"1.0\"
encoding=\"UTF-8\" standalone=\"yes\"?&gt;";<BR>if (!mysql_query($query))
{<BR>//nicht notwendig, dient nur der Fehlerkontrolle<BR>echo
"&lt;createNewEntry&gt;0&lt;/createNewEntry&gt;";}<BR>else {<BR>echo
"&lt;createNewEntry&gt;1&lt;/createNewEntry&gt;";<BR>}<BR>}</CODE> </P>
<P>Dabei erzeugt die Funktion createNewEntry wiederum eine XML-Antwort; dieser
schenken wir aber keine Beachtung. Sie wurde lediglich zur Fehlerüberprüfung
implementiert, so dass man über JavaScript, falls es einen MySQL-Fehler beim
Erzeugen eines neuen Eintrag gäbe, dies entsprechend im Browser anzeigen könnte
- wenn man denn wollte. </P>
<P><STRONG>Skriptsteuerung</STRONG><BR>Da alle Anfragen an ein und dasselbe
Skript geschickt werden (ajaxchat.php), benötigen wir noch ein paar Zeilen-Code,
mit denen sichergestellt wird, dass bei den Aufrufen auch die jeweils
angesprochene Funktion ausgeführt wird. Wir arbeiten hierbei mit Parametern, die
in die http Anfragen über das XMLHttpRequest Objekt eingebaut sind.</P>
<P><CODE>//falls action=createNewEntry, Erzeugung eines neuen Eintrages<BR>if
($_GET['action'] == "createNewEntry") { <BR>createNewEntry($_GET['name'],
$_GET['nachricht']);<BR>}<BR>//falls action=getLatestEntries, Ausgabe der
neuesten Einträge<BR>elseif ($_GET['action'] == "getLatestEntries")
{<BR>getLatestEntries($_GET['latestID']);<BR>}<BR>mysql_close(); //schließen der
PHP Verbindung<BR>?&gt;</CODE><BR><BR>Das PHP-Skript, der gesamte Backend ist
noch relativ harmlos. Bei unserer AJAX-Engine wird es kniffliger. </P>
<P><STRONG>Die AJAX Engine</STRONG><BR><BR><IMG height=212 alt=Screenshot
src="http://www.devmag.net/wp-content/uploads/ajax-chat-schritt-2.gif"
width=356><SPAN class=leg><BR>Im zweiten Schritt wird die AJAX-Engine aufgebaut;
mit ihr werden die http-Anfragen erzeugt und die Ergebnisse im Browser
dargestellt</SPAN> </P>
<P>Die AJAX-Engine hat folgende Aufgaben:</P>
<UL>
  <LI>Erzeugung der http-Anfragen um neue Nachrichten vom Server zu erfragen-
  <LI>Erzeugung der http-Anfragen, über die neue Einträge in der Datenbank
  gespeichert werden. </LI></UL>
<P>Da später das Empfangen von Daten automatisiert wird beziehungsweise über die
setTimeOut-Funktion gesteuert wird, ist es notwendig, dass wir für unsere
Anwendung zwei XMLHttpRequest-Objekte erzeugen. Damit wird sichergestellt, dass
man gleichzeitig sowohl Daten empfangen als auch senden kann. </P>
<P><STRONG>Erzeugung zweier XMLHttpRequest-Objekte</STRONG><BR>Das JavaScript
zur Erzeugung der XMLHttpRequest-Objekte ist identisch mit dem aus <A
href="http://www.drweb.de/programmierung/ajax-xmlhttpRequest.shtml">Teil 2</A>
dieser Artikelserie:<BR><BR><CODE>&lt;script type="text/javascript"&gt;<BR>var
latestID = 0; //latestID als globale Variable; wichtig!<BR><BR>function
createXMLHttpReqObj() { //erzeugt die XMLHttpRequest Objekte<BR><BR>// für
Mozilla etc.<BR>if(window.XMLHttpRequest) {<BR>try { //Fehler abfangen<BR>req =
new XMLHttpRequest(); <BR>} catch(e) {<BR>req = false;<BR>}<BR>// für den
InternetExplorer<BR>} else if(window.ActiveXObject) {<BR>try {<BR>req = new
ActiveXObject("Msxml2.XMLHTTP");<BR>} catch(e) {<BR>try {<BR>req = new
ActiveXObject("Microsoft.XMLHTTP");<BR>} catch(e) {<BR>req =
false;<BR>}<BR>}<BR>}<BR>return req;<BR>}<BR>// Initialisierung der beiden
Objekte<BR>var httpGetLatestEntries= createXMLHttpReqObj(); <BR>var
httpCreateNewEntry = createXMLHttpReqObj();</CODE></P>
<P><STRONG>Neueste Einträge abfragen</STRONG><BR>Bei der Abfrage nach den
neuesten Einträgen wird die <STRONG>LatestID</STRONG> in der http-Anfrage mit
übergeben. Diese ist eine globale Javascript-Variable, da ihr Wert aus
Funktionen heraus geändert wird. Initialisiert wird sie mit dem Wert null. Die
URL zu dem Skript ajaxchat.php müssen Sie natürlich an Ihre Umgebung
anpassen.</P>
<P>Die Funktion getLatestEntries sieht wie folgt aus:<BR><BR><CODE>//Funktion,
mit der Anfragen nach neuen Einträgen gesendet wird<BR>function
getLatestEntries() {<BR>//Anfrage senden, wenn Status der letzten Anfrage
"completed" ist, bzw. "nicht initialisiert" (d.h. erster Aufruf)<BR>if
(httpGetLatestEntries.readyState == 4 || httpGetLatestEntries.readyState == 0) {
<BR>//Übergabe der
latestID<BR>httpGetLatestEntries.open("GET","<BR>http://localhost/ajax/ajaxchat.php?<BR>action=getLatestEntries&amp;latestID="+latestID,
true);<BR>httpGetLatestEntries.onreadystatechange = handleHttpGetLatestEntries;
<BR>httpGetLatestEntries.send(null);<BR>}<BR>}</CODE></P>
<P>Als Funktion, mit welcher der Browser die Serverantwort behandelt ist die
Funktion <STRONG>handleHttpGetLatestEntries</STRONG> angegeben:</P>
<P><CODE>//Behandelt die Serverantwort<BR>function handleHttpGetLatestEntries()
{<BR><BR>//wenn Anfrage den Status "completed" hat<BR>if
(httpGetLatestEntries.readyState == 4) {<BR>//ermitteln der Antwort<BR>response
= httpGetLatestEntries.responseXML.documentElement; <BR>//ermitteln der
Messages; Überführung in ein Array<BR>messages =
response.getElementsByTagName('message');<BR><BR>//wenn es mindestens eine neue
Nachricht hat, dann wird diese angezeigt! <BR>if(messages.length &gt; 0)
{<BR><BR>for (var i=messages.length-1; i&gt;=0; i--) {<BR>//Darstellung im
Browser mit dem DOM<BR>showEntry=
document.getElementById("showEntries");<BR>neuSpan =
document.createElement('span');<BR>neuSpan.setAttribute('class','entry'); //CSS
Klasse<BR>neuSmall = document.createElement('small');<BR>neuNameDate =
document.createTextNode(messages[i].getElementsByTagName<BR>('date')[0].firstChild.nodeValue
+ ': ' + messages[i].getElementsByTagName('name')[0].firstChild.nodeValue +':
');<BR>neuSmall.appendChild(neuNameDate);<BR>neuSpan.appendChild(neuSmall);<BR>neuSpan.appendChild(document.createElement('br'));
<BR>neuNachricht =
document.createTextNode(messages[i].getElementsByTagName<BR>('nachricht')[0].firstChild.nodeValue);<BR>neuSpan.appendChild(neuNachricht);<BR>neuSpan.appendChild(document.createElement('br'));<BR>showEntry.insertBefore(neuSpan,
showEntry.firstChild); <BR>}<BR><BR>//Festlegung der neuen latestID; Zugriff auf
die Werte über das DOM<BR>latestID =
messages[0].getElementsByTagName('id')[0].firstChild.nodeValue;
<BR>}<BR>//erneuter periodischer Aufruf (eine Art
Rekursion)<BR>setTimeout('getLatestEntries();',3000); //Erneute Anfrage in drei
Sekunden<BR>}<BR>}</CODE><BR><BR>Über diese wird, sofern die Anfrage erfolgreich
war, die XML-Daten vom Server in ein Array (messages) überführt und im Browser
dargestellt. Dies findet jedoch nur statt, wenn es auch neue Nachrichten zum
Anzeigen gibt (wenn messages.length &gt;0), das heißt wenn die Anfrage an das
PHP-Skript auch eine neue Nachricht zurückgegeben hat. Ist dies der Fall, wird
die latestID nach der Darstellung der neuen Nachrichten im Browser aktualisiert.
Da dies aus einer Funktion heraus geschieht, wird klar, weshalb latestID eine
globale Variable sein muss. </P>
<P>Über die setTimeOut-Funktion wird nun unsere <STRONG>periodische
Überprüfung</STRONG> nach neuen Einträgen durch den Aufruf der Funktion
getLatestEntries alle drei Sekunden initialisiert; dabei handelt es sich um eine
Art "verzögerte Rekursion".</P>
<P><STRONG>Neue Nachrichten eintragen</STRONG><BR>Die JavaScript Funktionen,
über welche neue Einträge an den Server gesendet werden, sind ähnlich aufgebaut,
wie die vorherigen Funktionen. Mit der ersten Funktion createNewEntry wird die
http-Anfrage erzeugt, wobei ihr die Werte für die Felder name und nachricht aus
dem HTML-Formular übergeben werden. <BR><BR><CODE>//neue Nachricht auf dem
Server erzeugen; die Übergabe der Werte erfolgt über das HTML
Formular<BR>function createNewEntry(name, nachricht) {<BR><BR>//Anfrage senden,
wenn Status der letzten Anfrage "completed" ist, bzw. "nicht initialisiert"
(d.h. erster Aufruf) <BR>if (httpCreateNewEntry.readyState == 4 ||
httpCreateNewEntry.readyState == 0) {<BR>//URL für HTTP Anfrage; muss angepasst
werden<BR>url =
'http://localhost/ajax/ajaxchat.php?action=createNewEntry&amp;name=' + name +
'&amp;nachricht=' + nachricht; <BR>httpCreateNewEntry.open("GET", url,
true);<BR>httpCreateNewEntry.onreadystatechange =
handleHttpCreateNewEntry;<BR>httpCreateNewEntry.send();<BR>}<BR>}</CODE>
<BR><BR>Die Antwort vom Server wird über die Funktion handleHttpCreateNewEntry
abgearbeitet; diese ist relativ kurz: </P>
<P><CODE>//behandelt die Antwort des Servers<BR>function
handleHttpCreateNewEntry() {<BR>if (httpCreateNewEntry.readyState == 4)
{<BR>//nachdem eine neue Nachricht erfolgreich erzeugt wurde, wird diese
angezeigt<BR>getLatestEntries(); <BR>}<BR>}</CODE></P>
<P>Nachdem die Daten erfolgreich in der Datenbank hinterlegt wurden, wird die
Funktion getLatestEntries() wiederum aufgerufen, um sicherzustellen, dass die
neue Nachricht auch sofort angezeigt wird.</P>
<P><STRONG>Das Frontend</STRONG><BR>Nachdem nun die AJAX-Engine aufgestellt ist,
wenden wir uns dem Frontend zu. Auch hier ist JavaScript gefragt. So können die
Eingaben über JavaScript überprüft werden; die Darstellung der Nachrichten kann
über eine CSS-Klasse beeinflusst werden.</P>
<P><STRONG>Das Formular</STRONG><BR>Das Formular ist simpel gehalten; es gibt
lediglich Eingabefelder und einen Submit-Button:</P>
<P><CODE>&lt;form name="form1" method="post"
action=""&gt;<BR>&lt;p&gt;Name&lt;br /&gt;<BR>&lt;input type="text" name="name"
id="name"&gt;<BR>&lt;br /&gt;<BR>&lt;br /&gt;<BR>Nachricht&lt;br
/&gt;<BR>&lt;input type="text" name="nachricht"
id="nachricht"&gt;<BR>&lt;/p&gt;<BR>&lt;p&gt;<BR>&lt;input type="submit"
name="Submit" value="Submit" onclick="checkInput(document.form1.name.value,
document.form1.nachricht.value)" &gt;<BR>&lt;/p&gt;<BR>&lt;/form&gt;</CODE></P>
<P>Nachdem man auf den Submit-Button geklickt hat, wird die JavaScript-Funktion
checkInput aufgerufen; an diese werden die eingegebenen Daten weitergegeben. In
ihr wird die Eingabe überprüft.</P>
<P>Eine solche Überprüfung könnte im einfachsten Fall wie folgt
aussehen:<BR><BR><CODE>function checkInput(name, nachricht) {<BR>if(name != ""
&amp;&amp; nachricht != "") {<BR>//Falls alles OK ist, kann der neue Eintrag
erzeugt werden<BR>createNewEntry(name, nachricht);<BR>}<BR>else
{<BR>alert("Bitte sowohl einen Namen, als auch eine Nachricht
eingeben!");<BR>}<BR>}</CODE></P>
<P>Die Darstellung der Ergebnisse kann mit Hilfe von CSS beeinflusst werden.
Dazu greifen wir auf die über das DOM zugewiesene CSS-Klasse "entry" zurück;
über folgende Zeilen könnte man die Darstellung im Browser ein wenig
ansehnlicher machen. </P>
<P><CODE>&lt;style type="text/css"&gt;<BR>.entry {<BR>width:
100%;<BR>background-color: #F5F5F5;<BR>border: 1 dotted #666666;<BR>font-family:
Verdana;<BR>}<BR>.entry#small {<BR>color:
#CCCCCC;<BR>}<BR>&lt;/style&gt;</CODE><BR><BR>So könnte das Ergebnis im Browser
aussehen: </P>
<P><IMG height=425 alt=Screenshot
src="http://www.devmag.net/wp-content/uploads/ajax-chat-beispiel.gif"
width=365 border=1><SPAN class=leg><BR>AJAX Chat in der konkreten
Anwendung</SPAN></P>
<P>Der Aufruf des Skriptes kann über einen onLoad-Event im Body-Tag der
HTML-Seite (&lt;body onload="getLatestEntries()"&gt;), in welcher das Formular
eingebettet ist, eingeleitet werden; dabei wird die Funktion getLatestEntries
das erste mal aufgerufen, wodurch die setTimeOut-Endlosschleife gestartet wird.
<BR><BR>Alles in allem, war es ein langer Weg von der Idee zur konkreten
Umsetzung. AJAX bedeutet nicht nur, dass die Webseiten in Zukunft in ihrem
Verhalten normalen <STRONG>Desktop-Anwendung</STRONG> ähneln können, sondern
bringt auch viel Arbeit mit sich. Vor allem das Zusammenspiel von JavaScript und
XML klappt bislang nicht immer reibungslos. </P>
<P>Das hier vorgestellte Beispiel besitzt zudem einen Bug, der nicht
verschwiegen werden darf. Auf der JavaScript Seite kann nicht mit Umlauten oder
anderen Sonderzeichen umgegangen werden; diese verursachen einen Fehler. Alle
Dateien gibt es wie immer als Paket zum <A
href="http://www.devmag.net/webprog/ajaxchat.zip">Download</A>.
</P>

<p>(<a href="/informationen/autoren.htm">tf</a>) <br>
<small> Dieser Artikel ist ebenfalls bei Dr.Web erschienen </small></p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html' rel='bookmark' title='Permanent Link: AJAX: Die Zukunft des Webs?'>AJAX: Die Zukunft des Webs?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX: Die Zukunft des Webs?</title>
		<link>http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ajax-die-zukunft-des-webs</link>
		<comments>http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html#comments</comments>
		<pubDate>Tue, 07 Jul 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=59</guid>
		<description><![CDATA[Weiterf&#252;hrende Links:AJAX: Ein einfacher Chat wie bei Facebook und co!


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html' rel='bookmark' title='Permanent Link: AJAX: Ein einfacher Chat wie bei Facebook und co!'>AJAX: Ein einfacher Chat wie bei Facebook und co!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_ajax_workshop_1.jpg" class="illu" width="60" height="60" align="left" alt="AJAX - Workshop" />Der AJAX-Ansatz ist noch jung und wird schon heiß gelobt – doch was steckt dahinter, wie funktioniert AJAX und wie kann AJAX im Web konkret Anwendung finden?<span id="more-59"></span><P>In herkömmlichen Webanwendungen werden Formulare ausgefüllt und abgeschickt.
Bis dies geschieht, bleiben die Daten auf der Clientseite, der Server bekommt
nicht mit, dass Daten in das Formular gefüllt werden. Stürzt nun der Browser
mitten während des Ausfüllens ab, sind die Daten verloren, da sie ja nicht
abgeschickt wurden. </P>
<P>Ein solches Szenario kann man mit dem Ansatz von AJAX verhindern. Dabei
werden bereits während des Ausfüllens von Formularen asynchron die Daten zum
Server über das Javascript Objekt <STRONG>XMLHttpRequest</STRONG> geschickt.
</P>
<P>Die Kommunikation kann auch anders herum erfolgen; das heißt, wenn der
Benutzer zum Beispiel Daten eingibt, wie die Postleitzahl, so kann der Server
direkt nach dem Eingeben der Postleitzahl in einer Datenbank nach dem
korrespondierenden Ortsnamen suchen und diese im Formular anzeigen. Das heißt
man muss Änderungen im Formular nicht mehr explizit abschicken, das wird im
Hintergrund erledigt.</P>
<P>Zum einen wird damit die Serverlast ein wenig heruntergeschraubt, da die
Daten in kleinen Paketen gesendet werden, zum anderen wird das Ausfüllen und
Absenden von Formularen beschleunigt. Dieser Ansatz wird als
<STRONG>Asynchronous Javascript and XML</STRONG> bezeichnet – kurz AJAX; dabei
ist AJAX keine eigene Technologie, sondern lediglich eine Kombination von
bereits existierenden und profilierten Technologien. AJAX wird bereits ausgiebig
im Internet, unter anderem von Google und Co. verwendet. </P>
<P>Das wohl bekannteste Beispiel ist <A
href="http://www.google.com/webhp?complete=1&amp;hl=en" target=_blank>Google
Suggest</A>. Dabei wird bereits während der Eingabe eines Suchstrings nach
etwaigen Ergänzungen gesucht und die voraussichtliche Ergebniszahl zu dem
Suchbegriff angezeigt. Das Ganze funktioniert, während man im Suchfeld
Suchbegriffe eingibt. So kann man schon vorweg sehen, ob es sich lohnt, die
Suche genauer zu spezifizieren, sollten sich etwa zu viele Suchergebnisse
finden.</P>
<P><IMG height=353
alt="AJAX Google Suggests - Während der Eingabe werden von Google Vorschläge für die Suche angezeigt"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_google-suggests.gif" width=393
border=1><BR><SPAN class=leg>Google Suggests - Während der Eingabe werden von
Google Vorschläge für die Suche angezeigt</SPAN></P>
<P>Mit dem AJAX-Ansatz könnte man das <STRONG>Stop-and-Go-Verhalten</STRONG> von
Webapplikationen umgehen; der Benutzer muss nicht mehr auf den Server warten, da
alles im Hintergrund geregelt wird.</P>
<P>Über das XMLHttpRequest Objekt ist es möglich, über JavaScript und XML mit
Webapplikationen, die auf dem Server laufen, zu interagieren. Dabei werden die
Daten, zum Beispiel aus Formularen in Form von HTTP-Anfragen versendet. Das
funktioniert ähnlich wie mit <STRONG>SOAP</STRONG> oder generell wie bei Webservices, nur das hier über JavaScript mit einer
Applikation asynchron kommuniziert wird. Die Antworten des Servers werden in
Form von XML versandt.</P>
<P>Im Modell sieht die klassische Client-Server Interaktion im zeitlichen
Verlauf etwa wie folgt aus.</P>
<P><IMG height=187
alt="AJAX Klassisches Modell der Client-Server Kommunikation; Dateneingabe und Datenverarbeitung auf dem Server verlaufen synchron"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_klassisches-modell.gif"
width=355> <SPAN class=leg><BR>Klassisches Modell der
Client-Server-Kommunikation; Dateneingabe und Datenverarbeitung auf dem Server
verlaufen synchron</SPAN> </P>
<P>Dabei werden die Zeitverzögerungen, die sich aufgrund des Sendens und
Empfangens von Anfragen beziehungsweise Antworten deutlich.<BR><BR>Mit dem
AJAX-Ansatz wird eine weitere Engine eingebaut, die den Versand der Daten
asynchron regelt. Wie man aus der Modellskizze erkennen kann, werden zum
Beispiel die Daten aus der ersten Eingabe noch serverseitig verarbeitet, während
zur selben Zeit bereits wieder neue Daten eingegeben werden können. Der Versand
wird über die AJAX-Engine geregelt.</P>
<P><IMG height=210
alt="AJAX Modell – Dateneingabe und Datenverarbeitung auf dem Server verlaufen asynchron"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_ajax-modell.gif" width=356><SPAN
class=leg><BR>AJAX-Modell - Dateneingabe und Datenverarbeitung auf dem Server
verlaufen asynchron</SPAN></P>
<P>Das für die Kommunikation notwendige XMLHttpRequest-Objekt wurde zunächst von
Microsoft als ActiveX entwickelt, ist aber heutzutage in allen gängigen Browsern
integriert. Es ist der Kern des AJAX-Ansatzes, da mit ihm die Client-Server
Kommunikation, die im Hintergrund abläuft, ermöglicht wird. Jedoch liegt der
Fokus bei AJAX nicht allein bei XMLHttpRequest, sondern grundsätzlich bei der
Idee des Zusammenspiels der verschiedenen Technologien.<BR><BR><IMG height=210
alt="AJAX Ablauf einer Anfrage über XMLHttpRequest"
src="http://www.devmag.net/wp-content/uploads/php_ajax_workshop_ajax-modell-2.gif" width=356>
<BR><SPAN class=leg>Ablauf einer Anfrage über XMLHttpRequest</SPAN> <BR><BR>Im
InternetExplorer wird XMLHttpRequest immer noch über ein AcitiveX-Objekt
initialisiert, während es in Browsern wie Mozilla als einfaches Objekt
abgeleitet werden kann. </P>
<P>Da AJAX verstärkt über XMLHttpRequest Javascript als Technologie integriert,
ergeben sich jedoch auch <STRONG>Probleme</STRONG>. So muss, zum Beispiel gerade
schon bei der Initialisierung eines Objektes auf die Besonderheiten der
verschiedenen <STRONG>Browser</STRONG> geachtet werden. Dadurch können die
Skripte mitunter recht komplex ausfallen und man muss sich fragen, ob sich der
Aufwand überhaupt lohnt. Der "Zurück"-Button des Browsers wird ebenfalls bei der
Verwendung einer solchen AJAX Technologie unnutzbar, da dieser ja nur über die
direkten Anfragen des Clients funktioniert.</P>
<P>Des Weiteren ergeben sich mit AJAX auch Probleme etwa für die barerierearmen
Gestaltung von Webformularen, da AJAX nicht den Anforderungen der Web
Accesibility Initiative des W3C entspricht und auch nur schwer kompatibel
gemacht werden kann.</P>
<P>Dennoch ergeben sich den Programmierern von Webapplikationen mit AJAX viele
neue Möglichkeiten. Die Webapplikationen werden immer ähnlicher zu herkömmlichen
Desktop-Applikationen, was auch zu deren Emanzipation beitragen kann. Auf jeden
Fall unterstützt AJAX die weitergehende Entwicklung von Webtechnologien.
(tm)</P>

<p>(<a href="/informationen/autoren.htm">tf</a>) <br>
<small> Dieser Artikel ist ebenfalls bei Dr.Web erschienen </small></p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/61-ajax-ein-einfacher-chat-wie-bei-facebook-und-co.html' rel='bookmark' title='Permanent Link: AJAX: Ein einfacher Chat wie bei Facebook und co!'>AJAX: Ein einfacher Chat wie bei Facebook und co!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/59-ajax-die-zukunft-des-webs.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wikipedia für die eigene Webseite – Teil 1</title>
		<link>http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wikipedia-fur-die-eigene-webseite-teil-1</link>
		<comments>http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html#comments</comments>
		<pubDate>Fri, 03 Jul 2009 10:00:00 +0000</pubDate>
		<dc:creator>Thiemo</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.devmag.net/?p=43</guid>
		<description><![CDATA[Weiterf&#252;hrende Links:Wikipedia für die eigene Webseite – Teil 2 Eigene Web Services mit PHP5 bereitstellen? Kein Problem!


Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 2'>Wikipedia für die eigene Webseite – Teil 2</a></li>
<li><a href='http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html' rel='bookmark' title='Permanent Link: Eigene Web Services mit PHP5 bereitstellen? Kein Problem!'>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.devmag.net/wp-content/uploads/illu_php_wikipedia_1.gif" width="60" height="60" class="illu" align="right" alt="Wikipedia für die eigene Webseite mit PHP – Teil 1" />Wikipedia ist in! Die deutschsprachige Ausgabe von Wikipedia ist die zweitgrößte weltweit und sie wächst und wächst weiter. Doch wie kann man Wikipedia für die eigenen Benutzer als nützliches Tool zugänglich machen und an die eigenen Wünsche anpassen?<span id="more-43"></span><p><small>Dieser Artikel ist ebenfalls bei Dr.Web erschienen!</small></p>
<p>Im Endeffekt braucht es hierf&uuml;r nur ein wenig JavaScript und nat&uuml;rlich
  PHP &#8211; von da aus kann man Wikipedia auf die vielseitigsten Arten verwenden.
  Grunds&auml;tzlich hat man drei Optionen. Zum einen kann man die ganze Wikipedia
  MySQL Datenbank kopieren und auf dem eigenen Server samt Wikisoftware zum laufen
  bringen. Da die Datenbank nunmehr schon ein Gigabyte an Gr&ouml;&szlig;e erreicht
  hat, ist das nicht unbedingt eine Option die wirklich jedem offen steht. Zudem
  wird der Inhalt nicht von der gro&szlig;en Wikipedia Usergemeinde auf dem Laufendem
  gehalten.<br>
  Eine zweite M&ouml;glichkeit ist die Verwendung des XML Exports, der neuerdings
  von Wikipedia unter <a href="http://de.wikipedia.org/wiki/Spezial:Export/" target="_blank">http://de.wikipedia.org/wiki/Spezial:Export/</a>
  bereitgestellt wird. Dabei wird hinter das Spezial:Export/ schlicht der Name
  des Wikipedia-Artikels eingetragen. Die XML Antwort sieht dann in etwa so aus:</p>
<p><img src="http://www.devmag.net/wp-content/uploads/wikipedia-wikitax.gif" width="451" height="130"></p>
<span class="leg"> XML Antwort vom Wikipedia-Server - Zu sehen sind die WikiTax</span>
<p> Man wird aus dem zur&uuml;ckgegebenen Text nur schwer schlau. Das liegt daran,
  dass man den Inhalt zwar sch&ouml;n als XML zur&uuml;ckgeliefert bekommt, jedoch
  mit s&auml;mtlichen WikiTax. Das sind die wikimediaeigenen Tags, die vor jeder
  Ausgabe der Seite durch die Wikisoftware gerendert und in HTML umgesetzt werden.
  Zur Zeit gibt es noch Probleme bei dem XML Export von Wikipedia Daten, da es
  noch keine einheitliche Document Type Definition f&uuml;r die WikiTax gibt &#8211;
  deshalb kann man den XML Export noch nicht vollst&auml;ndig umsetzen. Zudem
  m&uuml;sste man selbst etwa mit Redirects in Wikipedia umgehen &#8211; ruft
  man z.B. den Artikel &quot;XML&quot;, so erh&auml;lt man:</p>
<p><code>&lt;text xml:space=&quot;preserve&quot;&gt;#REDIRECT [[Extensible_Markup_Language]]&lt;/text&gt; </code>
</p>
<p>Es gibt jedoch noch eine dritte M&ouml;glichkeit die Daten von Wikipedia direkt
  zu ermitteln &#8211; n&auml;mlich komplett mit allen HTML Formatierungen. Der
  Inhalt jeder Wikipedia-Seite ist von HTML Kommentaren eingeschlossen, n&auml;mlich
  den Kommentaren &lt;!-- start content --&gt; und &lt;!-- end content --&gt;.
  &Uuml;ber regul&auml;re Ausdr&uuml;cke und ein wenig PHP kann man diesen Inhalt
  vom Rest der Seite trennen und dann ausgeben. Ein solcher Ansatz wurde in der
  com!-Online Zeitschrift Ausgabe 8/05 vorgestellt. Das dabei verwendete PHP Skript
  von Stefan Kuhn und Andreas Dumont liest die Inhalte zwischen den beiden Kommentaren
  aus, passt die Verweise zu weiterf&uuml;hrenden Artikel an das Skript an und
  stellt die Inhalte im Browser dar. Dabei wird auch auf die PHP eigene gzip-Kompression
  zur&uuml;ckgegriffen, um die Ladezeiten und die Last f&uuml;r den Wikipedia-Server
  zu reduzieren. Dies hat auch den Vorteil, dass man immer die aktuellste Version
  des Wikipedia-Eintrags auf der Seite dargestellt bekommt. </p>
<p><code><strong>wikistatic.php</strong><br>
  &lt;?php<br>
  $query = $_SERVER['QUERY_STRING'];<br>
  $search = $_GET['search']; <br>
  ?&gt;<br>
  &lt;h1&gt;&lt;?php if (isset($search)) echo $search; ?&gt;&lt;/h1&gt;<br>
  &lt;?php <br>
  /************************************************************* <br>
  * Wikipedia-Skript : Version 1.05 : Mai 2005 <br>
  * wikipedia.php <br>
  * Stefan Kuhn, Andreas Dumont <br>
  *<br>
  * erweitert f&uuml;r Wikipedia-Suche von Thiemo Fetzer am 22. <br>
  * Juli 2005<br>
  /*************************************************************/ <br>
  function callback( $puffer ) { //zum Puffern!<br>
  <br>
  $puffer = substr( $puffer, strpos( $puffer, '&lt;!-- start content --&gt;' )
  ); // sucht erstes Vorkommen des Suchstrings und liefert die Position <br>
  $puffer = substr( $puffer, 0, strpos( $puffer, '&lt;div class=&quot;printfooter&quot;&gt;'
  ) ); <br>
  $puffer = str_replace( &quot;/w/index.php&quot;, &quot;/wikipedia/wikistatic.php&quot;,
  $puffer ); //macht die Links f&uuml;r das Skript kompatibel<br>
  $puffer = str_replace( &quot;/wiki/&quot;, &quot;/wikipedia/wikistatic.php?title=Spezial:Search&amp;search=&quot;,
  $puffer ); <br>
  $puffer = '&lt;style&gt;.editsection {display:none;}&lt;/style&gt;'.$puffer;
  //blendet die Bearbeiten-Links aus <br>
  ($puffer);<br>
  return $puffer; <br>
  } <br>
  if(eregi(&quot;Spezial:Search&quot;,$query) or eregi(&quot;Spezial%3aSearch&quot;,$query)
  or eregi(&quot;Special:Search&quot;,$query)) { //falls kein Artikel gefunden
  wird, dann automatischer Fallback zur normalen Suche<br>
  $search = str_replace( &quot; &quot;, &quot;+&quot;, $search ); //Leerzeichen
  HTTP konform umwandeln<br>
  ob_start(&quot;callback&quot;); //Einschalten der Pufferung von Ausgaben (f&uuml;r
  Suchen)<br>
  include 'http://de.wikipedia.org/w/index.php?'.$query; //der Query wird wieder
  angehaengt<br>
  ob_end_flush();<br>
  }<br>
  print( '&lt;small&gt;&lt;p&gt; <br>
  Text und Bilder dieses Beitrags stammen aus dem Artikel <br>
  &lt;a href=&quot;http://de.wikipedia.org/wiki/'.$begriff.'&quot; title=&quot;http://de.wikipedia.org/wiki/'.$begriff.'&quot;
  target=&quot;_blank&quot;&gt;'.$search.'&lt;/a&gt; <br>
  der freien Enzyklop&amp;auml;die &lt;a href=&quot;http://de.wikipedia.org&quot;
  title=&quot;http://de.wikipedia.org&quot; target=&quot;_blank&quot;&gt;Wikipedia&lt;/a&gt;
  <br>
  und stehen unter der &lt;a href=&quot;http://www.gnu.org/licenses/fdl.txt&quot;
  target=&quot;_blank&quot;&gt;GNU Free Documentation License&lt;/a&gt;. <br>
  Die Liste der Autoren ist in der Wikipedia unter <br>
  &lt;a href=&quot;http://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=history&quot;
  target=&quot;_blank&quot; title=&quot;http://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=history&quot;&gt;dieser
  Seite&lt;/a&gt; verf&amp;uuml;gbar, der Original-Artikel l&amp;auml;sst sich
  <br>
  &lt;a href=&quot;http://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=edit&quot;
  target=&quot;_blank&quot; title=&quot;hierhttp://de.wikipedia.org/w/wiki.phtml?title='.$search.'&amp;action=edit&quot;&gt;hier&lt;/a&gt;
  <br>
  bearbeiten. <br>
  &lt;/p&gt;&lt;/small&gt;'); <br>
  ?&gt;</code> </p>
<p>Bei dem Skript handelt es sich im Endeffekt nur um einen gew&ouml;hnliche PHP
  Webseitengrabber, bei dem Inhalte von fremden Webseiten extrahiert werden um
  dann auf der eigenen Seite dargestellt zu werden. Das Skript wurde dahingehend
  erweitert, dass es nun auch die Wikipedia-Suche vollst&auml;ndig unterst&uuml;tzt.
  Falls zu einem gesuchten Begriff kein Artikel direkt gefunden wird, so wird
  automatisch die Wikipedia Suche gestartet und die Suchergebnisse dargestellt.</p>
<p>Man kann das Design der Ergebnisseite &uuml;ber CSS und etwas HTML komplett
  den eigenen W&uuml;nschen anpassen. Daf&uuml;r k&ouml;nnte man das komplette
  Skript per PHP Include in eine andere Seite einbinden &#8211; etwa an die Stelle,
  an der man ohnehin den Inhalt dargestellt haben m&ouml;chte. Da die deutschen
  Sonderzeichen in der Wikipedia-Datenbank nicht durch HTML Entit&auml;ten ersetzt
  werden, muss man im Head-Bereich der Ergebnisseite den verwendeten Zeichensatz
  auf utf-8 einstellen. Dies geschieht mit folgender meta-Anweisung:</p>
<p><code>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;
  /&gt;</code></p>

<p><img src="http://www.devmag.net/wp-content/uploads/drweb-wikipedia.gif" width="394" height="301"> </p>
<p><span class="leg">Screenshot &#8211; Wikipedia in Dr.Web Design integriert (mit herk&ouml;mmlichen
  Dr.Web Stylesheet)</span></p>
<p>Zudem m&uuml;ssen Sie das PHP Skript so ab&auml;ndern, dass nicht mehr auf
  die Datei &quot;wikistatic.php&quot; verwiesen wird. In unserem Fall hei&szlig;t
  die PHP Datei, in die wikistatic.php per Include eingef&uuml;gt wurde &quot;drweb.php&quot;.
  Wir m&uuml;ssen nun in der Datei wikistatic.php alle Verweise in drweb.php umbenennen.
</p>
<p> <code>$puffer = str_replace( &quot;/w/index.php&quot;, &quot;/wikipedia/drweb.php&quot;,
  $puffer ); //ersetzt alle Vorkommen eines Strings in einem anderen String <br>
  $puffer = str_replace( &quot;/wiki/&quot;, &quot;/wikipedia/drweb.php?title=Spezial:Search&amp;search=&quot;,
  $puffer );</code> </p>
<p><strong>CSS Stylesheet</strong><br>
  Grunds&auml;tzlich kann man das Design der Seiten einfach &uuml;ber &Auml;nderungen
  am Wikipedia Stylesheet nach den eigenen W&uuml;nschen anpassen. Man muss in
  dem Skript lediglich den Verweis auf das Stylesheet ver&auml;ndern. Da Wikipedia
  wenig mit CSS Klassen arbeitet, muss man die generellen Tag-Formatierungen verwenden.
  D.h. die Darstellung von Blocks&auml;tzen definieren etc. Das Standardstylesheet
  von Wikipedia gibt&#8217;s <a href="wikipedia-stylesheet.css">hier</a> zum downloaden...<br>
  <br>
  <strong>Eine Suchbox f&uuml;r Wikipedia</strong><br>
  Eine einfache Suchbox f&uuml;r unser Wikipedia-Skript kann &uuml;ber folgende
  paar Zeilen HTML Code erzeugt werden:</p>
<p><code>&lt;div class=&quot;wiki_suchbox&quot;&gt;<br>
  &lt;h4&gt;Suchen in der Wikipedia Datenbank!&lt;/h4&gt;<br>
  &lt;form name=&quot;searchform&quot; action=&quot;/wikipedia/drweb.php&quot;
  method=&quot;get&quot;&gt;&lt;input type=&quot;hidden&quot; name=&quot;title&quot;
  value=&quot;Spezial:Search&quot; /&gt;<br>
  &lt;input id=&quot;searchInput&quot; name=&quot;search&quot; type=&quot;text&quot;
  value=&quot;&quot; /&gt;<br>
  &lt;input type=&quot;submit&quot; name=&quot;go&quot; class=&quot;searchButton&quot;
  value=&quot;Artikel&quot; /&gt;&amp;nbsp;<br>
  &lt;input type=&quot;submit&quot; name=&quot;fulltext&quot; class=&quot;searchButton&quot;
  value=&quot;Suche&quot; /&gt;<br>
  &lt;/form&gt;<br>
  &lt;/div&gt;</code></p>
<p>Auch hier m&uuml;ssten Sie etwa den action-Parameter des Formular anpassen.
  Im n&auml;chsten Teil sollen weitere M&ouml;glichkeiten vorgestellt werden,
  wie Sie Wikipedia f&uuml;r ihre Besucher m&ouml;glichst n&uuml;tzlich integrieren
  k&ouml;nnen.<br>
</p></p>


<p>Weiterf&uuml;hrende Links:<ol><li><a href='http://www.devmag.net/php/44-wikipedia-fur-die-eigene-webseite-teil-2.html' rel='bookmark' title='Permanent Link: Wikipedia für die eigene Webseite – Teil 2'>Wikipedia für die eigene Webseite – Teil 2</a></li>
<li><a href='http://www.devmag.net/php/69-eigene-web-services-mit-php5-bereitstellen-kein-problem.html' rel='bookmark' title='Permanent Link: Eigene Web Services mit PHP5 bereitstellen? Kein Problem!'>Eigene Web Services mit PHP5 bereitstellen? Kein Problem!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.devmag.net/php/43-wikipedia-fur-die-eigene-webseite-teil-1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

