<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Peter Rehm's Blog - PHP</title>
    <link>http://peter-rehm.de/</link>
    <description>apple,development,life &amp; more</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.6.2 - http://www.s9y.org/</generator>
    <pubDate>Wed, 02 Jan 2008 10:19:09 GMT</pubDate>

    <image>
        <url>http://peter-rehm.de/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Peter Rehm's Blog - PHP - apple,development,life &amp; more</title>
        <link>http://peter-rehm.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>PEAR unter OSX Leopard installieren</title>
    <link>http://peter-rehm.de/2008/01/02/PEAR-unter-OSX-Leopard-installieren/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2008/01/02/PEAR-unter-OSX-Leopard-installieren/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=196</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=196</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Im folgenden wird in aller kürze beschrieben, wie man PEAR unter&lt;br /&gt;
OSX 10.5 Leopard installiert. Dies sollte unter den vorherigen OSX&lt;br /&gt;
Versionen sicher ähnlich funktionieren.&lt;br /&gt;
&lt;br /&gt;
Auf meinem lokalen System habe ich PHP5 von entropy.ch am laufen, da&lt;br /&gt;
ich unbedingt die GD-Lib benötige. Dies hat nur Einfluss auf die Ablage&lt;br /&gt;
der php.ini. Dies muss eben von den auf dem jeweilig auf dem System vorhandenen&lt;br /&gt;
Gegebenheit abhängig gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Wir werden in /usr/local/ installieren, und dem System gestatten die TEMP-Files&lt;br /&gt;
in /usr/local/temp abzulegen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;sudo&amp;#160;mkdir&amp;#160;/usr/local/temp&lt;br /&gt;
sudo&amp;#160;chmod&amp;#160;-R&amp;#160;777&amp;#160;/usr/local/temp&lt;br /&gt;
sudo&amp;#160;mkdir&amp;#160;/usr/local/share/pear&lt;br /&gt;
sudo&amp;#160;chmod&amp;#160;-R&amp;#160;777&amp;#160;/usr/local/share/pear&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt wird go-pear ausgeführt.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;curl&amp;#160;http&amp;#58;//pear.php.net/go-pear&amp;#160;|&amp;#160;php&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Hier muss bei den Pfaden der 1. auf /usr/local geändert werden.&lt;br /&gt;
Alle anderen Einstellungen können in der Regel beibehalten werden.&lt;br /&gt;
&lt;br /&gt;
Während der Installation kommt dann die Warnung, dass der PEAR Pfad&lt;br /&gt;
noch nicht in der php.ini vorhanden ist, und es deswegen zu Problemen&lt;br /&gt;
mit der Verwendung von den PEAR Scripts kommen kann.&lt;br /&gt;
&lt;br /&gt;
Hier kommen wir an den Punkt wo es wichtig ist, zu wissen, wo die&lt;br /&gt;
Konfigurationsdatei des Webservers liegen muss. Dies kann man einfach&lt;br /&gt;
über ein kurzes Script herausfinden:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;&amp;#60;?&amp;#160;phpinfo&amp;#40;&amp;#41;;&amp;#160;?&amp;#62;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Im Browser die Datei ansehen und nach folgender Zeile suchen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;Configuration&amp;#160;File&amp;#160;&amp;#40;php.ini&amp;#41;&amp;#160;Path	/usr/local/php5/lib&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Hier muss die php.ini für den Webserver liegen, die php.ini für&lt;br /&gt;
das Command-Line-Interface (CLI) unabhängig davon in /etc/&lt;br /&gt;
&lt;br /&gt;
Standardgemäß ist eine php.ini.default in /etc/. Diese kopieren&lt;br /&gt;
und modifizieren wir zunächst.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;sudo&amp;#160;cp&amp;#160;/etc/php.ini.default&amp;#160;/etc/php.ini&lt;br /&gt;
sudo&amp;#160;nano&amp;#160;/etc/php.ini&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Nun nach dem Eintrag include_path suchen und diesen um &quot;/usr/local/share/pear&quot;&lt;br /&gt;
ergänzen. Bei mir sah dies nach der Anpassung so aus.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;include_path=&quot;.&amp;#58;/usr/local/share/pear&quot;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Ist eine php.ini in dem Config-Path des Webservers vorhanden bearbeiten&lt;br /&gt;
wir diese, ansonsten kopieren wir die Datei /etc/php.ini an die gewünschte&lt;br /&gt;
Stelle&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;sudo&amp;#160;cp&amp;#160;/etc/php.ini&amp;#160;/usr/local/php5/lib/php.ini&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Abschließend muss noch der Webserver neu gestartet werden, dann ist PEAR&lt;br /&gt;
einsatzfähig.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;sudo&amp;#160;apachectl&amp;#160;restart&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Kann PEAR von der Konsole nicht mit dem Befehl pear aufgerufen werden,&lt;br /&gt;
ist /usr/local/bin nicht korrekt in den SHELL-Pfaden eingetragen, und sollte nachgetragen&lt;br /&gt;
werden. Tipp: echo $PATH zum überprüfen in der SHELL eingeben.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Wed, 02 Jan 2008 11:16:31 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2008/01/02/196/</guid>
    <category>osx</category>
<category>pear</category>
<category>php</category>

</item>
<item>
    <title>jpgraph und utf-8 daten</title>
    <link>http://peter-rehm.de/2007/10/01/jpgraph-und-utf-8-daten/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/10/01/jpgraph-und-utf-8-daten/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=195</wfw:comment>

    <slash:comments>6</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=195</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Wer sich wundert wieso die Texte der erzeugten Graphen mittels jpgraph&lt;br /&gt;
in kryptischen Buchstaben dargestellt werden, obwohl gültige Daten in UTF-8&lt;br /&gt;
angeliefert wurden, ist nur einen kleinen Schritt von der Lösung entfernt.&lt;br /&gt;
&lt;br /&gt;
Die Ursache des Problems liegt darin dass die Standardschriftarten von jpgraph&lt;br /&gt;
kein UTF-8 darstellen können.&lt;br /&gt;
&lt;br /&gt;
Daher kann man sich einfach wie auch auf der jpgraph Seite angegeben ein&lt;br /&gt;
entsprechendes Schriftpaket herunterladen. Ich hab mich in meinem Fall für&lt;br /&gt;
Verda entschieden.Dies bekommt man hier: http://www.gnome.org/fonts/&lt;br /&gt;
&lt;br /&gt;
Die Schirften lädt man sich herunter und lädt Sie in ein beliebiges Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Nun muss nur noch das Verzeichnis der Library bekannt gemacht werden:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;DEFINE&amp;#40;&quot;TTF_DIR&quot;,dirname&amp;#40;&lt;u&gt;_file_&lt;/u&gt;&amp;#41;&amp;#160;.&amp;#160;&#039;/../../ttf-bitstream-vera-1.10/&#039;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Nun muss man noch mittels SetFont angeben, wo welche Schrift eingesetzt werden&lt;br /&gt;
soll. Mir ist es allerdings nicht gelungen die Schriftart für die Beschriftung in den&lt;br /&gt;
Netzdiagrammen (jpgraph_radar.php) festzulegen, daher musste ich manuell&lt;br /&gt;
die Standardschrift ändern, indem ich in jpgraph.php und jpgraph_radar.php FF_FONT1&lt;br /&gt;
durch FF_VERA ersetzt habe.&lt;br /&gt;
&lt;br /&gt;
Nun sollten alle Umlaute auch angezeigt werden können. 
    </content:encoded>

    <pubDate>Mon, 01 Oct 2007 23:35:00 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/10/01/195/</guid>
    <category>jpgraph</category>
<category>php</category>
<category>utf8</category>

</item>
<item>
    <title>Weitere Lektion in der Umlautproblematik</title>
    <link>http://peter-rehm.de/2007/08/16/Weitere-Lektion-in-der-Umlautproblematik/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/08/16/Weitere-Lektion-in-der-Umlautproblematik/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=194</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=194</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Nachdem ich in einem &lt;a href=&quot;http://peter-rehm.de/2006/11/18/UTF-8-in-Webapplikationen/&quot;&gt;früheren Blog Eintrag&lt;/a&gt; empfohlen habe, alle Daten aus&lt;br /&gt;
