<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hasematzel.de &#187; PHP</title>
	<atom:link href="http://hasematzel.de/blog/themen/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://hasematzel.de/blog</link>
	<description>webstandards, entwicklung, internet, kultur</description>
	<lastBuildDate>Thu, 24 Jun 2010 07:00:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Variablen aus PHP per JSON in JavaScript übergeben</title>
		<link>http://hasematzel.de/blog/2010/02/06/variablen-aus-php-per-json-in-javascript-uebergeben/</link>
		<comments>http://hasematzel.de/blog/2010/02/06/variablen-aus-php-per-json-in-javascript-uebergeben/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 20:32:24 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[variables]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=757</guid>
		<description><![CDATA[Von einem Layer in den nächsten zu kommunizieren, z. B. von PHP in JavaScript, kann schmerzhaft sein. Es wird eine Menge Überhang an Daten erzeugt, die nur zwischen Bestandteilen einer einzigen Applikation ausgetauscht werden müssen - dennoch werden diese Daten meist dringend gebraucht.]]></description>
			<content:encoded><![CDATA[<p>Es passiert mir recht oft, dass ich in einer Applikation im JavaScript-Layer auf die Werte von Variablen zugreifen muss, die eigentlich nur in PHP existieren. Meist habe ich mir in PHP ein Wörterbuch angelegt, welches Standardbegriffe enthält, die an vereinzelten Stellen in der Applikation verwendet werden. Zum Beispiel werden Fehlermeldungen (&#8220;konnte nicht gespeichert werden&#8221;, &#8220;bitte Feld %s ausfüllen&#8221;) in einer einzigen Datei zusammengefasst und zum notwendigen Zeitpunkt abgerufen und angezeigt. Das ermöglicht mir unter anderem später eine Lokalisierung der Applikation.</p>
<p>Ich beginne im Normalfall immer mit dem Backend (PHP) und setze erst später den Client-Layer (JavaScript) um. Das meiste JavaScript ist dann eine Verbesserung der Usability. Nicht selten brauche ich an manchen Stellen im JavaScript auch eine Fehlermeldung, die aber nur in PHP existiert.</p>
<h3>Der Holzhammer</h3>
<p>Die einfachste Methode ist der <code>print()</code> der Variable direkt in das JavaScript:</p>
<pre><code>&lt;?php
$error = 'Es ist ein Fehler aufgetreten';
?&gt;&lt;!DOCTYPE html&gt;
&lt;html lang="de"&gt;
&lt;head&gt;
...
    &lt;script type="text/javascript"&gt;
    var error = '&lt;?php echo $error; ?&gt;';
    alert(error);
    &lt;/script&gt;</code></pre>
<p>Die Methode ist effektiv, hat aber gehörige Nachteile:</p>
<ol>
<li>Ich habe manchmal nicht die Möglichkeit, mit PHP noch im HTML/DOM rumzuwerkeln. Manchmal will ich sie auch gar nicht haben.</li>
<li>Diese Lösung verursacht eine Sprach-Suppe, die nur sehr schwer zu betreuen ist.</li>
<li>Bei grösseren Wörterbüchern kommt man hier ganz schön ans Schwitzen.</li>
</ol>
<h3>Etwas eleganter: Ein bisschen JSON</h3>
<p>Die JavaScript-Objekt-Notation, kurz <em>JSON</em> genannt, bietet einen etwas eleganteren Weg, auch grössere Mengen von Variablen von PHP in JavaScript zu transferieren:</p>
<pre><code>&lt;?php
$errors = array(
    'errnosave' =&gt; 'Speichern fehlgeschlagen',
    'errunknown' =&gt; 'Unbekannter Fehler');
?&gt;&lt;!DOCTYPE html&gt;
&lt;html lang="de"&gt;
&lt;head&gt;
...
    &lt;script type="text/javascript"&gt;
    var errors = '&lt;?php echo json_encode($errors); ?&gt;';
    alert(errors.errunknown);
    &lt;/script&gt;</code></pre>
<p>Diese Methode hat schon einige Vorteile, aber immer noch ein paar Nachteile:</p>
<ol>
<li>Ich kann schon einige Daten an JavaScript übertragen. Das JSON-Format ist genial kurz und erzeugt für diese Aufgabe fast keinen Overhead.</li>
<li>Nachteil: Ich muss immer noch direkt ins Dokument schreiben.</li>
</ol>
<h3>Erzeugen einer eigenen dictionary.js</h3>
<p>Diese dritte Variante bemüht sich, einfach, aber so abstrakt wie möglich den Variablentransfer durchzuführen. Wir brauchen dafür drei Dateien und &#8211; wenn möglich &#8211; einen Cron, der regelmässig das Wörterbuch erzeugt.</p>
<h4>Datei Nr. 1: Die dictionary.ini</h4>
<p>In der dictionary.ini werden die Variablen abgelegt. Eine ini-Datei, weil man sie aus PHP heraus mit der Funktion <a title="Funktionsbeschreibung parse_ini_file() auf php.net" href="http://php.net/parse_ini_file">parse_ini_file()</a> so schön lesen und weiterverarbeiten kann. Eine ini-Datei ist ein einfaches Textdokument und kann so aussehen:</p>
<pre><code>; Statische Meldungen
[authentication]
variable = 'Wert'
variable2 = 'Wert2'

[errors]
errnosave = 'Es wurde nicht gespeichert'
errunknown = 'Unbekannter Fehler'</code></pre>
<p>Den Aufbau kennt man z. B. von den Smarty-Config-Dateien.</p>
<h4>Datei Nr. 2: Der Parser create_dictionary.php</h4>
<p>Ich kann meinen Parser in der Datei <em>create_dictionary.php</em> nun anweisen, die ini-Datei einzulesen und dabei die Sektionen (in den eckigen Klammern) zu berücksichtigen:</p>
<pre><code>&lt;?php
$dictionary = parse_ini_file('dictionary.ini', true);
$errors = $dictionary['errors']; // Sektion 'errors' ermitteln
?&gt; </code></pre>
<h4>Die dritte Datei: dictionary.js</h4>
<p>Nun kann ich den Array <code>$errors</code> im JSON-Format in eine Datei namens <em>dictionary.js</em> schreiben:</p>
<pre><code>&lt;?php
$data = sprintf('var DICT = %s', json_encode($errors));
$h = fopen('dictionary.js', 'w');
fwrite($h, $data);
fclose($h);
?&gt;</code></pre>
<p>Diese <em>dictionary.js</em>-Datei kann ich nun ganz normal im <code>&lt;head&gt;</code>-Bereich meiner HTML-Seite einbinden und habe Zugriff auf das <code>DICT</code>-Objekt:</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang="de"&gt;
&lt;head&gt;
...
    &lt;script type="text/javascript" src="dictionary.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
    alert(DICT.errunknown);
    &lt;/script&gt;</code></pre>
<p>Auch diese Methode kommt nicht ganz ohne Nachteile daher:</p>
<ol>
<li>Ich muss aus PHP in eine dictionary.js schreiben können, manchmal will man das aus Sicherheitsgründen nicht.</li>
<li>Ich will eine solche Schreiboperation nicht bei jedem Request auf die Applikation durchführen. Ich muss das also per Cronjob oder immer in einem Build machen.</li>
</ol>
<p>Dennoch ist die Variante &#8220;schön&#8221; genug, um in einzelnen Fällen und gerade in Web-Applikationen die Übermittlung von Variablen von PHP zu JavaScript zur Leichtigkeit werden zu lassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2010/02/06/variablen-aus-php-per-json-in-javascript-uebergeben/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Snow Leopard und Apache, PHP und MySQL</title>
		<link>http://hasematzel.de/blog/2009/09/10/snow-leopard-und-apache-php-und-mysql/</link>
		<comments>http://hasematzel.de/blog/2009/09/10/snow-leopard-und-apache-php-und-mysql/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 11:28:27 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Apache Webserver]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=695</guid>
		<description><![CDATA[Die Veröffentlichung von Apples neuer Betriebssystem-Version Snow Leopard hat für Web-Entwickler auch einige Neuerungen mitgebracht. Unter anderem wurde auch der [...]]]></description>
			<content:encoded><![CDATA[<p>Die Veröffentlichung von Apples neuer Betriebssystem-Version <a href="http://www.apple.com/macosx/">Snow Leopard</a> hat für Web-Entwickler auch einige Neuerungen mitgebracht. Unter anderem wurde auch der Apache und die PHP-Version aktualisiert. Wer wie ich nicht MAMP verwendet, hat eventuell ebenfalls eine böse Überraschung erlebt: Die angepasste Apache-Konfiguration und alle PHP-Einstellungen sind nach einem Update einfach weg, bzw. zurückgesetzt.</p>
<p>Nach wie vor lässt sich der docroot des Webservers über ein <code>http://localhost/~username</code> aurufen, aber PHP läuft dort nicht mehr und ein installiertes MySQL unter <code>/usr/local/</code> ist auf den ersten Blick auch nicht mehr da. Was ist passiert?</p>
<h3>Der neue Apache</h3>
<p>Der Apache Webserver wurde auf die Version 2.2.11 aktualisiert. Damit wurden jedoch die Einstellungen in der <code>httpd.conf</code> und vor allem unter <code>/extra/httpd-vhosts.conf</code> zurückgesetzt. Das bedeutet, trotz eines mitgelieferten PHP 5.3 funktionieren PHP-Dateien im docroot unter <code>/Users/{username}/Sites/</code> erstmal nicht. Eine Abhilfe schafft ein kurzer Sprung in die Konsole, um in der Apache-Konfiguration das Laden des PHP-Moduls wieder zu aktivieren (Bei solchen Sachen lohnt es sich, immer mal ein Backup der aktuellen Konfiguration anzulegen):</p>
<pre><code>#~&gt; sudo cp /private/etc/apache2/httpd.conf .
    ~/backup/httpd.conf.20090909.001
#~&gt; sudo vi /private/etc/apache2/httpd.conf
</code></pre>
<p>In der Datei suchen wir nach der Zeile, in der das PHP-Modul geladen wird. Die Zeile muss etwa so aussehen:</p>
<pre><code>#LoadModule php5_module    libexec/apache2/libphp5.so
</code></pre>
<p>Durch Entfernen des vorangestellten #-Zeichens und einem Neustart des Apaches wird nun das PHP-Modul geladen. Danach sollte eine im docroot des Webservers abgelegte PHP-Datei mit dem Aufruf der Funktion <code>phpinfo()</code> brav die nagelneue Version 5.3 anzeigen.</p>
<h3>Aktivieren der php.ini</h3>
<p>Bei einem Blick in die Aufstellung in der PHPInfo stellen wir fest, dass keine <code>php.ini</code>-Datei geladen wird. Stattdessen verwendet das Modul die Standardeinstellungen. Im Verzeichnis <code>/private/etc/</code> finden wir aber mehrere inaktive Versionen, die wir schnell aktivieren können:</p>
<pre><code>#~&gt; ls /private/etc/php.in*
/private/etc/php.ini.default
/private/etc/php.ini-5.2-previous
/private/etc/php.ini.default-5.2-previous
#~&gt; cd /private/etc/
#~&gt; sudo cp php.ini.default php.ini
#~&gt; sudo chmod u+w php.ini
#~&gt; sudo apachectl restart
</code></pre>
<p>Jetzt können wir an der Datei Änderungen vornehmen. Eine wichtige Neuerung in PHP5.3 ist sicherlich das Date/Timezone-Objekt. Das wirft nämlich massenweise Kompatibilitätsfehler aus, wenn Applikationen noch mit den date()-Funktionen von PHP5.2 und kleiner arbeiten. Um diese Fehler zu verhindern, sollte in der php.ini zumindest die Standard-Timezone gesetzt werden. Die unterschiedlichen Angaben (für Europa) findet man in der PHP-Dokumentation. Man öffnet die <code>php.ini</code>, sucht die Definition für <code>date.timezone</code> im Abschnitt <code>[date]</code>, setzt den Wert entsprechend (bei mir <strong>Europe/Berlin</strong>) und kommentiert die Zeile aus. Nach Speichern der Datei und eines Neustarts des Apaches sollten die Fehler verschwunden sein. Ich rate jedoch jedem Entwickler, sich <a href="http://de.php.net/manual/en/book.datetime.php">die Definition des neuen Date/Timezone-Objektes</a> anzusehen.</p>
<h3>MySQL</h3>
<p>Ich hatte vorher eine eigene MySQL-Installation unter <code>/usr/local/mysql</code> laufen. <code>/mysql</code> war dabei ein symbolischer Link auf die Bibliotheken unter <code>mysql-5.0.1a-osx10.5-x86</code>. Das Snow Leopard Update hat zwar die Bibliotheken wiederhergestellt, aber den symbolischen Link vergessen:</p>
<pre><code>#~&gt; cd /usr/local/
#~&gt; sudo ln -s mysql-5.0.1a-osx10.5-x86 mysql
</code></pre>
<p>Nebenbei sollte ich die MySQL-Version vielleicht auch einmal aktualisieren &#8211; zunächst mal klappt aber wieder der Zugriff über den Client.</p>
<p>PHP kann aber noch nicht auf MySQL zugreifen. Zunächst sind in der <code>php.ini</code> die entsprechenden mysql-Module freizuschalten (im Bereich <strong>Dynamic Extensions</strong>). Danach erscheint der Abschnitt MySQL zwar wieder brav in der phpinfo, es konnte jedoch immer noch keine Verbindung zur lokalen Datenbank hergestellt werden. Das liegt daran, das in der <code>php.ini.default</code> der Wert für das <code>mysql.default_socket</code> auf <code>/var/mysql/mysql.sock</code> steht. In meiner Installation liegt das Socket aber unter <code>/private/tmp/mysql.sock</code>. Schnell den Wert ändern, Apache neu starten und der Zugriff auf die lokale MySQL-DB klappt wieder:</p>
<pre><code>mysql.default_socket = /private/tmp/mysql.sock
mysqli.default_socket = /private/tmp/mysql.sock
</code></pre>
<p>Von meinen virtuellen Hosts hatte ich ausreichend Backups, darum war die Wiederherstellung der <code>httpd-vhosts.conf</code> nicht so schwer. Wer lokale TLDs verwendet und die Zugriffe durch Einträge in der <code>/private/etc/hosts</code> ermöglicht, muss übrigens die <em>hosts</em>-Datei nicht noch einmal anfassen: Die Einträge darin werden von Snow Leopard übernommen.</p>
<h3>Danke für die Hilfe</h3>
<p>Sehr viel geholfen haben mir dabei die Einträge von <em>tady</em> im <a href="http://wordpress.org/support/topic/306878">WordPress-Forum</a> und der Artikel <a href="http://blog.wolfgang-burger-it.de/archives/52-Snow-Leopard-Umstiegshuerden-eines-Webentwicklers.html">Snow Leopard: Umstiegshürden eines Web-Entwicklers</a> in Wookkies Blog. Danke dafür.</p>
]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/09/10/snow-leopard-und-apache-php-und-mysql/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>FirePHP als Debugger für PHP und Ajax einsetzen</title>
		<link>http://hasematzel.de/blog/2009/04/18/firephp-als-debugger-fuer-php-und-ajax-einsetzen/</link>
		<comments>http://hasematzel.de/blog/2009/04/18/firephp-als-debugger-fuer-php-und-ajax-einsetzen/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 06:40:21 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[firephp]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/?p=578</guid>
		<description><![CDATA[Jeder Entwickler benötigt einen Debugger. Abhängig von Programmiersprache und Entwicklungsumgebung gibt es unzählige Möglichkeiten, die Ausführung der entwickelten Applikation zu [...]]]></description>
			<content:encoded><![CDATA[<p>Jeder Entwickler benötigt einen Debugger. Abhängig von Programmiersprache und Entwicklungsumgebung gibt es unzählige Möglichkeiten, die Ausführung der entwickelten Applikation zu überwachen. Entwickler von Webapplikationen haben dabei oft das Problem, dass sie eine ganzheitliche Lösung brauchen, um über mehrere Ebenen zu debuggen: Das Backend (meist eine Mischung aus Datenbank und Skriptsprache), ggf. im Backend auch noch Schnittstellen zu Drittsystemen und zusätzlich das Frontend, dabei den statischen und dynamischen Anteil &#8211; zumeist JavaScript. Bei der Verwendung von asynchronen HTTP-Anfragen zurück ins Backend wird es noch komplizierter: Die Antwort auf den Request hat im Grunde keinen Platz für Log- oder Fehlermeldungen. Klar, man kann sich die Meldungen in der HTML-Seite ausgeben lassen oder man parst den Rückgabewert noch einmal durch das JavaScript. Oder man lässt den AJAX-Prozessor ins Fehlerlog des Webservers schreiben und überwacht dieses parallel auf der Kommandozeile per <em>tail</em>.</p>
<p>Alle diese Methoden bedeuten aber vermehrten Aufwand bei der Erzeugung (und später auch wieder bei der Entfernung) der Meldungen. Insbesondere steigt beim Einsatz verschiedener Mechanismen die Gefahr, dass die Debugger irgendwie ihren Weg in den Produktivcode finden, weil man nicht aufpasst.</p>
<h3>Debugging PHP im Browser</h3>
<p>Für die weit verbreitete Skriptsprache <strong>PHP</strong> gibt es auch anspruchsvollere Lösungen: Der Zend Debugger wird oft verwendet, <a href="http://www.zend.com/en/community/pdt">findet auch in PDT Einsatz</a>. Das <a href="http://aptana.com/">Aptana Studio</a> (ebenfalls ein Eclipse-Derivat) hat ein eigenes Firefox-Addon, welches sich jedoch leider ziemlich mit dem <a href="http://getfirebug.com/">unverzichtbaren Firebug</a> beisst. Allerdings besteht bei allen Helferlein das Problem, über die oben angesprochenen Ebenen hinweg zu überwachen. <a href="http://www.christophdorn.com/">Christoph Dorn</a> hat sich deshalb hingesetzt und eine feine Lösung gebaut: <a href="http://www.firephp.org/">FirePHP</a>. FirePHP ist eine weitere Firefox-Extension, die ein zuvor installiertes Firebug benötigt und dann im Firebug-Stil die Meldungen des im Backend vorhandenen Debuggers ausgibt.</p>
<h3>Was brauche ich?</h3>
<p>Die Liste der notwendigen Tools ist kurz, die Installation trivial:</p>
<ul>
<li><a href="http://www.mozilla-europe.org/de/firefox/">Den Webbrowser Mozilla Firefox</a></li>
<li><a href="https://addons.mozilla.org/de/firefox/addon/1843">Das Addon Firebug</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/6149">Das Addon Firephp</a></li>
<li>Natürlich einen Webserver mit PHP</li>
<li>Eine der FirePHP-Debugging Klassen: <a href="http://www.firephp.org/HQ/Install.htm">standalone oder für das Zend Framework</a></li>
</ul>
<p>Die weiteren Beispiele beziehen sich der Einfachheit halber auf die standalone-Version. Im Grunde reichen zwei Zeilen Code, um FirePHP ans Laufen zu bringen:</p>
<pre>&lt;?php

require dirname(__FILE__) . '/extlib/firephp-0.2.1/fb.php';
FB::log(array('Peter','Paul','Mary'), 'Names');

?&gt;</pre>
<p>Hat man die beiden Addons Firebug und FirePHP im Mozilla Firefox installiert und das Tracking für Konsole und Netzwerk eingeschaltet, bietet sich in der Firebug-Konsole ein wunderschönes Bild:</p>
<p><img class="alignnone size-full wp-image-581" title="Screenshot: FirePHP in der Firebug-Konsole" src="http://hasematzel.de/blog/wp-content/uploads/2009/04/bild-1.png" alt="Screenshot: FirePHP in der Firebug-Konsole" width="411" height="107" /></p>
<p><em>Magie!</em> Doch das ist noch nicht alles. Neben unterschiedlichen Nachrichtenarten (log, info, warn, error) gibt es <a href="http://www.firephp.org/HQ/Use.htm">unzählige weitere Einsatzmöglichkeiten</a>. Unter anderem fängt FirePHP auch Exceptions und lässt sich über ein Singleton auch als Objekt verwenden, um Traces zu bauen oder tabellarisch Inhalte anzuzeigen.</p>
<h3>Debugging AJAX-Handler per FirePHP</h3>
<p>Der Clou an der Sache: FirePHP portiert die Nachrichten über den HTTP-Header (gut, irgendwie müssen sie ja zum Browser kommen). In JSON-Syntax wird die entsprechende Meldung übermittelt. Das bedeutet, dass auch nachgelagerte Anfragen (AJAX) und deren Algoritmen brav in die Konsole schreiben. Ich muss mich also &#8211; gerade bei kleinen Projekten &#8211; nicht verbiegen, um die sonst so stillen Listener zum Reden zu bringen.</p>
<p><img class="alignnone size-full wp-image-589" title="Screenshot: JSON-Syntax im HTTP-Header" src="http://hasematzel.de/blog/wp-content/uploads/2009/04/bild-3.png" alt="Screenshot: JSON-Syntax im HTTP-Header" width="368" height="118" /></p>
<p>So kann ich das <em>console</em>-Objekt vom Firebug munter mit dem FB::-Debugger mischen und mir aus allen Teilen der Applikation Meldungen sichtbar machen.</p>
<p><img class="alignnone size-full wp-image-591" title="Mischung Firebug und FirePHP" src="http://hasematzel.de/blog/wp-content/uploads/2009/04/bild-4.png" alt="Mischung Firebug und FirePHP" width="382" height="117" /></p>
<h3>Vorsicht beim Deployment!</h3>
<p>Die Verwendung ist natürlich auch nicht ungefährlich. Man will unbedingt verhindern, dass derartige Meldungen und die Debug-Anweisungen irgendwo in einem Produktiv-System landen (das ist wohl bei jedem Debugger so). Aus diesem Grund benötigt man einen strengen Mechanismus, der auf Unaufmerksamkeit böse reagiert. Ein vernünftiger <a href="http://wordaligned.org/articles/a-subversion-pre-commit-hook">pre-commit hook</a> im Versionierungssystem bietet sich an. Wer seine Webapplikation z. B. per <a href="http://ant.apache.org/">Ant</a> bauen lässt, kann in seiner <em>build.xml</em> eine entsprechende Sicherheitsabfrage unterbringen. Für die Überprüfung bietet sich z. B. der <a href="http://pear.php.net/package/PHP_CodeSniffer">phpCodeSniffer</a> an, der sich wiederum im pre-commit hook einsetzen lässt. Dazu gibt es eine <a href="http://blog.ronnyristau.de/2008/12/04/php-code-conventions-mit-codesniffer-und-subversion/">großartige Zusammenfassung von Ronny Ristau</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2009/04/18/firephp-als-debugger-fuer-php-und-ajax-einsetzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Campfire-Chat und eine API in PHP</title>
		<link>http://hasematzel.de/blog/2008/02/08/der-campfire-chat-und-eine-api-in-php/</link>
		<comments>http://hasematzel.de/blog/2008/02/08/der-campfire-chat-und-eine-api-in-php/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 19:58:31 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Web-Entwicklung]]></category>
		<category><![CDATA[Werkzeuge]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[campfire]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/2008/02/08/der-campfire-chat-und-eine-api-in-php/</guid>
		<description><![CDATA[37signals haben sich schon vor längerer Zeit von einer Webagentur zu einem Application Service Provider gewandelt. Dabei vermieten sie Webapplikationen, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>37signals haben sich schon vor längerer Zeit von einer Webagentur zu einem Application Service Provider gewandelt. Dabei <em>vermieten</em> sie Webapplikationen, die zu ihrem eigenen Nutzen entstanden sind und nun der Öffentlichkeit zur Verfügung stehen.</strong></p>
<p>Seit heute nutze ich neben <a href="http://backpackit.com/">Backpack</a> noch einen weiteren Service der Agentur 37signals, für den ich Geld ausgebe: <a href="http://campfirenow.com/">Campfire</a>. Campfire ist ein webbasierter Chat, der besonders Entwickler bei den täglich anfallenden Aufgaben unterstützt. Ich nutze Campfire schon sehr lange als Werkzeug zur Absprache und als <em>besseren</em> Instant Messenger. Der Grund für die Entscheidung, für den Service zu bezahlen, kam durch die schon länger zurückliegende Beitragsreihe &#8220;<a href="http://www.google.de/search?q=Behind+the+scenes+37signals">Behind the scenes&#8230;</a>&#8221; im <a href="http://www.37signals.com/svn/">Blog der Firma</a>. Darin stellten die Jungs eindrucksvoll vor, wie sie ihre eigenen Produkte im täglichen Arbeitsprozess verwenden.</p>
<p>Zusätzlich habe ich eine <a href="http://labs.mimmin.com/icecube/">inoffizielle Campfire-API</a> entdeckt, die den Zugriff auf Chaträume per PHP und CURL ermöglicht. <em>Icecube</em> (so der Titel) bietet dabei genau das, was ich mir vorstelle. Rein in einen Raum, kurzes Paste und wieder raus. Genau richtig für einen post-commit hook in Subversion oder die Statusmeldung eines Systems a la twitter. <a href="http://garrettdimon.com/">Garrett Dimon</a> hatte zeitweise mal einen freien Campfire-Raum als Kommentarersatz für seine Blogbeiträge. Ein Ansatz, den ich persönlich ziemlich gut finde. Mal schauen, vielleicht gibt&#8217;s auf hasematzel.de auch bald mal ein Kommentar per Chat live mit dem Autor.</p>
]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2008/02/08/der-campfire-chat-und-eine-api-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OCI_COMMIT_ON_SUCCESS</title>
		<link>http://hasematzel.de/blog/2008/01/23/oci_commit_on_success/</link>
		<comments>http://hasematzel.de/blog/2008/01/23/oci_commit_on_success/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 14:38:43 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[adodb]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://hasematzel.de/blog/2008/01/23/oci_commit_on_success/</guid>
		<description><![CDATA[Mehr oder weniger ein Hinweis an mich selbst. PHP und Oracle haben die eine oder andere Hürde im Zusammenspiel. Nicht [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Mehr oder weniger ein Hinweis an mich selbst. PHP und Oracle haben die eine oder andere Hürde im Zusammenspiel. Nicht immer kann man von Fehlermeldungen auf die Ursache schliessen.</strong></p>
<p>Verwendet man dann noch ein Datenbank-Abstraktionslayer (z. B. AdoDB), kann die Fehlersuche bisweilen haarsträubend sein. Der Fehler: <em>Use of undefined constant OCI_COMMIT_ON_SUCCESS&#8230;</em> entsteht höchstwahrscheinlich aufgrund eines fehlendes <em>&#8211;with-oci8=&#8230;</em> in der Kompilierung von PHP. Einfach mal einen Blick in die <em>phpinfo();</em> werfen.</p>
<p>Das hat mich ein wenig Zeit gekostet. Ein <a href="http://www.symfony-project.org/forum/index.php/m/14214/">Forumsbeitrag im Symfony-Forum</a> brachte schliesslich die Erlösung. Hmpf.</p>
]]></content:encoded>
			<wfw:commentRss>http://hasematzel.de/blog/2008/01/23/oci_commit_on_success/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
