<?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/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>Bits, Bytes and my 5 cents &#187; SQL</title>
	<atom:link href="http://blog.encodingit.ch/category/programmieren/sql-programmieren/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.encodingit.ch</link>
	<description>Life is just a technical game</description>
	<lastBuildDate>Wed, 08 Feb 2012 07:57:25 +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>LDAP Synchronisation Script</title>
		<link>http://blog.encodingit.ch/2012/02/ldap-synchronisation-script/</link>
		<comments>http://blog.encodingit.ch/2012/02/ldap-synchronisation-script/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 07:40:45 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[LDAP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Planet]]></category>

		<guid isPermaLink="false">http://blog.encodingit.ch/?p=3159</guid>
		<description><![CDATA[Für einen Kunden wurde ich angefragt, ob ich ein Synchronisationsscript in PHP erstellen könne, welches die User samt Telefonnummer aus dem LDAP / AD ausliest und in eine MySQL-Tabelle umspeichert, so dass diese danach auf der Intranet-Seite angezeigt werden können. Leider wurde aus dem Auftrag nichts, da sich der User plötzlich nicht mehr gemeldet hatte, also dachte ich mir, veröffentlichen wir das Script halt, das es anderen vielleicht auch hilft.
Das könnte dich auch interessieren:<ol>
<li><a href='http://blog.encodingit.ch/2012/01/apache-mit-ldap-durch-xampp/' rel='bookmark' title='Apache mit LDAP durch XAMPP'>Apache mit LDAP durch XAMPP</a> <small>XAMPP ist ja eine ganz einfache Variante, wenn man schnell...</small></li>
</ol><img src="http://www.encodingit.ch/piwik/piwik.php?idsite=2&rec=1" style="border:0" alt="" />]]></description>
			<content:encoded><![CDATA[<p>Für einen Kunden wurde ich angefragt, ob ich ein Synchronisationsscript in PHP erstellen könne, welches die User samt Telefonnummer aus dem LDAP / AD ausliest und in eine MySQL-Tabelle umspeichert, so dass diese danach auf der Intranet-Seite angezeigt werden können. Leider wurde aus dem Auftrag nichts, da sich der User plötzlich nicht mehr gemeldet hatte, also dachte ich mir, veröffentlichen wir das Script halt, das es anderen vielleicht auch hilft.<br />
Damit das ganze funktioniert, muss das LDAP-Modul in der PHP.ini einkommentiert und die passende SO-Datei vorhanden sein.<br />
Unter Ubuntu und Debian geht das ganz einfach:</p>
<pre class="brush: bash; title: ; notranslate">
apt-get install php5-ldap
</pre>
<p>Auch andere Distros sind nicht allzu wild, genaueres dazu findet man zum Beispiel <a href="http://www.mediawiki.org/wiki/Extension:LDAP_Authentication/AD_Configuration_Examples#General_Configuration"  target="_blank" class="broken_link" rel="nofollow">hier</a>.</p>
<p>Das Script selbst war dann auch ganz einfach geschrieben, geplant war es, dieses jeweils mittels Cronjob alle paar Stunden laufen zu lassen, da sich die Benutzerdatenbank ja nicht gerade alle Minuten ändert. Also durchaus angemessen so!</p>
<p>So und hier ist also das Script.<br />
<span id="more-3159"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	// Adresse des Domänencontrollers:
	$ldap_server = &quot;ldap://173.194.35.24&quot;;

	// Konto für den Zugriff:
	$auth_user = &quot;sync@domain.local&quot;;
	$auth_pass = 'password';

	//Login für MySQL:
	$server = &quot;localhost&quot;;
	$user = &quot;sync&quot;;
	$pass = &quot;password&quot;;
	$db = &quot;users&quot;;

	// Mit LDAP Server verbinden:
	if (!($connect=@ldap_connect($ldap_server))) {
		die(&quot;Keine Verbindung zum Verzeichnis-Server möglich.&quot;);
	}

	// Diese Parameter sind nötig für den Zugriff auf ein Active Directory:
	ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
	ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);

	// An Server binden:
	if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) {
		die(&quot;Bind fehlgeschlagen.&quot;);
	}

	// BaseDN festlegen:
	$base_dn = &quot;CN=Users,DC=DOMAIN,DC=local&quot;;

	// LDAP filter setzen: Nur Kontakt- und Benutzer-Objekte sollen zurückgegeben werden
	$filter = &quot;(|(objectClass=contact)(objectClass=user))&quot;;

	// Mit MySQL Server verbinden:
	mysql_connect($server,$user,$pass) or die (&quot;Keine Verbindung mit SQL Server möglich&quot;);
	mysql_select_db($db) or die (&quot;Die Datenbank existiert nicht.&quot;);

	// Suche starten:
	if (!($search=@ldap_search($connect,$base_dn,$filter))) {
		die(&quot;Durchsuchen des LDAP-Servers fehlgeschlagen.&quot;);
	}
	$anzahl = ldap_count_entries($connect,$search);

	// Ergebnis der Suche in der Variablen $info ablegen:
	$info = ldap_get_entries($connect, $search);

	// Nur die relevanten Teile des $info-Arrays in ein $ergebnis-Array übernehmen und Umlaute dekodieren:
	for ($i=0; $i		//$ergebnis[$i][&quot;displayname&quot;]    = utf8_decode($info[$i][&quot;displayname&quot;][0]);
		$ergebnis[$i][&quot;cn&quot;] = utf8_decode($info[$i][&quot;cn&quot;][0]);
		$ergebnis[$i][&quot;telephonenumber&quot;] = $info[$i][&quot;telephonenumber&quot;][0];
	}

	// Array alphabetisch sortieren anhand einer Vergleichsfunktion:
	usort($ergebnis, 'vergleich');

	// Datenbank leeren:
	$leeren = mysql_query(&quot;TRUNCATE TABLE users&quot;) or die(&quot;Datenbank konnte nicht geleert werden&quot;);

	// Array $ergebnis in einer Tabelle ausgeben:
	for ($i=0; $i
		//Leere Namen ausschliessen:
		if (!empty($ergebnis[$i][&quot;cn&quot;]))
		{
			//Variabeln aufbereiten:
			$name = $ergebnis[$i][&quot;cn&quot;];
			$phone = $ergebnis[$i][&quot;telephonenumber&quot;];

			// Daten in Datebank schreiben:
			$eintrag = &quot;INSERT INTO users (name, phone) VALUES ('$name', '$phone')&quot;;

			//Datensätze einfügen:
			$eintragen = mysql_query($eintrag) or die(&quot;Datensätze konnten nicht komplett eingefügt werden&quot;);
		}
	}

	//Abschliessende Meldung ausgeben:
	echo &quot;Synchronisation done!&quot;;

	function vergleich($wert_a, $wert_b)
	{
		// Sortierung nach dem surename
		$a = $wert_a[&quot;cn&quot;];
		$b = $wert_b[&quot;cn&quot;];
		if ($a == $b) {
			return 0;
		}
			return ($a &lt; $b) ? -1 : +1; 	}