Speicherplatzgründen die im UTF-8 Format sind in z.b. dem latin1 charset abzulegen,&lt;br /&gt;
muss ich dem nun komplett wiedersprechen.&lt;br /&gt;
Bei einem durchschnittlichen Projekt lädt man sich deutlich mehr Ärger auf,&lt;br /&gt;
als dass man dadurch Vorteile durch Speicherplatzersparnis erzielt.&lt;br /&gt;
&lt;br /&gt;
In meiner Situation sah das dann so aus, dass ich ca. 8 Stunden damit beschäftigt&lt;br /&gt;
war, alle Datenbanken meiner Kunden umzustellen, was enorm händische Arbeit&lt;br /&gt;
erforderte. &lt;br /&gt;
&lt;br /&gt;
Im Ist-Zustand war es nun auch so, dass mittels phpMyAdmin logischerweise&lt;br /&gt;
alle Umlaute kaputt angezeigt wurde, und man nicht oder nur mit hohem manuellen&lt;br /&gt;
Aufwand direkt die Daten bearbeiten konnte.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight:bold&quot;&gt;Ausgangssituation&lt;/span&gt;&lt;br /&gt;
Datenbank mit latin1 als Standardcharset, alle Tabellen latin1, und UTF-8 Daten darin gespeichert.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight:bold&quot;&gt;Ziel&lt;/span&gt;&lt;br /&gt;
Datenbank &amp;amp; Tabellen UTF-8, und alle Inhalte UTF-8&lt;br /&gt;
Ich habe mich für utf8_general_ci entschieden, der unterschied zu utf8_unicode_ci liegt nur in&lt;br /&gt;
der Abhandlung von Sortierreihenfolgen. Dies kann man aber im Detail dem MySQL Manual entnehmen.&lt;br /&gt;
&lt;br /&gt;
1.) Datenbank Backup erstellen&lt;br /&gt;
Gehen wir einfach mal auf nummer sicher, um die Daten auch sicher nicht&lt;br /&gt;
endgültig zu zerstören.&lt;br /&gt;
&lt;br /&gt;
2.) Umwandeln aller Tabellen voll automatisch, und davon sollen auch alle&lt;br /&gt;
Text und Varchar Felder umgewandelt werden. Manch einer wird hier noch anpassungen&lt;br /&gt;
vornehmen müssen, da ich keine Char Felder umwandle, da die nicht benötigt&lt;br /&gt;
werden. ACHTUNG! Das Script basiert wie alle meine Code Snippets auf adodb,&lt;br /&gt;
kann aber Problemlos auf die von MySQL zur Verfügung stehenden Funktionen &lt;br /&gt;
portiert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;&amp;#60;?php&lt;br /&gt;
	//&amp;#160;fetch&amp;#160;all&amp;#160;tables&lt;br /&gt;
	$data&amp;#160;=&amp;#160;$cfg&amp;#91;&#039;db&#039;&amp;#93;-&amp;#62;pExecute&amp;#40;&quot;SHOW&lt;br /&gt;
									TABLES&quot;&amp;#41;;&lt;br /&gt;
	while&amp;#40;$row&amp;#160;=&amp;#160;$data-&amp;#62;FetchRow&amp;#40;&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		$sres&amp;#160;=&amp;#160;$cfg&amp;#91;&#039;db&#039;&amp;#93;-&amp;#62;pExecute&amp;#40;&quot;DESCRIBE&amp;#160;&quot;.&amp;#40;$row&amp;#91;0&amp;#93;&amp;#41;&amp;#41;;&lt;br /&gt;
		while&amp;#40;&amp;#160;$column&amp;#160;=&amp;#160;$sres-&amp;#62;FetchRow&amp;#40;&amp;#41;&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			//&amp;#160;if&amp;#160;column&amp;#160;is&amp;#160;text&amp;#160;or&amp;#160;varchar,&amp;#160;convert&lt;br /&gt;
			if&amp;#40;strpos&amp;#40;$column&amp;#91;&#039;Type&#039;&amp;#93;,&#039;text&#039;&amp;#41;!==false&amp;#160;||&amp;#160;strpos&amp;#40;$column&amp;#91;&#039;Type&#039;&amp;#93;,&#039;char&#039;&amp;#41;!==false&lt;br /&gt;
				||&amp;#160;strpos&amp;#40;$column&amp;#91;&#039;Type&#039;&amp;#93;,&#039;varchar&#039;&amp;#41;!==false&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				$cfg&amp;#91;&#039;db&#039;&amp;#93;-&amp;#62;Execute&amp;#40;&quot;ALTER&amp;#160;TABLE&amp;#160;&quot;.&amp;#40;$row&amp;#91;0&amp;#93;&amp;#41;.&quot;&amp;#160;CHANGE&amp;#160;&quot;.&amp;#40;$column&amp;#91;&#039;Field&#039;&amp;#93;&amp;#41;.&quot;&amp;#160;&quot;.&amp;#40;$column&amp;#91;&#039;Field&#039;&amp;#93;&amp;#41;.&quot;&amp;#160;&quot;.&amp;#40;$column&amp;#91;&#039;Type&#039;&amp;#93;&amp;#41;.&quot;&amp;#160;CHARACTER&amp;#160;SET&amp;#160;utf8&amp;#160;COLLATE&amp;#160;utf8_general_ci&amp;#160;NOT&amp;#160;NULL&quot;&amp;#41;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		//&amp;#160;confert&amp;#160;now&amp;#160;also&amp;#160;full&amp;#160;table&lt;br /&gt;
		$cfg&amp;#91;&#039;db&#039;&amp;#93;-&amp;#62;Execute&amp;#40;&quot;ALTER&amp;#160;TABLE&amp;#160;&quot;.$row&amp;#91;0&amp;#93;.&quot;&amp;#160;DEFAULT&amp;#160;CHARACTER&amp;#160;SET&amp;#160;utf8&amp;#160;COLLATE&amp;#160;utf8_general_ci&quot;&amp;#41;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;#62;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
3.) Manuelles Umwandeln der Datenbank&lt;br /&gt;
Ich habe mich dazu entschieden die eigentliche Datenbank händisch umzuwandeln,&lt;br /&gt;
da ich mich eh mit der Datenbank verbinden musste. Dazu habe ich dann folgendes&lt;br /&gt;
SQL Statement eingegebn&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;ALTER&amp;#160;DATABASE&amp;#160;`dbname`&amp;#160;DEFAULT&amp;#160;CHARACTER&amp;#160;SET&amp;#160;utf8&amp;#160;COLLATE&amp;#160;utf8_general_ci&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
4.) Exportieren der Daten&lt;br /&gt;
Nun werden die Daten der kompletten Datenbank exportiert, nicht aber die &lt;br /&gt;
Struktur. Dies wird für die meisten am besten mittels einer grafischen Oberfläche&lt;br /&gt;
wie phpMyAdmin erledigt. Hier kann man dies mit weigen Mausklicks erreichen.&lt;br /&gt;
&lt;br /&gt;
5.) Umwandeln des Datendumps&lt;br /&gt;
Nun wandeln wir einfach noch die &quot;kaputten Zeichen&quot; zurück in UTF8.&lt;br /&gt;
In meinem Fall und in den meisten wird folgendes Script hinreichend sein.&lt;br /&gt;
Dazu muss eine Datei data.sql im gleichen Verzeichnis wie das eigentliche&lt;br /&gt;
PHP Skript sein.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;&amp;#60;?php&lt;br /&gt;
$str=file_get_contents&amp;#40;&#039;data.sql&#039;&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
$bad_char=array&amp;#40;&quot;Ã¤&quot;,&quot;Ã¶&quot;,&quot;Ã¼&quot;,&quot;Ã„&quot;,&quot;Ã–&quot;,&quot;Ãœ&quot;,&quot;ÃŸ&quot;&amp;#41;;&lt;br /&gt;
$right=array&amp;#40;&#039;ä&#039;,&#039;ö&#039;,&#039;ü&#039;,&#039;Ä&#039;,&#039;Ö&#039;,&#039;Ü&#039;,&#039;ß&#039;&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
$bla=str_replace&amp;#40;$bad_char,$right,$str&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
echo&amp;#160;$bla;&lt;br /&gt;
&lt;br /&gt;
?&amp;#62;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
6.) Abschließende Arbeiten&lt;br /&gt;
Um die ganze Aktion abzuschließen, muss nur noch die Datenbank geleert werden,&lt;br /&gt;
un der neue Dump eingelesen werden. Dann sollte man die Umlaute alle&lt;br /&gt;
im entsprechenden Format in der Datenbank haben. &lt;br /&gt;
&lt;br /&gt;
Nun werden einige aber sicher zerstörte Umlaute in der Ausgabe haben,&lt;br /&gt;
und sich wundern warum. Dies liegt an der MySQL Verbindung die einen&lt;br /&gt;
Befehl zu beginn benötigt um UTF8 sauber zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;$cfg&amp;#91;&#039;db&#039;&amp;#93;-&amp;#62;Execute&amp;#40;&quot;SET&amp;#160;names&amp;#160;utf8&quot;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Nun sollte es endlich geschafft sein, und man sollte sich nun hoffentlich&lt;br /&gt;
wieder wichtigeren Dingen widmen können &lt;img src=&quot;http://peter-rehm.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Achja, heikel ist dann auch das string handling an manchen stellen, daher sollte man auf&lt;br /&gt;
die mb_* funktionen von PHP zurückgreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 16 Aug 2007 02:38:50 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/08/16/194/</guid>
    <category>php</category>
<category>programmierung</category>
<category>utf8</category>

</item>
<item>
    <title>gängige PHP Fehler - Tipps &amp; Tricks</title>
    <link>http://peter-rehm.de/2007/06/07/gaengige-PHP-Fehler-Tipps-Tricks/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/06/07/gaengige-PHP-Fehler-Tipps-Tricks/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=189</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=189</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Neulich wurde ich gebeten, mir &quot;kurz&quot; ein kleines PHP Skript anzusehen,&lt;br /&gt;
und bei der Fehlersuche zu helfen. Dabei ist mit allerdings sehr schnell&lt;br /&gt;
aufgefallen dass einige grundlegende Unschönheiten zu finden sind.&lt;br /&gt;
&lt;br /&gt;
Daher will ich anhand des mir zugesandten Codes einige Tipps zur PHP Entwicklung&lt;br /&gt;
geben.&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;list-style:none;&quot;&gt;&lt;br /&gt;
	&lt;li&gt;&lt;br /&gt;
		&lt;strong&gt;register_globals&lt;/strong&gt;&lt;br /&gt;
		&lt;p&gt;Ein immer wieder auftrendes Problem ist die register globals Geschichte,&lt;br /&gt;
		da PHP einem lange Zeit die Freiheit ließ, auf die POST Variable &#039;test&#039; auf&lt;br /&gt;
		zwei Arten zuzugreifen. Entweder als $test, oder per $_POST[&#039;test&#039;].&lt;br /&gt;
		Nutzt man erstere Variante kann man sich nie sicher sein, woher der&lt;br /&gt;
		Inhalt der Variablen eigentlich stammt, und man vergisst leicht einen&lt;br /&gt;
		vielleicht gefährlichen Inhalt zu escapen. Sofern die Möglichkeit besteht&lt;br /&gt;
		ist es sogar empfehlenswert register_globals auszuschalten. Aber man&lt;br /&gt;
		sollte es sich zumindest immer angewöhnen, auf POST/GET/REQUEST variablen&lt;br /&gt;
		immer mittels den dafür vorgesehenen superglobalen Arrays zuzugreifen.&lt;/p&gt;&lt;br /&gt;
	&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;br /&gt;
		&lt;strong&gt;SQL Injections&lt;/strong&gt;&lt;br /&gt;
		&lt;p&gt;Eine große Gefahr stellen vor allem im Zusammenhang mit register_globals&lt;br /&gt;
		die SQL Injections dar, über die nicht gewollter SQL Code eingeschleußt &lt;br /&gt;
		werden kann. Um hier nicht auszuschweifen sollte man sich immer angewöhnen,&lt;br /&gt;
		Inhalt der manipuliert sein kann, zu escapen. Eine einfach Möglichkeit&lt;br /&gt;
		hierzu bietet mysql_real_escape_string(). Man sollte sich wenigstens &lt;br /&gt;
		angewöhnen den Inhalt immer zu escapen. Es empfiehlt sich auch eine&lt;br /&gt;
		eigene Funktion dafür zu nehmen, dass man später auch noch andere &lt;br /&gt;
		Verfahren einsetzen könnte, indem man nur eine Funktion überarbeiten &lt;br /&gt;
		muss. Hier ein Beispiel:&lt;/p&gt;&lt;br /&gt;
		&lt;br /&gt;
		&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;	easy&amp;#160;accesible&amp;#160;handle&amp;#160;to&amp;#160;escape&amp;#160;all&amp;#160;db&amp;#160;strings&lt;br /&gt;
&amp;#42;	@param&amp;#160;string&amp;#160;$string&amp;#160;string&amp;#160;which&amp;#160;should&amp;#160;be&amp;#160;escaped&amp;#160;to&amp;#160;be&amp;#160;put&amp;#160;into&amp;#160;an&amp;#160;sql&amp;#160;statement&lt;br /&gt;
&amp;#42;	@return&amp;#160;string&amp;#160;returns&amp;#160;the&amp;#160;escaped&amp;#160;string&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
function&amp;#160;escapeDB&amp;#40;$string&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
	global&amp;#160;$run;&lt;br /&gt;
	if&amp;#40;is_numeric&amp;#40;$string&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		return&amp;#160;$string;&lt;br /&gt;
	}&amp;#160;else&amp;#160;{&lt;br /&gt;
		return&amp;#160;$run&amp;#91;&#039;db&#039;&amp;#93;-&amp;#62;qstr&amp;#40;$string,get_magic_quotes_gpc&amp;#40;&amp;#41;&amp;#41;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
		&lt;/div&gt;&lt;br /&gt;
	&lt;/li&gt;	&lt;br /&gt;
	&lt;li&gt;&lt;br /&gt;
		&lt;strong&gt;Variablen&lt;/strong&gt;&lt;br /&gt;
		&lt;p&gt;Man sollte Variablen immer klein schreiben, und Umlaute sollten nicht&lt;br /&gt;
		eingesetzt werden. Es ist meist auch recht angenehm die äquivalente englische&lt;br /&gt;
		Bezeichnung für Variablen zu verwenden. EIn unschönes Beispiel:&lt;/p&gt;&lt;br /&gt;
		&lt;br /&gt;
		&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;		&amp;#160;&#039;$Arbeitsverhaeltnis&#039;,&amp;#160;&#039;$Kündigungsfrist&#039;,&amp;#160;&#039;$Sonstiges&#039;&lt;br /&gt;
		&lt;/div&gt;&lt;br /&gt;
	&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;br /&gt;
		&lt;strong&gt;Fehlermeldungen&lt;/strong&gt;&lt;br /&gt;
		&lt;p&gt;Fehlermeldungen sollte man am besten immer beherzigen. PHP kennt verschiedene&lt;br /&gt;
		Modi, je nach &quot;wichtigkeit&quot; eines Fehlers. Meist werden die NOTICE&#039;s&lt;br /&gt;
		ausgeblendet. Allerdings sind NOTICES oft auch recht hilfreich, &lt;br /&gt;
		da man erkennt wo man z.B. eine noch nicht initialisierte Variable &lt;br /&gt;
		verwendet. Es empfiehlt sich meistens alle Fehlermeldungen anzuzeigen.&lt;br /&gt;
		Die macht man wie folgt:&lt;/p&gt;&lt;br /&gt;
		&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;		error_reporting&amp;#40;E_ALL&amp;#41;;&lt;br /&gt;
		&lt;/div&gt;&lt;br /&gt;
		&lt;p&gt;Vor allem gefährlich ist das manuelle Unterdrücken von Fehlermeldungen&lt;br /&gt;
		mittels dem @ Operator. Diesen sollte man auch nicht einsetzen, da dadurch&lt;br /&gt;
		die Fehlersuche oft erschwert sein kann.&lt;/p&gt;&lt;br /&gt;
	&lt;/li&gt;&lt;br /&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
