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.
Kommentare :
Noch keine Kommentare »
Kategorien : Coding, Shorttips
Trackbacks :
Keine Trackbacks »
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
Kommentare :
Noch keine Kommentare »
Kategorien : Coding, Shorttips, Tutorial
Trackbacks :
Keine Trackbacks »
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?
Kommentare :
Noch keine Kommentare »
Kategorien : Coding, Javascript, Lesenswert, Shorttips, Tooltip
Trackbacks :
Keine Trackbacks »
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.
Kommentare :
Noch keine Kommentare »
Kategorien : Ajax, Coding, Lesenswert
Trackbacks :
Keine Trackbacks »
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
Kommentare :
4 Kommentare »
Kategorien : Coding, ext JS, Shorttips
Trackbacks :
Keine Trackbacks »
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.
Kommentare :
3 Kommentare »
Kategorien : Coding, Shorttips
Trackbacks :
Keine Trackbacks »
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.
Kommentare :
Noch keine Kommentare »
Kategorien : cakePHP, Coding, Shorttips
Trackbacks :
Keine Trackbacks »
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');
Kommentar :
1 Kommentar »
Kategorien : Coding
Trackbacks :
Keine Trackbacks »
Tags für diesen Artikel:
Coding
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.
Kommentare :
3 Kommentare »
Kategorien : Coding, Shorttips
Trackbacks :
Keine Trackbacks »
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 :)
Kommentare :
2 Kommentare »
Kategorien : cakePHP, Coding
Trackbacks :
Keine Trackbacks »