<?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>PHP Maniac</title>
	<atom:link href="http://www.phpmaniac.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpmaniac.de</link>
	<description>Das PHP Blog für PHP-Profis und alle die es werden wollen</description>
	<lastBuildDate>Sun, 07 Mar 2010 20:15:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tutorial: Erstellen eines einfachen WordPress Plugins</title>
		<link>http://www.phpmaniac.de/php_blog/tutorials/tutorial-erstellen-eines-einfachen-wordpress-plugins/</link>
		<comments>http://www.phpmaniac.de/php_blog/tutorials/tutorial-erstellen-eines-einfachen-wordpress-plugins/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 20:15:53 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=162</guid>
		<description><![CDATA[Da ich mich in der letzten Zeit vermehrt mit der Erstellung von WordPress-Plugins beschäftigt habe, möchte ich diese Gelegenheit nutzen um euch die Erstellung eines einfachen WordPress-Plugins näher zu erklären. Im Rahmen dieses HowTos werden wir ein sehr simples Plugin erstellen, dass jedem Artikel ein Bild hinzufügt. Welches Bild das Plugin auswählt hängt mit den [...]

]]></description>
			<content:encoded><![CDATA[<p>Da ich mich in der letzten Zeit vermehrt mit der Erstellung von WordPress-Plugins beschäftigt habe, möchte ich diese Gelegenheit nutzen um euch die Erstellung eines einfachen WordPress-Plugins näher zu erklären. Im Rahmen dieses HowTos werden wir ein sehr simples Plugin erstellen, dass jedem Artikel ein Bild hinzufügt. Welches Bild das Plugin auswählt hängt mit den den Tags des jeweiligen WordPress-Artikels zusammen. Somit lassen sich z.B. Themenrelevante Bilder automatisch in jeden Beitrag einfügen, wie ich es z.B. auf dem <a href="http://www.alldeals.de/" target="_web">alldeals.de Schnäppchen-Blog</a> realisiert habe.<br />
<span id="more-162"></span></p>
<h2>Vorbereitungen</h2>
<p>Im Wesentlichen besteht ein WordPress-Plugin aus einem Ordner im &#8220;wp-content/plugins&#8221;-Ordner der WordPress-Installation. Der Ordnername sollte dem des Plugins entsprechen. In diesem Ordner legen wir nun eine PHP-Datei, ebenfalls mit dem Plugin-Namen, an. Unser Beispielplugin wird &#8220;wp-catpics&#8221; heissen, es ergibt sich also folgende Ordnerstruktur innerhalb der WordPress-Installation:</p>
<pre class="brush: php">
/wp-content/plugins/wp-catpics
/wp-content/plugins/wp-catpics/wp-catpics.php
</pre>
<p>Besonders wichtig bei WordPress-Plugins sind zunächst die Meta-Informationen zu Beginn der PHP-Datei, die WordPress dem Benutzer bei der Installation anzeigt. Damit PHP diesen Teil der Datei nicht ausführt, werden alle Meta-Informationen in einem PHP-Kommentarblock abgelegt. Die wp-catpics.php sollte also wie folgt beginnen:</p>
<pre class="brush: php">
/*
Plugin Name: wp-catpic
Plugin URI: http://www.alldeals.de/
Description: Kategorie-Bilder nach Tags einfügen
Author: M.E.
Version: 0.0.1
Author URI: http://www.alldeals.de
*/
</pre>
<p>Wie ihr seht sind hier wichtige Informationen für WordPress hinterlegt. Neben dem Plugin-Namen und dessen Homepage wird auch eine kurze Beschreibung sowie die Version und URL des Autors angegeben. WordPress liest diese Informationen automatisch aus und bereitet sie für den Benutzer auf.</p>
<h2>Bilder in Artikel einfügen</h2>
<p>Nachdem wir alle Vorbereitungen für unser Plugin getroffen haben, werden wir nun die eigentliche Funktionalität implementieren. Wir werden diese in eine PHP-Funktion kapseln, warum das sinnvoll ist, werden wir am Ende des Artikels sehen. Fangen wir direkt mit dem Quellcode an, den ich im Anschluss näher erläutern werde:</p>
<pre class="brush: php">
function add_pics($content)
{
	$d = &#039;/var/www/img/cat/&#039;;
	$tags = get_the_tags();

	if(is_array($tags))
	{
		foreach($tags as $tag)
		{
			if ($dh = opendir($d))
			{
				while (($file = readdir($dh)) !== false)
				{
					list($name, $ext) = explode(&#039;.&#039;, $file);

					if($ext == &#039;jpg&#039;)
					{
						if($name == $tag-&gt;name)
						{
							$content = &#039;&lt;img src=&quot;/img/cat/&#039;.$file.&#039;&quot; title=&quot;&#039;.$tag-&gt;name.&#039;&quot; align=&quot;left&quot; style=&quot;padding-right:8px;padding-top:4px;padding-bottom:8px;&quot;&gt; &#039;.$content;
							closedir($dh);
							return $content;
						}
					}
				}
			}
			closedir($dh);
		}
	}
	return $content;
}
</pre>
<p>Zunächst legen wir den absoluten Pfad zum Verzeichnis mit unseren Kategoriebildern fest. Diesen benötigen wir, da das Plugin in diesem Ordner nach den passenden Bildern suchen soll. Das Problem lässt sich natürlich auch mit einer Datenbank lösen, doch so ist es wesentlich einfacher. Mit Hilfe der WordPress-Funktion get_the_tags() bekommen wir von WordPress einen Array mit Tag-Objekten. Wir prüfen zunächst ob für den aktuellen Artikel überhaupt Tags vergeben wurden (is_array). Ist dies der Fall iterieren wir durch alle Tags und versuchen für jeden Tag ein passendes Bild zu finden. Da wir pro Artikel lediglich ein einziges Bild einfügen wollen, brechen wir die komplette Funktion beim ersten Treffer ab (Dies ist beim Einsatz des Plugins zu beachten, falls mehrere Bilder möglich sind wählt das Plugin immer den ersten Treffer). Um Treffer zu finden öffnen wir das Verzeichnis mit den Bildern und iterieren hier durch alle Dateien, handelt es sich bei der aktuellen Datei um ein jpg vergleichen wir den Namen des Bildes und den des Tags (selbstverständlich lässt sich das Plugin auch für PNGs oder GIFs umbauen). Sind Name und Tag identisch hängen wir einen passenden IMG-Tag vor den Content und geben diesen zurück. Andernfalls wird das nächste Bild verglichen.<br />
Soweit so gut, doch wie bewegen wir WordPress dazu unsere Funktion zum passenden Zeitpunkt aufzurufen und das auch noch mit dem Inhalt des Artikels als Parameter? Ganz einfach, für solche Anwendungsfällt lassen sich in WordPress so genannte Filter installieren, die die Ausgaben des Blogs vorab filtern und verändern können. In unserem Fall können wir einen solchen Filter wie folgt aktivieren:</p>
<pre class="brush: php">
add_filter(&#039;the_content&#039;, &#039;add_pics&#039;);
</pre>
<p>Im Klartext bedeutet dies das WordPress den Content eines jeden Artikels an die Funktion add_pics übergeben soll. Anschließend wird der Artikel-Content mit dem Rückgabewert der add_pic Funktion ersetzt. Einfach oder? Wenn ihr nun in den Adminbereich eures Blogs schaut, sollte dort euer Plugin auftauchen. Ihr könnt es wie gewohnt aktivieren und deaktivieren.</p>
<h2>Abschließende Worte</h2>
<p>Die erfahreneren PHP-Programmierer unter euch werden es sicherlich schon gemerkt haben, der Code des Plugins ist nicht perfekt. So wäre es z.B. sinnvoller vorab eine Liste mit den Bilddateien zu erstellen, anstatt jedesmal das Dateisystem zu beanspruchen. Die Plugin-Version, die sich bei mir im Einsatz befindet habe ich bereits entsprechend erweitert. Da ich hier aber gerne die absoluten Grundlagen für die ersten eigenen WordPress-Plugins vorstellen wollte, habe ich mich entschieden diese sehr simple Implementierung zu veröffentlichen. In meinen Augen ist diese ein wesentlich besserer Startpunkt für die WordPress-Plugin-Enwicklung als ein deutlich komplexeres Beispiel. Wer möchte kann seine Verbesserungen aber gerne in den Kommentaren vorstellen. Viel Spaß beim Ausprobieren und Erweitern!</p>


]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/tutorials/tutorial-erstellen-eines-einfachen-wordpress-plugins/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP und die Twitter-API &#8211; Autofollow &amp; Autounfollow (Teil 3)</title>
		<link>http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/</link>
		<comments>http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 18:22:27 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Artikelserie]]></category>
		<category><![CDATA[PHP 5]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=155</guid>
		<description><![CDATA[Willkommen zum dritten Teil meiner kleinen Serie zur Twitter-API mit PHP. Heute wollen wir das in den letzten zwei Teilen vorgestellte Wissen für eine erste kleine Twitter-Anwendung verwenden. Hierfür benötigen wir die call_twitter-Funktion aus dem ersten Teil und das im zweiten Teil besprochene Auslesen der eigenen Follower &#038; Friends. Alle die diese Teile bis jetzt [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/" rel="bookmark">PHP und die Twitter-API &#8211; Freunde &#038; Follower (Teil 2)</a><!-- (14.9)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/" rel="bookmark">Twitter mit PHP fernsteuern &#8211; Die Twitter-API machts möglich (Teil 1)</a><!-- (9.8)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p>Willkommen zum dritten Teil meiner kleinen Serie zur Twitter-API mit PHP. Heute wollen wir das in den letzten zwei Teilen vorgestellte Wissen für eine erste kleine Twitter-Anwendung verwenden. Hierfür benötigen wir die <a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/">call_twitter-Funktion</a> aus dem ersten Teil und das im zweiten Teil besprochene <a href="http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/">Auslesen der eigenen Follower &#038; Friends</a>. Alle die diese Teile bis jetzt noch nicht gelesen haben, sollten dies vor der Lektüre dieses Artikels nachholen.<br />
<span id="more-155"></span></p>
<h2>Einem Twitter-User folgen (followen)</h2>
<p>Mit der Twitter-API können wir selbstverständlich nicht nur die Liste der Follower und Friends abrufen, sondern diese auch verändern. Zunächst möchte ich die API-Funktion zum Folgen eines anderen Twitter-Users implementieren:</p>
<pre class="brush: php">http://twitter.com/friendships/create/(user_id).xml</pre>
<p>Über diese URL lassen sich automatisiert Twitter-Freundschaften knüpfen. (user_id) muss hierbei mit der ID des Users ersetzt werden, dem wir folgen wollen. Weiterhin wird diese URL nicht mittels HTTP-Get aufgerufen, sonder als POST-Request realisiert. Dank unserer flexiblen call_twitter Funktion lässt sich dies allerdings sehr einfach durch das zweite, optionale Argument realisieren:</p>
<pre class="brush: php">
$result = twitter_call(&quot;http://twitter.com/friendships/create/&quot;.$user_id.&quot;.xml&quot;, &quot;POST&quot;);
if(isset($followers-&gt;error))
{
	echo &quot;Anfrage fehlgeschlagen: &quot;.$result-&gt;error;
}
else
{
	echo &quot;Freundschaft zu User-ID: &quot;.$user_id.&quot; erstellt!&quot;;
}
</pre>
<h2>Einen Twitter-Freund entfolgen (unfollow)</h2>
<p>Genauso einfach wie das Hinzufügen von neuen Freunden lassen sich diese auch wieder aus dem Twitter-Account entfernen:</p>
<pre class="brush: php">
$result = twitter_call(&quot;http://twitter.com/friendships/destroy/&quot;.$user_id.&quot;.xml&quot;, &quot;DELETE&quot;);
if(isset($followers-&gt;error))
{
	echo &quot;Anfrage fehlgeschlagen: &quot;.$result-&gt;error;
}
else
{
	echo &quot;Freundschaft zu User-ID: &quot;.$user_id.&quot; entfernt!&quot;;
}
</pre>
<p>Man beachte den Type-Parameter der twitter_call Funktion, hier setzt die Twitter-API einen DELETE Request-Typ vorraus. Skripts die einen HTTP-Request-Typ DELETE nicht unterstützen können hier allerdings auch einen POST-Request absenden. Es muss allerdings der Parameter &#8220;_method=DELETE&#8221; an die URL angehängt werden. Da unsere twitter_call Funktion dank cURL auch DELETE-Requests unterstützt verzichten wir an dieser Stelle aber hierauf.</p>
<h2>Automatisches Follow- &#038; Unfollow-Skript</h2>
<p>Zum Abschluss dieses Teils der Twitter-Serie möchte ich nun aus allen uns bekannten Funktionen ein kleines Autofollow/Autounfollow-Skript erstellen. Da in der Twitter-API die Anzahl der Anfragen pro Stunde für viele Anfragen auf 150 begrenzt ist, muss hier mit bedacht programmiert werden. In unserem Skript werden wir zunächst die Liste unserer Follower und die unserer Freunde von der API abrufen. Mit Hilfe von PHP-Funktionen bestimmen wir dann die Unterschiede der Listen und Löschen danach die Freundschaften zu Usern, die uns nicht folgen. Im Anschluss erzeugen wir Freundschaften zu Usern noch nicht unsere Freunde sind, aber unseren Account bereits folgen. Genug der Worte, hier erstmal der notwendige Quellcode:</p>
<pre class="brush: php">
$login_info = twitter_call(&quot;http://twitter.com/account/verify_credentials.xml&quot;);
if(isset($login_info-&gt;error))
{
	die(&quot;Login fehlgeschlagen: &quot;.$login_info-&gt;error);
}
else
{
	$followers = twitter_call(&quot;http://twitter.com/followers/ids.xml&quot;);
	$friends = twitter_call(&quot;http://twitter.com/friends/ids.xml&quot;);

	foreach(array_diff($friends, $followers) as $user_id)
	{
		//Entfolge User die uns nicht folgen
		$result = twitter_call(&quot;http://twitter.com/friendships/destroy/&quot;.$user_id.&quot;.xml&quot;, &quot;DELETE&quot;);
		if(isset($followers-&gt;error))
		{
			echo &quot;Anfrage fehlgeschlagen: &quot;.$result-&gt;error.&quot; (User ID: &quot;.$user_id.&quot;)&lt;br&gt;&quot;;
		}
		else
		{
			echo &quot;Entfolge: &quot;.$user_id.&quot;&lt;br&gt;&quot;;
		}
	}
	foreach(array_diff($followers, $friends) as $user_id)
	{
		//Folge Usern denen wir noch nicht folgen
		$result = twitter_call(&quot;http://twitter.com/friendships/create/&quot;.$user_id.&quot;.xml&quot;, &quot;POST&quot;);
		if(isset($followers-&gt;error))
		{
			echo &quot;Anfrage fehlgeschlagen: &quot;.$result-&gt;error.&quot; (User ID: &quot;.$user_id.&quot;)&lt;br&gt;&quot;;
		}
		else
		{
			echo &quot;Folge: &quot;.$user_id.&quot;&lt;br&gt;&quot;;
		}
	}
}
</pre>
<p>Da der größte Teil des Skripts bereits oben oder in den jeweiligen Teilen dieser Serie vorgestellt wurde, will ich hier nur auf die Neuerungen eingehen. Mit Hilfe der array_diff Funktion ermitteln wir über PHP die Unterschiede zwischen den Array mit den Freunden und dem der Follower. Je nachdem welcher Array als erstes Argument übergeben wird, erhalten wir eine Liste mit den Leuten denen wir folgen bzw. die wir entfolgen wollen. Mit der Foreach-Schleife setzen wir diese dann direkt in die Tat um und Entfernen alle User die uns nicht folgen aus unserer Freundesliste. Danach werden die Leute, die uns folgen zu unserer Freundesliste hinzugefügt. Zwar kann dieses Vorgehen auch das Twitter-Rate-Limit überschreiten, durch den Vergleich der Arrays werden allerdings sehr viele zeitintisive Abfragen gegenüber einer herkömmlichen Implementierung eingespart (herkommlich würde in diesem Fall bedeuten zunächst alle Freunde abzurufen und dann für jeden Freund mit Hilfe einer Abfrage zu Prüfen ob dieser in unserer Freundesliste ist).</p>
<p>Soviel zu dritten Teil der Twitter-Serie, heute haben wir zum ersten Mal ein mehr oder weniger sinnvolles Skript für die Twitter-API auf die Beine gestellt. Alle Leute die (wie ich) ihre Twitter-Zugangsdaten ungerne auf den diversen Twitter-Tools Webseiten eingeben können somit die beliebteste Funktion direkt auf dem eigenen Server realisieren. Alle anderen lernen hoffentlich etwas für eigene Twitter-Skripte, falls ihr eigene Skripte oder Ergebnisse vorweisen könnt postet gerne in den Kommentaren. </p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/" rel="bookmark">PHP und die Twitter-API &#8211; Freunde &#038; Follower (Teil 2)</a><!-- (14.9)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/" rel="bookmark">Twitter mit PHP fernsteuern &#8211; Die Twitter-API machts möglich (Teil 1)</a><!-- (9.8)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP und die Twitter-API &#8211; Freunde &amp; Follower (Teil 2)</title>
		<link>http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/</link>
		<comments>http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 19:03:14 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[PHP 5]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[schnipsel]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[tipps & tricks]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=150</guid>
		<description><![CDATA[Nachdem ich im Ersten Teil von &#8220;PHP und die Twitter-API&#8221; bereits die Grundlagen für einen PHP-Zugriff auf die Twitter-API erläutert habe gehts jetzt endlich ans Eingemachte. Mit Hilfe der im ersten Teil erstellten Funktion call_twitter werden wir die Follower und Freunde des Twitter-Accounts über die API auslesen. Also, los gehts&#8230; Twitter Follower Um die Twitter-Follower [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/" rel="bookmark">PHP und die Twitter-API &#8211; Autofollow &#038; Autounfollow (Teil 3)</a><!-- (14.7)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/" rel="bookmark">Twitter mit PHP fernsteuern &#8211; Die Twitter-API machts möglich (Teil 1)</a><!-- (10)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich im Ersten Teil von &#8220;<a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/">PHP und die Twitter-API</a>&#8221; bereits die Grundlagen für einen PHP-Zugriff auf die Twitter-API erläutert habe gehts jetzt endlich ans Eingemachte. Mit Hilfe der im ersten Teil erstellten Funktion call_twitter werden wir die Follower und Freunde des Twitter-Accounts über die API auslesen. Also, los gehts&#8230;<br />
<span id="more-150"></span></p>
<h2>Twitter Follower</h2>
<p>Um die Twitter-Follower eines Accounts über die API abzurufen genügt eine simple Anfrage mit Hilfe der twitter_call Funktion. Der Aufruf liefert aber lediglich die User-IDs aller Follower zurück. Selbstverständlich muss vor der Abfrage die Authentifizierung gegenüber der Twitter-API erfolgen. Wie das geht könnt ihr dem <a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/">ersten Teil dieser Serie</a> entnehmen.</p>
<pre class="brush: php">
$followers = twitter_call(&quot;http://twitter.com/followers/ids.xml&quot;);
if(isset($followers-&gt;error))
{
	echo &quot;Anfrage fehlgeschlagen: &quot;.$followers-&gt;error;
}
else
{
	echo count($followers-&gt;id).&quot; Follower gefunden!&quot;;
}
</pre>
<p>Dank der XML-Umwandlung mit simple_xml, die bereits von der twitter_call Funktion durchgeführt wird, erhalten wir direkt einen Array mit den Benutzer-IDs, den wir z.B. mit Hilfe einer foreach-Schleife durchlaufen können. Falls ihr mehr Informationen über die einzelnen Follower benötigt, so könnt ihr selbstverständlich auch die User-Details über die API abfragen:</p>
<pre class="brush: php">
echo &quot;&lt;table&gt;&lt;tr&gt;&lt;td&gt;ID&lt;/td&gt;&lt;td&gt;Picture&lt;/td&gt;&lt;td&gt;Username&lt;/td&gt;&lt;td&gt;Location&lt;/td&gt;&lt;/tr&gt;&quot;;

foreach($followers-&gt;id as $id)
{
	$user_info = twitter_call(&quot;http://api.twitter.com/1/users/show.xml?user_id=&quot;.$id);
	echo &quot;&lt;tr&gt;&quot;;
	echo &quot;&lt;td&gt;&quot;.$user_info-&gt;id.&quot;&lt;/td&gt;&quot;;
	echo &quot;&lt;td&gt;&lt;img src=&#039;&quot;.$user_info-&gt;profile_image_url.&quot;&#039;&gt;&lt;/td&gt;&quot;;
	echo &quot;&lt;td&gt;&quot;.$user_info-&gt;screen_name.&quot;&lt;/td&gt;&quot;;
	echo &quot;&lt;td&gt;&quot;.$user_info-&gt;location.&quot;&lt;/td&gt;&quot;;
	echo &quot;&lt;/tr&gt;&quot;;
}
echo &quot;&lt;/table&gt;&quot;;
</pre>
<p>Der Beispielcode stellt hierbei die Informationen zu allen Followern in einer kleinen Tabelle dar. Zu beachten ist jedoch, dass Twitter die Anzahl der Anfragen an seine API begrenzt. Aktuell sind 150 Anfragen pro Stunde und Account erlaubt, was bei vielen Followern allerdings schnell überschritten werden kann. Auch die php.ini kann durch max_execution_time zum Problem werden, wenn viele Anfragen sehr lange dauern.</p>
<h2>Twitter Friends</h2>
<p>Um die Leute zu ermitteln, denen man selbst folgt, kann analog zum obigen Beispiel vorgegangen werden. Lediglich die URL der API ändert sich für den Aufruf:</p>
<pre class="brush: php">
$friends = twitter_call(&quot;http://twitter.com/friends/ids.xml&quot;);
if(isset($friends-&gt;error))
{
	echo &quot;Anfrage fehlgeschlagen: &quot;.$followers-&gt;error;
}
else
{
	foreach($friends-&gt;id as $id)
	{
		echo count($friends-&gt;id).&quot; Freunde gefunden!&quot;;
	}
}
</pre>
<p>Auch hier gibt Twitter ein Array mit den IDs der Freunde zurück, dass wie oben durch eine foreach-Schleife durchlaufen werden kann. Soviel zu den Twitter Freunden und Followern, im nächsten Teil der Serie werde ich näher auf die Suche und das automatische Followen bzw. Unfollowen eingehen. Zusammen mit den heute vorgestellten Funktionen lassen sich dann bereits mächtige Twitter-Werkzeuge mit PHP erstellen. In einem der letzten Teile der Serie werden wir beispielhaft auch ein solches erstellen, also schaut wieder rein!</p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/" rel="bookmark">PHP und die Twitter-API &#8211; Autofollow &#038; Autounfollow (Teil 3)</a><!-- (14.7)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/" rel="bookmark">Twitter mit PHP fernsteuern &#8211; Die Twitter-API machts möglich (Teil 1)</a><!-- (10)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Twitter mit PHP fernsteuern &#8211; Die Twitter-API machts möglich (Teil 1)</title>
		<link>http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/</link>
		<comments>http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 20:25:45 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=125</guid>
		<description><![CDATA[Da Twitter ja in letzter Zeit in aller Munde ist (vorallem nachdem Google den Twitter Konkurrenten Buzz gestartet hat), möchte ich das Thema heute aus Entwicklersicht aufgreifen und mich mit der Twitter-API beschäftigen. Auf Grund der vielen unterschiedlichen Möglichkeiten, die mit Hilfe der Twitter-API realisiert werden können, werde ich das Thema als kleine Serie vorstellen [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/" rel="bookmark">PHP und die Twitter-API &#8211; Freunde &#038; Follower (Teil 2)</a><!-- (9.7)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/" rel="bookmark">PHP und die Twitter-API &#8211; Autofollow &#038; Autounfollow (Teil 3)</a><!-- (9.6)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Da Twitter ja in letzter Zeit in aller Munde ist (vorallem nachdem Google den Twitter Konkurrenten <a href="http://www.google.com/buzz?hl=de">Buzz</a> gestartet hat), möchte ich das Thema heute aus Entwicklersicht aufgreifen und mich mit der Twitter-API beschäftigen. Auf Grund der vielen unterschiedlichen Möglichkeiten, die mit Hilfe der Twitter-API realisiert werden können, werde ich das Thema als kleine Serie vorstellen und in den nächsten Tagen weitere Artikel zum Thema veröffentlichen. Am Ende der Serie soll dann ein kleines PHP-Skript entstehen, das uns einige der täglichen Arbeiten im Umgang mit Twitter abnehmen kann und leicht an eigene Anforderungen anzupassen ist.</p>
<h2>Die Twitter-API im Überblick</h2>
<p style="text-align: justify;">Die Twitter-API lässt sich in unterschiedlichen Formaten ansprechen, zur Auswahl stehen XML, JSON und RSS. Leider ist nicht jede Methode auch in allen drei Formaten verfügbar, aber alle drei lassen sich mit Hilfe von PHP sehr einfach weiterverwenden. Abgewickelt werden alle API-Anfragen über HTTP Requests. Hierbei kommen sowohl GET- als auch POST-Anfragen zum Einsatz. Weiterhin ist der Zugriff auf viele Methoden an das Vorhandensein eines Twitter-Accounts gebunden, deren Benutzername und Passwort bei der Anfrage mit übergeben werden. Grundsätzlich benötigen alle Methoden eine Authentifizierung, die sich mit Informationen eines Twitter-Accounts beschäftigen (z.B. das Abrufen von Followern oder der Timeline). Die Twitter-API Dokumentation findet ihr übrigens unter <a href="http://apiwiki.twitter.com/">http://apiwiki.twitter.com/</a></p>
<h2 style="text-align: justify;"><span id="more-125"></span>Vorbereitungen</h2>
<p>Der Einfachheit halber werden wir für die HTTP-Anfragen an die Twitter-Server die cURL Bibliothekt, die standardmäßig als Modul in PHP integriert ist. Selbstverständlich wäre es auch möglich die bereits an anderer Stelle präsentierten <a href="http://www.phpmaniac.de/php_blog/code-schnipsel/http-get-requests-mit-php-erzeugen/">HTTP-GET Requests</a> dafür zu verwenden. Da sämtliche Interaktion mit der Twitter-API über solche Anfragen abgewickelt wird, bietet es sich an den Code für die Kommunikation als eigene Funktion zu erstellen. In einem späteren Artikel dieser Serie werden wir die so erstellten Funktionen dann in eine eigene Twitter-Klasse kapseln. Vorerst werden wir uns allerdings mit einfachen Funktionen begnügen. Die Funktion für generelle Twitter-API-Anfragen sieht wie folgt aus:</p>
<pre class="brush: php">
define(&#039;TWITTER_USER&#039;, &#039;user&#039;);
define(&#039;TWITTER_PASS&#039;, &#039;passwort&#039;);

function twitter_call($url, $type=&#039;GET&#039;)
{
   //cURL Handle erzeugen
   $ch = curl_init();

   //Festlegen ob ein GET- oder POST-Request gesendet wird
   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $type);

   //URL festlegen
   curl_setopt($ch, CURLOPT_URL, $url);

   //Daten als String zurückgeben und nicht direkt an den Browser senden
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

   //Login-Informationen setzen
   curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
   curl_setopt($ch, CURLOPT_USERPWD, TWITTER_USER.&quot;:&quot;.TWITTER_PASS);

   //URL aufrufen und XML interpretieren
   $data = simplexml_load_string(curl_exec($ch));

   //Resourcen freigeben
   curl_close($ch);

   return $data;
}
</pre>
<p style="text-align: justify;">Zur Verwendung von cURL wird mit der init-Methode zunächst ein Handle erstellt, sämtliche Einstellungen können im Folgenden in diesem Handle gespeichert werden. Sollen unterschiedliche Anfragen erstellt werden, können z.B. mehrere Handles erstellt werden. Mit Hilfe des curl_setopt Befehls lassen sich dann die angesprochenen Einstellungen vornehmen. Wir wählen zunächst einen Anfragetyp (GET oder POST) und wählen als Rückgabetyp die String-Ausgabe um diese an eine Variable zu übergeben (andernfalls würde cURL die Daten direkt an den Browser ausgeben). Im Anschluss werden dann Benutzername und Passwort gesetzt bevor der Befehl dann abgesetzt wird. Sollen viele Anfragen parallel durchgeführt werden, ist es unbedingt zu empfehlen das die durch cURL belegten Resourcen mit curl_close wieder freigegeben werden. Aufmerksamen Lesern wird aufgefallen sein das wir mit dieser Funktion immer die Benutzerdaten übergeben obwohl ich oben erwähnt habe, dass nicht alle Twitter-Funktionen diese Daten benötigen. Dies ist durchaus richtig, allerdings nimmt uns Twitter das nicht übel &#8211; So lange die Daten korrekt sind, wenn sie vorrausgesetzt werden.</p>
<h2>Der erste Kontakt</h2>
<p>Jetzt wo die Funktion für die Kommunikation mit Twitter bereits fertig ist, möchten wir nun erstmals Kontakt zur Twitter-API herstellen. Hierzu verwenden wir die oben erstellte Funktion:</p>
<pre class="brush: php">
$login_info = twitter_call(&quot;http://twitter.com/account/verify_credentials.xml&quot;);

if(isset($login_info-&gt;error))
{
   echo &quot;Login fehlgeschlagen: &quot;.$login_info-&gt;error;
}
else
{
   echo &quot;Login erfolgreich!&lt;br&gt;&quot;;
   echo &quot;Name: &quot;.$login_info-&gt;name.&quot;&lt;br&gt;&quot;;
   echo &quot;Twitter Name: &quot;.$login_info-&gt;screen_name.&quot;&lt;br&gt;&quot;;
   echo &quot;Ort: &quot;.$login_info-&gt;location.&quot;&lt;br&gt;&quot;;
   echo &quot;Info: &quot;.$login_info-&gt;description.&quot;&lt;br&gt;&quot;;
}
</pre>
<p style="text-align: justify;">Zunächst sendet das obige Programm eine Anfrage an die verify_credentials.xml auf dem Twitter-Server. Die Dateiendung .xml gibt hierbei übrigens das Rückgabeformat an, wollten wir die Daten im JSON-Format erhalten, so würde einfach .json als Endung verwendet. Ob der Login erfolgreich war, lässt sich über das error-Objekt herrausfinden. Dieses enthält die jeweilige Fehlermeldung wenn ein Fehler aufgetreten ist. Ist die Anfrage erfolgreich verlaufen existiert kein error-Objekt und Twitter liefert und umfangreiche Informationen zum verwendeten Account. Zu Demonstrationszwecken gibt das Skript einige hiervon an den Benutzer aus.</p>
<h2>Ausblick</h2>
<p style="text-align: justify;">Heute haben wir die Grundlagen für die Verwendung der Twitter-API mit PHP geschaffen. Durch die flexible twitter_call-Methode müssen wir uns in den nächsten Teilen dieser Serie nicht mehr mit der reinen Kommunikation beschäftigen, sondern können direkt neue Twitter-Funktionen in unser Programm einbauen. Im zweiten Teil der Serie werde ich zeigen wie sich die eigene Timeline, Follower und Friends des eigenen Twitter-Accounts auslesen lassen. Bald gehts weiter, stay tuned&#8230;</p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/code-schnipsel/php-und-die-twitter-api-freunde-follower/" rel="bookmark">PHP und die Twitter-API &#8211; Freunde &#038; Follower (Teil 2)</a><!-- (9.7)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/php-5/php-und-die-twitter-api-autofollow-autounfollow-teil-3/" rel="bookmark">PHP und die Twitter-API &#8211; Autofollow &#038; Autounfollow (Teil 3)</a><!-- (9.6)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/php/twitter-mit-php-fernsteuern-die-twitter-api-machts-moglich/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Appfuchs.de &#8211; DER Preisvergleich für iPhone-Apps</title>
		<link>http://www.phpmaniac.de/php_blog/allgemein/appfuchs-de-der-preisvergleich-fur-iphone-apps/</link>
		<comments>http://www.phpmaniac.de/php_blog/allgemein/appfuchs-de-der-preisvergleich-fur-iphone-apps/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 21:21:31 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=122</guid>
		<description><![CDATA[Wer kennt das nicht? Da kauft man heute im Apple Appstore eine interessante App und schon wenige Tage später wird diese massiv im Preis gesenkt. Um dieses Problem in den Griff zu bekommen habe ich in den letzten Monaten ich verstärkt an einem neuen Projekt gearbeitet, welches ich euch nun nicht länger vorenthalten möchte. Es [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/" rel="bookmark">iPhone: Versteckte Apps nach Update wieder sichtbar machen</a><!-- (8.4)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.appfuchs.de"><img class="alignleft" style="margin: 5px;" src="http://a3.twimg.com/profile_images/584297715/flyer-a7-front_bigger.png" alt="" width="73" height="73" /></a> Wer kennt das nicht? Da kauft man heute im Apple Appstore eine interessante App und schon wenige Tage später wird diese massiv im Preis gesenkt. Um dieses Problem in den Griff zu bekommen habe ich in den letzten Monaten ich verstärkt an einem neuen Projekt gearbeitet, welches ich euch nun nicht länger vorenthalten möchte. Es handelt sich um einen Preisvergleich für iPhone- bzw. iPod Touch-Apps mit dem Namen <a href="http://www.appfuchs.de/">Appfuchs</a>&#8230;<br />
<span id="more-122"></span>Der <a href="http://www.appfuchs.de/">Appfuchs </a>wertet ständig alle Updates, neue Apps und Preisveränderungen im Appstore aus und dokumentiert diese für seine Benutzer. Die gewonnen Daten werden grafisch an Hand von Preis- und Rankingdiagrammen aufbereitet. Nach einer einfachen Registrierung informiert der Appfuchs außerdem über Preissenkungen oder Updates aller Apps die sich auf der User-Wunschliste befinden.</p>
<p style="text-align: center;"><a href="http://www.appfuchs.de/app/details/mobilenavigator-europe/"><img class="aligncenter" src="http://www.appfuchs.de/diagramm/preisverlauf/mobilenavigator-europe/" alt="Appfuchs.de: Preisverlauf Navigon Europe" width="500" height="280" /></a></p>
<p style="text-align: justify;">Auf der Startseite listet der Appfuchs weiterhin alle aktuellen Änderungen im Appstore auf, beobachtet man diese Daten einige wird einem auch schnell bewusst wie viel sich im Appstore Tag für Tag ändert. Die aktuellen <a href="http://www.appfuchs.de/app/charts/kostenpflichtige/alle/25/">Charts für alle Kategorien</a> und Unterkategorien sind selbstverständlich auch dabei. Eine <a href="http://www.appfuchs.de/app/suche/">umfangreiche Detailsuche</a> erleichtert außerdem das Auffinden von neuen, interessanten Apps. Für die Zukunft habe ich natürlich noch eine Menge Erweiterungen auf dem Zettel, bis dahin schaut euch die aktuelle Version doch schon einmal an. Über Feedback würde ich mich freuen!</p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/" rel="bookmark">iPhone: Versteckte Apps nach Update wieder sichtbar machen</a><!-- (8.4)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/allgemein/appfuchs-de-der-preisvergleich-fur-iphone-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone: Sprachausgabe (Voice Feedback) bei Nike+ reparieren</title>
		<link>http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-sprachausgabe-bei-nike-reparieren/</link>
		<comments>http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-sprachausgabe-bei-nike-reparieren/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 16:22:05 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[tipps & tricks]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=120</guid>
		<description><![CDATA[Nachdem nach einigem Hin- und Her endlich ein funktionstüchtiger Nike+ Sensor bei mir aufgeschlagen ist, versuche ich mich wieder regelmäßig zum Joggen zu zwingen. Mit den Nike+ Statistiken und vor allem dem Voice-Feedback mit meinem iPhone 3Gs macht das Ganze auch gleich deutlich mehr Spaß. Leider ist aber eben diese Sprachausgabe schon nach wenigen Einsätzen [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/" rel="bookmark">iPhone: Versteckte Apps nach Update wieder sichtbar machen</a><!-- (7.2)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p>Nachdem nach einigem Hin- und Her endlich ein funktionstüchtiger Nike+ Sensor bei mir aufgeschlagen ist, versuche ich mich wieder regelmäßig zum Joggen zu zwingen. Mit den Nike+ Statistiken und vor allem dem Voice-Feedback mit meinem iPhone 3Gs macht das Ganze auch gleich deutlich mehr Spaß. Leider ist aber eben diese Sprachausgabe schon nach wenigen Einsätzen bei mir ausgefallen. Das iPhone erkennt zwar problemlos den Sensor und meine Laufstrecke aber immer wenn ich aus Motivationsgründen die aktuellen Infos angesagt bekommen möchte, läuft stur die Musik weiter.</p>
<p>Lange Rede kurzer Sinn: Nach langem Probieren bin ich auf eine Lösung gestossen, die das Problem bei mir sofort behoben hat. Daher möchte ich sie an dieser Stelle mit allen Leidgenossen teilen, damit das Überwinden des inneren Schweinehunds nicht unnötig erschwert wird. Und so gehts:</p>
<p>1) In den iPhone Einstellungen unter Nike+ die Sprachausgabe komplett deaktivieren<br />
2) Einstellungen beenden und das iPhone komplett ausschalten<br />
3) Wenn das iPhone komplett abgeschaltet ist könnt ihr es erneut einschalten<br />
4) Jetzt wieder unter Einstellungen -> Nike+ das Voice-Feedback (Sprachausgabe) aktiveren<br />
5) Viel Spaß beim Training mit Motivation auf Knopfdruck!</p>
<p>Sollte die Lösung bei euch funktionieren würde ich mich über einen kleinen Kommentar freuen. Falls nicht könnt ihr auch gerne posten wie ihr das Problem in den Griff bekommen habt.</p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/" rel="bookmark">iPhone: Versteckte Apps nach Update wieder sichtbar machen</a><!-- (7.2)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-sprachausgabe-bei-nike-reparieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Datei-Uploads mit PHP &#8211; Hochladen leicht gemacht</title>
		<link>http://www.phpmaniac.de/php_blog/allgemein/datei-uploads-mit-php-hochladen-leichtgemacht/</link>
		<comments>http://www.phpmaniac.de/php_blog/allgemein/datei-uploads-mit-php-hochladen-leichtgemacht/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 10:02:40 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[getimagesize]]></category>
		<category><![CDATA[move_uploaded_file]]></category>
		<category><![CDATA[php upload]]></category>
		<category><![CDATA[Upload]]></category>
		<category><![CDATA[upload script]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=113</guid>
		<description><![CDATA[Nachdem ich in meinem letzten Beitrag erläutert habe, wie ihr Informationen per Email an eure Besucher versenden könnt, stelle ich heute einen Weg vor, wie Ihr Dateien von den Besuchern in Form von Datei Uploads erhalten könnt. PHP bietet hier, wie so oft, einige praktische Funktionen für den Datei-Upload an, die sehr einfach zu verwenden [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/code-schnipsel/ftp-verbindungen-mit-php/" rel="bookmark">FTP Verbindungen mit PHP</a><!-- (5)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich in meinem letzten Beitrag erläutert habe, wie ihr Informationen per <a href="http://www.phpmaniac.de/php_blog/allgemein/mailen-mit-php-uber-das-automatisierte-versenden-von-emails/">Email an eure Besucher versenden</a> könnt, stelle ich heute einen Weg vor, wie Ihr Dateien von den Besuchern in Form von Datei Uploads erhalten könnt. PHP bietet hier, wie so oft, einige praktische Funktionen für den Datei-Upload an, die sehr einfach zu verwenden sind. Leider ist aber auch bei diesem Thema die Sicherheit ein wichtiger Aspekt, denn man erlaubt ja (mehr oder weniger) fremden Leuten Dateien auf den eigenen Webserver zu übertragen. Aber fangen wir erst einmal mit dem Datei-Upload an sich an.<br />
<span id="more-113"></span></p>
<h2>Das Formular</h2>
<p>Für den Upload von Dateien durch den Besucher ist zunächst ein spezielles HTML Formular notwendig, dass das Hochladen von Dateien unterstützt. Im Prinzip  unterscheidet es sich nicht groß von anderen Formularen, die ihr sonst so benutzt, aber der Teufel steckt wie immer im Detail:</p>
<pre class="brush: html">
&lt;form action=&quot;upload.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
Datei hochladen: &lt;input type=&quot;file&quot; name=&quot;meine_datei&quot;&gt;
&lt;inpupt type=&quot;submit&quot; value=&quot;Hochladen&gt;
&lt;/form&gt;
</pre>
<p>Der einzige Unterschied zu normalen Formularen ist hier der zusätzliche Parameter „enctype“, der dem Browser mitteilt, wie er die angehängten Daten für die Übertragung kodieren soll. Damit der Benutzer komfortabel eine Datei von seinem System auswählen kann, verwenden wir außerdem ein Input vom Typ „file“, der im Browser einen Dialog zum Auswählen der Datei zur Verfügung stellt.</p>
<h2>Ein erster Datei-Upload</h2>
<p>Nun brauchen wir noch etwas PHP Code um die Daten vom Formular zu verarbeiten und die Datei abzuspeichern. Hierfür existiert bei PHP die Funktion move_uploaded_file(), die zum einen Prüft ob es sich wirklich um eine hochgeladene Datei handelt und diese dann in einen Ordner unserer Wahl verschiebt. Da der Rückgabewert vom Typ bool ist, können wir den Aufruf direkt in eine if-Abfrage einbauen:</p>
<pre class="brush: php">
&lt;?
$dir = getcwd().&#039;/files&#039;;

if($_FILES[&#039;datei_upload&#039;][&#039;size&#039;] &gt; 0)
{
	if(move_uploaded_file($_FILES[&#039;datei_upload&#039;][&#039;tmp_name&#039;], $dir.$_FILES[&#039;datei_upload&#039;][&#039;name&#039;]))
	{
		echo &quot;Der Upload der Datei war erfolgreich!&quot;;
	}
	else
	{
		echo &quot;Irgendwas stimmt hier nicht, Upload nicht erfolgreich!&quot;;
	}
}
else
{
	?&gt;
		&lt;form action=&quot;upload.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
		Datei hochladen: &lt;input type=&quot;file&quot; name=&quot;datei_upload&quot;&gt;
		&lt;inpupt type=&quot;submit&quot; value=&quot;Hochladen&gt;
		&lt;/form&gt;
	&lt;?
}
?&gt;
</pre>
<p>Das Beispiel prüft also zunächst ob eine Datei größer 0 Byte übertragen wurde. Ist dies nicht der Fall wird unser Upload-Formular angezeigt. Andernfalls versucht das Skript die hochgeladene Datei in den Ordner „files“ zu verschieben. Hierzu muss dieser natürlich existieren und PHP muss Schreibrechte auf diesen besitzen (CHMOD  777). Hat alles geklappt findet ihr eure hochgeladene Datei nach dem Upload in diesem Verzeichnis.</p>
<h2>Informationen über hochgeladene Dateien</h2>
<p>PHP stellt uns zu jeder hochgeladenen Datei einige Informationen zur Verfügung, diese befinden sich im Array $_FILES. Über den Index wird hier die gewünschte Datei ausgewählt, da durchaus auch mehrere Dateien gleichzeitig hochgeladen werden können. Den Namen der Datei im Array legt man über den Namen des File-Input-Elements im Formular fest und in unserem Fall ist das „datei_upload“.<br />
Hier eine kleine Übersicht über die verfügbaren Informationen zu den hochgeladenen Dateien im $_FILES Array:</p>
<pre class="brush: php">
$_FILES[&#039;datei_upload&#039;][&#039;name&#039;]		Ursprünglicher Dateiname auf dem Rechner des Benutzers
$_FILES[&#039;datei_upload&#039;][&#039;type&#039;]		Mime-Type der Datei, wenn der Browser ihn zur Verfügung stellt
$_FILES[&#039;datei_upload&#039;][&#039;size&#039;]		Dateigröße in Bytes
$_FILES[&#039;datei_upload&#039;][&#039;tmp_name&#039;]	Temporärer Dateiname zum Zugriff auf die Datei nach dem Upload
$_FILES[&#039;datei_upload&#039;][&#039;error&#039;]	Fehlercode, wenn beim Upload ein Problem auftritt
</pre>
<p>Wichtig hierbei ist, dass der Mime-Type vom Browser des Clients übertragen wird. Das ist ja eigentlich sehr praktisch, aber leider übertragen wieder nicht alle Browser diese Information oder sie könnte vom Besucher absichtlich manipuliert worden sein. Daher sollte man sich nicht auf den Mime-Type im $_FILES Array verlassen. Für die Verarbeitung von Bildern empfiehlt es sich vielmehr die Funktion GetImageSize() zu verwenden, die unter Anderem auch den Mime-Type der Datei bestimmt.</p>
<h2>Datei-Upload mit Einschränkungen</h2>
<p>In der Praxis wollen wir aber sicherlich nicht jede beliebige Datei akzeptieren und müssen daher einige zusätzliche Einschränkungen implementieren, die aus den hochgeladenen Dateien diejenigen auswählen, die unseren Kriterien entsprechen. Das folgende Beispiel zeigt einige der Möglichkeiten, die häufig benötigt werden:</p>
<pre class="brush: php">
$dir = getcwd().&#039;/files/&#039;;

if($_FILES[&#039;datei_upload&#039;][&#039;size&#039;] &gt; 0)
{
	if($_FILES[&#039;datei_upload&#039;][&#039;size&#039;] &lt; 100000)
	{
		$info = GetImageSize($_FILES[&#039;datei_upload&#039;][&#039;tmp_name&#039;]);

		if($info[2] != 0)
		{
			if($info[0] == 100 &amp;&amp; $info[1] == 150)
			{
				if(move_uploaded_file($_FILES[&#039;datei_upload&#039;][&#039;tmp_name&#039;], $dir.$_FILES[&#039;datei_upload&#039;][&#039;name&#039;]))
				{
					echo &quot;Der Upload der Datei war erfolgreich!&quot;;
				}
				else
				{
					echo &quot;Irgendwas stimmt hier nicht, Upload nicht erfolgreich!&quot;;
				}
			}
			else
			{
				echo &quot;Bitte laden Sie nur Bilder mit einer Größe von 100x150 Pixeln hoch!&quot;;
			}
		}
		else
		{
			echo &quot;Bitte laden Sie nur Bilder vom Typ .gif .jpg oder .png hoch!&quot;;
		}
	}
	else
	{
		echo &quot;Die Maximalgröße für Uploads liegt bei 100kB&quot;;
	}
}
else
{
	?&gt;
		&lt;form action=&quot;upload.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
		Datei hochladen: &lt;input type=&quot;file&quot; name=&quot;datei_upload&quot;&gt;
		&lt;inpupt type=&quot;submit&quot; value=&quot;Hochladen&gt;
		&lt;/form&gt;
	&lt;?
}
</pre>
<p>Die Funktion GetImageSize() liefert uns einen Array mit der Breite (Index 0), Höhe (Index 1)  und dem Mime-Type (Index 2) des Bildes. Ist der Mime-Type gleich Null, so handelt es sich um kein (bekanntes) Bildformat (1 – GIF, 2 – JPG, 3 – PNG). Über den Array können wir so einschränken welche Bildgröße und Bildtypen erlaubt sind. Weiterhin prüfen wir mit dem $_FILES Array ob die Dateigröße unter 100kByte liegt. Ist einer der Werte nicht innerhalb unserer Vorgaben, so wird eine einfache Fehlermeldung ausgegeben.</p>
<h2>Sicherheitsaspekte</h2>
<p>Wie immer noch einige Worte zur Sicherheit: Bitte seid euch immer bewusst, dass ihr im Zweifelsfall fremden Leuten gestattet Dateien auf eurem Webserver abzulegen. Wenn möglich sollte kein direkter Zugriff auf den Upload-Ordner vom Internet aus bestehen oder dieser mit einem htaccess Passwort geschützt werden. Gelingt es einem Angreifer eine PHP Datei hochzuladen und über den Browser auf diese zuzugreifen, so hat er kompletten Zugriff auf euren Webspace. Daher immer alle Dateien sehr genau prüfen und am besten keinen direkten Zugriff auf hochgeladene Daten ermöglichen. Ist ein Zugriff zwangsläufig notwendig, so bietet es sich an den Zugriff selbst auch wieder über ein PHP-Skript zu gewährleisten, dass zusätzliche Sicherheit bietet. Eventuell schreibe ich hierzu in Zukunft auch nochmal einen Artikel.</p>
<p>Bis dahin viel Spaß mit den Dateiuploads!</p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/code-schnipsel/ftp-verbindungen-mit-php/" rel="bookmark">FTP Verbindungen mit PHP</a><!-- (5)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/allgemein/datei-uploads-mit-php-hochladen-leichtgemacht/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mailen mit PHP &#8211; Über das automatisierte Versenden von Emails</title>
		<link>http://www.phpmaniac.de/php_blog/allgemein/mailen-mit-php-uber-das-automatisierte-versenden-von-emails/</link>
		<comments>http://www.phpmaniac.de/php_blog/allgemein/mailen-mit-php-uber-das-automatisierte-versenden-von-emails/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 13:49:33 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[str_replace]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=109</guid>
		<description><![CDATA[Nachdem sich mein letzter Artikel mit dem automatischen Generieren von Passwörtern beschäftigt hat und ich als Beispiel die Benutzerregistrierung erwählte, möchte ich euch heute gerne zeigen wie ihr die erstellen Passwörter (oder auch beliebige andere Informa-tionen) per Mail an den Benutzer senden könnt. Zunächst wollen wir uns hierfür die von PHP mitgebrachte mail() Funktion näher [...]

]]></description>
			<content:encoded><![CDATA[<p>Nachdem sich mein letzter Artikel mit dem <a href="http://www.phpmaniac.de/php_blog/code-schnipsel/zufallige-passworter-automatisch-mit-php-generieren/">automatischen Generieren von Passwörtern</a> beschäftigt hat und ich als Beispiel die Benutzerregistrierung erwählte, möchte ich euch heute gerne zeigen wie ihr die erstellen Passwörter (oder auch beliebige andere Informa-tionen) per Mail an den Benutzer senden könnt. Zunächst wollen wir uns hierfür die von PHP mitgebrachte mail() Funktion näher anschauen, die einen schnellen Versand von einfachen Emails ermöglicht.<br />
<span id="more-109"></span></p>
<h2>Einfach nur Mailen</h2>
<p>Wie eingangs erwähnt bringt PHP von Haus aus eine Funktion für den Emailversand mit, die PHP mail() Funktion:</p>
<pre class="brush: php">
bool mail(string $an, string $betreff, string $text);
</pre>
<p>Wie ihr seht ist der Umgang mit der Mail Funktion sehr einfach. Ein Aufruf genügt und schon versendet PHP das Email für euch an die angegebene Adresse. Emails an mehrere Empfänger sind auch kein Problem, es können mehrere Adressen an die Funktion über-geben werden, wenn die Adressen durch ein Komma getrennt werden. Da der Rückga-betyp bool ist, können wir auch direkt in einer if-Abfrage prüfen ob der Versand erfolg-reich war:</p>
<pre class="brush: php">
if(mail(&quot;user@email.de&quot;, &quot;Testnachricht&quot;, &quot;Hallo! Dies ist ein Test!&quot;))
{
	echo &quot;Nachricht erfolgreich versendet!&quot;;
}
else
{
	echo &quot;Das Senden der Nachricht ist fehlgeschlagen!&quot;;
}
</pre>
<p>Wenn ihr euch mit dem obigen Skript mal ein Email sendet, wird euch aber schnell auf-fallen, dass z.B. der Absender etwas abenteuerlich ausschaut. Wie genau ist von Fall zu Fall unterschiedlich, da der Standardabsender von der Serverkonfiguration abhängt. Damit wollen wir uns aber natürlich nicht zufrieden geben und daher bietet die mail() Funktion eine Möglichkeit eine eigene Absenderadresse festzulegen. Leider ist dies nicht so einfach wie wir es sonst von PHP gewöhnt sind, aber kompliziert ist es auch nicht.</p>
<h2>Eigene Absender festlegen</h2>
<p>Die mail() Funktion bietet für einen optionalen Parameter an, mit dem sich bestimmte Header-Einstellungen für das Email umsetzen lassen. Hierrüber lässt sich der Absender, die Antwortadresse und vieles mehr einstellen:</p>
<pre class="brush: php">
$header = &#039;From: mirko@phpmail.de&#039; . &quot;\r\n&quot; .
	  &#039;Reply-To: kai@javamail.com&#039; . &quot;\r\n&quot;;

if(mail(&quot;user@email.de&quot;, &quot;Testnachricht&quot;, &quot;Hallo! Dies ist ein Test!&quot;, $header))
{
	echo &quot;Nachricht erfolgreich versendet!&quot;;
}
else
{
	echo &quot;Das Senden der Nachricht ist fehlgeschlagen!&quot;;
}
</pre>
<p>Das Beispielskript versendet nun ein Mail von der Adresse mirko@phpmail.de, da dies durch den „From“ Eintrag im Header festgelegt wird. Jedes Feld im Header muss durch einen doppelten Zeilenumbruch mit „\r\n“ abgeschlossen werden, wie wir es schon von unseren <a href="http://www.phpmaniac.de/php_blog/code-schnipsel/http-get-requests-mit-php-erzeugen/">Headern bei den http Requests</a> gelernt haben. Klickt der Empfänger jetzt auf Antworten um auf unser Email zu antworten, so wird sein Emailprogramm eine Antwort an kai@javamail.com senden. Dies lässt sich über den Header-Eintrag Reply-To festlegen. Dies sind nur zwei der vielen Möglichen Einstellungen für die Email-Header, aber es sind sicherlich die wichtigsten.</p>
<h2>Sicherheitsaspekte</h2>
<p>Die einfache Anwendung der mail() Funktion ist gleichzeitig auch ihre große Schwäche. Nur zu leicht kann man durch schlecht programmierte Skripte Spammern ein perfektes Werkzeug in die Hand geben um den eigenen Server zum Versenden von tausenden von Emails zu verwenden. Daher möchte ich an dieser Stelle ganz besonders auf einige wichtige Aspekte bei der Verwendung der mail() Funktion hinweisen:</p>
<p>1) Wenn die Empfängeradresse eine Benutzereingabe in eurem Skript ist, so solltet ihr diese sehr genau prüfen. So wie ihr Emails an mehrere Empfänger versenden könnt, so kann es auch jeder Besucher eurer Webseite, indem er mehrere Adres-sen durch ein Komma trennt.</p>
<p>2) Solltet ihr Benutzereingaben im Headerfeld zulassen, z.B. um eine Absenderad-resse zu ermöglichen, so solltet ihr noch vorsichtiger sein. Kann der Benutzer beliebigen Text in den Header einfügen, so ist es mögliche das Email komplett zu verändern. Über den Header können rein theoretisch auch Anhänge oder ein neuer Nachrichtentext realisiert werden.</p>
<p>Viele Server erlauben heutzutage zwar keine Absenderadressen für Domains mehr, für die sie nicht zuständig sind, jedoch kann man sich darauf nicht verlassen. Ich empfehle daher möglichst viele Parameter der Mail-Funktion statisch selbst vorzugeben. Wollt ihr z.B. ein Kontaktformular erstellen, dann muss die Emailadresse des Benutzers ja nicht unbedingt die Absenderadresse des Emails sein. Ihr könnt sie auch in den Nachrichten-text einbauen und somit zumindest Benutzereingaben im Headerbereich der Email ver-meiden.<br />
Ein erster Schritt um wenigstens eine gewisse Grundsicherheit zu erreichen ist das Er-setzen der Steuerzeichen für Header und Adressen:</p>
<pre class="brush: php">
$benutzer_an = str_replace(&#039;,&#039;, &#039;&#039;, $benutzer_an);
$benutzer_header = str_replace(&quot;\n&quot;, &#039;&#039;, $benutzer_header);
$benutzer_header = str_replace(&quot;\r&quot;, &#039;&#039;, $benutzer_header);
</pre>
<p>Selbstverständlich müssen die Ersetzungen nur auf die Benutzereingaben angewendet werden und nicht auf den gesamten Header. Andernfalls würden durch das Ersetzen auch die von uns gewünschten Einstellungen unwirksam.</p>
<p>Welche Sicherheitsmaßnahmen im Einzelfall noch nötig sind, muss separat geprüft werden, aber mit den oben genannten Ersetzungen wird schon einmal das schlimmste verteilt und man macht es einem möglichen Angreifer nicht all zu leicht.</p>
<p>Soviel zur PHP mail() Funktion, für anspruchsvollere Aufgaben im Bereich des automa-tisierten Mailings werde ich in nächster Zeit noch eine Email-Klasse vorstellen, die auch gut mit HTML Emails oder Anhängen zu recht kommt und ebenfalls sehr einfach zu bedienen ist. Bis dahin, viel Spaß mit der mail() Funktion!</p>


]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/allgemein/mailen-mit-php-uber-das-automatisierte-versenden-von-emails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zufällige Passwörter automatisch mit PHP generieren</title>
		<link>http://www.phpmaniac.de/php_blog/code-schnipsel/zufallige-passworter-automatisch-mit-php-generieren/</link>
		<comments>http://www.phpmaniac.de/php_blog/code-schnipsel/zufallige-passworter-automatisch-mit-php-generieren/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 12:36:41 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[Code-Schnipsel]]></category>
		<category><![CDATA[Grundlagen]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[mt_rand]]></category>
		<category><![CDATA[mt_srand]]></category>
		<category><![CDATA[passwort]]></category>
		<category><![CDATA[strlen]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=106</guid>
		<description><![CDATA[Heute möchte ich euch gerne einen kleinen Codeschnipsel vorstellen, der automatisch Passwörter generieren kann. Er enthält zwar keine großen Innovationen aber ich verwende ihn bereits seit vielen Jahren in meinen Projekten und somit ist er sicherlich auch für den einen oder anderen von euch interessant. Das Generieren von Passwörtern ist vor allem dort notwendig, wo [...]

]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich euch gerne einen kleinen Codeschnipsel vorstellen, der automatisch Passwörter generieren kann. Er enthält zwar keine großen Innovationen aber ich verwende ihn bereits seit vielen Jahren in meinen Projekten und somit ist er sicherlich auch für den einen oder anderen von euch interessant.</p>
<p>Das Generieren von Passwörtern ist vor allem dort notwendig, wo sich z.B. neue Benutzer registrieren können und zunächst ein beliebiges Passwort gesetzt werden soll. Beliebig ist hierbei allerdings relativ, denn natürlich sollte das Passwort jedesmal unterschiedlich sein und gewissen Anforderungen an die Passwortlänge und die erlauben Zeichen genügen. Schließlich wollen wir unsere Benutzer nicht mit Passwörtern aus lauter Sonderzeichen vergraulen.<br />
<span id="more-106"></span><br />
Hier nun vorab einmal das Skript, ich werde im Anschluss kurz auf die Besonderheiten eingehen:</p>
<pre class="brush: php">
function generatePassword($pwlen=5)
{
	mt_srand();
	$salt = &quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&quot;;

	for($i=0;$i&lt;$pwlen;$i++)
	{
		$pw .= $salt[mt_rand(0, strlen($salt)-1)];
	}

	return $pw;
}
</pre>
<p>Die obige Funktion generiert euch also zufällige Passwörter. Die Passwortlänge kann hierbei als Parameter übergeben werden, standardmäßig werden Passwörter mit fünf Zeichen erstellt. Die für die Passwörter zulässigen Zeichen können einfach in die Variable $salt mit eingetragen werden. Das Skript initialisiert zunächst den Zufallsgenerator, allerdings wäre es besser dies ganz zu Anfang der index.php zu erledigen und die Initialisierung aus der Funktion selbst zu entfernen. Da dann dieses Beispiel aber nicht so ohne Weiteres überall funktionieren würde, habe ich mich für diesen (nicht ganz optimalen) Weg entschieden.</p>
<p>Nach der Initialisierung wird die for-Schleife so oft durchlaufen, bis die gewünschte Passwortlänge erreicht wurde. Bei jedem Durchlauf wird hierbei ein zufälliges Zeichen aus der $salt Variable ausgewählt und an den $pw String angehängt, der später das generierte Passwort enthält, das zurückgegeben wird. Der Trick ist hierbei, dass die $salt Variable als Array aufgefasst werden kann um das gewünschte Zeichen zu extrahieren.</p>
<p>Viel Spaß beim Verwenden und Erweitern!</p>


]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/code-schnipsel/zufallige-passworter-automatisch-mit-php-generieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone: Versteckte Apps nach Update wieder sichtbar machen</title>
		<link>http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/</link>
		<comments>http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 12:45:47 +0000</pubDate>
		<dc:creator>PHP Maniac</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>

		<guid isPermaLink="false">http://www.phpmaniac.de/?p=99</guid>
		<description><![CDATA[Da ich Mitte Mai mit der Arbeit an meiner Diplomarbeit begonnen habe, bin ich leider länger nicht mehr dazu gekommen hier zu Posten. Das ich zwischenzeitlich mein iPhone 2G gegen das neue iPhone 3GS ausgetauscht habe, macht die Sache auch nicht einfacher&#8230; Die Liste mit Ideen für neue Artikel ist jedoch lang und ich werde [...]
<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/allgemein/appfuchs-de-der-preisvergleich-fur-iphone-apps/" rel="bookmark">Appfuchs.de &#8211; DER Preisvergleich für iPhone-Apps</a><!-- (9.1)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-sprachausgabe-bei-nike-reparieren/" rel="bookmark">iPhone: Sprachausgabe (Voice Feedback) bei Nike+ reparieren</a><!-- (7.8)--></li>
	</ol>
</div>
]]></description>
			<content:encoded><![CDATA[<p>Da ich Mitte Mai mit der Arbeit an meiner Diplomarbeit begonnen habe, bin ich leider länger nicht mehr dazu gekommen hier zu Posten. Das ich zwischenzeitlich mein iPhone 2G gegen das neue iPhone 3GS ausgetauscht habe, macht die Sache auch nicht einfacher&#8230; Die Liste mit Ideen für neue Artikel ist jedoch lang und ich werde mein Bestes geben sie in den nächsten Tagen und Wochen abzuarbeiten.</p>
<p>Zunächst möchte ich jedoch einen kleinen Trick für iPhone-Besitzer loswerden, die ein iPhone mit Jailbreak auf die neue Firmware 3.0 upgedated haben. Alternativ funktioniert der Trick auch wenn man ein Backup von einem iPhone 2G oder 3G auf ein 3GS einspielen will. Benutzt man, wie ich, ein Tool um nicht verwendete Apps zu verstecken (z.B. BossPrefs oder Categories) auf seinem Jailbreak iPhone und vergisst das Ausblenden vor einem Firmware-Update rückgängig zu machen, so sind die Apps auch nach dem Update unsichtbar. Eigentlich kein Problem möchte man meinen, die neue Firmware Jailbreaken, BossPrefs installieren und die Apps wieder sichtbar machen. Allerdings steht man vor einem Problem, wenn es noch keinen Jailbreak gibt (so wie für das aktuelle 3GS). Also habe ich die letzte Woche ohne SMS App verbracht, was manchmal ganz schön ärgerlich sein kann. Folgender Trick löst das Problem schnell und einfach, ohne Restore oder Jailbreak&#8230;<br />
<span id="more-99"></span></p>
<p>1. Unter Einstellungen -> Allgemein -> Einschränkungen gehen<br />
2. Die Einschränkungen aktivieren<br />
3. Pin festlegen<br />
4. Pin bestätigen<br />
5. Einstellungen beenden (Home Taste)<br />
6. Wieder Einstellungen -> Allgemein -> Einschränkungen aufrufen<br />
7. Einschränkungen deaktivieren (Pin eingeben)<br />
8. Einstellungen beenden (Home Taste)</p>
<p>Und schon sollten wieder alle Apps sichtbar sein. Scheinbar realisiert Apple seinen Jugendschutz ebenfalls über das Ausblenden von Apps auf dem iPhone und beim Deaktivieren der Einschränkungen werden einfach alle Apps wieder auf sichtbar gestellt (auch wenn diese garnicht ausgeblendet wurden). Im Gegensatz zu machen anderen Methoden gehen hier keinerlei Einstellungen verloren und das Ganze funktioniert auch ohne Jailbreak.</p>
<p>Falls der Trick bei euch auch funktioniert (oder halt auch nicht) würde ich mich über einen Kommentar freuen &#8211; Happy Unhiding!</p>

<div style="background-color: #f9f9f9; border: 1px solid #c0c0c0; padding: 5px;">
<h3>Weitere Beiträge, die für Sie interessant sein könnten:</h3>
	<ol>
		<li><a href="http://www.phpmaniac.de/php_blog/allgemein/appfuchs-de-der-preisvergleich-fur-iphone-apps/" rel="bookmark">Appfuchs.de &#8211; DER Preisvergleich für iPhone-Apps</a><!-- (9.1)--></li>
		<li><a href="http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-sprachausgabe-bei-nike-reparieren/" rel="bookmark">iPhone: Sprachausgabe (Voice Feedback) bei Nike+ reparieren</a><!-- (7.8)--></li>
	</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpmaniac.de/php_blog/tipps-und-tricks/iphone-versteckte-apps-nach-update-wieder-sichtbar-machen/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

