<?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/"
	>

<channel>
	<title>UST PHP-Blog</title>
	<atom:link href="http://www.phpblog.de/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.phpblog.de</link>
	<description>Infos rund um PHP und Webentwicklung</description>
	<pubDate>Wed, 23 Jun 2010 23:00:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP mit Oracle Client auf Windows</title>
		<link>http://www.phpblog.de/?p=196</link>
		<comments>http://www.phpblog.de/?p=196#comments</comments>
		<pubDate>Wed, 23 Jun 2010 08:09:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Installation]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Absturz]]></category>

		<category><![CDATA[Apache]]></category>

		<category><![CDATA[Crash]]></category>

		<category><![CDATA[nicht starten]]></category>

		<category><![CDATA[php5ts]]></category>

		<category><![CDATA[php_oci8]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=196</guid>
		<description><![CDATA[PHP funktioniert ja recht gut im Zusammenspiel mit der Oracle-Datenabnk. Lediglich bei der  Installation des Oracle-Clients muss man aufpassen. Vielfach ist wahrscheinlich noch ein Oracle 10g Client im Einsatz, den man zur Verbindung zwischen Webserver und Oracleserver verwenden möchte. Wenn man allerdings dann bei PHP 5.x (auch bei der aktuellen 5.3.2) die php_oci8.dll Extension [...]]]></description>
			<content:encoded><![CDATA[<p>PHP funktioniert ja recht gut im Zusammenspiel mit der Oracle-Datenabnk. Lediglich bei der  Installation des Oracle-Clients muss man aufpassen. Vielfach ist wahrscheinlich noch ein Oracle 10g Client im Einsatz, den man zur Verbindung zwischen Webserver und Oracleserver verwenden möchte. Wenn man allerdings dann bei PHP 5.x (auch bei der aktuellen 5.3.2) die php_oci8.dll Extension aktivieren möchte, lässt sich der Apache 2.2 danach nicht mehr starten. Es erscheint eine Meldung im Eventviewer, dass die php5ts.dll einen Fehler verursacht.</p>
<blockquote><p>Faulting application httpd.exe, version 2.2.3.0, faulting module php5ts.dll, version 5.3.2.0, fault address 0&#215;000980d6. </p></blockquote>
<p>Offensichtlich hat der Oracle-Client nicht alle erwarteten Schnittstellen implementiert. Abhilfe schafft die Installation des OracleXE-Clients, mit dem die Anbindung problemlos gelingt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=196</wfw:commentRss>
		</item>
		<item>
		<title>Google Chart API mit PHP verwenden</title>
		<link>http://www.phpblog.de/?p=193</link>
		<comments>http://www.phpblog.de/?p=193#comments</comments>
		<pubDate>Fri, 18 Jun 2010 22:31:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Grafik]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[API]]></category>

		<category><![CDATA[Chart]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[Graph]]></category>

		<category><![CDATA[JpGraph]]></category>

		<category><![CDATA[Statistik]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=193</guid>
		<description><![CDATA[Um statistische Daten grafisch darzustellen gibt es mittlerweile ja verschiedene Bibliotheken, allen voran ist hier wohl die JpGraph-Bibliothek zu nennen, die viele Wünsche der Statistikfreunde erfüllt. Gerade für kleinere Auswertungen gibt es aber auch eine weitere, recht einfache Möglichkeit. Google stellt hier mit der Google Chart API eine recht umfangreiche Schnittstelle zur Verfügung, der man [...]]]></description>
			<content:encoded><![CDATA[<p>Um statistische Daten grafisch darzustellen gibt es mittlerweile ja verschiedene Bibliotheken, allen voran ist hier wohl <a href="http://jpgraph.net/">die JpGraph-Bibliothek</a> zu nennen, die viele Wünsche der Statistikfreunde erfüllt. Gerade für kleinere Auswertungen gibt es aber auch eine weitere, recht einfache Möglichkeit. Google stellt hier mit der Google Chart API eine recht umfangreiche Schnittstelle zur Verfügung, der man per Post oder Get ein paar Werte unterschiebt und schon bekommt man das fertige Bild zurück.<br />
Für interessierte Einsteiger habe ich ein <a href='http://www.phpblog.de/wp-content/uploads/2010/06/googlechartapi.zip'>Beispiel zur Google Chart API</a> erstellt, das eine Möglichkeit aufzeigt, die Daten sowohl in einer tabellarischen Form als auch als Grafik darzustellen. Natürlich kann man das <a href="http://www.phpblog.de/demo/googlechartapi/" target="_blank">Beispiel auch direkt online betrachten</a>.<br />
Man muss klar sagen, dass es einige Einschränkungen gibt, z.B. die Beschränkung der Bildgröße auf 300.000 Pixel oder dass nur Werte zwischen 0 und 100 zulässig sind (was durch eine Skalierung erreicht wird), aber für viele Fälle reicht es eben doch aus und die Einbindung geht sehr schnell und einfach.<br />
Weitergehende Informationen zur API finden sich bei der Beschreibung der <a href="http://code.google.com/intl/de-DE/apis/chart/image_charts.html">Google Chart Tools</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=193</wfw:commentRss>
		</item>
		<item>
		<title>PHP Unconference</title>
		<link>http://www.phpblog.de/?p=191</link>
		<comments>http://www.phpblog.de/?p=191#comments</comments>
		<pubDate>Mon, 22 Mar 2010 21:23:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Allgemeines]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=191</guid>
		<description><![CDATA[Die etwas andere PHP-Konferenz
Als kleinen Kontrast zu den &#8220;konventionellen&#8221; PHP- (oder allgemeiner Web-) Konferenzen, die ja mittlerweile mehrfach im Jahr stattfinden gibt es seit 2007 jedes Jahr im September die PHP-Unconference. Auf dieser Konferenz gibt es kein feststehendes Programm mit x Speakern, sondern &#8220;nur&#8221; einen losen Rahmen. Es gibt einen definierten Zeitrahmen (in diesem Jahr [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Die etwas andere PHP-Konferenz</strong><br />
Als kleinen Kontrast zu den &#8220;konventionellen&#8221; PHP- (oder allgemeiner Web-) Konferenzen, die ja mittlerweile mehrfach im Jahr stattfinden gibt es seit 2007 jedes Jahr im September die PHP-Unconference. Auf dieser Konferenz gibt es kein feststehendes Programm mit x Speakern, sondern &#8220;nur&#8221; einen losen Rahmen. Es gibt einen definierten Zeitrahmen (in diesem Jahr findet die Unconference am 24. und 25. September in Hamburg statt) und eine Liste an Themen, die aber von den Besuchern im Vorfeld vorgeschlagen wurden. Aus diesen Vorschlägen bestimmen dann wiederum die Besucher die interessantesten Themen und diese werden dann in den Sessions abgehalten. Die Vortragenden sind teilweise &#8220;normale&#8221; PHP-User wie Du und ich, aber auch die Koryphäen der Szene sind vertreten.<br />
Der ganze Spaß kostet gerade mal 30,&#8211; Euro und wenn Hamburg nicht gerade am anderen Ende von Deutschland liegen würde, wäre ich auf jeden Fall dabei <img src='http://www.phpblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Aber da wohl noch einige andere genauso denken, ist aktuell die erste internationale Unconference in Planung, die dann Ende 2010 auf Mallorca stattfinden soll.<br />
Weitere Infos gibt es unter <a href="http://www.php-unconference.de/">www.php-unconference.de/</a> und <a href="http://europe.phpunconference.org/">europe.phpunconference.org/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=191</wfw:commentRss>
		</item>
		<item>
		<title>Server2Go mit Firefox</title>
		<link>http://www.phpblog.de/?p=186</link>
		<comments>http://www.phpblog.de/?p=186#comments</comments>
		<pubDate>Fri, 29 Jan 2010 10:20:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Allgemeines]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=186</guid>
		<description><![CDATA[Viele kennen wahrscheinlich die Server2Go-Umgebung von Timo Haberkern, mit der man eine komplette PHP- (und MySQL-) gestützte Website auf CD oder USB-Stick kopieren kann und dann auf (fast) jedem Windowsrechner einfach ohne Installation starten kann. An dieser Stelle auch nochmals herzlichen Dank an Timo für dieses tolle Projekt!
Einziger Wermutstropfen ist die Unterstützung anderer Browser als [...]]]></description>
			<content:encoded><![CDATA[<p>Viele kennen wahrscheinlich die <a href="http://www.server2go-web.de">Server2Go-Umgebung</a> von Timo Haberkern, mit der man eine komplette PHP- (und MySQL-) gestützte Website auf CD oder USB-Stick kopieren kann und dann auf (fast) jedem Windowsrechner einfach ohne Installation starten kann. An dieser Stelle auch nochmals herzlichen Dank an Timo für dieses tolle Projekt!<br />
Einziger Wermutstropfen ist die Unterstützung anderer Browser als dem Internet Explorer. Man kann zwar in der pms_config.ini andere Browser einstellen, die auch automatisch gestartet werden, aber speziell bei der aktuellsten Version wird die Umgebung bei anderen Browsern meist nach 2 oder 3 Klicks geschlossen und der Apache-Server ist dann nicht mehr verfügbar. Ob es sich um einen Absturz handelt, kann man von &#8220;außen&#8221; nicht erkennen. Offensichtlich erkennt aber das Server2Go-Modul den laufenden Browser nicht und fährt dann automatisch herunter. Dies kann man durch Ändern der Option <code>KeepRunningAfterBrowserClose</code> umstellen. Setzt man diese Option in der pms_config.ini auf den Wert 1</p>
<blockquote><p>  KeepRunningAfterBrowserClose = 1</p></blockquote>
<p>ist die gesamte Umgebung auch mit Firefox oder Firefox Portable stabil lauffähig. Speziell beim Einsatz des Firefox Portable, den man dann ebenfalls auf den USB-Stick kopiert, kann man somit eine definierte Umgebung schaffen, die man nach seinen Wünschen einstellen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=186</wfw:commentRss>
		</item>
		<item>
		<title>Default Charset UTF-8 oder ISO-8859-1</title>
		<link>http://www.phpblog.de/?p=179</link>
		<comments>http://www.phpblog.de/?p=179#comments</comments>
		<pubDate>Wed, 20 Jan 2010 22:54:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=179</guid>
		<description><![CDATA[Der Apache-Webserver kann so konfiguriert werden, dass Seiten standardmäßig mit einem bestimmten Charset ausgeliefert werden. Damit kann dann eine PHP-Seite, die eigentlich im UTF-8-Format gespeichert wurde, auf einmal als ISO-Seite erscheinen und dann natürlich mit fehlerhaften Umlauten, sofern diese nicht als HTML-Entities geschrieben wurden. Um das zu umgehen, kann man mit ini_set zu Beginn seiner [...]]]></description>
			<content:encoded><![CDATA[<p>Der Apache-Webserver kann so konfiguriert werden, dass Seiten standardmäßig mit einem bestimmten Charset ausgeliefert werden. Damit kann dann eine PHP-Seite, die eigentlich im UTF-8-Format gespeichert wurde, auf einmal als ISO-Seite erscheinen und dann natürlich mit fehlerhaften Umlauten, sofern diese nicht als HTML-Entities geschrieben wurden. Um das zu umgehen, kann man mit ini_set zu Beginn seiner Skripte den eigenen, gewünschten Charset angeben. Mit einem</p>
<p><code> ini_set("default_charset", "UTF-8");</code></p>
<p>wird die Seite dann auch garantiert als UTF-8-Seite ausgegeben, unabhängig von der Webserver-Konfiguration.<br />
Besonders bei gehosteten Webpaketen bietet sich ein solches Vorgehen an, da man in diesem Fall ja meist keine Kontrolle über die Konfiguration hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=179</wfw:commentRss>
		</item>
		<item>
		<title>Upload-Fortschritt mit 100% PHP und AJAX</title>
		<link>http://www.phpblog.de/?p=148</link>
		<comments>http://www.phpblog.de/?p=148#comments</comments>
		<pubDate>Fri, 11 Sep 2009 07:28:05 +0000</pubDate>
		<dc:creator>gabler</dc:creator>
		
		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=148</guid>
		<description><![CDATA[Da das PECL-Package APC (Alternative PHP Cache) bisher bei mehreren parallelen Uploads unzuverlässige Fortschritts-Werte liefert (getestet mit Version 3.0), wurde bisher auf eine Perl-Lösung ausgewichen. Schöner wäre es allerdings, eine reine PHP-Lösung zu haben. Glücklicherweise gibt es noch ein weiteres PECL-Package namens uploadprogress, das mit Version 1.0 nun erstmals als stabile Version vorliegt. Die uploadprogress-Extension [...]]]></description>
			<content:encoded><![CDATA[<p>Da das PECL-Package APC (Alternative PHP Cache) bisher bei mehreren parallelen Uploads unzuverlässige Fortschritts-Werte liefert (getestet mit Version 3.0), wurde bisher auf eine Perl-Lösung ausgewichen. Schöner wäre es allerdings, eine reine PHP-Lösung zu haben. Glücklicherweise gibt es noch ein weiteres PECL-Package namens uploadprogress, das mit Version 1.0 nun erstmals als stabile Version vorliegt. Die uploadprogress-Extension für php funktioniert auch bei mehreren parallelen Uploads und lässt sich recht einfach installieren&#8230;</p>
<p><span id="more-148"></span></p>
<h3>Voraussetzungen</h3>
<p></p>
<ul>
<li>Mindestens PHP 5.2.0</li>
</ul>
<h3>Installation unter Windows</h3>
<p></p>
<p>Für Windows werden direkt kompilierte Bibliotheken zum Download angeboten. Diese können von der pecl4win-Seite heruntergeladen werden: <a href="http://pecl4win.php.net/" target="_blank">pecl4win.php.net</a>. Diese Seite ist allerdings momentan (während dieser Artikel entstanden ist) nicht verfügbar. Eine alternative Download-Seite ist diese: <a href="http://downloads.php.net/pierre/" target="_blank">downloads.php.net/pierre</a>. Auf dieser Seite muss man lediglich nach <code style="color:navy;">php_uploadprogress</code> suchen und die entsprechende Version herunterladen. Alternativ hier der direkte Link zu <a href="http://downloads.php.net/pierre/php_uploadprogress-1.0.0-5.2-Win32-VC6-x86.zip" target="_blank">Version 1.0.0 Win32</a>.</p>
<p>Nachdem das Zip-Archiv heruntergeladen und entpackt wurde, muss Datei php_uploadprogress.dll in das PHP-Extension-Verzeichnis kopiert werden. Anschließend müssen in Datei php.ini noch folgende Zeilen ergänzt werden:</p>
<pre style="color:navy;">
extension=php_uploadprogress.dll

uploadprogress.file.filename_template="C:/Ihr-Temp-Ordner/upload_status_%s"
uploadprogress.file.contents_template="C:/Ihr-Temp-Ordner/upload_contents_%s"
uploadprogress.get_contents=0
</pre>
<p></p>
<h3>Installation unter Linux</h3>
<p></p>
<p>Unter Linux muss zunächst das aktuellste stabile Paket heruntergeladen werden: <a href="http://pecl.php.net/package/uploadprogress" target="_blank">pecl.php.net/package/uploadprogress</a>. Ist das Archiv entpackt, kann in das enthaltene Unterverzeichnis gewechselt werden. In diesem sind dann per Konsole folgende schritte auszuführen:</p>
<pre style="color:navy;">
phpize
./configure
make
sudo make install
</pre>
<p></p>
<p>Während make install wird eine Meldung darüber ausgegeben, wohin die erstellte Datei uploadprogress.so verschoben wurde. Entspricht dieses Verzeichnis nicht dem eingestellten PHP-Extension-Verzeichnis, so muss die Datei ggf. von dem angegebenen Verzeichnis in das PHP-Extension-Verzeichnis verschoben werden. Anschließend müssen in Datei php.ini folgende Zeilen ergänzt werden:</p>
<pre style="color:navy;">
extension=uploadprogress.so

uploadprogress.file.filename_template="/tmp/upload_status_%s"
uploadprogress.file.contents_template="/tmp/upload_contents_%s"
uploadprogress.get_contents=0
</pre>
<p></p>
<h3>Anmerkung zu den Einstellungen in Datei php.ini</h3>
<p></p>
<p>Über die uploadprogress-Extension kann auch auf die Inhalte hochgeladener Dateien zugegriffen werden. Dies empfielt sich jedoch nicht, da Uploads sonst sehr langsam werden. Daher sollte die Einstellung <code style="color:navy;">uploadprogress.get_contents</code> deaktiviert werden, indem sie auf 0 (die Zahl Null) gesetzt wird (siehe oben). Es ist auf jeden Fall sicherzustellen, dass die Ordner, in denen später <code style="color:navy;">upload_status_%s</code> und <code style="color:navy;">upload_contents_%s</code> angelegt werden sollen, vorhanden und beschreibbar sind. Die Dateinamen selbst können angepasst werden, jedoch muss unbedingt %s enthalten sein, da dieser Teil beim Upload von der Extension durch einen eindeutigen Kenner ersetzt wird.</p>
<h3>HTML-Formular und Javascript</h3>
<p></p>
<p>Zunächst wird ein Formular benötigt, bei dem das target-Attribut auf einen iframe zeigt (<code style="color:navy;">target="iframe-id"</code>). Im onsubmit-Event des Formulars wird die Javascript-Update-Funktion für den Fortschritt aufgerufen, am besten mit einer kleien Verzögerung. (Bitte beachten Sie, dass XHTML im Strict-Mode für Formulare kein target-Attribut kennt.)</p>
<p>Damit <code style="color:navy;">uploadprogress</code> den Upload identifizieren kann, benötigt die Extension einen eindeutigen Kenner. Dieser wird per POST über ein Feld übergeben, das <code style="color:navy;">UPLOAD_IDENTIFIER</code> heißen muss. Im Beispiel wird für diesen Kenner die Session-ID mit einer eindeutigen, von PHP generierten ID kombiniert. (Natürlich muss dazu zuvor  ein Aufruf von <code style="color:navy;">session_start()</code> stattgefunden haben.) <strong>Wichtig:</strong> Es ist unbedingt zu beachten, dass das Feld <code style="color:navy;">UPLOAD_IDENTIFIER</code> <u>vor</u> den file-Feldern steht.</p>
<pre style="color:navy;">
&lt;form action="upload.php"
      method="post"
      enctype="multipart/form-data"
      target="upload_target"
      onsubmit="setTimeout('refreshUploadProgress();',500);"&gt;

  &lt;input type="hidden"
         name="UPLOAD_IDENTIFIER"
         id="UPLOAD_IDENTIFIER"
         value="&lt;?php echo uniqid(session_id() . "_"); ?&gt;" /&gt;

  &lt;input type="hidden" name="MAX_FILE_SIZE" value="10000000000000" /&gt;

  &lt;p&gt;
    Datei wählen:&lt;br /&gt;
    &lt;input type="file"
           maxlength="255"
           size="40"
           id="fUPLOAD_FILE"
           name="fUPLOAD_FILE" /&gt;
  &lt;/p&gt;

  &lt;p&gt;
    &lt;input type="submit" name="btnSave" value="Jetzt hochladen" /&gt;
  &lt;/p&gt;

&lt;/form&gt;
</pre>
<p></p>
<p>Die Javascript-Funktion <code style="color:navy;">refreshUploadProgress()</code> ruft per AJAX-Request periodisch solange die Informationen über den Upload-Fortschritt ab und zeigt sie an, bis der Upload beendet wurde. Für das Absenden des Requests und das Empfangen und Auswerten der Antwort können Sie ihre bevorzugte Javascript-Bibliothek verwenden. <strong>Wichtig:</strong> Der Wert aus Feld <code style="color:navy;">UPLOAD_IDENTIFIER</code> muss per Javascript mit an die PHP-Datei übergeben werden, die die Informationen über den Fortschritt des Uploads ausliest.</p>
<h3>Upload-Fortschritt ermitteln</h3>
<p></p>
<p>Der per Get oder Post übergebene eindeutige Kenner wird an Funktion <code style="color:navy;">uploadprogress_get_info(...)</code> übergeben, die von der uploadprogress-Extension zur Verfügung gestellt wird:</p>
<pre style="color:navy;">
uploadprogress_get_info($_GET["UPLOAD_IDENTIFIER"]);
</pre>
<p></p>
<p>Die Funktion liefert nun einige Informationen über den Verlauf des Uploads. Hier ein Beispiel:</p>
<pre style="color:navy;">
array(11) {
  ["upload_id"]=>
  string(40) "gr9rim68iuvc3ubb2ao66jpkg1_4aa9f36776419"
  ["fieldname"]=>
  string(12) "fUPLOAD_FILE"
  ["filename"]=>
  string(19) "upload-test.txt"
  ["time_start"]=>
  string(10) "1252651882"
  ["time_last"]=>
  string(10) "1252651883"
  ["speed_average"]=>
  string(8) "35173072"
  ["speed_last"]=>
  string(8) "35167807"
  ["bytes_uploaded"]=>
  string(8) "35173072"
  ["bytes_total"]=>
  string(9) "168132200"
  ["files_uploaded"]=>
  string(1) "0"
  ["est_sec"]=>
  string(1) "3"
}
</pre>
<p></p>
<p>Diese Informationen können nun je nach Anforderung ausgewertet und (üblicherweise JSON-formatiert) ausgegeben werden. Die Javascript-Funktion, die letztendlich die Antwort vom Server erhält, kann bspw. eine textuelle und/oder grafische Anzeige realisieren.</p>
<h3>Wenn der Upload fertig ist</h3>
<p></p>
<p>Datei <code style="color:navy;">upload.php</code> übernimmt die php-seitige Behandlung der hochgeladenen Dateien. Hier kann bspw. mit dem <code style="color:navy;">$_FILES</code>-Array wie gewohnt vorgegangen werden. Wird der iFrame angezeigt, können die Informationen (evtl. auch Fehlermeldungen) bspw. direkt als HTML ausgegeben werden. Ist der iFrame versteckt, kann bspw. im onload-Event der Seite im iFrame eine Javascript-Funktion aufgerufen werden, die bspw. das innerHTML des Elementes mit den Meldungen an ein Element oder eine Javascript-Funktion von <code style="color:navy;">window.parent</code> übergibt.</p>
<p>Damit die Uploads auch bei ausgeschaltetem Javascript funktionieren, empfielt es sich, das target-Attribut des Formulars erst im onsubmit-Event zu setzen. Ist Javascript deaktiviert, wird somit <code style="color:navy;">upload.php</code> direkt geladen und die hochgeladenen Dateien werden trotzdem verarbeitet und es werden trotzdem die Meldungen ausgegeben.</p>
<h3>Testumgebung</h3>
<p></p>
<p>Getestet wurde mit folgenden Systemen:</p>
<ul>
<li>Windows XP SP3 mit PHP 5.2.9 und uploadprogress 1.0.0</li>
<li>openSUSE 11.1 mit PHP 5.2.9 und uploadprogress 1.0.1</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=148</wfw:commentRss>
		</item>
		<item>
		<title>Installation von php_mcrypt.dll unter Windows</title>
		<link>http://www.phpblog.de/?p=138</link>
		<comments>http://www.phpblog.de/?p=138#comments</comments>
		<pubDate>Thu, 03 Sep 2009 18:20:57 +0000</pubDate>
		<dc:creator>gabler</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=138</guid>
		<description><![CDATA[Um die Extension mcrypt zu aktivieren, genügt es nicht, in Datei php.ini anzugeben, dass die Extension geladen werden soll:

extension=php_mcrypt.dll


Damit die Extension geladen werden kann, muss zuerst libmcrypt installiert werden. Dazu wird die Datei libmcrypt.dll im Windows-Verzeichnis in das Unterverzeichnis system32 kopiert. Die Bibliothek ist auf SourceForge.net verfügbar:
Download: mcrypt bei SourceForge.net herunterladen
]]></description>
			<content:encoded><![CDATA[<p>Um die Extension <code style="color:navy;">mcrypt</code> zu aktivieren, genügt es nicht, in Datei <code style="color:navy;">php.ini</code> anzugeben, dass die Extension geladen werden soll:</p>
<pre style="color:navy;">
extension=php_mcrypt.dll
</pre>
<p></p>
<p>Damit die Extension geladen werden kann, muss zuerst <code style="color:navy;">libmcrypt</code> installiert werden. Dazu wird die Datei <code style="color:navy;">libmcrypt.dll</code> im <code style="color:navy;">Windows</code>-Verzeichnis in das Unterverzeichnis <code style="color:navy;">system32</code> kopiert. Die Bibliothek ist auf SourceForge.net verfügbar:</p>
<p>Download: <a href="http://sourceforge.net/projects/mcrypt/" target="_blank">mcrypt bei SourceForge.net herunterladen</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=138</wfw:commentRss>
		</item>
		<item>
		<title>Binäre Datei mit readfile ausgeben</title>
		<link>http://www.phpblog.de/?p=125</link>
		<comments>http://www.phpblog.de/?p=125#comments</comments>
		<pubDate>Thu, 27 Aug 2009 20:34:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=125</guid>
		<description><![CDATA[In vielen PHP-Anwendungen findet man immer wieder mal die Funktion, eine Datei herunterzuladen, die nicht im Document-Root des Servers liegt. Hierzu wird dann ein kleines download-Skript erstellt, das in der Regel den gewünschten Dateinamen als Parameter erhält und dann die Datei direkt zum Browser ausgibt. Bequemerweise stellt PHP dafür die Funktion readfile zur Verfügung. Ein [...]]]></description>
			<content:encoded><![CDATA[<p>In vielen PHP-Anwendungen findet man immer wieder mal die Funktion, eine Datei herunterzuladen, die nicht im Document-Root des Servers liegt. Hierzu wird dann ein kleines download-Skript erstellt, das in der Regel den gewünschten Dateinamen als Parameter erhält und dann die Datei direkt zum Browser ausgibt. Bequemerweise stellt PHP dafür die Funktion <strong>readfile</strong> zur Verfügung. Ein typischer Codeblock sieht dann ungefähr so aus:</p>
<blockquote><p><code>if (isset($_GET["file"])) {<br />
&nbsp;&nbsp;  $sFileName = $_GET["file"];<br />
&nbsp;&nbsp;  // check for invalid file paths and preceed with file archive directory<br />
&nbsp;&nbsp;  $sFile = getFullFileName($sSubDir);<br />
&nbsp;&nbsp;  if (file_exists($sFile)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;    header(&#8221;Content-type: application/x-download&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;    header(&#8221;Content-Disposition: attachment; filename=$sFileName&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;    header(&#8221;Content-Transfer-Encoding: binary&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;    header(&#8217;Content-Length: &#8216; . filesize($sFile));<br />
&nbsp;&nbsp;&nbsp;&nbsp;    ob_clean();<br />
&nbsp;&nbsp;&nbsp;&nbsp;    flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;    readfile($sFile);<br />
&nbsp;&nbsp;  }<br />
}</code></p></blockquote>
<p>Wichtig ist dabei die Verwendung von ob_clean() und flush() nach dem Senden der Header-Angaben. Ansonsten werden speziell Dateien mit Binärdaten nicht korrekt übermittelt und lassen sich dann beim Empfänger ggf. nicht öffnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=125</wfw:commentRss>
		</item>
		<item>
		<title>TR ein- und ausblenden</title>
		<link>http://www.phpblog.de/?p=121</link>
		<comments>http://www.phpblog.de/?p=121#comments</comments>
		<pubDate>Fri, 14 Aug 2009 21:03:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=121</guid>
		<description><![CDATA[Möchte man dynamisch eine Tabellenzeile per Javascript ausblenden, erreicht man dies durch die Zuweisung wie in folgendem Beispiel zum Verstecken der zweiten Zeile:
var oTR = document.getElementById(&#8217;TableID&#8217;).rows[1];
oTR.style.display = &#8216;none&#8217;;
Möchte man die Zeile nun wieder anzeigen, erwartet ein korrekter Browser eigentlich das Setzen der Display-Eigenschaft auf &#8220;table-row&#8221;, also:
oTR.style.display = &#8216;table-row&#8217;;
Dies interpretiert der Internet Explorer allerdings nicht korrekt, [...]]]></description>
			<content:encoded><![CDATA[<p>Möchte man dynamisch eine Tabellenzeile per Javascript ausblenden, erreicht man dies durch die Zuweisung wie in folgendem Beispiel zum Verstecken der zweiten Zeile:</p>
<blockquote><p>var oTR = document.getElementById(&#8217;TableID&#8217;).rows[1];<br />
oTR.style.display = &#8216;none&#8217;;</p></blockquote>
<p>Möchte man die Zeile nun wieder anzeigen, erwartet ein korrekter Browser eigentlich das Setzen der Display-Eigenschaft auf &#8220;table-row&#8221;, also:</p>
<blockquote><p>oTR.style.display = &#8216;table-row&#8217;;</p></blockquote>
<p>Dies interpretiert der Internet Explorer allerdings nicht korrekt, er erwartet ein &#8220;display = &#8216;block&#8217;&#8221;, was wiederum in W3C-kompatiblen Browsern versagt. Die Lösung liegt in der Zuweisung eines Leerstrings an die Eigenschaft, also</p>
<blockquote><p>oTR.style.display = &#8221;;</p></blockquote>
<p>Dies wird von (allen?) Browsern richtig verstanden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=121</wfw:commentRss>
		</item>
		<item>
		<title>2 x exec() = PHP + Server hängen</title>
		<link>http://www.phpblog.de/?p=107</link>
		<comments>http://www.phpblog.de/?p=107#comments</comments>
		<pubDate>Fri, 07 Aug 2009 15:32:54 +0000</pubDate>
		<dc:creator>gabler</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.phpblog.de/?p=107</guid>
		<description><![CDATA[Es ist schon mehrfach aufgetreten, dass Seiten, die mittels exec() Programme ausführen, urplötzlich hängen. Eine genauere Analyse ergab, dass dieses Problem auftritt, wenn der Server den ersten Request noch nicht abgearbeitet hat, jedoch der Benutzer im Browser schon wieder auf einen Link geklickt hat. Ruft der zweite Request auch exec() auf, hängt der Server. Es [...]]]></description>
			<content:encoded><![CDATA[<p>Es ist schon mehrfach aufgetreten, dass Seiten, die mittels <code style="color:navy;">exec()</code> Programme ausführen, urplötzlich hängen. Eine genauere Analyse ergab, dass dieses Problem auftritt, wenn der Server den ersten Request noch nicht abgearbeitet hat, jedoch der Benutzer im Browser schon wieder auf einen Link geklickt hat. Ruft der zweite Request auch <code style="color:navy;">exec()</code> auf, hängt der Server. Es handelt sich dabei weder um ein Problem des Servers (bspw. Apache, IIS, Tomcat, usw.) noch um ein Problem des mit <code style="color:navy;">exec()</code> ausgeführten Programms (bspw. GhostScript, ImageMagick, sonstige.com, usw.exe).</p>
<p>Das Problem liegt in diesem Fall bei PHP. Da die Session noch in Verwendung ist, während der nächste Request bereits versucht, einen zweiten Prozess mit der selben Session zu öffnen, hängt der Server, falls das ganze während der Ausführung von <code style="color:navy;">exec()</code> stattfindet. Die Lösung dieses Problems ist es, die Session vor dem Aufruf von <code style="color:navy;">exec()</code> zu schließen und sie direkt im Anschluss wieder zu starten:</p>
<pre style="color:navy;">
&lt;?php
  ...
  session_write_close();
  exec($sCommand);
  session_start();
  ...
?&gt;
</pre>
<p></p>
<p>Durch das Schließen der Session kommt es nicht mehr zum Hängen des Servers. Das erneute Öffnen nach dem Aufruf von <code style="color:navy;">exec()</code> garantiert, dass alle vor Beendigung des Skriptes erfolgenden Session-Zugriffe korrekt ablaufen.</p>
<p>Links zu diesem Problem:</p>
<ul>
<li><a href="http://bugs.php.net/bug.php?id=44994" target="_blank">http://bugs.php.net/bug.php?id=44994</a></li>
<li><a href="http://bugs.php.net/bug.php?id=44942" target="_blank">http://bugs.php.net/bug.php?id=44942</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.phpblog.de/?feed=rss2&amp;p=107</wfw:commentRss>
		</item>
	</channel>
</rss>
