<?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>Service2Max &#187; PHP Archiv  &#8211; Blog für Programmierer und Software-Architekten</title>
	<atom:link href="http://blog.service2max.ch/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.service2max.ch</link>
	<description>Technik, die begeistert</description>
	<lastBuildDate>Sat, 14 May 2011 16:47:40 +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>Sortierbare Liste mit Drag &amp; Drop in Ajax</title>
		<link>http://blog.service2max.ch/sortierbare-liste-mit-drag-drop-in-ajax-tutorial/</link>
		<comments>http://blog.service2max.ch/sortierbare-liste-mit-drag-drop-in-ajax-tutorial/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 19:12:29 +0000</pubDate>
		<dc:creator>Patrick Matsumura</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.service2max.ch/?p=36</guid>
		<description><![CDATA[In diesem Tutorial möchte ich erklären, wie man mit script.aculo.us und dem Javascript Framework Prototype eine sortierbare Liste mit Drag &#38; Drop-Funktionalität aufbaut. Der Clou an der Sache ist, dass die Liste sich ihren Zustand dauerhaft merken wird. Damit das einwandfrei funktioniert, ist es notwendig die Informationen zu speichern. Als Datenspeicher dient eine MySQL Datenbank. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.service2max.ch%2Fsortierbare-liste-mit-drag-drop-in-ajax-tutorial%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.service2max.ch%2Fsortierbare-liste-mit-drag-drop-in-ajax-tutorial%2F&amp;source=service2max&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>In diesem Tutorial möchte ich erklären, wie man mit <strong>script.aculo.us</strong> und dem <strong>Javascript Framework Prototype</strong> eine sortierbare Liste mit Drag &amp; Drop-Funktionalität aufbaut. Der Clou an der Sache ist, dass die Liste sich ihren Zustand dauerhaft merken wird. Damit das einwandfrei funktioniert, ist es notwendig die Informationen zu speichern. Als Datenspeicher dient eine MySQL Datenbank.<br />
<span id="more-36"></span><br />
Hier sind vorab die Links zur <a href="http://blog.service2max.ch/tutorials/sortable_ajax_list/sortable_list_ajax.php">Vorschau</a> und zum <a href="http://blog.service2max.ch/tutorials/sortable_ajax_list/sortable_ajax.zip">Download der Tutorialfiles</a>.</p>
<p>Zunächst braucht man <a href="http://www.prototypejs.org" target="_blank">Prototype</a> und <a href="http://script.aculo.us" target="_blank">script.aculo.us</a>. Danach werden die Javascript-Dateien in einen Ordner gespeichert und in die HTML-Datei eingebunden. Ich habe die Javascripts in den Ordner &#8220;js&#8221; gespeichert. Man sollte unbedingt darauf achten, dass Prototype <strong>VOR</strong> script.aculo.us eingebunden wird.</p>
<p>So bindet man die beiden Bibliotheken ein:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script src=&quot;/js/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;/js/scriptaculous.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Nachdem das Grundgerüst steht, kann ich mit der MySQL Datenbank anfangen. Dazu lege ich mir eine Tabelle mit folgendem Code an:</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE `sortable_ajax_list` (
`ID` TINYINT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`list_value` VARCHAR(64) NOT NULL ,
`sort_order` TINYINT(4) NOT NULL
) ENGINE = MYISAM
</pre>
<p>Ich erkläre kurz die Bedeutung der einzelnen Felder. ID wird benutzt um einen eindeutigen Bezeichner für jeden Datensatz zu haben. Dieser Wert erhöht sich durch das AUTO_INCREMENT automatisch um eins, sobald ein neuer Datensatz angelegt wird. Gleichzeitig ist ID auch der Primary Key. Im Feld list_value speichere ich den Wert des Listenelements und in sort_order wir die Sortierreihenfolge festgehalten.</p>
<p>Damit sind die beiden Bibliotheken eingebunden und Die MySQL Tabelle angelegt. Als nächstes werde ich eine HTML-Liste mit einem kleinen Stück PHP-Code generieren. Der Code soll die aktuelle Bezeichnung und die Reihenfolge der Listenelemente aus der Datenbank laden und entsprechend darstellen.</p>
<p>Aber vorher will ich noch eine kleine Konfigurationsdatei für alle weitern PHP-Scripts anlegen. In dieser Datei werden die Logindaten für die Datenbank eingetragen und die Verbindung hergestellt. Diese Datei nenne ich config.php und speichere sie in meinem Stammverzeichnis ab. </p>
<pre class="brush: php; title: ; notranslate">&lt;?

####
# Konfigurationsdaten für die Datenbank
####

$dbhost = 'localhost';
$dbuser = 'benutzer';
$dbpass = 'passwort';
$dbname = 'meine_db';

$connection = mysql_connect($dbhost, $dbuser, $dbpass); // Stellt die Verbindung zur Datenbank her

mysql_select_db($dbname, $connection); // Wählt die entsprechende Datenbank aus
?&gt;
</pre>
<p>Nachdem ich jetzt meine Konfiguration fertig habe, kann ich sie in die HTML-Datei einbinden. Auch kann ich meine MySQL-Datenbank abfragen und so die Liste erzeugen. Das sieht nun so aus:</p>
<pre class="brush: php; title: ; notranslate">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Sortable List in Ajax&lt;/title&gt;
&lt;script src=&quot;js/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/scriptaculous.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;ul id=&quot;ajax_liste&quot;&gt;

&lt;?php
	include_once('config.php'); //Konfigurationsdatei einbinden

    $result = mysql_query(&quot;SELECT * FROM sortable_ajax_list ORDER BY sort_order&quot;); // Anfrage an die Datenbank stellen und Ausgabe sortieren

    while($data = mysql_fetch_array($result))
    {
		echo '&lt;li id=&quot;item_'. $data[ID] .'&quot;&gt;'. $data[list_value] .'&lt;/li&gt;';
		echo &quot;\n&quot;;
	}
?&gt;

&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Jetzt, wo die Liste vom PHP-Code generiert wurde, soll sie auch noch sortierbar sein und sich ihren Zustand merken. Das Speichern soll nicht &#8220;spürbar&#8221; sein und darum machen wir den Request mit Ajax.Request von Prototype. Die Aktualisierung soll nach jeder Änderung der Reihenfolge vorgenommen werden. Darum setze ich den Request in die onUpdate Methode und übermittle an die PHP-Datei &#8220;sort_function.php&#8221; die serialisierten Daten der Liste. Der Code dafür sieht so aus:</p>
<pre class="brush: jscript; title: ; notranslate">&lt;script type=&quot;text/javascript&quot;&gt;
Sortable.create(&quot;ajax_liste&quot;,
	{
	onUpdate:function()
		{
		new Ajax.Request('sort_function.php',
			{
			method: &quot;post&quot;,
			parameters: {data: Sortable.serialize(&quot;ajax_liste&quot;)}
			});
		}
	});
&lt;/script&gt;</pre>
<p><strong>Wichtig:</strong> Das Javascript muss im HTML-Code <strong>NACH</strong> der Liste kommen, sonst wird es nicht angewendet. Als nächstes brauche ich die Funktion zum Speichern der Reihenfolge. Diese schreibe ich in die Datei &#8220;sort_function.php&#8221; und speichere sie in meinem Stammverzeichnis. Das ganze sieht so aus:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
include_once('config.php');

parse_str($_POST['data']);

for ($i = 0; $i &lt; count($ajax_liste); $i++) {
	if(is_int($i)) {
		mysql_query(&quot;UPDATE sortable_ajax_list SET sort_order = $i WHERE ID = $ajax_liste[$i]&quot;);
	}
	else {
	exit;
	}
}

?&gt;</pre>
<p>Man sollte beachten, dass in diesem Codestück nur wenig Überprüfung der übermittelten Daten erfolgt. Das kann unter Umständen missbraucht werden, um schädlichen Code einzuschleusen. Also ist es wichtig, die Daten zuerst genauer zu prüfen und dann zu speichern.</p>
<p>Jetzt ist alles fertig und die Liste kann sortiert und ihr Zustand gespeichert werden. </p>
<p>Kommentare und Verbesserungsvorschläge sind erwünscht. </p>
<p>Bis zum nächsten Tutorial,</p>
<p>Patrick</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.service2max.ch/sortierbare-liste-mit-drag-drop-in-ajax-tutorial/feed/</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
		<item>
		<title>Vergleichen von Strings in PHP</title>
		<link>http://blog.service2max.ch/vergleichen-von-strings-in-php/</link>
		<comments>http://blog.service2max.ch/vergleichen-von-strings-in-php/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 22:01:57 +0000</pubDate>
		<dc:creator>Patrick Matsumura</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[strcmp]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[vergleichen]]></category>

		<guid isPermaLink="false">http://blog.service2max.ch/?p=4</guid>
		<description><![CDATA[Nachdem eine der meist genutzten Anwendungen von String in PHP das Vergleichen ist, dachte ich mir, dass ich mal etwas dazu schreibe. Es gibt nämlich das Problem, dass PHP intern den Datentyp für eine Stringvariable festlegt. Unter Umständen kommt es vor, dass Strings als Zahlen interpretiert werden und somit oft in einen numerischen Datentyp konvertiert [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.service2max.ch%2Fvergleichen-von-strings-in-php%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.service2max.ch%2Fvergleichen-von-strings-in-php%2F&amp;source=service2max&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Nachdem eine der meist genutzten Anwendungen von String in PHP das Vergleichen ist, dachte ich mir, dass ich mal etwas dazu schreibe. Es gibt nämlich das Problem, dass PHP intern den Datentyp für eine Stringvariable festlegt. Unter Umständen kommt es vor, dass Strings als Zahlen interpretiert werden und somit oft in einen numerischen Datentyp konvertiert werden.<br />
<span id="more-4"></span><br />
Siehe dazu folgendes Beispiel:</p>
<pre class="brush: php; title: ; notranslate">&lt;?
$string = '123abc';
if ($string == 123) {
    // mach irgendwas
}
?&gt;</pre>
<p>Man würde normalerweise davon ausgehen, dass die beiden Werte nicht identisch sind. Aber PHP wandelt den Inhalt von $string in den Integer 123 um, macht den Vergleich also wahr. Um diesem &#8220;Problem&#8221; aus dem Weg zu gehen, könnte man auch alternativ den Identitäts-Operator === nehmen.</p>
<p>Weitere Möglichkeiten bieten die Funktionen strcmp() und strcasecmp(). Sie wurden speziell dafür entwickelt Stings miteinander zu vergleichen. Man muss aber darauf achten, dass strcasecmp() auf Gross- und Kleinschreibung Rücksicht nimmt. Somit ist &#8220;patrick&#8221; nicht gleich &#8220;Patrick&#8221;. Die beiden Funktionen geben jeweils 0 zurück, sofern die zu vergleichenden Parameter identisch sind.</p>
<p>Patrick</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.service2max.ch/vergleichen-von-strings-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced (User agent is rejected)
Database Caching using disk: basic
Object Caching 525/579 objects using disk: basic

Served from: blog.service2max.ch @ 2012-02-07 22:23:41 -->