Dies mal nur als kurze Zusammenfassung. 
    </content:encoded>

    <pubDate>Thu, 07 Jun 2007 15:49:13 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/06/07/189/</guid>
    <category>development</category>
<category>php</category>

</item>
<item>
    <title>PHP5/PHP5 method_exists</title>
    <link>http://peter-rehm.de/2007/03/31/PHP5PHP5-method_exists/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/03/31/PHP5PHP5-method_exists/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=182</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=182</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Wenn mann dynamisch Methoden aus einer Klasse aufrufen möchte, kommt man&lt;br /&gt;
vermutlich an method_exists() kaum vorbei.&lt;br /&gt;
&lt;br /&gt;
Heute musste ich allerdings feststellen, dass PHP4 alle Klassennamen im lowercase überprüft,&lt;br /&gt;
PHP5 hingegen so wie es geschrieben wurde. Dies führte natürlich in meinem aktuellen Projekt&lt;br /&gt;
zu massiven Schwierigkeiten.&lt;br /&gt;
&lt;br /&gt;
Es bleibt kaum eine andere Lösung, als sich selber eine lowercase Version von method_exists anzufertigen.&lt;br /&gt;
Die könnte wie folgt aussehen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;function&amp;#160;_method_exists&amp;#40;$class,$method&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
	$classMethods&amp;#160;=&amp;#160;array_map&amp;#40;&#039;strtolower&#039;,&amp;#160;get_class_methods&amp;#40;$class&amp;#41;&amp;#41;;&lt;br /&gt;
	&lt;br /&gt;
	if&amp;#40;in_array&amp;#40;strtolower&amp;#40;$method&amp;#41;,$classMethods&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		return&amp;#160;true;&lt;br /&gt;
	}&amp;#160;else&amp;#160;{&lt;br /&gt;
		return&amp;#160;false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Das hab ich dann implementiert, und seither funktioniert alles so wie man es verwenden sollte.&lt;br /&gt;
&lt;br /&gt;
Achja und wenn wir gerade beim Thema sind, man wird auch schnell feststellen, dass &lt;br /&gt;
call_user_method deprecated ist und daher nicht mehr eingesetzt werden sollte.&lt;br /&gt;
Zumindest laut meiner PHP4 version, im Manual konnte ich dazu nicht viel finden.&lt;br /&gt;
&lt;br /&gt;
Dies kann man aus dem Weg schaffen, indem man call_user_func() oder call_user_func_array()&lt;br /&gt;
mit folgenden Parametern aufruft.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;call_user_func&amp;#40;array&amp;#40;&amp;amp;$object,&#039;my_method_name&#039;&amp;#41;&amp;#41;;&lt;/div&gt; 
    </content:encoded>

    <pubDate>Sat, 31 Mar 2007 19:02:11 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/03/31/182/</guid>
    <category>php</category>

</item>
<item>
    <title>Validierung von Ausweisdaten mit PHP</title>
    <link>http://peter-rehm.de/2007/03/05/Validierung-von-Ausweisdaten-mit-PHP/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/03/05/Validierung-von-Ausweisdaten-mit-PHP/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=176</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=176</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Es kursieren unzählige Mythen um die Ausweisnummer. So behaupten einige,&lt;br /&gt;
