10 10 2007 Nils Hitze
Ajax ist toll, wir Requesten was das Zeug hält. Api in MSIE 7 geladen, Datensatz gelöscht, Modus gewechselt und ... WAS ZUM HENKER MACHT DER DATENSATZ DA? FF angeworfen, selber Seite, kein Datensatz. MSIE Cache gelöscht, reload, Datensatz ist weg. Google -> ajax msie cache, folgende Lösung gefunden:
<?
header( "Cache-Control: no-cache, must-revalidate" ); // HTTP/1.1
header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
?>
Hoffe es hilft.

Bookmark   at del.icio.us Digg  Technorati

02 10 2007 Nils Hitze
Weil gerade verzweifelt gesucht, hier ein Lösungsansatz. Das Problem: Wie erhalte ich die Anzahl Ergebnisse einer Suche, wenn ich den Query auf mehrere Seiten verteile. Konventionelle Lösung: Zwei Queries, einer ohne Limit, einer mit. Nachteil: Performanceeinbuße Neue Lösung: SQL_CALC_FOUND_ROWS Definitiv schneller als der alte Ansatz und gut ist. via ArrayStudios

Bookmark   at del.icio.us Digg  Technorati

11 09 2007 Nils Hitze
Das klassische Problem ist: onClick, onBlur, onMouseOut, alles ganz schön, aber der echte JScriptfetischist weiss, es gibt an passender Stelle nie den richtigen Handler. Was wäre wenn man onClose, onEmail oder onUserToDumb setzen und abgreifen könnte. Kann man, Josh Davis erklärt wie es geht. Vorsicht im Zusammenhang mit der Prototype Lib, da kann es sein das einem das um die Ohren fliegt, wenn Fragen aufkommen, einfach hier posten. Langsam könnten wir auch die JSUGMunich aufmachen, oder?

Bookmark   at del.icio.us Digg  Technorati

31 08 2007 Nils Hitze
Beim Entwickeln unserer Hauseigenen CMS Lösung ist mir heute erstmalig aufgefallen, wie sehr die verschiedenen zusammengesteckten Ajaxkomponenten an der Performance des Browsers, respektive des Rechners zehren. Lade ich unser Adressbuch neu, schlägt die Leistungsnadel meiner CPU in den roten Bereich und mein iTunes hängt. Das geht so nicht weiter, hab ich mir gedacht, also ran ans Profiling und ans Tunen. Performance sollte zwar eigentlich bei uns als Letztes kommen, aber wie schon ein kluger Mann einst sagte: Kein Plan überlebt den ersten Feindkontakt. Es gibt zum Thema Ajax (JS) Performance nicht gerade viele Beiträge und noch weniger deutsche Blogs, also sind alle Links die ich liefere ausnahmslos englisch. Nur zur Vorwarnung. Wer als Entwickler jetzt noch kein Englisch kann, an der VHS sofort anmelden und am besten noch einen Kurs bei einer Sprachschule obendrauf. Einen Skript zum aneinanderreihen von JS/CSS Files und gzipped ausgeben, liefert uns rakaz. Mit ausführlicher Anleitung und Sourcecode. Alles was man braucht ist einen mod_rewrite-fähigen Webserver und ein bisschen Geduld. Einen guten Einstiegsartikel in das Thema JScript Performance findet ihr auf Fasterj.com, von Dirk Pepperdine (also der Artikel). Sehr lesenswert. Alles was ich noch finde, folgt dann demnächst.

Bookmark   at del.icio.us Digg  Technorati

