<?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>Philip Ehret Web Entwicklung</title>
	<atom:link href="http://philip-ehret.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://philip-ehret.de</link>
	<description>This and that.</description>
	<lastBuildDate>Mon, 28 Nov 2011 13:12:30 +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>WebDAV extrem langsam unter Windows 7</title>
		<link>https://philip-ehret.de/webdav-extrem-langsam-unter-windows-7/</link>
		<comments>https://philip-ehret.de/webdav-extrem-langsam-unter-windows-7/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 13:12:30 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">https://philip-ehret.de/?p=378</guid>
		<description><![CDATA[Nachdem der Zugriff auf ein WebDAV-Laufwerk unter Linux problemlos und schnell möglich war, unter Windows 7 jedoch für die Anzeige jedes einzelnen Ordners extrem lang brauchte, löste folgender Tipp das Problem: Wenn Webdav unter Windows 7 verblüffend langsam ist: Bei den Proxy-Einstellungen im IE die automatische Suche abschalten]]></description>
			<content:encoded><![CDATA[<p>Nachdem der Zugriff auf ein WebDAV-Laufwerk unter Linux problemlos und schnell möglich war, unter Windows 7 jedoch für die Anzeige jedes einzelnen Ordners extrem lang brauchte, löste folgender <a href="http://lipflip.org/blog/lipflip/2010/02/webdav-unter-windows-7" title="WebDAV unter Windows 7 | lipflip.org" class="extern">Tipp</a> das Problem:</p>
<p><q cite="http://lipflip.org/blog/lipflip/2010/02/webdav-unter-windows-7">Wenn Webdav unter Windows 7 verblüffend langsam ist: Bei den Proxy-Einstellungen im IE die automatische Suche abschalten</q></p>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/webdav-extrem-langsam-unter-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einem WCF Dienst aus PHP ein Dictionary als Parameter übergeben</title>
		<link>https://philip-ehret.de/einem-wcf-dienst-aus-php-ein-dictionary-als-parameter-ubergeben/</link>
		<comments>https://philip-ehret.de/einem-wcf-dienst-aus-php-ein-dictionary-als-parameter-ubergeben/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 14:15:27 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[dictionary]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[SoapClient]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=339</guid>
		<description><![CDATA[Einem WCF Dienst ein Dictionary (hier Dictionary&#60;string, string&#62;) als Parameter zu übergeben, kann z.B. sinnvoll sein, wenn der Dienst eine Suche in einer SQL-Datenbank durchführen soll, wobei die SQL-Abfrage, die dieser Suche zu Grunde liegt, beliebig viele SQL-Parameter enthalten kann: SELECT * FROM [TABLE] WHERE FIELD1 LIKE @Search1 FIELD2 LIKE @Search2 FIELD3 LIKE @Search3 ... [...]]]></description>
			<content:encoded><![CDATA[<p>Einem WCF Dienst ein Dictionary (hier <strong>Dictionary&lt;string, string&gt;</strong>) als Parameter zu übergeben, kann z.B. sinnvoll sein, wenn der Dienst eine Suche in einer SQL-Datenbank durchführen soll, wobei die SQL-Abfrage, die dieser Suche zu Grunde liegt, beliebig viele SQL-Parameter enthalten kann:</p>
<pre><code>SELECT
    *
FROM
    [TABLE]
WHERE
    FIELD1 LIKE @Search1
    FIELD2 LIKE @Search2
    FIELD3 LIKE @Search3
    ...
    FIELDN LIKE @SearchN</code></pre>
<p>Die entsprechende Methode des Dienstes könnte dann so aussehen (die Deklaration als <em>void</em> um so einfach wie möglich zu bleiben):</p>
<pre><code>public void SendDictString(Dictionary&lt;string, string&gt; dParam)
{
    SqlCommand sc = new SqlCommand();
    sc.CommandText = ...; // Die SQL-Abfrage, z.B. aus Datei geladen

    Dictionary&lt;string,string&gt;.Enumerator e = dParam.GetEnumerator();
    while (e.MoveNext())
    {
        Debug("{0}:{1}", e.Current.Key.ToString(), e.Current.Value.ToString());

        sc.Parameters.Add(new SqlParameter(e.Current.Key, e.Current.Value));
    }
    SqlDataReader sdr = sc.ExecuteReader();
}</code></pre>
<p>Betrachtet man die resultierende WSDL-Datei, sieht diese so aus:</p>
<pre><code>&lt;xs:schema xmlns:xs=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:tns=&quot;http://schemas.microsoft.com/2003/10/Serialization/Arrays&quot; elementFormDefault=&quot;qualified&quot; targetNamespace=&quot;http://schemas.microsoft.com/2003/10/Serialization/Arrays&quot;&gt;
&lt;xs:complexType name=&quot;ArrayOfKeyValueOfstringstring&quot;&gt;
&lt;xs:annotation&gt;
&lt;xs:appinfo&gt;
&lt;IsDictionary xmlns=&quot;http://schemas.microsoft.com/2003/10/Serialization/&quot;&gt;true&lt;/IsDictionary&gt;
&lt;/xs:appinfo&gt;
&lt;/xs:annotation&gt;
&lt;xs:sequence&gt;
&lt;xs:element minOccurs=&quot;0&quot; maxOccurs=&quot;unbounded&quot; name=&quot;KeyValueOfstringstring&quot;&gt;
&lt;xs:complexType&gt;
&lt;xs:sequence&gt;
&lt;xs:element name=&quot;Key&quot; nillable=&quot;true&quot; type=&quot;xs:string&quot;/&gt;
&lt;xs:element name=&quot;Value&quot; nillable=&quot;true&quot; type=&quot;xs:string&quot;/&gt;
&lt;/xs:sequence&gt;
&lt;/xs:complexType&gt;
&lt;/xs:element&gt;
&lt;/xs:sequence&gt;
&lt;/xs:complexType&gt;
&lt;xs:element name=&quot;ArrayOfKeyValueOfstringstring&quot; nillable=&quot;true&quot; type=&quot;tns:ArrayOfKeyValueOfstringstring&quot;/&gt;
&lt;/xs:schema&gt;</code></pre>
<p>Interessant an dieser Beschreibung ist dieser Teil:</p>
<pre><code>&lt;xs:sequence&gt;
&lt;xs:element name=&quot;Key&quot; nillable=&quot;true&quot; type=&quot;xs:string&quot;/&gt;
&lt;xs:element name=&quot;Value&quot; nillable=&quot;true&quot; type=&quot;xs:string&quot;/&gt;
&lt;/xs:sequence&gt;</code></pre>
<p>Mit einer PHP-Anwendung ließe sich der Dienst entsprechend wie folgt konsumieren:</p>
<pre><code>$client->SendDictString(array(
	"dParam"	=>	array(
		array(
			"Key"	=>	"Search1",
			"Value"	=>	"Suchbegriff1"
		),
		array(
			"Key"	=>	"Search2",
			"Value"	=>	"Suchbegriff2"
		),
		array(
			"Key"	=>	"Search3",
			"Value"	=>	"Suchbegriff3"
		)
	)
)</code></pre>
<p>Die Debug-Ausgabe des WCF Dienst sieht dann so aus:</p>
<pre><samp>Search1:Suchbegriff1
Search2:Suchbegriff2
Search3:Suchbegriff3</samp></pre>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/einem-wcf-dienst-aus-php-ein-dictionary-als-parameter-ubergeben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fehlermeldung &#8220;Error Fetching http headers&#8221; bei der Abfrage eines WCF Dienstes, welcher einen benutzerdefinierten Typ zurückgibt</title>
		<link>https://philip-ehret.de/fehlermeldung-error-fetching-http-headers-bei-der-abfrage-eines-wcf-dienstes-welcher-einen-benutzerdefinierten-typ-zuruckgibt/</link>
		<comments>https://philip-ehret.de/fehlermeldung-error-fetching-http-headers-bei-der-abfrage-eines-wcf-dienstes-welcher-einen-benutzerdefinierten-typ-zuruckgibt/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 09:56:35 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Exception]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[ServiceContract]]></category>
		<category><![CDATA[ServiceKnownType]]></category>
		<category><![CDATA[SoapClient]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows Server]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=323</guid>
		<description><![CDATA[Bei der Entwicklung eines WCF WebService, definierte ich den folgenden ServiceContract: [ServiceContract] public interface IClient { ... [OperationContract] WebUser GetUserData(string sWebUserHash); ... } Beim Abruf einer Implementierung des Dienstes mit Hilfe des PHP SoapClient kam es zu der Exception: Error Fetching http headers Zwar hat mich die Suche nach dem Ursprung unter anderem zu einem [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der Entwicklung eines WCF WebService, definierte ich den folgenden ServiceContract:</p>
<pre><code>[ServiceContract]
public interface IClient
{
    ...
    [OperationContract]
    WebUser GetUserData(string sWebUserHash);
    ...
}</code></pre>
<p>Beim Abruf einer Implementierung des Dienstes mit Hilfe des PHP SoapClient kam es zu der Exception:</p>
<blockquote><p>Error Fetching http headers</p>
</blockquote>
<p>Zwar hat mich die Suche nach dem Ursprung unter anderem zu einem <a href="https://bugs.php.net/bug.php?id=37054">PHP Bug Report</a> geführt, jedoch konnten die dort angegebenen Hilfen mein Problem nicht beheben.</p>
<p>Da die Kompilierung des WebService ohne Probleme verlief, die Dienstbeschreibung per HTTP abrufbar war und andere Methoden ohne Probleme funktionierten, vermutete ich das Problem beim PHP SoapClient. Jedoch stellte sich dann heraus, dass ich vergessen hatte, dem WebService den Typ <em>WebUser</em> bekanntzumachen.</p>
<p>Das Problem <strong>löste</strong> sich durch die simple Ergänzung des folgenden Attributs:</p>
<pre><code>[ServiceKnownType(typeof(WebUser))]</code></pre>
<p>Der funktionierende Quellcode sah dann so aus:</p>
<pre><code>[ServiceContract]
[ServiceKnownType(typeof(WebUser))]
public interface IClient
{
    ...
    [OperationContract]
    WebUser GetUserData(string sWebUserHash);
    ...
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/fehlermeldung-error-fetching-http-headers-bei-der-abfrage-eines-wcf-dienstes-welcher-einen-benutzerdefinierten-typ-zuruckgibt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft SQL Server: Problem mit dem GO-Schlüsselwort beim Verwenden des JDBC-Treibers</title>
		<link>https://philip-ehret.de/microsoft-sql-server-problem-mit-dem-go-schlusselwort-beim-verwenden-des-jdbc-treibers/</link>
		<comments>https://philip-ehret.de/microsoft-sql-server-problem-mit-dem-go-schlusselwort-beim-verwenden-des-jdbc-treibers/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 14:51:57 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[GO]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=298</guid>
		<description><![CDATA[Arbeitet man mit dem Microsoft SQL Server, so wird man viel und oft das Schlüsselwort GO verwenden. Sollen Serverabfragen, die das GO-Schlüsselwort enthalten, mit JDBC ausgeführt werden, kommt es jedoch zu einer Ausnahme (Exception): Falsche Syntax in der Nähe von &#8216;GO&#8217;. Anstatt alle SQL-Skripte, die das GO-Schlüsselwort enthalten, umzuschreiben, gibt es auch eine einfachere Möglichkeit [...]]]></description>
			<content:encoded><![CDATA[<p>Arbeitet man mit dem Microsoft SQL Server, so wird man viel und oft das Schlüsselwort <strong>GO</strong> verwenden. Sollen Serverabfragen, die das GO-Schlüsselwort enthalten, mit JDBC ausgeführt werden, kommt es jedoch zu einer Ausnahme (Exception):</p>
<blockquote><p>Falsche Syntax in der Nähe von &#8216;GO&#8217;.</p></blockquote>
<p>Anstatt alle SQL-Skripte, die das GO-Schlüsselwort enthalten, umzuschreiben, gibt es auch eine einfachere Möglichkeit in Java: Man zerlegt ein SQL-Skript einfach anhand des GO-Schlüsselworts und packt jedes Teilelement in ein eigenes JDBC-Statement.</p>
<p>Wir gehen von folgendem SQL-Skript aus:</p>
<pre><samp>USE [someDatabase]
GO

CREATE VIEW [someSchema].[someView] AS SELECT * FROM [someSchema].[someTable]
GO

CREATE TABLE [someSchema].[someTable] (
	someField VARCHAR(50) NULL
)
GO</samp></pre>
<p>Dann lassen sich alle Teile wie folgt ausführen:</p>
<pre><code>Connection con; // Eine aktive Verbindung zu einem SQL-Server via JDBC
String sql; // Oben genanntes SQL-Skript

for(String batch: sql.split("GO")){
	con.createStatement(batch.trim()).execute();
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/microsoft-sql-server-problem-mit-dem-go-schlusselwort-beim-verwenden-des-jdbc-treibers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Analytics Alternative wegen rechtlicher Unsicherheit</title>
		<link>https://philip-ehret.de/google-analytics-alternative-wegen-rechtlicher-unsicherheit/</link>
		<comments>https://philip-ehret.de/google-analytics-alternative-wegen-rechtlicher-unsicherheit/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 12:24:15 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Abmahnung]]></category>
		<category><![CDATA[Google Analytics]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Recht]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=284</guid>
		<description><![CDATA[Schon seit langem setze ich auf Projekt-Webseiten Google Analytics ein, weil es meiner Meinung nach ausreichende und übersichtliche Auswertungen für Webseiten-Zugriffe bietet. Zwar bin ich erklärter Google-Fan und finde es total absurd, wie in letzter Zeit gegen Google vorgegangen wird (siehe StreetView etc.) während ähnliche Dienste von Microsoft (Bing) und anderen Anbietern nicht schlechtgeredet werden, [...]]]></description>
			<content:encoded><![CDATA[<p>Schon seit langem setze ich auf Projekt-Webseiten <a href="http://www.google.com/analytics" title="Externer Link zu Google Analytics">Google Analytics</a> ein, weil es meiner Meinung nach ausreichende und übersichtliche Auswertungen für Webseiten-Zugriffe bietet.</p>
<p>Zwar bin ich erklärter Google-Fan und finde es total absurd, wie in letzter Zeit gegen <a href="http://www.google.com">Google</a> vorgegangen wird (siehe StreetView etc.) während ähnliche Dienste von <a href="http://www.microsoft.com">Microsoft</a> (Bing) und anderen Anbietern nicht schlechtgeredet werden, jedoch bewegt man sich beim Einsatz von Google Analytics scheinbar auf einem rechtlich unsicheren Pfad.</p>
<p>Da Webseiten, die Analytics einbinden, Daten über Besucher (auch die IP-Adressen) an Google weiterleiten, ist das rechtlich nicht in Ordnung. Beim Einsatz von Analytics muss man also im schlimmsten Fall mit (teuren) Abmahnungen rechnen.</p>
<p>Deswegen habe ich mich auf die Suche nach einer Alternative gemacht und diese jetzt gefunden: <a href="http://www.piwik.org">Piwik</a>, eine Open-Source Google Analytics Alternative, speichert nach einer Installation auf einem eigenen Server Daten unabhängig von Dritten und kann leicht so angepasst werden, dass die Analysierung der Besucherdaten mit Deutschem Recht vereinbar ist:</p>
<ul>
<li>Nach der Installation von Piwik das Plugin <em>AnonymizeIP</em> aktivieren</li>
<li>Auf einer Datenschutz-Unterseite o.ä. der Webseite dem Benutzer die Möglichkeit bieten, sich von der Datenerfassung auszuschließen</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/google-analytics-alternative-wegen-rechtlicher-unsicherheit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLDu in neuer Version 1.1</title>
		<link>https://philip-ehret.de/mysqldu-v1-1/</link>
		<comments>https://philip-ehret.de/mysqldu-v1-1/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 14:39:46 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQLDu]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[automatisch]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Update]]></category>
		<category><![CDATA[Version]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=277</guid>
		<description><![CDATA[Meine kleine MySQL-Backup-Lösung MySQLDu gibt es in der neuen Version 1.1. Neben zwei kleinen Änderungen ist die neu hinzugefügte FTP-Unterstützung interessant. Backups können jetzt automatisch auf einen FTP-Server hochgeladen werden. MySQLDu 1.1 herunterladen]]></description>
			<content:encoded><![CDATA[<p>Meine kleine <a href="http://philip-ehret.de/projekte/mysqldu/">MySQL-Backup-Lösung MySQLDu</a> gibt es in der neuen Version 1.1.</p>
<p>Neben zwei kleinen Änderungen ist die neu hinzugefügte FTP-Unterstützung interessant. Backups können jetzt automatisch auf einen FTP-Server hochgeladen werden.</p>
<p><a href="http://files.philip-ehret.de/dev/mysqldu-1.1.rar">MySQLDu 1.1 herunterladen</a></p>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/mysqldu-v1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatisches MySQL-Backup per Mail</title>
		<link>https://philip-ehret.de/automatisches-mysql-backup-per-mail/</link>
		<comments>https://philip-ehret.de/automatisches-mysql-backup-per-mail/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 14:09:49 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQLDu]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[automatisch]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Script]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=199</guid>
		<description><![CDATA[Wem seine Daten lieb sind, der sichert sie häufig. Ob Wöchentlich, täglich oder stündlich hängt dabei von der Änderungsrate ebendieser ab, völlig unabhängig davon ist aber, dass die manuelle Erstellung von Backups kostbare Zeit kostet, die anderweitig besser investiert wäre. Bei Internetprojekten ist die frei verfügbare MySQL-Datenbank mittlerweile ein Standard, administriert wird sie meistens mit [...]]]></description>
			<content:encoded><![CDATA[<p>Wem seine Daten lieb sind, der sichert sie häufig. Ob Wöchentlich, täglich oder stündlich hängt dabei von der Änderungsrate ebendieser ab, völlig unabhängig davon ist aber, dass die manuelle Erstellung von Backups kostbare Zeit kostet, die anderweitig besser investiert wäre.</p>
<p>Bei Internetprojekten ist die frei verfügbare <a href="http://dev.mysql.com/">MySQL</a>-Datenbank mittlerweile ein Standard, administriert wird sie meistens mit <a href="http://www.phpmyadmin.net">phpMyAdmin</a>, einem ebenso kostenlosem Web-Interface. Wer MySQL-Datenbanken normalerweise sichert, der erstellt in phpMyAdmin ein <a href="http://de.wikipedia.org/wiki/Datenbankdump">Datenbank-Dump</a> und lässt es sich wahlweise als Textdatei oder in einem Archiv verpackt liefern. Doch aufgrund der nötigen Autorisierung am Server dauert die Erstellung schon einige Zeit, wieso da nicht einfacher? Mit einem automatischen Backup zum Beispiel.</p>
<p>Mithilfe eines <a href="http://de.wikipedia.org/wiki/Cron">Cronjobs</a>, dem Tipp, <a title="Mit Plesk einen PHP Cronjob einrichten" href="/mit-plesk-einen-php-cronjob-einrichten/">wie man mit wget ein PHP-Script aufruft</a> und <a title="MySQLDu - Simple MySQL backup solution" href="/projekte/mysqldu/">MySQLDu</a> lässt sich einfach eine Backup-Lösung erstellen. Wie das geht wird im Folgenden erklärt.</p>
<p>Laden wir zunächst die aktuelle Version von <a href="http://files.philip-ehret.de/dev/mysqldu-1.0.rar">MySQLDu</a> (1.0) herunter und entpacken das Archiv auf den Webserver, auf dem auch die MySQL-Datenbank liegt.</p>
<p>Als nächstes <strong>löschen</strong> wir die Dateien <em>testoutput.php</em>, <em>testmail.php</em>, <em>testfile.php</em>, <em>msdu.sql</em> und das Unterverzeichnis <em>dump/</em>, da diese entweder zu Testzwecken dienen oder für die Sicherung per Mail nicht erforderlich sind.</p>
<p><strong>Ganz wichtig</strong> ist, dass das Unterverzeichnis <em>tmp/</em> durch den Webserver-Benutzer schreibbar ist (am Besten setzen Sie die Rechte auf 0777).</p>
<p>Jetzt erstellen wir eine neue Datei <strong>cronbackup.php</strong> mit folgendem Inhalt:</p>
<pre><code>&lt;?php
	define("MYSQLDU_MODE","mail"); // legt den Mail-Modus fest

	// Datenbankzugangsdaten
	define("MYSQLDU_DB","");
	define("MYSQLDU_USER","");
	define("MYSQLDU_PASSWORD","");
	define("MYSQLDU_HOST","localhost");	

	// Mail-Optionen
	define("MYSQLDU_MAIL_FROM","noreply@philip-ehret.de");
	define("MYSQLDU_MAIL_FROMNAME","MySQLDu V!version");
	define("MYSQLDU_MAIL_TITLE","MySQL dump of !database on !d.!m.!Y (!H:!i:!s)");
	define("MYSQLDU_MAIL_TEXT","Hi there, this mail contains your dump of database !database created by MySQLDu V!version on !d.!m.!Y (!H:!i:!s).\n".
		"See attached file!\n\n".
		"Thanks for using MySQLDu (http://philip-ehret.de/projekte/mysqldu/)\n".
		"See also mysqldump.php from Huang Kai (http://atutility.com/software/mysqldumpphp/) on which MySQLDu is based on\n".
		"This mail was automatically generated and sent by PHPMailer(http://phpmailer.worxware.com/)");
	define("MYSQLDU_MAIL_SENDTO","mail@philip-ehret.de");
	define("MYSQLDU_MAIL_ATTACHMENT_NAME","!server.!database.!date.dump.sql");

	require_once("mysqldu-1.0.php");
?&gt;</code></pre>
<p><strong>Wichtig</strong> ist, dass Sie die Konstanten <em>MYSQLDU_USER</em>, <em>MYSQLDU_HOST</em>, <em>MYSQLDU_PASSWORD</em>, <em>MYSQLDU_DB</em> an die Zugangsdaten Ihrer MySQL-Datenbank anpassen und <em>MYSQLDU_MAIL_FROM</em> und <em>MYSQLDU_MAIL_SENDTO</em> passend setzen (Das erste ist die E-Mail-Adresse, die später als Absender der Backup-Mail erscheint, das zweite die E-Mail-Adresse, an die das Backup gesandt werden soll).</p>
<p>Die Konstanten <em>MYSQLDU_MAIL_TITLE</em> und <em>MYSQLDU_MAIL_TEXT</em> können Sie nach belieben anpassen, mögliche Platzhalter finden Sie in der<strong> mysqldu-1.0.php</strong> in der Variablen <em>$MYSQLDU_REPLACE_ARRAY</em>.</p>
<p>Rufen Sie das Script jetzt einmal mit Ihrem Browser auf. Die Ausgabe sollte bei Erfolg die folgende sein. Eventuell öffnet Ihr Browser auch einen Download-Dialog, die heruntergeladene Datei enthält dann die Ausgabe.</p>
<pre><samp>{&quot;status&quot;:&quot;success&quot;,&quot;text&quot;:&quot;Mail was successfully delivered&quot;}</samp></pre>
<p>Es handelt sich hierbei um eine JSON-codierte Ausgabe. Das ist deswegen so, damit andere Scripte, die das Backup-Script aufrufen könnten, die Rückmeldungen einfach verarbeiten können.</p>
<p>Sollten Sie eine andere Ausgabe erhalten, so sehen Sie sich den JSON-codierten Fehlertext an. Dieser gibt Rückschlüsse darauf, was falsch läuft. Überprüfen Sie die Schreibrechte für das Unterverzeichnis <em>tmp/</em> und stellen Sie sicher, dass Sie die Datenbankzugangsdaten korrekt eingegeben haben.</p>
<p>Wenn die Ausgabe stimmt, gehen Sie in das E-Mail-Postfach der für <em>MYSQLDU_MAIL_SENDTO</em> angegebenen E-Mail-Adresse. Dort sollte bereits eine E-Mail auf Sie warten, welche die Datenbanksicherung als Anhang enthält.</p>
<p>Um das E-Mail-Backup jetzt auch noch vollautomatisch zu erhalten, führen Sie sich den Artikel zur <a title="Mit Plesk einen PHP Cronjob einrichten" href="/mit-plesk-einen-php-cronjob-einrichten/">Ausführung eines PHP-Scriptes mithilfe eines Cronjobs</a> zu Gemüte, welcher nicht nur für Plesk seine Gültigkeit hat.</p>
<p>Meine persönlichen Datenbanken sind zum Großteil in Unicode, da das etliche Vorteile bietet, welche den gegenüber anderen Datencodierungen höheren Speicherverbrauch meiner Meinung nach durchaus rechtfertigen.<br />
Sollten Sie eine andere Codierung haben und die Dump-Datei fehlerhaft sein, versuchen Sie das Problem zu beheben, indem Sie an den Anfang der <strong>cronbackup.php</strong> folgenden Code einfügen:</p>
<pre><code>define(&quot;MYSQLDU_UTF8&quot;,0);</code></pre>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/automatisches-mysql-backup-per-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mit Plesk einen PHP Cronjob einrichten</title>
		<link>https://philip-ehret.de/mit-plesk-einen-php-cronjob-einrichten/</link>
		<comments>https://philip-ehret.de/mit-plesk-einen-php-cronjob-einrichten/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 09:45:04 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[automatisch]]></category>
		<category><![CDATA[Cronjob]]></category>
		<category><![CDATA[Plesk]]></category>
		<category><![CDATA[Script]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=150</guid>
		<description><![CDATA[Wer mit Plesk einen Cronjob einrichten möchte, der ein PHP-Script aufruft, kann das ohne umständliche Aufrufe mit dem Befehl wget machen, welcher normalerweise ein Dokument von einer URL lädt und abspeichert. Der Trick hierfür ist die Verwendung der Option spider, welche die Abspeicherung unterdrückt: wget http://anydomain.tld/script.php?action=dosomething --spider]]></description>
			<content:encoded><![CDATA[<p>
Wer mit Plesk einen Cronjob einrichten möchte, der ein PHP-Script aufruft, kann das ohne umständliche Aufrufe <strong>mit dem Befehl wget</strong> machen, welcher normalerweise ein Dokument von einer URL lädt und abspeichert. Der Trick hierfür ist die Verwendung der Option spider, welche die Abspeicherung unterdrückt:
</p>
<pre><samp>wget http://anydomain.tld/script.php?action=dosomething --spider</samp></pre>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/mit-plesk-einen-php-cronjob-einrichten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Smarty Rekursion in einem Template</title>
		<link>https://philip-ehret.de/smarty-rekursion-in-einem-template/</link>
		<comments>https://philip-ehret.de/smarty-rekursion-in-einem-template/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 13:05:52 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Rekursion]]></category>
		<category><![CDATA[Smarty]]></category>

		<guid isPermaLink="false">http://philip-ehret.de/?p=120</guid>
		<description><![CDATA[Es kommt öfters vor, dass man ein Array ausgeben möchte, ohne die Tiefe zu kennen. Baumstrukturen oder Verzeichnislistings sind Beispiele dafür. Mit PHP und anderen Skriptsprachen lässt sich eine solche Struktur leicht mithilfe von Rekursion ausgeben. Ich persönlich benutze seit geraumer Zeit die Smarty Template Engine, welche die Möglichkeit der Rekursion in Templates leider bisher [...]]]></description>
			<content:encoded><![CDATA[<p>Es kommt öfters vor, dass man ein Array ausgeben möchte, ohne die Tiefe zu kennen. Baumstrukturen oder Verzeichnislistings sind Beispiele dafür. Mit PHP und anderen Skriptsprachen lässt sich eine solche Struktur leicht mithilfe von Rekursion ausgeben.</p>
<p>Ich persönlich benutze seit geraumer Zeit die <a title="Smarty Template Engine" href="http://smarty.net">Smarty Template Engine</a>, welche die Möglichkeit der Rekursion in Templates leider bisher vermissen lässt.<br />
Wer jedoch zwischen den Zeilen liest, findet im Smarty-Forum <a title="Smarty :: View topic - ADVANCED: Recursion with Smarty" href="http://www.smarty.net/forums/viewtopic.php?t=291&amp;postdays=0&amp;postorder=asc&amp;highlight=loop+recursion&amp;start=0">eine Lösung</a>, diese Funktionalität trotzdem implementieren zu können.</p>
<p>1) Aktuelle Version des <a title="Download compiler.defun" href="http://lammfellpuschen.de/compiler.defun/">Plugins compiler.defun herunterladen</a> (Kompatibel mit PHP4+)</p>
<p>2) Die heruntergeladene Datei compiler.defun.php in das Plugins-Verzeichnis von Smarty kopieren (smarty/libs/plugins/)</p>
<p>3) Folgende Template-Datei als test.tpl in das Smarty-Template-Verzeichnis (normalerweise templates/) erstellen, welche ein verschachteltes Array ausgeben soll:</p>
<pre><code>&lt;ul&gt;
{defun name="testrecursion" list=$tree}
{foreach from=$list item=node}
&lt;li&gt;&lt;span&gt;{$node.caption} ({$node.access_string})&lt;/span&gt;{if $node.children}&lt;ul&gt;
	{fun name="testrecursion" list=$node.children}&lt;/ul&gt;{/if}&lt;/li&gt;
{/foreach}
{/defun}
&lt;/ul&gt;</code></pre>
<p>4) Zuletzt mit folgendem Quellcode eine Datei test.php erzeugen, welche Smarty instanziert und ein verschachteltes Array zuweißt:</p>
<pre><code>&lt;?php
	require_once 'smarty/libs/Smarty.class.php';
	$smarty = new smarty();
	$smarty-&gt;assign("tree",array(
		0=&gt;array(
			"caption"=&gt;"Hallo",
			"access_string"=&gt;"hallo.html",
			"children"=&gt;array()
		),
		1=&gt;array(
			"caption"=&gt;"Huhu",
			"access_string"=&gt;"huhu.html",
			"children"=&gt;array(
				0=&gt;array(
					"caption"=&gt;"Wuhu",
					"access_string"=&gt;"huhu/wuhu.html",
					"children"=&gt;array()
				),
				1=&gt;array(
					"caption"=&gt;"Bla",
					"access_string"=&gt;"huhu/bla.html",
					"children"=&gt;array(
						0=&gt;array(
							"caption"=&gt;"Waha",
							"access_string"=&gt;"huhu/bla/waha.html",
							"children"=&gt;array(
								0=&gt;array(
									"caption"=&gt;"Ariba",
									"access_string"=&gt;"huhu/bla/waha/ariba.html",
									"children"=&gt;array(
										0=&gt;array(
											"caption"=&gt;"Wabadu",
											"access_string"=&gt;"huhu/bla/waha/ariba/wabadu.html",
											"children"=&gt;array()
										),
										1=&gt;array(
											"caption"=&gt;"Wabadi",
											"access_string"=&gt;"huhu/bla/waha/ariba/wabadi.html",
											"children"=&gt;array(
												0=&gt;array(
													"caption"=&gt;"Hallo",
													"access_string"=&gt;"huhu/bla/waha/ariba/wabadi/hallo.html",
													"children"=&gt;array()
												)
											)
										)
									)
								)
							)
						)
					)
				),
				2=&gt;array(
					"caption"=&gt;"Wau",
					"access_string"=&gt;"huhu/wau.html",
					"children"=&gt;array()
				)
			)
		),
		2=&gt;array(
			"caption"=&gt;"Maeh",
			"access_string"=&gt;"maeh.html",
			"children"=&gt;array(
				0=&gt;array(
					"caption"=&gt;"Muh",
					"access_string"=&gt;"maeh/muh.html",
					"children"=&gt;array()
				)
			)
		)
	));
	$smarty-&gt;display("test.tpl");
?&gt;</code></pre>
<p>Die Ausgabe von test.php sieht dann wie folgt aus:<br />
<a href="/wp-content/uploads/2010/08/ausgabe_test.php_.jpg"><img class="alignnone size-full wp-image-131" title="Ausgabe test.php" src="http://philip-ehret.de/wp-content/uploads/2010/08/ausgabe_test.php_.jpg" alt="Ausgabe test.php" width="515" height="248" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/smarty-rekursion-in-einem-template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL UPDATE unter Einbeziehung des aktuellen Feldwertes</title>
		<link>https://philip-ehret.de/mysql-update-unter-einbeziehung-des-aktuellen-feldwertes-mysql-update-aktuellen-feldwert-einbeziehen/</link>
		<comments>https://philip-ehret.de/mysql-update-unter-einbeziehung-des-aktuellen-feldwertes-mysql-update-aktuellen-feldwert-einbeziehen/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 23:43:36 +0000</pubDate>
		<dc:creator>Philip</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://127.0.0.1/philip-ehret.de/?p=79</guid>
		<description><![CDATA[Da in einer meiner Projektdatenbanken für Bilder relative Pfade verwendet werden und ich die lokale Version des Projekts in einem Verzeichnis pflege, dessen Name nicht dem der Online-Version entspricht, war es notwendig, alle Pfade in der lokalen Projektdatenbank anzupassen. Während der Projektpfad online /projectx/ lautete, hieß er lokal /domainx/projectx/ Das Anpassungsscript sollte also den aktuellen [...]]]></description>
			<content:encoded><![CDATA[<p>
Da in einer meiner Projektdatenbanken für Bilder relative Pfade verwendet werden und ich die lokale Version des Projekts in einem Verzeichnis pflege, dessen Name nicht dem der Online-Version entspricht, war es notwendig, alle Pfade in der lokalen Projektdatenbank anzupassen.
</p>
<p>
Während der Projektpfad online
</p>
<pre><samp>/projectx/</samp></pre>
<p>lautete, hieß er lokal</p>
<pre><samp>/domainx/projectx/</samp></pre>
<p>Das Anpassungsscript sollte also den aktuellen Feldwert nehmen und davor ein <i>/domainx</i> einfügen.<br />
Leider funktioniert das nicht ähnlich simpel wie mit Zahlen, bei denen der aktuelle Feldwert einfach mit einem mathematischen Operator wie z.B. einem <i>+</i> mit einer Zahl verknüpft werden kann, wie etwa hier:</p>
<pre><code>UPDATE `tablex` SET `fieldx` = `fieldx` + 5</code></pre>
<p>
Es muss vielmehr auf die <a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_concat" title="MySQL :: MySQL 5.1 Reference Manual :: 11.4 String Functions">MySQL-Funktion CONCAT</a> zurückgegriffen werden, welche alle Argumente zu einem String verknüpft.<br />
Das sah in meinem Fall dann so aus:</p>
<pre><code>UPDATE `tablex` SET `fieldx` = CONCAT('/domainx', `fieldx`)</code></pre>
<p>
Wichtig ist, dass die Argumente für CONCAT richtig angegeben werden: Auf Feldwerte wird mit dem Feldnamen bzw. dem durch <i>&#8220;</i> gequoteten Feldnamen Bezug genommen, direkte Stringeingaben erfolgen durch einfache Hochkommas.</p>
]]></content:encoded>
			<wfw:commentRss>https://philip-ehret.de/mysql-update-unter-einbeziehung-des-aktuellen-feldwertes-mysql-update-aktuellen-feldwert-einbeziehen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