die letzte Ziffer, sei die Zahl, wieviele Leute in Deutschland einem ähnlich&lt;br /&gt;
sind &lt;img src=&quot;http://peter-rehm.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
Dem ist nicht so. Hinter der Ausweisnummer steckt ein triviales System.&lt;br /&gt;
&lt;br /&gt;
Der erste Block setzt sich zusammen aus der Ausgabenummer des Ortes, von dem&lt;br /&gt;
man den Ausweis bezogen hat, einer zufälligen Nummer, einer Prüfziffer, und&lt;br /&gt;
der Staatsangehörigkeit.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;0000000005D&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Die letzte Zahl vor dem D ist die Prüfziffer (5), und das D ist die Staatsangehörigkeit,&lt;br /&gt;
also Deutsch.&lt;br /&gt;
&lt;br /&gt;
Der zweite Block beinhaltet das Geburtsdatum des Ausweisinhabers, in der&lt;br /&gt;
Form YYMMDD und eine Prüfziffer&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;8607209&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
9 ist in dem Beispiel die Prüfziffer, und der Ausweisinhaber wurde am 20. Juli 1986&lt;br /&gt;
geboren.&lt;br /&gt;
&lt;br /&gt;
Der dritte Block ist wie der zweite, beinhaltet allerdings das Gültigkeitsdatum.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;8607209&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
In dem Fall ist die Prüfziffer wieder 9, und der Ausweis ist gültig bis zum 20. Juli 1986.&lt;br /&gt;
&lt;br /&gt;
Der letzte Block ist eine Prüfziffer von den Prüfziffern.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Prüfziffern&lt;/h2&gt;&lt;br /&gt;
&lt;br /&gt;
Hinter den Prüfziffern verbirgt sich ein einfacher Algorithmus.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;7&amp;#160;&amp;#42;&amp;#160;die&amp;#160;erste&amp;#160;Zahl&amp;#160;+&amp;#160;3&amp;#160;&amp;#42;&amp;#160;die&amp;#160;zweite&amp;#160;Zahl&amp;#160;+&amp;#160;die&amp;#160;dritte&amp;#160;Zahl&amp;#160;+&amp;#160;7&amp;#160;&amp;#42;&amp;#160;die&amp;#160;erste&amp;#160;Zahl,...&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Dies wird solange wiederholt, bis alle Zahlen summiert werden. Das Ergebnis Modulo 10&lt;br /&gt;
ist dann die Prüfziffer.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;8607209&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Berechnung:&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;8&amp;#42;7&amp;#160;+&amp;#160;6&amp;#42;3&amp;#160;+&amp;#160;0&amp;#160;+&amp;#160;7&amp;#42;7&amp;#160;+&amp;#160;2&amp;#42;3&amp;#160;+&amp;#160;0&amp;#160;=&amp;#160;129&lt;br /&gt;
&lt;br /&gt;
129&amp;#160;%&amp;#160;10&amp;#160;=&amp;#160;9&lt;br /&gt;
&lt;br /&gt;
Daher&amp;#160;ist&amp;#160;die&amp;#160;Prüfziffer&amp;#160;9.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Auch die Prüfziffer der Prüfziffern wird nach dem gleichen Algorithmus berechnet.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Code&lt;/h2&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;&amp;#60;?php&lt;br /&gt;
/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;	class&amp;#160;to&amp;#160;verify&amp;#160;the&amp;#160;german&amp;#160;passport&amp;#160;number&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
class&amp;#160;verify_passport&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	var&amp;#160;$full_number;&lt;br /&gt;
	var&amp;#160;$blocks=array&amp;#40;&amp;#41;;&lt;br /&gt;
	var&amp;#160;$result;&lt;br /&gt;
	var&amp;#160;$is_valid=true;&lt;br /&gt;
	var&amp;#160;$expires;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Constructor&lt;br /&gt;
	&amp;#42;	@param&amp;#160;string&amp;#160;$number&amp;#160;passportnumber&lt;br /&gt;
	&amp;#42;	@return&amp;#160;void&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	function&amp;#160;verify_passport&amp;#40;$number&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		/&amp;#42;&amp;#42;&lt;br /&gt;
		&amp;#42;	Remove&amp;#160;the&amp;#160;&amp;#60;&amp;#160;and&amp;#160;split&amp;#160;into&amp;#160;the&amp;#160;4&amp;#160;blocks&lt;br /&gt;
		&amp;#42;	If&amp;#160;$number&amp;#160;&amp;#62;&amp;#160;26&amp;#160;$number&amp;#160;is&amp;#160;invalid&lt;br /&gt;
		&amp;#42;/&lt;br /&gt;
		if&amp;#40;strlen&amp;#40;$number&amp;#41;&amp;#62;26&amp;#160;||&amp;#160;strlen&amp;#40;$number&amp;#41;&amp;#60;26&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			$number=str_replace&amp;#40;&#039;&amp;#60;&#039;,&#039;&#039;,$number&amp;#41;;&lt;br /&gt;
			if&amp;#40;strlen&amp;#40;$number&amp;#41;&amp;#62;26&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				die&amp;#40;&#039;invalid&amp;#160;passport&amp;#160;length&#039;&amp;#41;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		$this-&amp;#62;blocks&amp;#91;1&amp;#93;=substr&amp;#40;$number,0,11&amp;#41;;&lt;br /&gt;
		$this-&amp;#62;blocks&amp;#91;2&amp;#93;=substr&amp;#40;$number,11,7&amp;#41;;		&lt;br /&gt;
		$this-&amp;#62;blocks&amp;#91;3&amp;#93;=substr&amp;#40;$number,18,7&amp;#41;;&lt;br /&gt;
		$this-&amp;#62;blocks&amp;#91;4&amp;#93;=substr&amp;#40;$number,25,1&amp;#41;;&lt;br /&gt;
		foreach&amp;#40;$this-&amp;#62;blocks&amp;#160;as&amp;#160;$key&amp;#160;=&amp;#62;&amp;#160;$value&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			if&amp;#40;!$this-&amp;#62;verify_block&amp;#40;$key,$value&amp;#41;&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				echo&amp;#160;$key;&lt;br /&gt;
				$this-&amp;#62;is_valid=false;&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/&amp;#42;&amp;#42;&lt;br /&gt;
		&amp;#42;	Set&amp;#160;the&amp;#160;expire&amp;#160;date&lt;br /&gt;
		&amp;#42;/&lt;br /&gt;
		$this-&amp;#62;expires=mktime&amp;#40;0,0,0,substr&amp;#40;$this-&amp;#62;blocks&amp;#91;3&amp;#93;,2,2&amp;#41;,substr&amp;#40;$this-&amp;#62;blocks&amp;#91;3&amp;#93;,4,2&amp;#41;,substr&amp;#40;$this-&amp;#62;blocks&amp;#91;3&amp;#93;,0,2&amp;#41;&amp;#41;;&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Verifies&amp;#160;the&amp;#160;single&amp;#160;Blocks&lt;br /&gt;
	&amp;#42;	@param&amp;#160;integer&amp;#160;$type&amp;#160;block&amp;#160;id&lt;br /&gt;
	&amp;#42;	@param&amp;#160;string&amp;#160;$data&amp;#160;block&amp;#160;content&lt;br /&gt;
	&amp;#42;	@return&amp;#160;boolean&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	function&amp;#160;verify_block&amp;#40;$type,$data&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		switch&amp;#40;$type&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			case&amp;#160;1&amp;#58;&lt;br /&gt;
				return&amp;#160;&amp;#40;$this-&amp;#62;calc_checksum&amp;#40;substr&amp;#40;$data,0,-2&amp;#41;&amp;#41;==$data{9}&amp;#160;?&amp;#160;true&amp;#160;&amp;#58;&amp;#160;false&amp;#160;&amp;#41;;&lt;br /&gt;
				break;			&lt;br /&gt;
			case&amp;#160;2&amp;#58;&lt;br /&gt;
			case&amp;#160;3&amp;#58;&lt;br /&gt;
				return&amp;#160;&amp;#40;$this-&amp;#62;calc_checksum&amp;#40;substr&amp;#40;$data,0,-1&amp;#41;&amp;#41;==$data{6}&amp;#160;?&amp;#160;true&amp;#160;&amp;#58;&amp;#160;false&amp;#160;&amp;#41;;&lt;br /&gt;
				break;&lt;br /&gt;
			case&amp;#160;4&amp;#58;&lt;br /&gt;
				return&amp;#160;&amp;#40;$this-&amp;#62;calc_checksum&amp;#40;substr&amp;#40;$this-&amp;#62;blocks&amp;#91;1&amp;#93;,0,-1&amp;#41;.substr&amp;#40;$this-&amp;#62;blocks&amp;#91;2&amp;#93;,0&amp;#41;.substr&amp;#40;$this-&amp;#62;blocks&amp;#91;3&amp;#93;,0&amp;#41;&amp;#41;==$data{0}&amp;#160;?&amp;#160;true&amp;#160;&amp;#58;&amp;#160;false&amp;#160;&amp;#41;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Calculates&amp;#160;the&amp;#160;Checksum&amp;#160;for&amp;#160;the&amp;#160;given&amp;#160;line&lt;br /&gt;
	&amp;#42;	@param&amp;#160;string&amp;#160;$data&lt;br /&gt;
	&amp;#42;	@result&amp;#160;unit&amp;#160;place&amp;#160;of&amp;#160;the&amp;#160;checksum&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	function&amp;#160;calc_checksum&amp;#40;$data&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		$result=0;&lt;br /&gt;
		$length=strlen&amp;#40;$data&amp;#41;;&lt;br /&gt;
		for&amp;#40;$i=0;$i&amp;#60;$length;$i++&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			switch&amp;#40;$i%3&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				case&amp;#160;0&amp;#58;&lt;br /&gt;
					$result+=$data{$i}&amp;#42;7;&lt;br /&gt;
					break;&lt;br /&gt;
				case&amp;#160;1&amp;#58;&lt;br /&gt;
					$result+=$data{$i}&amp;#42;3;&lt;br /&gt;
					break;&lt;br /&gt;
				case&amp;#160;2&amp;#58;&lt;br /&gt;
					$result+=$data{$i};&lt;br /&gt;
					break;			&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return&amp;#160;$result%10;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Checks&amp;#160;if&amp;#160;all&amp;#160;was&amp;#160;valid&amp;#160;-&amp;#160;Also&amp;#160;if&amp;#160;passport&amp;#160;is&amp;#160;not&amp;#160;expired&lt;br /&gt;
	&amp;#42;	@return&amp;#160;boolean&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	function&amp;#160;is_valid&amp;#40;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		if&amp;#40;$this-&amp;#62;is_valid&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			if&amp;#40;time&amp;#40;&amp;#41;&amp;#60;=$this-&amp;#62;expires&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				return&amp;#160;true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return&amp;#160;false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Returns&amp;#160;the&amp;#160;Age&amp;#160;in&amp;#160;array&amp;#160;or&amp;#160;unix&amp;#160;timestamp&lt;br /&gt;
	&amp;#42;	@param&amp;#160;integer&amp;#160;$type&amp;#160;0=array&amp;#160;1=timestamp&lt;br /&gt;
	&amp;#42;	@return&amp;#160;array&amp;#160;or&amp;#160;timestamp&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	function&amp;#160;get_age&amp;#40;$type=&#039;0&#039;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
	&lt;br /&gt;
		$year=substr&amp;#40;$this-&amp;#62;blocks&amp;#91;2&amp;#93;,0,2&amp;#41;;&lt;br /&gt;
		/&amp;#42;&lt;br /&gt;
		&amp;#42;&amp;#160;Create&amp;#160;a&amp;#160;4&amp;#160;digit&amp;#160;Year&amp;#160;number&lt;br /&gt;
		&amp;#42;/&lt;br /&gt;
		if&amp;#40;$year&amp;#62;=20&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			$year=&amp;#40;substr&amp;#40;date&amp;#40;&quot;Y&quot;&amp;#41;,0,2&amp;#41;-1&amp;#41;&amp;#42;100+$year;&lt;br /&gt;
		}&amp;#160;else&amp;#160;{&lt;br /&gt;
			$year=substr&amp;#40;date&amp;#40;&quot;Y&quot;&amp;#41;,0,2&amp;#41;&amp;#42;100+$year;		&lt;br /&gt;
		}&lt;br /&gt;
		$month=substr&amp;#40;$this-&amp;#62;blocks&amp;#91;2&amp;#93;,2,2&amp;#41;;&lt;br /&gt;
		$day=substr&amp;#40;$this-&amp;#62;blocks&amp;#91;2&amp;#93;,4,2&amp;#41;;&lt;br /&gt;
	&lt;br /&gt;
		if&amp;#40;$type==0&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			return&amp;#160;array&amp;#40;&#039;year&#039;=&amp;#62;$year,&lt;br /&gt;
						&amp;#160;&#039;month&#039;=&amp;#62;$month,&lt;br /&gt;
						&amp;#160;&#039;day&#039;=&amp;#62;$day&amp;#41;;&lt;br /&gt;
		}&amp;#160;else&amp;#160;{&lt;br /&gt;
			return&amp;#160;mktime&amp;#40;0,0,0,$month,$day,$year&amp;#41;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;#62;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Funktionsweise&lt;/h2&gt;&lt;br /&gt;