24 08 2007 Nils Hitze
Wer schonmal mit der ext JS Bibliothek gearbeitet hat, weiß, das Tool ist unglaublich mächtig. Gut dokumentiert, schwer zu verstehen, aber mächtig. Das Lieblingseinstiegsbeispiel beinahe aller ist das Data Grid, bzw. die Ajax betriebene Variante. So auch bei mir. Und ich bin gnadenlos auf die Fresse gefallen damit. A) Schön zu wissen das man zum Betreiben des Beispiels ext-base, ext-all, ext-all.css sowie ext-yui-adapter und yui braucht. Ein ganzer Riesenpacken von JS Libs sowie die richtige Includereihenfolge sind das Geheimniss. Für dieses Problem gibt es eine INCLUDE_ORDER.txt im Rootverzeichniss von ext JS. B) Erst lernen den Data Store und den XML Reader zu benutzen, die Zusatzparameter sind sehr lehrreich. So zum Beispiel die Tatsache das HTML Linkdaten in XML Daten Entityencoded werden müssen um zu funktionieren. Nagut, dass wissen viele, aber eben nicht jeder. Ausserdem gibt Data Store nach dem vollständigen LADEN der Daten keinen Callback zurück, sondern knapp nach dem Success. Für diesen Fall einen DataStore.on('load' ... Eventhandler initialisieren, der behebt das Problem mit der nachträglichen Manipulation der DOM Struktur. z.B. Lightbox auf Links in per XML geladenen Daten, etc. So, im Anschluss an soviel Gemecker noch meinen Quellcode, der zum Funktionieren aber besagte Bibliotheken braucht. Für das Debuggen benutzten wir wie immer Firebug und ich hoffe einige ext JS Anfänger haben jetzt einen ruhigeren Tag da sie sich nicht durch die Doku arbeiten müssen, sondern einfach mein Beispiel nehmen. Fragen zu dem Skript einfach stellen.

"" vollständig lesen


Bookmark   at del.icio.us Digg  Technorati

20 08 2007 Nils Hitze
Für einen Artikel wie diesen von Felix, braucht man 13 Zeichen Regex um sich viel Arbeit zu sparen. 13 Zeichen ändern die ganze Welt. 13 Zeichen und "schwupps!" schon sind all die Zeilennummern und Punkte verschwunden. Die meisten Texteditoren beherrschen RegEx-en und somit ist folgendes Stück Code die Rettung aller Copy/Paster.
\\s+\\d{1,3}\\..*
Faszinierend, oder? Wenn ihr selber sowas habt, her damit.

Bookmark   at del.icio.us Digg  Technorati

14 08 2007 Nils Hitze
Für die Lösung des folgenden Problemes, habe ich einen Ansatz in den Kommentaren dieses Beitrages gefunden. Da die aber auf englisch und verschachtelt waren und da sowas nicht genug publiziert werden kann, hier nochmal. Cake 1.2 auf PHP4 Basis verträgt sich nicht mit dem Containable- Behavior von Felix Geisendörfer. Das ist nicht Felix Schuld sondern die von PHP. Problem: Cake 1.2 auf PHP 4 kann mit dem & Referenzzeichen in einer foreach-Schleife nichts anfangen und steigt aus. Lösung: In der Datei containable.php im Verzeichniss /app/model/behavior folgende Zeilen ändern. - steht für weglöschen, + für reinkopieren. Das Ganze findet ihr ungefähr bei Zeile 140
		return;
	}
