<?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>PHP-Consulting.de</title>
	<atom:link href="http://php-consulting.de/feed" rel="self" type="application/rss+xml" />
	<link>http://php-consulting.de</link>
	<description>Entwicklung, Beratung, Konzeption und Training</description>
	<lastBuildDate>Tue, 27 Sep 2011 09:25:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ifset() oder ifsetor() ohne Notice-Fehlermeldung</title>
		<link>http://php-consulting.de/blog/2011/ifset-oder-ifsetor-ohne-notice-fehlermeldung</link>
		<comments>http://php-consulting.de/blog/2011/ifset-oder-ifsetor-ohne-notice-fehlermeldung#comments</comments>
		<pubDate>Tue, 27 Sep 2011 09:23:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=178</guid>
		<description><![CDATA[Um auf eine Variable, deren Existenz nicht gesichert ist (z.B. Benutzereingaben), mit übersichtlichem Code und ohne eine &#8220;Notice&#8221;-Fehlermeldung zuzugreifen, hilft folgende Funktion:


function ifset(&#38;$value)
{
    if(isset($value)) return $value;
}
ifset($_REQUEST['foo']);
ifset($foo);
ifset($bar['foo']);

Alle Variablen sind nicht gesetzt und es kommt, dank der Übergabe per Referenz (&#38;), zu keinen Notices.
Die Alternative ohne Funktion:
isset($_REQUEST['foo']) ? $_REQUEST['foo'] : NULL;
Sie funktioniert anstandslos, hat aber [...]]]></description>
			<content:encoded><![CDATA[<p>Um auf eine Variable, deren Existenz nicht gesichert ist (z.B. Benutzereingaben), mit übersichtlichem Code und ohne eine &#8220;Notice&#8221;-Fehlermeldung zuzugreifen, hilft folgende Funktion:<br />
<span id="more-178"></span></p>
<pre>
function ifset(&amp;$value)
{
    if(isset($value)) return $value;
}
ifset($_REQUEST['foo']);
ifset($foo);
ifset($bar['foo']);
</pre>
<p>Alle Variablen sind nicht gesetzt und es kommt, dank der Übergabe per Referenz (<code>&amp;</code>), zu keinen Notices.</p>
<p>Die Alternative ohne Funktion:</p>
<pre>isset($_REQUEST['foo']) ? $_REQUEST['foo'] : NULL;</pre>
<p>Sie funktioniert anstandslos, hat aber doppelten Code und ist insgesamt nicht schön zu lesen.</p>
<p>Die <a href="http://marc.info/?l=php-internals&#038;m=108940007627089&#038;w=2">Idee</a> dazu ist abgeleitet aus der <a href="https://wiki.php.net/rfc/ifsetor">Diskussion</a> zu einer nativen ifsetor()-Funktion.</p>
<p>Mit obiger Funktion wäre die aber aus meiner Sicht nicht nötig, da diese Problemlos mit dem Ternären Operator dargestellt werden kann:</p>
<pre>ifset($foo) ?: 'bar';</pre>
<h2>Fazit</h2>
<p>Bemüht man sich im eigenen Userland-Code möglichst objektorientiert zu Programmieren, wirkt eine selbst definierte Funktion wie ein Fremdkörper. Natürlich ist es aber auch möglich sie als statische Methode in einer Klasse zu implementieren. Dann wirkt es <em>sauberer</em>, dafür ist der Name länger.</p>
<p>Am saubersten wäre aber natürlich eine solche Funktionalität als natives internes PHP-Konstrukt. Kurzfristig ist damit aber wohl nicht zu rechnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2011/ifset-oder-ifsetor-ohne-notice-fehlermeldung/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was bedeutet &#8220;NoSQL&#8221;?</title>
		<link>http://php-consulting.de/blog/2010/was-bedeutet-nosql</link>
		<comments>http://php-consulting.de/blog/2010/was-bedeutet-nosql#comments</comments>
		<pubDate>Tue, 11 May 2010 08:44:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Theorie]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=168</guid>
		<description><![CDATA[Im Ende ist &#8220;NoSQL&#8221; ein Oberbegriff für nicht-relationale Datenbanken oder Daten-Modelle.
Es geht also um Alternativen zu dem Quasi-Standard der Relationalen Datenbanken (wie MySQL, MS SQL, Oracle, etc.) die vereinfacht auch als SQL-Datenbanken beschrieben werden. Es geht also gar nicht um die Ablehnung der Abfragesprache SQL, sondern lediglich um die Ablehnung der damit stark assoziierten Relationalen [...]]]></description>
			<content:encoded><![CDATA[<p>Im Ende ist &#8220;NoSQL&#8221; ein Oberbegriff für nicht-relationale Datenbanken oder Daten-Modelle.</p>
<p>Es geht also um Alternativen zu dem Quasi-Standard der Relationalen Datenbanken (wie MySQL, MS SQL, Oracle, etc.) die vereinfacht auch als SQL-Datenbanken beschrieben werden. Es geht also gar nicht um die Ablehnung der Abfragesprache SQL, sondern lediglich um die Ablehnung der damit stark assoziierten Relationalen Datenbanken.<br />
<span id="more-168"></span></p>
<h2>Was ist nun die Alternative?</h2>
<p>Die Alternativen gehen vom Datenmodell in zwei Richtungen. Zum einen der Verkleinerung der Datenhappen in Schlüssel-Wert-Paare (vorstellbar wie ein assoziatives Array in PHP oder eine Hash-Map in Java). Zum anderen der Vergrößerung in der Datenhappen in &#8220;Dokumente&#8221; (vorstellbar als Baum-Struktur, z.B. ein JSON-Objekt oder die DOM-Struktur einer XML-Datei).</p>
<p>Mit den richtigen Schnittstellen kann dies die Entwicklungsarbeit deutlich vereinfachen da unnötige Abstraktionen weg fallen.</p>
<p>Ein weiterer Aspekt ist oft die Skalierbarkeit von Groß- und Größtprojekten. Systeme wie Facebook, Twitter oder Digg stießen alle an die Grenzen der Skalierbarkeit.</p>
<p>Die neue Generation von Datenbanken versucht hier mit besseren Techniken der Verteilung der Datenbanken auf viele Server (z.B. <a href="http://en.wikipedia.org/wiki/Sharding">Sharding</a>) hier Verbesserungen zu erreichen.</p>
<h3>Buzzword &#8220;NoSQL&#8221;</h3>
<p>Im Ende ist &#8220;NoSQL&#8221; also eher ein ungenaues Buzzword für einen Umbruch in der Datenbank-Technik.</p>
<p>Dieser Beitrag ist natürlich nur ein kurzer Anriss. Bei Interesse werde ich dieses Thema gerne weiter vertiefen.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2010/was-bedeutet-nosql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Henne-Ei-Dilemma in der Aufwandsschätzung</title>
		<link>http://php-consulting.de/blog/2010/das-henne-ei-dilemma-in-der-aufwandsschatzung</link>
		<comments>http://php-consulting.de/blog/2010/das-henne-ei-dilemma-in-der-aufwandsschatzung#comments</comments>
		<pubDate>Sun, 24 Jan 2010 14:17:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Arbeitsweise]]></category>
		<category><![CDATA[Aufwandsschätzung]]></category>
		<category><![CDATA[Methodik]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=99</guid>
		<description><![CDATA[Die Praxis zeigt, eine realistische Aufwandsabschätzung ist eigentlich erst möglich, wenn ein Projekt schon realisiert wurde. Dann hat sie aber ihren Sinn verloren und ist auch keine Aufwandsschätzung mehr. Wir stecken somit in einem Henne-Ei-Dilemma.
Das Problem
Um Aufwand abschätzen zu können, muss natürlich erstmal der Umfang des Projekt vorliegen. Sprich: Die Anforderungen müssen klar sein.
Gerade das [...]]]></description>
			<content:encoded><![CDATA[<p>Die Praxis zeigt, eine realistische Aufwandsabschätzung ist eigentlich erst möglich, wenn ein Projekt schon realisiert wurde. Dann hat sie aber ihren Sinn verloren und ist auch keine Aufwandsschätzung mehr. Wir stecken somit in einem Henne-Ei-Dilemma.<span id="more-99"></span></p>
<h2>Das Problem</h2>
<p>Um Aufwand abschätzen zu können, muss natürlich erstmal der Umfang des Projekt vorliegen. Sprich: Die Anforderungen müssen klar sein.</p>
<p>Gerade das ist im Detail aber im Vorhinein oft nicht möglich. Aus zeitlichen oder organisatorischen Gründen oder weil die nötigen Fragestellungen eben oft erst auftreten, wenn man das Konzept im Detail umzusetzen versucht.</p>
<p>Somit müsste man also das Konzept so genau wie möglich fassen. In schriftlicher Form ist dies nur bis zu einem bestimmten Grad sinnvoll, denn sonst verliert sich schnell das Wesentliche in der Masse an Text.</p>
<p>Grafisch kann man weiter gehen: <a href="http://de.wikipedia.org/wiki/Anwendungsfalldiagramm">Anwendungsdiagramme (auch Use-Case-Diagramme)</a> für die Grobstruktur, Entwürfe für Oberflächen, klickbare <a href="http://de.wikipedia.org/wiki/Mock-up#Mock-up_in_der_Softwareentwicklung">Mock-Ups</a>/<a href="http://de.wikipedia.org/wiki/Wireframe#Web-Entwicklung">Wireframes</a> oder sogar ganze Prototypen.</p>
<p>Ein Prototyp kann, durch seine nähe zum fertigen Produkt, schon eine Fülle von Detail-Anforderungen offenbahren. Dementsprechend hat er aber auch schon einen hohen Eigenaufwand. Wegwerf-Prototypen sind aus diesem Grund eigentlich zu schade. Mehr Sinn machen sie als Vorstufe zum Endprodukt.</p>
<p>Unser eigentliches Ziel war ja aber, eine genaue Aufwandsschätzung im vorhinein. Wenn nun aber, für eine perfekte Aufwandsschätzung, erst das Endprodukt ausprogrammiert werden müsste, ist die Aufwandsschätzung ja nur noch eine Aufwandsmessung und unser Ziel verfehlt. Wir stecken also im besagten Henne-Ei-Dilemma.</p>
<h3>Schätzung bleibt Schätzung</h3>
<p>Also muss man wohl das Wort &#8220;Schätzung&#8221; in &#8220;Aufwandsschätzung&#8221; akzeptieren. Das Ergebnis bleibt also immer eine Näherung, ermittelt aus Erfahrungswerten und Intuition.</p>
<p>Hat man nur eine grobe Idee als Anforderung, ist die Schätzung ungenau. Möchte man es genauer, muss schon viel Aufwand nur für Konzeption und Prototyping eingesetzt werden.</p>
<p>Für jede Schätzung bleibt also nur die Möglichkeit, einen dem Projekt entsprechenden Mittelweg zu wählen.</p>
<h2>Alternativer Lösungsweg</h2>
<p>Eine Alternative besteht darin, das Dilemma mit in die Lösung einzubeziehen.</p>
<p>Dabei wird bewusst die Planung flach und einfach gehalten, und konzentriert sich um so mehr auf eine schnelle Entwicklung eines, in grundzügen benutzbaren, Prototypen. Dieser wird dann in weiteren Entwicklungsschleifen laufend analysiert und erweitert.</p>
<p>Dieses Vorgehen, konzentriert die Entwicklungsarbeit von sich aus auf das Wesentliche, auf einen gut funktionierenden Grundprozess.</p>
<p>Dinge entscheidet man erst dann, wenn es nötig ist. Man vermeidet es, Details schon festlegen zu wollen, wenn sie noch gar nicht überblickt werden können. Neue Anforderungen die sich erst während der Entwicklung abzeichnen, vielleicht sogar sehr wichtig sind, kann man flexibel einarbeiten. Andere Ideen aus der ursprünglichen Planung, erweisen sich manchmal als weniger wichtig und man stellt sie zurück.</p>
<h3>Fazit: Realistischere Weg?</h3>
<p>Das Henne-Ei-Problem ist somit auch hier nicht gelöst. Es bleibt nur sich zu arrangieren.</p>
<p>Der konventionelle Weg scheint mehr Vorhersehbarkeit und Sicherheit zu bieten, diese existiert aber oft sowieso nur in der Theorie. Denn die Praxis zeigt, das der alternative Weg näher an der Realität liegt, wie Projekte durchschnittlich verlaufen. Somit kann dieser Weg im Ende sogar mehr Vorhersehbarkeit bieten, nämlich das eben gerade vieles ungeplant passiert.</p>
<p>Für alle beteiligten bietet dieser Weg mehr Flexibilität sich auf das Wichtigste zu konzentrieren: Ein gutes und passendes Produkt.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2010/das-henne-ei-dilemma-in-der-aufwandsschatzung/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Roadmap für PHP 6 unklar</title>
		<link>http://php-consulting.de/blog/2010/roadmap-fur-php-6-unklar</link>
		<comments>http://php-consulting.de/blog/2010/roadmap-fur-php-6-unklar#comments</comments>
		<pubDate>Sat, 02 Jan 2010 23:33:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP 6]]></category>
		<category><![CDATA[Roadmap]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=29</guid>
		<description><![CDATA[Ein Veröffentlichungstermin für PHP 6 scheint leider immer noch unklar. Noch nicht mal ungefähre Zeitspanne ist abzusehen. Zumindest lies sich auch nach längerer Recherche keine Aussage, noch nicht mal eine wage, im Netz dazu finden. Zwar gibt es eine Todo-Liste zu PHP 6 im PHP-Wiki oder das NEWS-File aus der Versionierung, jeweils aber ohne Roadmap [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Veröffentlichungstermin für PHP 6 scheint leider immer noch unklar. Noch nicht mal ungefähre Zeitspanne ist abzusehen. Zumindest lies sich auch nach längerer Recherche keine Aussage, noch nicht mal eine wage, im Netz dazu finden. Zwar gibt es eine <a href="http://wiki.php.net/todo/php60">Todo-Liste zu PHP 6 im PHP-Wiki</a> oder das <a href="http://cvs.php.net/viewvc.cgi/php-src/NEWS?view=markup&amp;pathrev=HEAD">NEWS-File aus der Versionierung</a>, jeweils aber ohne Roadmap oder andere zeitliche Aussagen.<a href="http://aspn.activestate.com/ASPN/Mail/Message/php-dev/3780761"><br />
<span id="more-29"></span><br />
Aktuellere Diskussionen in der Developer-Mailing-Liste</a> bemühen sich zwar wieder etwas mehr Schwung in die Weiterentwicklung von PHP 6 zu bringen. Der eher träge Verlauf der Diskussionen vermittelt aber leider keine Aufbruchstimmung.</p>
<p>Es klemmt wohl immer noch an der Kernneuerung von PHP 6, der Unicode-Unterstützung.</p>
<p>Einen großen Teil der anderen Neuerungen, die eigentlich erst in PHP 6 enhalten sein sollten (<a href="http://php-consulting.de/blog/2009/namenskonventionen-fur-php-namespaces-ab-5-3">Namespaces</a>, Closures, etc.), hatte man ja glücklicherweise schon in PHP 5.3 vorgezogen.</p>
<p>Für den Großteil der hiesigen PHP-Entwicklungen ist die Verzögerung wohl nicht all zu tragisch, denn sie kommen noch gut ohne Unicode-Unterstützung aus. Schmerzlicher ist es für große internationale Projekte. Diese könnten deutlich von den verbesserten Möglichkeiten zur Internationalisierung durch Unicode profitieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2010/roadmap-fur-php-6-unklar/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Namenskonventionen für PHP-Namespaces ab 5.3</title>
		<link>http://php-consulting.de/blog/2009/namenskonventionen-fur-php-namespaces-ab-5-3</link>
		<comments>http://php-consulting.de/blog/2009/namenskonventionen-fur-php-namespaces-ab-5-3#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:23:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[5.3]]></category>
		<category><![CDATA[Coding Standards]]></category>
		<category><![CDATA[Namespaces]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=20</guid>
		<description><![CDATA[Seit der Version 5.3 unterstützt PHP ja schöner Weise Namespaces, vergleichbar z.B. mit den Packages in Java.
Um ein möglichst einheitliches Benennungs-Schema in den verschiedenen Projekten und Frameworks zu benutzen, haben sich glücklicher Weise einige Entwickler großer Projekte zusammen gesetzt und eine Empfehlung für die Benennungs-Konventionen erarbeitet.Empfohlen wird folgender Aufbau:
vendor\package_name\ClassName
Zu achten ist darauf das Klassen-Namen wie [...]]]></description>
			<content:encoded><![CDATA[<p>Seit der Version 5.3 unterstützt PHP ja schöner Weise <a href="http://de.php.net/manual/de/language.namespaces.php">Namespaces</a>, vergleichbar z.B. mit den Packages in Java.</p>
<p>Um ein möglichst einheitliches Benennungs-Schema in den verschiedenen Projekten und Frameworks zu benutzen, haben sich glücklicher Weise einige Entwickler großer Projekte zusammen gesetzt und eine <a href="http://groups.google.com/group/php-standards/web/php-coding-standard">Empfehlung für die Benennungs-Konventionen</a> erarbeitet.<span id="more-20"></span>Empfohlen wird folgender Aufbau:</p>
<pre>vendor\package_name\ClassName</pre>
<p>Zu achten ist darauf das Klassen-Namen wie &#8220;Abstract&#8221; oder &#8220;Interface&#8221; nicht erlaubt sind, da sie reservierte Wörter darstellen. In diesen Fällen wird der Name zusammengezogen:</p>
<pre>vendor\package_name\ClassNameAbstract
vendor\package_name\ClassNameInterface</pre>
<p>Bestehende Klassen-/Paket-Strukturen lassen sich auch innerhalb der neuen Namespaces abbilden:</p>
<pre>vendor\package_name\SemiPakage_ClassName</pre>
<p>Zu Exceptions gibt es noch die Empfehlung in jedem Paket eine Basis-Exception anzulegen, von der alle anderen erben können.</p>
<p>Mehr zur Entstehung der Empfehlung, findet sich auch in einem <a href="http://www.empaya.com/index.php?z=news%3A%2F%2Fnews.php.net%2Fphp.standards%2F2">News-Beitrag</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2009/namenskonventionen-fur-php-namespaces-ab-5-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String-Performance: Konkatenieren (Punkt) vs. implodieren</title>
		<link>http://php-consulting.de/blog/2009/string-performance-konkatenieren-punkt-vs-implodieren</link>
		<comments>http://php-consulting.de/blog/2009/string-performance-konkatenieren-punkt-vs-implodieren#comments</comments>
		<pubDate>Tue, 27 Oct 2009 05:58:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[implode]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[sprintf]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Tipp]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=16</guid>
		<description><![CDATA[Das performanteste um einen String zu bilden scheint mir der ordinäre Punkt-Parameter zu sein. Zwar hatte ich gelesen, implodieren von Arrays wäre schneller, sehe ich aber nicht:

&#60;?php
$t = microtime( true);
for ($i = 1; $i &#60;= 1000; $i++) {
    $b = 'foo'.'bar'.'foo'.'bar'.'foo'.'bar'.'foo';
}
echo "Punkt:   ".(microtime( true) - $t).PHP_EOL;

$t = microtime( true);
for ($i [...]]]></description>
			<content:encoded><![CDATA[<p>Das performanteste um einen String zu bilden scheint mir der ordinäre Punkt-Parameter zu sein. Zwar hatte ich gelesen, implodieren von Arrays wäre schneller, sehe ich aber nicht:<br />
<span id="more-16"></span></p>
<pre>&lt;?php
$t = microtime( true);
for ($i = 1; $i &lt;= 1000; $i++) {
    $b = 'foo'.'bar'.'foo'.'bar'.'foo'.'bar'.'foo';
}
echo "Punkt:   ".(microtime( true) - $t).PHP_EOL;

$t = microtime( true);
for ($i = 1; $i &lt;= 1000; $i++) {
    $b = implode(array( 'foo','bar','foo','bar','foo','bar','foo'));
}
echo "Implode: ".(microtime( true) - $t).PHP_EOL;

$t = microtime( true);
for ($i = 1; $i &lt;= 1000; $i++) {
    $b = sprintf( '%s%s%s%s%s%s', 'foo','bar','foo','bar','foo','bar','foo');
}
echo "Sprintf: ".(microtime( true) - $t).PHP_EOL;
?&gt;
Punkt:   0.0010280609130859
Implode: 0.0029480457305908
Sprintf: 0.0025858879089355</pre>
<p>Ist ja recht eindeutig. Sprintf wurde auch manchmal erwähnt, ist zwar noch etwas schneller als das implodieren, persönlich finde ich es aber unleserlich.</p>
<p>Mich hat es schon immer etwas gewundert das es so einen schönen, wunderbar einfachen, Punkt-Operator gibt, den man dann aus nicht verwenden soll. In <a href="http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html">Java ist das aus Performance-Sicht</a> wohl so (dort natürlich + statt . als Operator). Hängt vermutlich damit zusammen das dort normale Strings eine fixe länge haben. Das kennt PHP ja erst gar nicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2009/string-performance-konkatenieren-punkt-vs-implodieren/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP-Fehlermeldungen klickbar machen</title>
		<link>http://php-consulting.de/blog/2009/php-fehlermeldungen-klickbar-machen</link>
		<comments>http://php-consulting.de/blog/2009/php-fehlermeldungen-klickbar-machen#comments</comments>
		<pubDate>Thu, 19 Feb 2009 10:41:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Arbeitserleichterung]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[TextMate]]></category>
		<category><![CDATA[Tipp]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[URL-Schema]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=10</guid>
		<description><![CDATA[Durch einen Trick habe ich mir ermöglicht PHP-Fehler über einen Klick direkt im Code in der richtigen Zeile anzuspringen. Das funktionieren ist allerdings von den Möglichkeiten des Editors abhängig.Folgendes habe ich dafür in meine  httpd.conf des Apache geschrieben:
php_value error_prepend_string "&#60;div style=\"cursor:pointer;\" onClick=\"bs = this.getElementsByTagName( 'b'); url = 'txmt://open/?url=file://' + bs[1].firstChild.data + '&#38;line=' + bs[2].firstChild.data; window.location.href [...]]]></description>
			<content:encoded><![CDATA[<p>Durch einen Trick habe ich mir ermöglicht PHP-Fehler über einen Klick direkt im Code in der richtigen Zeile anzuspringen. Das funktionieren ist allerdings von den Möglichkeiten des Editors abhängig.<span id="more-10"></span>Folgendes habe ich dafür in meine  <var>httpd.conf</var> des Apache geschrieben:<br />
<code><a href="http://php.net/configuration.changes">php_value</a> <a href="http://php.net/manual/errorfunc.configuration.php#ini.error-prepend-string">error_prepend_string</a> "&lt;div style=\"cursor:pointer;\" onClick=\"bs = this.getElementsByTagName( 'b'); url = '<a href="http://manual.macromates.com/en/using_textmate_from_terminal#url_scheme_html">txmt:</a>//open/?url=file://' + bs[1].firstChild.data + '&amp;line=' + bs[2].firstChild.data; window.location.href = url;\"&gt;"<br />
php_value <a href="http://php.net/manual/errorfunc.configuration.php#ini.error-append-string">error_append_string</a> "&lt;/div&gt;"</code></p>
<p>Das Resultat ist eine grafisch  gleich gebliebene Fehlermeldung, die  bei einem Klick eine spezielle URL zusammen setzt die Pfad und Zeile der Fehlerursache enthält und diese aufruft. Der Browser oder das System übergibt diese an den Editor der dann die Datei an der richtigen Stelle öffnet.</p>
<p>Wie man sieht eine gute Mischung aus:</p>
<ul>
<li><a href="http://php.net/configuration.changes">PHP-Einstellungen in Apache Konfiguration</a> (optional in <var>php.ini</var> oder per <a href="http://php.net/manual/de/function.ini-set.php">ini_set</a>)</li>
<li>angepasste <a href="http://php.net/manual/errorfunc.configuration.php#ini.error-prepend-string">PHP-Einstellungen</a> für Fehlerausgabe</li>
<li>JavaScript im onClick-Handler das über DOM Pfad und Zeile ausliest</li>
<li>URL mit speziellem Schema (Editor-/Browser-/Systemabhängig, in meinem Fall <var><a href="http://manual.macromates.com/en/using_textmate_from_terminal#url_scheme_html">txmt:</a></var>)</li>
<li>Editor mit entsprechender Funktionalität (in meinem Fall <a href="http://macromates.com/">TextMate</a> auf Mac OS)</li>
</ul>
<p>Kritisch sind die beiden letzten Punkte. Die Schemabehandlung lässt sich wohl noch in vielen(?) Browsern einstellen, Editoren die aber auch ein entsprechendes Schema unterstützen sind mir sonst keine bekannt. Hinweise nehme ich gerne entgegen. Vielleicht gibt es ja auch noch ganz andere ähnliche Möglichkeiten?</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2009/php-fehlermeldungen-klickbar-machen/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQLi Prepared Statements leider langsamer</title>
		<link>http://php-consulting.de/blog/2007/mysqli-prepared-statements-leider-langsamer</link>
		<comments>http://php-consulting.de/blog/2007/mysqli-prepared-statements-leider-langsamer#comments</comments>
		<pubDate>Sun, 18 Feb 2007 12:57:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tipp]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=8</guid>
		<description><![CDATA[Die Prepared Statements der Query Cache von MySQL nutzen. Dies ist sehr schade, denn der bringt gerade bei Select-Zugriffen Geschwindigkeitsvorteile.Für die meisten durchschnittlichen Projekte wird dieser Nachteil der Prepared Statements, durch die Vorteile (Sicherheit, sauberer Code) wohl übertrumpft.
Möchte man aber auf den Query Cache nicht verzichten, bleibt nur die Möglichkeit die SQL-Anfragen wie gehabt aus [...]]]></description>
			<content:encoded><![CDATA[<p>Die Prepared Statements der <a href="\">MySQLi Extension</a> (also der neueren mit dem &#8220;i&#8221; hinten) können bisher leider nicht den <a href="\">Query Cache von MySQL</a> nutzen. Dies ist sehr schade, denn der bringt gerade bei Select-Zugriffen Geschwindigkeitsvorteile.<span id="more-8"></span>Für die meisten durchschnittlichen Projekte wird dieser Nachteil der Prepared Statements, durch die Vorteile (Sicherheit, sauberer Code) wohl übertrumpft.</p>
<p>Möchte man aber auf den Query Cache nicht verzichten, bleibt nur die Möglichkeit die SQL-Anfragen wie gehabt aus Zeichenketten zusammen zu setzen.</p>
<p>Dieses Problem beruht auf der zugrunde liegenden C API, betrifft also nicht nur PHP. Es gibt aber Bemühungen diesen <a href="\">Misstand</a> in PHP6 zu beseitigen.</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2007/mysqli-prepared-statements-leider-langsamer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie alles anfing</title>
		<link>http://php-consulting.de/blog/2007/wie-alles-anfing</link>
		<comments>http://php-consulting.de/blog/2007/wie-alles-anfing#comments</comments>
		<pubDate>Sat, 17 Feb 2007 19:19:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[In eigener Sache]]></category>
		<category><![CDATA[Bloghistorie]]></category>

		<guid isPermaLink="false">http://php-consulting.de/?p=5</guid>
		<description><![CDATA[Eher zufällig bin ich an die Adresse php-consulting.de gekommen. Ich konnte nicht widerstehen. Nun muss ich mir überlegen was ich mit ihr mache. Zwar hab ich schon einen sehr tiefen Einblick in PHP und helfe immer gern,  hätte mich aber trotzdem nie als Consultant bezeichnet!
Somit gibt es erst mal dieses Blog und dann mal [...]]]></description>
			<content:encoded><![CDATA[<p>Eher zufällig bin ich an die Adresse php-consulting.de gekommen. Ich konnte nicht widerstehen. Nun muss ich mir überlegen was ich mit ihr mache. Zwar hab ich schon einen sehr tiefen Einblick in PHP und helfe immer gern,  hätte mich aber trotzdem nie als Consultant bezeichnet!</p>
<p>Somit gibt es erst mal dieses Blog und dann mal schauen &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://php-consulting.de/blog/2007/wie-alles-anfing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