Der Constructor teilt die Nummer in die Blocks auf, und überprüft ob die Länge&lt;br /&gt;
der Nummer korrekt ist. Ist dies nicht der Fall wird die Class sofort beendet.&lt;br /&gt;
Der die() ist zugegeben etwas hart, und sollte im Produktiven Einsatz vielleicht&lt;br /&gt;
nicht so verwendet werden &lt;img src=&quot;http://peter-rehm.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Danach kann ich mir über die Methode is_valid() anzeigen lassen, ob die&lt;br /&gt;
Ausweisnummer gültig ist. Die Funktion gibt einen Boolschen Wert zurück.&lt;br /&gt;
Neben den Prüfziffern wird auch überprüft, ob das Ablaufdatum noch nicht&lt;br /&gt;
erreicht ist.&lt;br /&gt;
&lt;br /&gt;
Man kann sich auch das Geburtsdatum als Unix Timestamp oder als Array ausgeben lassen.&lt;br /&gt;
Dies geht mittels get_age($type). ist type 0 wird in Array mit den Keys (year,month,day&lt;br /&gt;
zurückgegeben, ansonsten ein Unix Timestam.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Der Einsatz&lt;/h2&gt;&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel soll abschließend die Funktionsweise verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;$try=new&amp;#160;verify_passport&amp;#40;$ppn&amp;#41;;&lt;br /&gt;
var_dump&amp;#40;&amp;#160;date&amp;#40;&quot;Ymd&quot;,$try-&amp;#62;get_age&amp;#40;1&amp;#41;&amp;#41;&amp;#160;&amp;#41;;&lt;br /&gt;
var_dump&amp;#40;&amp;#160;$try-&amp;#62;is_valid&amp;#40;&amp;#41;&amp;#160;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
$ppn sollte die Ausweisnummer beinhalten. 
    </content:encoded>

    <pubDate>Mon, 05 Mar 2007 18:51:31 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/03/05/176/</guid>
    <category>ausweisdaten</category>
<category>php</category>

</item>
<item>
    <title>Mails UTF-8 kodiert versenden</title>
    <link>http://peter-rehm.de/2007/02/17/Mails-UTF-8-kodiert-versenden/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/02/17/Mails-UTF-8-kodiert-versenden/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=172</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=172</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Ergänzend zum dem Eintrag bezüglich &lt;a href=&quot;http://peter-rehm.de/2006/11/18/UTF-8-in-Webapplikationen/&quot;&gt;UTF-8 in Webapplikationen&lt;/a&gt; hier noch eine kurze Info zum versenden von UTF8 Mails mit PHP.&lt;br /&gt;
&lt;br /&gt;
Man kann zum einen die Mails wieder in ISO konvertieren, allerdings möchte ich nur auf die Möglichkeit eingehen,&lt;br /&gt;
Mails unkonvertiert zu versenden. Dazu muss an sich nur das Encoding im Header in der Funktion mail()&lt;br /&gt;
gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;mail&amp;#40;&quot;reciever@reciever.de&quot;,&lt;br /&gt;
	&amp;#160;&quot;subject&quot;,&lt;br /&gt;
	&amp;#160;&quot;content&quot;,&lt;br /&gt;
	&amp;#160;&quot;From&amp;#58;&amp;#160;bla@bla.de\r\nContent-Type&amp;#58;&amp;#160;text/plain;&amp;#160;charset=UTF-8&quot;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man auch &lt;a href=&quot;http://de.php.net/mb_send_mail&quot;&gt;mb_send_mail()&lt;/a&gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Sat, 17 Feb 2007 18:04:50 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/02/17/172/</guid>
    <category>php</category>
<category>utf8</category>

</item>
<item>
    <title>CSV Dateien in MySQL importieren</title>
    <link>http://peter-rehm.de/2007/01/18/CSV-Dateien-in-MySQL-importieren/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/01/18/CSV-Dateien-in-MySQL-importieren/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=165</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=165</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Ich musste gerade eine Reihe Postleitzahlen importieren, daher habe ich eine Quick &amp;amp; Dirty Lösumg geschrieben um CSV Dateien zu importieren.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;&amp;#60;?php&lt;br /&gt;
&lt;br /&gt;
class&amp;#160;csv2mysql&lt;br /&gt;
{&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	DB&amp;#160;Host&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$host=&#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	DB&amp;#160;User&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$user=&#039;root&#039;;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	DB&amp;#160;Pass&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$pass=&#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	DB&amp;#160;Name&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$db;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Table&amp;#160;Name&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$table;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	CSV&amp;#160;Separator&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$separator=&#039;;&#039;;	&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Filename&amp;#160;to&amp;#160;import&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$filename;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	DB&amp;#160;Handle&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$db_handle;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	File&amp;#160;Handle&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$file_handle;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Max&amp;#160;Line&amp;#160;length&amp;#160;in&amp;#160;CSV&amp;#160;File&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$max_line_length=1000;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Insert&amp;#160;Count&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	var&amp;#160;$count=0;&lt;br /&gt;
	&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Konstruktor&amp;#160;to&amp;#160;set&amp;#160;the&amp;#160;options&lt;br /&gt;
	&amp;#42;&lt;br /&gt;
	&amp;#42;	options&amp;#58;&amp;#160;dbname,tablename,separator&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	function&amp;#160;csv2mysql&amp;#40;$options&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		if&amp;#40;empty&amp;#40;$options&amp;#91;&#039;dbname&#039;&amp;#93;&amp;#41;&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			die&amp;#40;&quot;you&amp;#160;have&amp;#160;to&amp;#160;enter&amp;#160;a&amp;#160;database&amp;#160;name!&quot;&amp;#41;;&lt;br /&gt;
		}&amp;#160;else&amp;#160;{&lt;br /&gt;
			$this-&amp;#62;db=$options&amp;#91;&#039;dbname&#039;&amp;#93;;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if&amp;#40;empty&amp;#40;$options&amp;#91;&#039;table&#039;&amp;#93;&amp;#41;&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			die&amp;#40;&quot;you&amp;#160;have&amp;#160;to&amp;#160;enter&amp;#160;a&amp;#160;table&amp;#160;name!&quot;&amp;#41;;&lt;br /&gt;
		}&amp;#160;else&amp;#160;{&lt;br /&gt;
			$this-&amp;#62;table=$options&amp;#91;&#039;table&#039;&amp;#93;;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if&amp;#40;empty&amp;#40;$options&amp;#91;&#039;filename&#039;&amp;#93;&amp;#41;&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			die&amp;#40;&quot;you&amp;#160;have&amp;#160;to&amp;#160;enter&amp;#160;a&amp;#160;filename!&quot;&amp;#41;;&lt;br /&gt;
		}&amp;#160;else&amp;#160;{&lt;br /&gt;
			$this-&amp;#62;filename=$options&amp;#91;&#039;filename&#039;&amp;#93;;&lt;br /&gt;
			if&amp;#40;!file_exists&amp;#40;$this-&amp;#62;filename&amp;#41;&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				die&amp;#40;&quot;file&amp;#160;does&amp;#160;not&amp;#160;exist&quot;&amp;#41;;&lt;br /&gt;
			}&lt;br /&gt;
		}		&lt;br /&gt;
		&lt;br /&gt;
		if&amp;#40;!empty&amp;#40;$options&amp;#91;&#039;separator&#039;&amp;#93;&amp;#41;&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			$this-&amp;#62;separator=$options&amp;#91;&#039;separator&#039;&amp;#93;;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		$this-&amp;#62;db_handle=mysql_connect&amp;#40;$this-&amp;#62;host,$this-&amp;#62;user,$this-&amp;#62;pass&amp;#41;;&lt;br /&gt;
		mysql_select_db&amp;#40;$this-&amp;#62;db,$this-&amp;#62;db_handle&amp;#41;;	&lt;br /&gt;
		&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function&amp;#160;convert&amp;#40;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;#62;file_handle=fopen&amp;#40;$this-&amp;#62;filename,&quot;r&quot;&amp;#41;;&lt;br /&gt;
		if&amp;#40;$this-&amp;#62;file_handle&amp;#160;&amp;amp;&amp;amp;&amp;#160;$this-&amp;#62;db_handle&amp;#41;&lt;br /&gt;
		{&lt;br /&gt;
			while&amp;#40;$data=fgetcsv&amp;#40;$this-&amp;#62;file_handle,$this-&amp;#62;max_line_length,$this-&amp;#62;separator&amp;#41;&amp;#41;&lt;br /&gt;
			{&lt;br /&gt;
				$res=mysql_query&amp;#40;&quot;INSERT&amp;#160;INTO&amp;#160;&quot;.$this-&amp;#62;table.&quot;&lt;br /&gt;
							&amp;#160;VALUES&amp;#160;&amp;#40;&quot;.join&amp;#40;$data,&#039;,&#039;&amp;#41;.&quot;&amp;#41;&quot;,$this-&amp;#62;db_handle&amp;#41;&amp;#160;or&amp;#160;die&amp;#40;mysql_error&amp;#40;&amp;#41;&amp;#41;;&lt;br /&gt;
				if&amp;#40;$res&amp;#41;&lt;br /&gt;
				{&lt;br /&gt;
					$this-&amp;#62;count++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			echo&amp;#160;$this-&amp;#62;count;&lt;br /&gt;
		}&amp;#160;else&amp;#160;{&lt;br /&gt;
			die&amp;#40;&quot;could&amp;#160;not&amp;#160;open&amp;#160;file&amp;#160;or&amp;#160;database&quot;&amp;#41;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$imp=new&amp;#160;csv2mysql&amp;#40;array&amp;#40;&#039;filename&#039;=&amp;#62;&#039;/www/test.csv&#039;,&lt;br /&gt;
					&#039;dbname&#039;=&amp;#62;&#039;plzdb&#039;,&lt;br /&gt;
					&#039;table&#039;=&amp;#62;&#039;plz&#039;&amp;#41;&amp;#41;;&lt;br /&gt;
$imp-&amp;#62;convert&amp;#40;&amp;#41;;&lt;br /&gt;
?&amp;#62;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund den anstehenden Prüfungen verzichte ich auf das erklären des Codes, das müsste man auch so verstehen können &lt;img src=&quot;http://peter-rehm.de/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; 
    </content:encoded>

    <pubDate>Thu, 18 Jan 2007 21:33:35 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/01/18/165/</guid>
    <category>csv</category>
<category>import</category>
<category>mysql</category>
<category>php</category>

</item>
<item>
    <title>Zahlungsverfahren - DTA Dateien per PHP erzeugen</title>
    <link>http://peter-rehm.de/2007/01/15/Zahlungsverfahren-DTA-Dateien-per-PHP-erzeugen/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2007/01/15/Zahlungsverfahren-DTA-Dateien-per-PHP-erzeugen/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=162</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=162</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    DTA ist ein in Deutschland existierender Standard für die Abwicklung&lt;br /&gt;
von Zahlungen. Die DTA Dateien können von jeder Bank oder per Banking Software&lt;br /&gt;
und unter anderem per HBCI verarbeitet werden.&lt;br /&gt;
&lt;br /&gt;
Es gibt einige Szenarios, in denen man mit den DTA Dateien arbeiten könnte.&lt;br /&gt;
Z.b. für die Eigenentwicklung einer Finanzsoftware, in der die eingehenden&lt;br /&gt;
Rechnungen verwaltet werden. Aus den eingegeben Rechnungen kann man dann&lt;br /&gt;
automatsich per DTA Datei die Bezahlung einleiten. Dies wird in einigen großen&lt;br /&gt;
Buchhaltungslösungen so eingesetzt. &lt;br /&gt;
&lt;br /&gt;
Es kann aber auch ein Lastschrifteinzug mit einer DTA Datei abgewickelt werden.&lt;br /&gt;
So kann man eine Vereinssoftware entwickeln, bei der die Monatsbeiträge per Lastschrift&lt;br /&gt;
eingezogen werden.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass in einer DTA Datei entweder nur Überweisungen oder nur Lastschriften&lt;br /&gt;
stehen dürfen. Beides vermischt geht nicht!&lt;br /&gt;
&lt;br /&gt;
Diese Dateien kann man sehr einfach mit dem PEAR Package Payment_DTA erzeugen.&lt;br /&gt;
&lt;br /&gt;
Wir fassen nun das Beispiel mit den einzugebenden und zu bezahlenden Rechnungen aus.&lt;br /&gt;
Wir geben bei jeder Rechnung die Zahlmodalitäten ein, in dem Fall das Fälligkeitsdatum.&lt;br /&gt;
Wurde eine Rechnung bar bezahlt oder bereits überwiesen wird in der Datenbank das&lt;br /&gt;
Feld &quot;is_paid&quot; auf 1 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Datenbankstruktur sieht wie folgt aus&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;--&amp;#160;&lt;br /&gt;
--&amp;#160;Tabellenstruktur&amp;#160;für&amp;#160;Tabelle&amp;#160;&#039;bank&#039;&lt;br /&gt;
--&amp;#160;&lt;br /&gt;
&lt;br /&gt;
CREATE&amp;#160;TABLE&amp;#160;bank&amp;#160;&amp;#40;&lt;br /&gt;
&amp;#160;&amp;#160;bank_id&amp;#160;int&amp;#40;11&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;bank_name&amp;#160;text&amp;#160;NOT&amp;#160;NULL&lt;br /&gt;
&amp;#41;&amp;#160;ENGINE=MyISAM&amp;#160;DEFAULT&amp;#160;CHARSET=latin1;&lt;br /&gt;
&lt;br /&gt;
--&amp;#160;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&amp;#160;&lt;br /&gt;
--&amp;#160;Tabellenstruktur&amp;#160;für&amp;#160;Tabelle&amp;#160;&#039;bills&#039;&lt;br /&gt;
--&amp;#160;&lt;br /&gt;
&lt;br /&gt;
CREATE&amp;#160;TABLE&amp;#160;bills&amp;#160;&amp;#40;&lt;br /&gt;
&amp;#160;&amp;#160;number&amp;#160;text&amp;#160;NOT&amp;#160;NULL,&lt;br /&gt;
&amp;#160;&amp;#160;creditor&amp;#160;int&amp;#40;11&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;amount&amp;#160;float&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;is_paid&amp;#160;int&amp;#40;1&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;payment_date&amp;#160;int&amp;#40;11&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;transaction_info&amp;#160;text&amp;#160;NOT&amp;#160;NULL&lt;br /&gt;
&amp;#41;&amp;#160;ENGINE=MyISAM&amp;#160;DEFAULT&amp;#160;CHARSET=latin1;&lt;br /&gt;
&lt;br /&gt;
--&amp;#160;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&amp;#160;&lt;br /&gt;
--&amp;#160;Tabellenstruktur&amp;#160;für&amp;#160;Tabelle&amp;#160;&#039;creditor&#039;&lt;br /&gt;
--&amp;#160;&lt;br /&gt;
&lt;br /&gt;
CREATE&amp;#160;TABLE&amp;#160;creditor&amp;#160;&amp;#40;&lt;br /&gt;
&amp;#160;&amp;#160;creditorID&amp;#160;int&amp;#40;11&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;auto_increment,&lt;br /&gt;
&amp;#160;&amp;#160;company&amp;#160;text&amp;#160;NOT&amp;#160;NULL,&lt;br /&gt;
&amp;#160;&amp;#160;bank_account&amp;#160;int&amp;#40;11&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;bank_id&amp;#160;int&amp;#40;11&amp;#41;&amp;#160;NOT&amp;#160;NULL&amp;#160;default&amp;#160;&#039;0&#039;,&lt;br /&gt;
&amp;#160;&amp;#160;PRIMARY&amp;#160;KEY&amp;#160;&amp;#160;&amp;#40;creditorID&amp;#41;&lt;br /&gt;
&amp;#41;&amp;#160;ENGINE=MyISAM&amp;#160;DEFAULT&amp;#160;CHARSET=latin1&amp;#160;AUTO_INCREMENT=1&amp;#160;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datenstruktur ist nur ein Beispiel und hab ich nur kurz für den&lt;br /&gt;
Eintrag hier geschrieben.&lt;br /&gt;
&lt;br /&gt;
Hier nun eine Beispielanwendung, die mit obiger Datenbankstruktur&lt;br /&gt;
arbeitet. &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;&amp;#60;?php&lt;br /&gt;
/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;&lt;br /&gt;
&amp;#42;	DTA&amp;#160;Example&amp;#160;in&amp;#160;a&amp;#160;small&amp;#160;Application&lt;br /&gt;
&amp;#42;&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
include&amp;#40;&quot;Payment/DTA.php&quot;&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
$conn=mysql_connect&amp;#40;&#039;localhost&#039;,&#039;root&#039;&amp;#41;;&lt;br /&gt;
$res=mysql_select_db&amp;#40;&#039;financedev&#039;,$conn&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
$mode=&quot;download&quot;;&amp;#160;//&amp;#160;valid&amp;#58;&amp;#160;download,display,server&lt;br /&gt;
&lt;br /&gt;
if&amp;#40;$mode==&#039;download&#039;&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
	header&amp;#40;&#039;Content-type&amp;#58;&amp;#160;text/plain;&#039;&amp;#41;;	&lt;br /&gt;
	header&amp;#40;&#039;Content-Disposition&amp;#58;&amp;#160;attachment;&amp;#160;filename=&quot;DTAUS0&quot;&#039;&amp;#41;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$res=mysql_query&amp;#40;&quot;SELECT&amp;#160;&amp;#42;&lt;br /&gt;
				&amp;#160;&amp;#160;&amp;#160;FROM&amp;#160;bills&lt;br /&gt;
				&amp;#160;&amp;#160;&amp;#160;INNER&amp;#160;JOIN&amp;#160;creditor&lt;br /&gt;
				&amp;#160;&amp;#160;&amp;#160;ON&amp;#160;bills.creditor=creditor.creditorID&lt;br /&gt;
				&amp;#160;&amp;#160;&amp;#160;INNER&amp;#160;JOIN&amp;#160;bank&amp;#160;on&amp;#160;creditor.bank_id=bank.bank_id&lt;br /&gt;
				&amp;#160;&amp;#160;&amp;#160;WHERE&amp;#160;is_paid=0&quot;,$conn&amp;#41;;&lt;br /&gt;
if&amp;#40;count&amp;#40;$res&amp;#41;&amp;#62;0&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;	Erstellt&amp;#160;eine&amp;#160;neue&amp;#160;DTA&amp;#160;Datei,&amp;#160;für&amp;#160;die&amp;#160;Überweisung&amp;#160;von&amp;#160;Beträgen&lt;br /&gt;
&amp;#42;	Für&amp;#160;Lastschrift&amp;#160;der&amp;#160;Klasse&amp;#160;DTA_DEBIT&amp;#160;üebergeben.&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
$dta_file&amp;#160;=&amp;#160;new&amp;#160;DTA&amp;#40;DTA_CREDIT&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;	Absender&amp;#160;von&amp;#160;den&amp;#160;Überweisungen,&amp;#160;hier&amp;#160;müssen&amp;#160;die&amp;#160;eigenen&amp;#160;Daten&amp;#160;angegeben&amp;#160;werden,&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
$dta_file-&amp;#62;setAccountFileSender&amp;#40;array&amp;#40;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&quot;name&quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;=&amp;#62;&amp;#160;&quot;Max&amp;#160;Mustermann&quot;,&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&quot;bank_code&quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;=&amp;#62;&amp;#160;60069860,&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&quot;account_number&quot;&amp;#160;=&amp;#62;&amp;#160;12345&lt;br /&gt;
&amp;#41;&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
	while&amp;#40;$row=mysql_fetch_array&amp;#40;$res&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		/&amp;#42;&amp;#42;&lt;br /&gt;
		&amp;#42;&amp;#160;Transaktionen&amp;#160;hinzufügen&lt;br /&gt;
		&amp;#42;/&lt;br /&gt;
		$dta_file-&amp;#62;addExchange&amp;#40;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;		array&amp;#40;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&quot;name&quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;=&amp;#62;&amp;#160;$row&amp;#91;&#039;company&#039;&amp;#93;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;//&amp;#160;Kontoinhaber&lt;br /&gt;
		&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&quot;bank_code&quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;=&amp;#62;&amp;#160;$row&amp;#91;&#039;bank_id&#039;&amp;#93;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//&amp;#160;BLZ&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&quot;account_number&quot;&amp;#160;=&amp;#62;&amp;#160;$row&amp;#91;&#039;bank_account&#039;&amp;#93;,&amp;#160;//&amp;#160;Kontonummer&lt;br /&gt;
	&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&amp;#41;,&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;		$row&amp;#91;&#039;amount&#039;&amp;#93;,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//&amp;#160;Betrag&lt;br /&gt;
		&amp;#160;&amp;#160;&amp;#160;&amp;#160;array&amp;#40;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;//&amp;#160;Verwendungszweck&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&amp;#40;!empty&amp;#40;$row&amp;#91;&#039;transaction_info&#039;&amp;#93;&amp;#41;&amp;#160;?&amp;#160;$row&amp;#91;&#039;transaction_info&#039;&amp;#93;&amp;#160;&amp;#58;&amp;#160;$row&amp;#91;&#039;number&#039;&amp;#93;&amp;#160;&amp;#41;,&lt;br /&gt;
	&amp;#160;&amp;#160;&amp;#160;&amp;#160;	&amp;#160;&amp;#160;&amp;#160;&amp;#160;&quot;---&quot;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;		&amp;#41;&lt;br /&gt;
		&amp;#41;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/&amp;#42;&amp;#42;&lt;br /&gt;
	&amp;#42;	Speichert&amp;#160;Datei&lt;br /&gt;
	&amp;#42;/&lt;br /&gt;
	if&amp;#40;$mode==&#039;server&#039;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		$dta_file-&amp;#62;saveFile&amp;#40;&quot;DTAUS0&quot;&amp;#41;;&lt;br /&gt;
	}&amp;#160;else&amp;#160;{&lt;br /&gt;
		/&amp;#42;&amp;#42;&lt;br /&gt;
		&amp;#42;	Gibt&amp;#160;Inhalt&amp;#160;aus&lt;br /&gt;
		&amp;#42;/&lt;br /&gt;
		echo&amp;#160;$dta_file-&amp;#62;getFileContent&amp;#40;&amp;#41;;	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&amp;#160;else&amp;#160;{&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
?&amp;#62;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight:bold&quot;&gt;Achtung&lt;/span&gt; Nimmt man DTA_DEBIT, also das Lastschriftverfahren ist der Sender der der &lt;br /&gt;
das Geld erhält. Bei DTA_CREDIT ist es der von dessen Konto Geld überwiesen wird.&lt;br /&gt;
Dies muss beachtet werden, und erscheint etwas unlogisch. Allerdings ist der Sender&lt;br /&gt;
so immer in der Regel der fixe Wert, da alles auf mein Konto überwiesen wird, oder&lt;br /&gt;
ich Lastschriften auf mein Konto einziehe.&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 15 Jan 2007 22:55:05 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2007/01/15/162/</guid>
    <category>dta</category>
<category>zahlungsverfahren</category>

</item>
<item>
    <title>Arrays in Smarty</title>
    <link>http://peter-rehm.de/2006/12/31/Arrays-in-Smarty/</link>
            <category>PHP</category>
    
    <comments>http://peter-rehm.de/2006/12/31/Arrays-in-Smarty/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=153</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=153</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    In Smarty Templates kann man, welch wunder, auch auf Arrays zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;{$array.element1}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Dies stellt die einfachste Art dar, wie man dies erledigen kann. Mit der ist man wohl&lt;br /&gt;
auch desöfteren konfrontiert, und stellt daher bestimmt kein Problem dar.&lt;br /&gt;
&lt;br /&gt;
Allerdings kann Smarty auch mit [] umgehen, und ermöglicht daher auch den dynamischen&lt;br /&gt;
Zugriff auf mehrdimensionale Arrays.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;{foreach&amp;#160;item=car&amp;#160;from=$data}&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#60;th&amp;#62;{$calc&amp;#91;$car.sxID&amp;#93;.20000.total_saving}&amp;#60;/th&amp;#62;&lt;br /&gt;
{/foreach}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Dies ist für manche Anwendungsfälle ganz praktisch. 
    </content:encoded>

    <pubDate>Sun, 31 Dec 2006 00:27:41 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2006/12/31/153/</guid>
    <category>php</category>
<category>smarty</category>
<category>templates</category>

</item>
<item>
    <title>[PHP] String als Zipfile</title>
    <link>http://peter-rehm.de/2006/09/15/PHP-String-als-Zipfile/</link>
            <category>PHP</category>
            <category>Programmierung</category>
    
    <comments>http://peter-rehm.de/2006/09/15/PHP-String-als-Zipfile/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=115</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=115</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Wie oft habe ich bereits einen String in ein komprimiertes File schreiben wollen, das vollautomatisiert und zum Download für den User. Allerdings eignet sich dazu das gzip format nicht da die meisten Benutzer mit Windows arbeiten und man ein zusätzliches Tool installieren.&lt;br /&gt;
&lt;br /&gt;
Daher benötigt man das PEAR Module &lt;a href=&quot;http://pear.php.net/package/Archive_Zip/&quot;&gt;Archive_Zip&lt;/a&gt; das hervorragend Zip Dateien erstellen kann. Allerdings benötige ich das Zip File nicht direkt, da ich das File nach dem Download nicht mehr benötige da es veraltet sein könnte. Daher habe ich mir eine Funktion gebaut, die auf Archive_Zip aufbaut, mit der ich das Problem erledigen kann.&lt;br /&gt;
&lt;br /&gt;
Die Funktion stringtozip erstellt temporär das Archiv mit den gewünschten Dateinamen, und löscht danach alles wieder, um nur den String zurückzuliefern.&lt;br /&gt;
&lt;br /&gt;
Aber sehet selbst!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;	function&amp;#160;to&amp;#160;create&amp;#160;an&amp;#160;zip&amp;#160;file&amp;#160;from&amp;#160;an&amp;#160;string&lt;br /&gt;
&amp;#42;	@param&amp;#160;string&amp;#160;$string&amp;#160;content&amp;#160;of&amp;#160;the&amp;#160;file&lt;br /&gt;
&amp;#42;	@param&amp;#160;string&amp;#160;$filename&amp;#160;name&amp;#160;of&amp;#160;the&amp;#160;file&amp;#160;includes&amp;#160;the&amp;#160;content&lt;br /&gt;
&amp;#42;	@param&amp;#160;string&amp;#160;$zipdescription&amp;#160;description&amp;#160;in&amp;#160;the&amp;#160;zipfile&lt;br /&gt;
&amp;#42;	@param&amp;#160;string&amp;#160;$tmpfolder&amp;#160;path&amp;#160;for&amp;#160;the&amp;#160;temporary&amp;#160;files&amp;#160;with&amp;#160;an&amp;#160;ending&amp;#160;/&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
function&amp;#160;stringToZip&amp;#40;$string,$filename,$zipdescription,$tmpfolder&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
	global&amp;#160;$cfg;&lt;br /&gt;
	$rand=rand&amp;#40;&amp;#41;;&lt;br /&gt;
	&lt;br /&gt;
	if&amp;#40;!class_exists&amp;#40;&#039;Archive_Zip&#039;&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		//&amp;#160;module&amp;#160;archive_zip&amp;#160;is&amp;#160;not&amp;#160;existing&lt;br /&gt;
		return&amp;#160;false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if&amp;#40;!is_writable&amp;#40;$tmpfolder&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		//&amp;#160;directory&amp;#160;is&amp;#160;not&amp;#160;writeable&lt;br /&gt;
		return&amp;#160;false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if&amp;#40;!file_exists&amp;#40;$tmpfolder.$filename&amp;#41;&amp;#41;&lt;br /&gt;
	{&lt;br /&gt;
		$int_filename=$tmpfolder.$filename;&lt;br /&gt;
	}&amp;#160;else&amp;#160;{&lt;br /&gt;
		$int_filename=$tmpfolder.$filename.&#039;-&#039;.$rand;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$fhandler=fopen&amp;#40;$int_filename,&#039;a&#039;&amp;#41;;&lt;br /&gt;
	fwrite&amp;#40;$fhandler,$string&amp;#41;;&lt;br /&gt;
	fclose&amp;#40;$fhandler&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
	$zipHandler=new&amp;#160;Archive_Zip&amp;#40;$tmpfolder.date&amp;#40;&quot;YmdHis&quot;&amp;#41;.&#039;-&#039;.$zipdescription.&#039;-&#039;.$rand.&#039;.zip&#039;&amp;#41;;&lt;br /&gt;
	$zipHandler-&amp;#62;create&amp;#40;$int_filename,array&amp;#40;&#039;remove_all_path&#039;=&amp;#62;true&amp;#41;&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
	//&amp;#160;unlink&amp;#160;the&amp;#160;file&amp;#160;containing&amp;#160;the&amp;#160;string	&lt;br /&gt;
	unlink&amp;#40;$int_filename&amp;#41;;&lt;br /&gt;
	&lt;br /&gt;
	//&amp;#160;store&amp;#160;the&amp;#160;data&amp;#160;and&amp;#160;delete&amp;#160;the&amp;#160;temp&amp;#160;file&lt;br /&gt;
	$data=file&amp;#40;$tmpfolder.date&amp;#40;&quot;YmdHis&quot;&amp;#41;.&#039;-&#039;.$zipdescription.&#039;-&#039;.$rand.&#039;.zip&#039;&amp;#41;;&lt;br /&gt;
	unlink&amp;#40;$tmpfolder.date&amp;#40;&quot;YmdHis&quot;&amp;#41;.&#039;-&#039;.$zipdescription.&#039;-&#039;.$rand.&#039;.zip&#039;&amp;#41;;&lt;br /&gt;
	&lt;br /&gt;
	return&amp;#160;join&amp;#40;&quot;\n&quot;,$data&amp;#41;;&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Viel Spaß! 
    </content:encoded>

    <pubDate>Fri, 15 Sep 2006 16:17:50 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2006/09/15/115/</guid>
    <category>development</category>
<category>php</category>

</item>
<item>
    <title>ADODB Table Prefix</title>
    <link>http://peter-rehm.de/2006/06/28/ADODB-Table-Prefix/</link>
            <category>PHP</category>
            <category>Programmierung</category>
    
    <comments>http://peter-rehm.de/2006/06/28/ADODB-Table-Prefix/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=106</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=106</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Bei fast jedem Projekt arbeitet man mit Tabellen Prefixen, um das Projekt z.b. 2x in der gleichen Datenbank laufen zu lassen. Gestern habe ich angefangen mein Projekt auf &lt;a href=&quot;http://adodb.sourceforge.net/&quot;&gt;ADOBD&lt;/a&gt; und dabei festgestellt dass es noch keine eingebaute Funktion für das Verwalten eines Prefixes gibt. Daher hab ich das nun auf meine Anforderungen angepasst.&lt;br /&gt;
&lt;br /&gt;
Mein Prefix liegt in $cfg[&#039;tbl_prefix&#039;].&lt;br /&gt;
&lt;br /&gt;
Die Querys werden nun so aufgebaut (&quot;SELECT * FROM ##daten&quot;).&lt;br /&gt;
&lt;br /&gt;
Statt Execute nimmt man nun die neue Funktion pExecute.&lt;br /&gt;
&lt;br /&gt;
Diese Funktion muss in die adodb.inc.php implementiert werden, ich hab diese in der aktuellen ADODB Version in Zeile 784 direkt vor Execute plaziert.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Function&amp;#160;to&amp;#160;Replace&amp;#160;the&amp;#160;Prefixes&lt;br /&gt;
&amp;#42;&amp;#160;&amp;#160;&amp;#160;&amp;#160;After&amp;#160;replacing&amp;#160;it&amp;#160;the&amp;#160;SQL&amp;#160;Statement&amp;#160;will&amp;#160;be&amp;#160;passed&amp;#160;to&amp;#160;EXECUTE&amp;#40;&amp;#41;&lt;br /&gt;
&amp;#42;&amp;#160;&amp;#160;&amp;#160;&amp;#160;@param&amp;#160;sql&amp;#160;SQL&amp;#160;statement&amp;#160;to&amp;#160;execute,&amp;#160;##&amp;#160;will&amp;#160;be&amp;#160;replaced&amp;#160;with&amp;#160;the&amp;#160;Prefix&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
function&amp;#160;&amp;amp;pExecute&amp;#40;$sql&amp;#41;&lt;br /&gt;
{&lt;br /&gt;
global&amp;#160;$cfg;&lt;br /&gt;
return&amp;#160;$this-&amp;#62;Execute&amp;#40;str_replace&amp;#40;&#039;##&#039;,$cfg&amp;#91;&#039;tbl_prefix&#039;&amp;#93;,$sql&amp;#41;&amp;#41;;&lt;br /&gt;
}&lt;/div&gt; 
    </content:encoded>

    <pubDate>Wed, 28 Jun 2006 10:39:27 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2006/06/28/106/</guid>
    <category>mysql</category>
<category>php</category>

</item>
<item>
    <title>Multi List Drag &amp; Drop - Sajax!</title>
    <link>http://peter-rehm.de/2006/06/20/Multi-List-Drag-Drop-Sajax!/</link>
            <category>PHP</category>
            <category>Programmierung</category>
    
    <comments>http://peter-rehm.de/2006/06/20/Multi-List-Drag-Drop-Sajax!/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=100</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=100</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Als ich über die Seite von &lt;a href=&quot;http://www.cyberdummy.co.uk/2005/07/13/multi-list-drag-and-drop/&quot;&gt;Tom Westcott&lt;/a&gt; gestolpert bin war mir klar, ich muss das in mein neues CMS einbinden. Ich hatte mir damals schon vorgestellt dass das für die Inhaltsstruktur oder für die Sidebar interessant sein könnte, aber ich war damals noch in der Planungsphase.&lt;br /&gt;
&lt;br /&gt;
Als ich dann die Implementation in &lt;a href=&quot;ttp://s9y.org&quot;&gt;Serendipity&lt;/a&gt; die ich durch &lt;a href=&quot;http://garv.in&quot;&gt;Garvin&#039;s SuperBlog&lt;/a&gt; entdeckt habe getestet habe, war mir klar, genau das will ich auch. Allerdings hat mir nur die AJAX Implementierung zugesagt, da ich ganz genau weiss da manche kunden bei so futuristischen Anwendungen sicher vergessen das abzuschicken. Daher muss das automatisch gemacht werden. Tom hat glücklicherweise auch gleich beide Methoden bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
Allerdings war der Code sehr verworren, und daher habe ich angefangen den Code neu aufzubauen, da ich vor allem im CMS das dann schon sauber einbauen wollte. Anstelle der umfangreicheren Implementation reicht nun folgendes:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;&amp;#160;db&amp;#160;settings&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;host&#039;&amp;#93;&amp;#160;=&amp;#160;&quot;localhost&quot;;&amp;#160;//&amp;#160;server&lt;br /&gt;
$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;user&#039;&amp;#93;&amp;#160;=&amp;#160;&quot;root&quot;;&amp;#160;//&amp;#160;dbuser&lt;br /&gt;
$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;pass&#039;&amp;#93;&amp;#160;=&amp;#160;&quot;&quot;;&amp;#160;//&amp;#160;password&lt;br /&gt;
$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;db&#039;&amp;#93;&amp;#160;=&amp;#160;&quot;sajaxdemo&quot;;&amp;#160;//&amp;#160;dbname&lt;br /&gt;
&lt;br /&gt;
/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;&amp;#160;&amp;#160;&amp;#160;&amp;#160;start&amp;#160;the&amp;#160;connection&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
$conn&amp;#160;=&amp;#160;mysql_connect&amp;#160;&amp;#40;$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;host&#039;&amp;#93;,&lt;br /&gt;
$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;user&#039;&amp;#93;,&lt;br /&gt;
$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;pass&#039;&amp;#93;&amp;#41;;&lt;br /&gt;
$result&amp;#160;=&amp;#160;mysql_select_db&amp;#160;&amp;#40;$cfg&amp;#91;&#039;server&#039;&amp;#93;&amp;#91;&#039;db&#039;&amp;#93;,$conn&amp;#41;;&lt;br /&gt;
&lt;br /&gt;
/&amp;#42;&amp;#42;&lt;br /&gt;
&amp;#42;&amp;#160;&amp;#160;&amp;#160;&amp;#160;include&amp;#160;the&amp;#160;sajax&amp;#160;file&lt;br /&gt;
&amp;#42;/&lt;br /&gt;
include&amp;#40;&quot;sajax.php&quot;&amp;#41;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Danach muss noch der Pfad in der sajax Datei angepasst werden, dass das einbinden der styles und des JS auch funktioniert.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;var&amp;#160;$sajax_path=&#039;thirdparty/sajax/&#039;;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion &lt;em&gt;update_db&lt;/em&gt; sollte dann auch an die Gegebenheiten angepasst werden. Die Funktion greift auf die global Datenbankverbindung zu.&lt;br /&gt;
&lt;br /&gt;
Das Auslesen wird dann direkt in dem File gemacht in dem Sie die Liste anzeigen möchten.&lt;br /&gt;
&lt;br /&gt;
Um dies zu vereinfachen habe ich eine Bespiel Datei mitgeliefert, in der Sie das alles sehen können. Dazu auch der passende SQL dump.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://peter-rehm.de/downloads/sajax/demo.php&quot;&gt;Beispielseite&lt;/a&gt; - &lt;a href=&quot;http://peter-rehm.de/downloads/sajax.zip&quot;&gt;Download&lt;/a&gt;&lt;br /&gt;
&lt;ul /&gt;Ich hoffe dieses Script findet irgendwo sinvollen Einsatz. Über Feedback würde ich mich freuen. 
    </content:encoded>

    <pubDate>Tue, 20 Jun 2006 00:33:22 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2006/06/20/100/</guid>
    <category>ajax</category>
<category>javascript</category>
<category>php</category>

</item>
<item>
    <title>PHPThumb Fehler</title>
    <link>http://peter-rehm.de/2006/04/27/PHPThumb-Fehler/</link>
            <category>PHP</category>
            <category>Programmierung</category>
    
    <comments>http://peter-rehm.de/2006/04/27/PHPThumb-Fehler/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=85</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=85</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    &lt;img alt=&quot;phpthumb error&quot; id=&quot;image88&quot; title=&quot;phpthumb error&quot; src=&quot;http://peter-rehm.de/wp-content/uploads/2006/04/screenshot_013.jpg&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Zum Bilder verkleinern und skalieren wird sehr oft phpThumb verwedet was an sich auch toll ist, jedoch hat man oft das Problem, dass man eine Applikation lokal entwickelt und beim Hochladen gibt es dann einen Fehler.&lt;br /&gt;
&lt;br /&gt;
Bei phpThumb kommt es relativ oft zu dem Fehler&lt;br /&gt;
&lt;br /&gt;
Unknown image type identified by ?ph ( 0x3c 0x3f 0x70 0x68 ) in SourceImageToGD&lt;br /&gt;
&lt;br /&gt;
Die ist sehr ärgerlich aber es gibt einen einfach Workaround&lt;br /&gt;
&lt;br /&gt;
Man muss einfach folgende Zeilen in phpThumb/phpThumb.php entfernen:&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;em&gt;&lt;div class=&quot;bb-code-title&quot;&gt;CODE:&lt;/div&gt;&lt;div class=&quot;bb-code&quot;&gt;if&amp;#160;&amp;#40;@$_SERVER&amp;#91;&#039;PATH_INFO&#039;&amp;#93;&amp;#41;&amp;#160;{&lt;br /&gt;
$_SERVER&amp;#91;&#039;PHP_SELF&#039;&amp;#93;&amp;#160;=&amp;#160;str_replace&amp;#40;$_SERVER&amp;#91;&#039;PATH_INFO&#039;&amp;#93;,&amp;#160;&#039;&#039;,&amp;#160;@$_SERVER&amp;#91;&#039;PHP_SELF&#039;&amp;#93;&amp;#41;;&amp;#60;/em&amp;#62;&amp;#60;/em&amp;#62;&lt;br /&gt;
&lt;br /&gt;
&amp;#60;em&amp;#62;&amp;#60;em&amp;#62;$args&amp;#160;=&amp;#160;explode&amp;#40;&#039;;&#039;,&amp;#160;substr&amp;#40;$_SERVER&amp;#91;&#039;PATH_INFO&#039;&amp;#93;,&amp;#160;1&amp;#41;&amp;#41;;&lt;br /&gt;
if&amp;#160;&amp;#40;!empty&amp;#40;$args&amp;#41;&amp;#41;&amp;#160;{&lt;br /&gt;
$_GET&amp;#91;&#039;src&#039;&amp;#93;&amp;#160;=&amp;#160;@$args&amp;#91;count&amp;#40;$args&amp;#41;&amp;#160;-&amp;#160;1&amp;#93;;&amp;#60;/em&amp;#62;&amp;#60;/em&amp;#62;&lt;br /&gt;
&lt;br /&gt;
&amp;#60;em&amp;#62;&amp;#60;em&amp;#62;}&lt;br /&gt;
if&amp;#160;&amp;#40;eregi&amp;#40;&#039;^&amp;#40;&amp;#91;0-9&amp;#93;&amp;#42;&amp;#41;x?&amp;#40;&amp;#91;0-9&amp;#93;&amp;#42;&amp;#41;$&#039;,&amp;#160;@$args&amp;#91;count&amp;#40;$args&amp;#41;&amp;#160;-&amp;#160;2&amp;#93;,&amp;#160;$matches&amp;#41;&amp;#41;&amp;#160;{&lt;br /&gt;
$_GET&amp;#91;&#039;w&#039;&amp;#93;&amp;#160;=&amp;#160;$matches&amp;#91;1&amp;#93;;&lt;br /&gt;
$_GET&amp;#91;&#039;h&#039;&amp;#93;&amp;#160;=&amp;#160;$matches&amp;#91;2&amp;#93;;&lt;br /&gt;
}&lt;br /&gt;
for&amp;#160;&amp;#40;$i&amp;#160;=&amp;#160;0;&amp;#160;$i&amp;#160;&amp;#60;&amp;#160;count&amp;#40;$args&amp;#41;&amp;#160;-&amp;#160;2;&amp;#160;$i++&amp;#41;&amp;#160;{&lt;br /&gt;
@list&amp;#40;$key,&amp;#160;$value&amp;#41;&amp;#160;=&amp;#160;explode&amp;#40;&#039;=&#039;,&amp;#160;@$args&amp;#91;$i&amp;#93;&amp;#41;;&lt;br /&gt;
if&amp;#160;&amp;#40;substr&amp;#40;$key,&amp;#160;-2&amp;#41;&amp;#160;==&amp;#160;&#039;&amp;#91;&amp;#93;&#039;&amp;#41;&amp;#160;{&lt;br /&gt;
$_GET&amp;#91;substr&amp;#40;$key,&amp;#160;0,&amp;#160;-2&amp;#41;&amp;#93;&amp;#91;&amp;#93;&amp;#160;=&amp;#160;$value;&lt;br /&gt;
}&amp;#160;else&amp;#160;{&lt;br /&gt;
$_GET&amp;#91;$key&amp;#93;&amp;#160;=&amp;#160;$value;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;/div&gt;&lt;/em&gt;&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;em&gt;Danach sollte es gehen, mir ist vor allem das Problem bei meinem 1&amp;1 Server aufgefallen, da es lokal meistens funktionierte. &lt;/em&gt; &lt;/em&gt; 
    </content:encoded>

    <pubDate>Thu, 27 Apr 2006 14:39:57 +0200</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2006/04/27/85/</guid>
    <category>development</category>
<category>php</category>

</item>
<item>
    <title>WinBinder - PHP Applicationen für Windows</title>
    <link>http://peter-rehm.de/2006/03/08/WinBinder-PHP-Applicationen-fuer-Windows/</link>
            <category>PHP</category>
            <category>Programmierung</category>
    
    <comments>http://peter-rehm.de/2006/03/08/WinBinder-PHP-Applicationen-fuer-Windows/#comments</comments>
    <wfw:comment>http://peter-rehm.de/wfwcomment.php?cid=50</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://peter-rehm.de/rss.php?version=2.0&amp;type=comments&amp;cid=50</wfw:commentRss>
    

    <author>nospam@example.com (Peter Rehm)</author>
    <content:encoded>
    Sieht sehr interessant aus ist aber für Windows. Werde ich wohl mal kurz testen müssen wenn ich wieder in Deutschland bin, da ich hier keinen eigenen Windows rechner habe.&lt;br /&gt;
&lt;p align=&quot;left&quot;&gt;Aber interessant wird es erst wenn es auch einen MacBinder gibt.&lt;/p&gt;&lt;br /&gt;
Vom Prinzip her ist es aber sicher interessant.&lt;br /&gt;
&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://www.winbinder.com/overview.php&quot;&gt;http://www.winbinder.com/overview.php&lt;/a&gt; 
    </content:encoded>

    <pubDate>Wed, 08 Mar 2006 11:17:35 +0100</pubDate>
    <guid isPermaLink="false">http://peter-rehm.de/2006/03/08/50/</guid>
    
</item>

</channel>
</rss>