-	foreach ($this->runtime[$model->name] as $key => &$containedModel) {
+	$keys = array_keys($this->runtime[$model->name]);
+	foreach ($keys as $key) {
+            $containedModel =& $this->runtime[$model->name][$key];

        if (!empty($containedModel->__backAssociation)) {
		$ontainedModel->__resetAssociations();
	}

	return;
}
Ich hoffe das hilft allen weiter die dieses brilliante Stück Code von Felix benutzen und leider noch mit PHP 4 arbeiten müssen.

Bookmark   at del.icio.us Digg  Technorati

09 08 2007 Nils Hitze
Heute zeige ich ein Beispiel, wie man in PHP "Fatal Errors" besser handeln kann. Folgende beispiel nutzt die error_prepend_string und error_append_string um mehr aus ein Fehler zu machen, und funktioniert auch beim timeout, wo i.d.r. nichts mehr als der typische "Fatal Error...." aus PHP kommt. Man braucht ausser diese linien eine Datei (hier fatal_error.php genant) die nach dem fehler aufgeruft wird. Dort kann man z.B. ein E-Mail schicken und eine bessere HTML Seite an die Benutzer zeigen.
/**
 Show an error page when a fatal error ocurrs

 pre-/appends an HTML form to a PHP error to be able to redirect to a user-
 friendly error page.

 @param   string  $errorPage  Path to the custom error page where the user
                              should be redirected to
 @return  void
*/
function catchFatalErrors($errorPage = 'fatal_error.php')
{

// error display needs to be turned on
ini_set('display_errors','On');

// Prepend a non displaying DIV element to hide the error message and
// store the PHP error in a hidden field
$phperror = '<div id="phperror" style="display:none">'.
'<form method="POST" action="'.$errorPage.'" name="FatalError">'.
'<input type="hidden" name="hiddenErrorMsg" value="';
ini_set('error_prepend_string', $phperror);

if (file_exists($errorPage)) {

// Append javascript code which submits the form to the custom error page, if the error page exists
$phperror = '"></form></div>'.
'<script type="text/javascript">'.
'document.forms['FatalError'].submit();'.
'</script>';

} else {

// If error page does not exist hide the PHP error message and display
// a customized error text
$phperror = '"></form></div>'.
'A critical error occurred, please contact support.';

}

ini_set('error_append_string', $phperror);

}

// This calls the function to enable the functionality
catchFatalErrors('framework/modules/main/fatal_error.php');

Bookmark   at del.icio.us Digg  Technorati

09 08 2007 Nils Hitze
Dieser Artikel zeigt ein paar einfache Funktionen mit denen man die eigene Webanwendung etwas sicherer machen kann. Usereingaben Alle Formularfelder die von Benutzern ausgefüllt und übertragen werden sollten mit addslashes, htmlentities oder urlencode entschärft werden. Will man zudem noch verhindern das HTML eingefügt wird kann man mit strip_tags alle HTML-Tags entfernen oder nur bestimmte zulassen. Numerische Werte Wenn man weiß das die übertragenen Werte nur numerisch sein dürfen kann man vorher mit is_numeric abfragen ob sie es auch wirklich sind. Datenbanken Wer mit Datenbanken arbeitet sollte die Escape funktion für die jeweilige Datenbank verwenden. Für MySQL gibt es die Funktion mysql_real_escape_string. Werte die an die Datenbank übergeben werden sollten vorher mit dieser Funktion escaped werden um SQL Injection Angriffe zu verhindern. Hier ein kleines Beispiel: So sollte man es nicht machen
$user = $_GET['user'];
mysql_query("SELECT FROM tabelle WHERE user=\"$user\"");
denn ein Angreifer könnte die URL manipullieren und versuchen eine weitere SQL Anweisung ausführen zu lassen. Beispiel:   http://www.domain.de/?user=1;UPDATE... Richtig wäre so
$user = mysql_real_escape_string($_GET['user']);
mysql_query("SELECT FROM tabelle WHERE user=\"$user\"");
Es ist auch immer ratsam für jede Anwendung einen neuen Datenbank Benutzer einzurichten und diesem nur die Rechte zu geben die die Anwendung braucht. Cookie's Auch Cookies sollten wie Usereingaben behandelt werden da man auch diese manipulieren kann.

Bookmark   at del.icio.us Digg  Technorati

07 08 2007 Nils Hitze
Wer beim Verwenden mehrerer Datenbanken bzw. Datenbankzugänge in CakePHP (1.1.14.4797) auf dieses Problem stossen sollte, beisst sich daran beinahe die Zähne aus (ging zumindestens mir so). Im deutschen Raum ist die Problematik vollständig unbekannt (zuwenig cakePHP Nutzer, denke ich), im englischen ist sie nur als Ticket im Trac System von cake bekannt und die Lösung des Problems habe ich auf einer Japanischen Seite mit Hilfe von Google Sprachtools gefunden :)

Bookmark   at del.icio.us Digg  Technorati