?&gt;
</pre>
<p>Die Datenbank, in welche geschrieben wird, trägt den Namen &#8220;Users&#8221; und muss die beiden Spalten &#8220;name&#8221; und &#8220;phone&#8221; aufweisen.<br />
Ich hoffe, es hilft irgendwem!</p>
<br /><p>Das könnte dich auch interessieren:<ol>
<li><a href='http://blog.encodingit.ch/2012/01/apache-mit-ldap-durch-xampp/' rel='bookmark' title='Apache mit LDAP durch XAMPP'>Apache mit LDAP durch XAMPP</a> <small>XAMPP ist ja eine ganz einfache Variante, wenn man schnell...</small></li>
</ol></p><img src="http://www.encodingit.ch/piwik/piwik.php?idsite=2&rec=1" style="border:0" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.encodingit.ch/2012/02/ldap-synchronisation-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>die Tücken mit unterschiedlichen DBMS</title>
		<link>http://blog.encodingit.ch/2009/02/die-tucken-mit-unterschiedlichen-dbms/</link>
		<comments>http://blog.encodingit.ch/2009/02/die-tucken-mit-unterschiedlichen-dbms/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 21:47:02 +0000</pubDate>
		<dc:creator>Patrick</dc:creator>
				<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://compr00t.5x.to/?p=204</guid>
		<description><![CDATA[RDBMS hat viele Tücken! Manchmal, wenn man nicht dran denkt, kann man so gut und gern mal einen Tag verschwenden...

Diese Erfahrung habe ich soeben wieder mal machen dürfen. Der einfache und nützliche Befehl ON DUBLICATE KEY UPDATE wollte ich verwenden, um Datensätze in meiner Datenbank zu aktualisieren, falls sich beim Schreiben mit INSERT herausstellen sollte, das schon ein solcher Vorhanden ist.<img src="http://www.encodingit.ch/piwik/piwik.php?idsite=2&rec=1" style="border:0" alt="" />]]></description>
			<content:encoded><![CDATA[<p>RDBMS hat viele Tücken! Manchmal, wenn man nicht dran denkt, kann man so gut und gern mal einen Tag verschwenden&#8230;</p>
<p>Diese Erfahrung habe ich soeben wieder mal machen dürfen. Der einfache und nützliche Befehl ON DUBLICATE KEY UPDATE wollte ich verwenden, um Datensätze in meiner Datenbank zu aktualisieren, falls sich beim Schreiben mit INSERT herausstellen sollte, das schon ein solcher Vorhanden ist.</p>
<pre><code>"INSERT INTO hosts(ip, hostname, date, OS) VALUES('ip', 'hostname', 'date', 'OS') ON DUPLICATE KEY UPDATE hosts SET date = 'date' WHERE hostname = 'hostname' AND ip = 'ip'";</code></pre>
<p>Alles schön und gut hab ich mir gedacht und mein Code mal getestet. Doch in die Datenbank wurde weder etwas geschrieben, noch ein Datensatz aktualisiert.</p>
<p>Auf der Suche nach der Antwort für mein für mich unverständliches Problem, habe ich von diversen Seiten bestätigt bekommen, dass mein SQL-Querry so eigentlich funktionieren sollte.</p>
<p>Eigentlich war ich kurz vor dem Verzweifeln, bis ich einen Tipp bekam. Dieser war kurz und einfach: RDBMS</p>
<p>Wie sich herausstellte, und woran ich beim Programmieren auch nicht gedacht habe ist, dass ON DUBLICATE KEY UPDATE nur für MySQL-dB&#8217;s funktioniert, nicht aber für M$SQL, welche ich verwende&#8230;</p>
<p>Damit mein Vorhaben auch unter einem Microsoft-Produkt funktioniert brauche ich einen andern SQL-String:</p>
<p><code> </code></p>
<pre>IF (EXISTS (SELECT * FROM hosts WHERE ip= 'xyz')) begin UPDATE hosts SET date = now() WHERE ip= 'xyz' end else
begin INSERT INTO hosts(ip, date) VALUES('zzz', now()) end</pre>
<p>Es läuft nun astrein mit der Ausnahme, dass der SQL String für M$SQL einfach 5 Mal so lang und 10 Mal so kompliziert&#8230; Aber die Effektivität von Microsoft ist ein anderes Thema <img src='http://blog.encodingit.ch/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://www.encodingit.ch/piwik/piwik.php?idsite=2&rec=1" style="border:0" alt="" />]]></content:encoded>
			<wfw:commentRss>http://blog.encodingit.ch/2009/02/die-tucken-mit-unterschiedlichen-dbms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

