C# Hochkomma maskieren für SQL-Statements (SQL-Escape)

Ein häufiges Problem im Umgang mit Strings oder SQL-Statements sind Hochkommas. Diese unscheinbaren Zeichen (’ oder „) bereiten immer wieder Probleme. Manchmal auch an Stellen, die man die erwartet hätte.
Gerade beim Zugriff auf SQL-Datenbanken kann sich ein solches Problem zur Laufzeit einschleichen. Dann nämlich, wenn in einem SQL-Statement beispielsweise Benutzer-Eingaben verarbeitet werden. Aber nicht nur der Benutzer, der in ein Textfeld Hochkommas platziert, auch in der Datenverarbeitung stößt man auf dieses Problem. Spätestens, wenn der erste Datensatz mit dem Namen „O’Henry“ auftaucht. Und in jeder Stadt gibt es ein Irish-Pub-Besitzer, der so heißt …

Warum Hochkommas ein Problem sind
In einer Stringzuweisung bereitet das folgende Beispiel kein Problem:

string sHochkommaTest = „Mein Name ist O’Henry“;

Doch dieses Beispiel wird sofort zu Problemen führen:

string sHochkommaTest = „Bitte drücken Sie die „OK“-Taste“;

Was hier hilft ist eine Maskierung des Hochkommas. In C# behilft man sich dem Backslash („“). So ist das folgende Beispiel valider Code:

string sHochkommaTest = „Bitte drücken Sie die „OK“-Taste“;

Hochkommas in jeder Ausprägung werden dann zum Problem, wenn das Hochkomma selbst in einem Statement eine bestimmte Funktion erfüllen. So das doppelte Hochkomma („) bei einer Stringzuweisung, oder das einfache Hochkomma (‚) in einem SQL-Statement.

Hochkomma in einem SQL-Statement maskieren
Hier kann es sehr schnell gefährlich werden. Nehmen wir an, sie nehmen eine Benutzereingabe entgegen wie beispielsweise den Benutzername des Users, den sie in einer Datenbank gespeichert haben und nun prüfen möchten, ob der Benutzer dem System bekannt ist. So könnte das folgende Beispiel aussehen:

SELECT id, name, vorname, pw FROM benutzer WHERE name=’$benutzereingabe’;

In der Variable „$benutzereingabe“ ist der eingegeben Benutzer gespeichert. Und nun kommt unser Herr O’Henry, gibt seinen Namen ein und erzeugt einen Fehler (was das kleinste Problem ist). Er macht nämlich aus unserem SELECT folgendes:

SELECT id, name, vorname, pw FROM benutzer WHERE name=’O’Henry’;

Jeder SQL-Parser wird hier einen Fehler melden. Damit nicht genüg: Solche Fehler sind ein Einfallstor für Hacker in eine Anwendung. Wenn Benutzereingaben gegen eine Datenbank nicht von der Anwendung schon geprüft und maskiert werden, kann dies eine böse Sicherheitslücke ergeben.

Also muss unsere Benutzereingabe geprüft und gegebenenfalls maskiert werden. Man wünscht sich in C# eine Funktion wie in PHP die Funktion mysql_real_escape_string, die dafür sorgt, dass alle Sonderzeigen in der übergebenen Variable auf Sonderzeigen geprüft und ordentlich maskiert werden. Doch meines Wissens gibt es in C# so etwas (einfaches und sicheres) nicht. Weder String-Literale noch LINQ bringen wirkliche Verbesserung.
Während das String-Literal („@“) doppelte Hochkommas filtert (und einige nette weitere Erleichterungen bereithält), löst er jedoch nicht das Problem des einfachen Hochkommas:

string x = @"Joe said ""Hello"" to me";   // Joe said "Hello" to me
string y = @"Joe said ''Hello'' to me";
Console.WriteLine(x);
Console.WriteLine(y);
Console.ReadLine();

So sind beide Zeilen gültiger C#-Code, doch zwei hintereinander folgende einzelne Hochkommas bleiben erhalten. Zumal diese Idee ein „WHERE name =’O’Henry’“ auch nicht lösen würde.

Maskierung für SQL-Statements
Eine ganz einfache Hilfe ist die untenstehende Funktion, über die jede Variable, die in ein SQL-Statement eingebaut werden soll, geschickt werden muss. Diese Funktion macht nichts anderes, als ein einfaches Hochkomma in zwei Hochkommas zu maskieren. Der SQL-Parser wird dieses Ergebnis ohne Fehler verarbeiten.

private static string maskiere(string sValue)
{
    return sValue.Replace("'", "''");
}

Problem der Maskierung
Diese Lösung wird vielleicht folgendes Problem erzeugen: Wenn Sie ein SQL-Ergebnis haben, das Sie bereits durch diese Funktion geschickt haben, das Ergebnis also zwei Hochkommas hintereinander hat, und Sie speichern diesen Code erneut (mit dieser Funktion), werden aus zwei Hochkommas hintereinander (“) vier Hochkommas (““). Und dies wird Ihnen der SQL-Parser sehr übelnehmen.

Die SQL-Lösung zur Maskierung eines SQL-Statements
Wir haben nun viele Möglichkeiten beleuchtet, haben aber noch nicht die wirklich allumfassende perfekte Lösung für C# gefunden. Aber keine Sorge, es gibt sie. Einfach im Artikel „PHP-Funktion mysql_real_escape_string in C# umsetzen“ weiterlesen …

C# String-Literale (Stringliteral)

Eine Möglichkeit der Problematik von zwei doppelten Hochkommas hintereinander („“) zu begegnen oder um den Backslash bei Pfadangaben zu ermöglichen, ist der String-Literal. Sicherlich ist Ihnen in fremden Programmen schon mal aufgefallen, dass vor manchen String-Zuweisungen das AT („@“) steht.

So erzeugt folgende C#-Zeile einen Fehler:
string sLiteral = „Bitte drücken Sie die „OK“-Taste“;

Sie können dieses Problem so umgehen:
string sLiteral = „Bitte drücken Sie die „OK“-Taste“;

Oder noch besser mit dem String-Literal („@“):
string sLiteral = @“Bitte drücken Sie die „“OK““-Taste“;
Durch das AT (@)-Zeichen weisen Sie den C#-Interpreter an, er möge bitte zwei Hochkommas hintereinander als eines betrachten. Der String wird so valide.
So werden aber auch Steuerzeichen durch ein Literal nicht umgesetzt, was meistens wünschenswert ist. Nehmen wir als Beispiel dem Tabulator und den Klassiker „Hello world“:

string Literal1 ="Hello t world";               // Hello     world
string Literal2 = @"Hello t world";               // Hello t world

Besonders beliebt und sinnvoll die der String-Literal in Pfadangaben.
So wird C# die folgende Zeile mit „Nicht erkannte Escapesequenz“ anmäckern:

string sMeinPfad = „c:mein-ordnermeine-datei.txt“;

Mit zwei Backslash wird der String valide:
string sMeinPfad = „c:\mein-ordner\meine-datei.txt“;

Als Literal schreiben Sie folgendes:
string sMeinPfad = @“c:mein-ordnermeine-datei.txt“;

Um Server oder Dateien via UNC-Pfad anzusprechen, benötigt man den doppelten Backslash (\). So kann ich aus zwei Slashs vier schreiben, um mein Ergebnis zu erreichen:

string Con = „\\server\freigabe\file.txt“;   // \serverfreigabefile.txt

Oder

string Con = @“\serverfreigabefile.txt“;      // \serverfreigabefile.txt

Einen wirklichen Mehrwert bieten das C#-String-Literal allerdings durch seine Multi-Line-Fähigkeit. Wenn wir gezwungen sind, einen String über mehrere Zeilen zu schreiben, werden die meisten Programmierer dies in etwa so erledigen:

string sLangerString = "Dies ist der Beispielcode für einen langen, " +
"sehr langen String. Dadurch, dass ich als herrschender Programmierer " +
"den String über mehrere Zeilen ziehen möchte, muss ich die einzelnen " +
"Teile mit einem Plus verknüpfen";

Stattdessen kann man unter Zuhilfenahme des AT (@) wie folgt schreiben:

string sLangerString = @"Dies ist der Beispielcode für einen langen,
sehr langen String. Nun verknüpfen wir den Code nicht mit einem
Plus, sondern nutzen den Vorteil eines String-Literals der es
ermöglicht, den Zeilenumbruch zu ignorieren";

Auch bei SQL-Statements, die ja bekanntlich meist aus längeren Zeichenfolgen bestehen, leisten die String-Literale gute dienste. Wie man zusätzlich noch Hochkommas maskiert, beschreibe ich im Artikel „C# Hochkomma maskieren für SQL-Statements (SQL-Escape)„.

WordPress Plugin Similar Posts: Ähnliche Artikel und Beiträge anzeigen

Leider bietet WordPress von Haus aus keine Möglichkeiten, die meistgelesenen Artikel  oder thematisch passende Artikel zu einem aufgerufenen Beitrag anzuzeigen. Beides sind jedoch nicht nur aus SEO-Sicht wünschenswerte Anzeigen (beides sorgt für eine positive interne Verlinkung), sondern bietet für den Leser einen echten Mehrwert. Gerade die thematisch passenden Artikel können einem Leser, der beispielsweise über eine Suchmaschine einen Artikel gefunden hat, noch weitere, vielleicht tiefergehende Informationen verschaffen.

In diesem Artikel möchten wir uns mit der Möglichkeit der „ähnlichen Artikel“ beschäftigen. Wer nur eine Box mit den „meistgelesenen Artikel“ möchte, dem sei der Artikel „WordPress Plugin: Popular Posts (Populärste oder meistgelesene Artikel)“ ans Herz gelegt. Es macht jedoch Sinn, beide Plugins zu installieren, da beide Plugins vom selben Autor stammen, gut miteinander harmonieren und beide auch eine spezielle Library benötigen, die man dann nur einmal installieren muss.

Auch hier stößt man bei der Suche nach einem geeigneten Plugin auf viele, vielleicht zu viele Plugins, so dass die Qual der Wahl groß ist. Ich habe mich für das Plugin „Similar Posts“ entschieden, da es einerseits gut mit dem vom gleichen Autor erstellen Plugin „Popular Posts“ harmoniert, andererseits ich mit den Plugins des Autors „Rob Marsh“ bereits sehr gute Erfahrungen gemacht habe. Und auch dieses Plugin hat mich nicht enttäuscht.

Installation des Plugin „Similar Posts“
Die Installation ist simpel. Entweder die Dateien von Similar Posts direkt downloaden und via FTP im Ordner „plugins“ kopieren, oder einfach den Installations-Wizzard von WordPress bemühen. Aber Achtung: Zur Installation gehört auch das Plugin „post-plugin Library“ des gleichen Autors. Dies muss mit installiert werden! Ich empfehle, die Library (Installation analog jedem anderen Plugins) zuerst zu installieren. Man erspart sich einige Fehlermeldungen …

Similar Posts auf Deutsch installieren
Ich habe aktuell keine deutsche Version dieses Plugins gefunden. Benötigt wird nur eine übersetzte „mo/po“-Datei. Bei Bedarf einfach weiter googlen. Ich erachte dies aber auch als nicht sehr notwendig. Viel wichtiger ist nämlich, dass das Plugin mit den Eigenschaften der Sprache umgehen kann. Und da hat der Autor neben Englisch auch Deutsch, Französisch, Italienisch und Spanisch berücksichtigt. So beinhaltet die Standard-Konfiguration bereits Stoppwörter und Stemmer, also Konstruktionen für den Aufbau der Wörter der jeweiligen Sprache. Das Plugin selbst prüft, in welcher Sprache WordPress installiert wurde und ordnet so die richtigen Stoppwörter zu.
Um es kurz zu machen: Das Plugin bringt schon von Haus aus alles Notwendige mit, um mit der Deutschen Sprache umzugehen. Der Benutzer muss hier nichts einstellen und sich keine Gedanken machen.

Konfiguration des Plugin „Similar Posts“
Auch die Konfiguration ist einfach, sofern man ein Theme in WordPress nutzt, das Widgets unterstützt und man die Anzeige in der Sidebar möchte. In diesem Fall navigiert man lediglich im Dashboard unter „Design/Widgets“ und zieht das Plugin „Similar Posts+“ in die Sidebar. Und siehe da, WordPress zeigt nun bei jedem Artikel fünf ähnliche Artikel an.
Weitere Einstellungen können selbstverständlich noch vorgenommen werden. Eine passende Überschrift, die Menge der angezeigten Artikel und weitere Dinge. Doch schon die Standardeinstellung dürfte die meisten Wünsche abdecken.

„Ähnliche Artikel/Beiträge“ unter dem Artikel oder Beitrag
Auch dieser Wunsch ist nicht schwierig zu erfüllen, jedoch nicht einfach per Drag & Drop erledigt. Denn hierfür muss die Theme angepasst werden. Je nach Wunsch betrifft es die Templates „single.php“ und/oder „page.php“. Diese im Template-Ordner abgelegten File sind um den PHP-Aufruf:

<? PHP similar_posts(); ?>

an der gewünschten Stelle zu erweitern. Eine komplette single.php mit den Änderungen (sowie einer Überschrift) ist untenstehend abgebildet.

Wie funktioniert Similar Posts?
Ich analysiere eigentlich jedes Plugin, nachdem ich es getestet habe. Wenn ich von einem Plugin begeistert bin (so wie von diesem), dann bin ich umso gespannter, wie der Autor ein Problem gemeistert hat. Gerade bei diesem Problem, nämlich sprachübergreifend ähnliche Artikel zuzuordnen, kommt man schnell an seine Grenzen. Anhand des Titels über SQL ähnliche Titel herauszusuchen, ist ein netter Ansatz. Doch man merkt schnell, dass dies nicht die ganze Lösung sein kann.
Rob Marsh, der Autor dieses WordPress-Plugins, bedient sich der Text-Rank-Analyse (TextRank: Bringing Order into Texts) von  Rada Mihalcea und Paul Tarau vom Department of Computer Science, University of North Texas. Hier wird beschrieben, wie Texte analysiert und aufgrund dieser Analyse Texte verglichen werden. Einem ähnlichen Algorithmus bedienen wir uns fast tagtäglich: Über die Suchmaschine Google.

Singe.php (Speichern in UTF-8!)

<?php
/**
 * The Template for displaying all single posts.
 *
 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */

get_header(); ?>

		<div id="container">
			<div id="content" role="main">

			<?php
			/* Run the loop to output the post.
			 * If you want to overload this in a child theme then include a file
			 * called loop-single.php and that will be used instead.
			 */
			get_template_part( 'loop', 'single' );?>
			<br><strong>Diese Beiträge könnten Sie auch interessieren:</strong>
			<?php similar_posts();
			?>

			</div><!-- #content -->
		</div><!-- #container -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

WordPress Plugin: Popular Posts (Populärste oder meistgelesene Artikel)

Sicher nicht erst, wenn der Blog oder das WordPress CMS eine gewisse Menge an Artikel enthält kommt der Wunsch auf, dass die populärsten oder meistgelesenen Artikel an prominenter Stelle in der Sidebar noch einmal verlinkt werden. Dieser Wunsch hat nicht nur den Hintergedanken, dass wenn viele Leser einen Artikel angeklickt haben (und er wohl deswegen interessant war), er somit auch für andere Leser interessant sein könnte, sondern auch den Gedanken an die interne Verlink-Struktur, die aus SEO-Sicht wichtig ist und das Suchmaschinen-Ranking positiv beeinflussen kann.
Was auch immer der Grund für den Wunsch ist: Eine nette Anzeige ist dies allemal und füllt so manche leere Sidebar mit wichtigem Inhalt (Content).

Wie fast immer bei der Suche nach einem geeigneten WordPress Plugin, stößt man auch bei diesem Thema über unzählige Plugins. Viele schon lang nicht mehr weiterentwickelt, manche in einem Beta-Stadium verwaist, so dass die Qual der recht groß ist. Meine Wahl fiel auf das Plugin „Popular Posts“ von „Rob Marsh“. Da ich mit weiteren Plugins von Rob Marsh durchaus zufrieden bin (siehe auch „WordPress Plugin Similar Posts: Ähnliche Artikel und Beiträge anzeigen“), war dieser Schritt ein sehr kleiner. Wie viele seiner Plugins benötigt auch „Popular Posts“ die Library „post-plugin“. Wer auf der Suche nach einem einfachen „Popular-Post-Plugin“ ist, mag es etwas als übertrieben erachten, auch noch eine Library zu installieren. Da aber dieses Plugin meistens auch gleich noch mit einem Plugin „Ähnliche Artikel/Beiträge“ wie das Plugin „similar posts“ von Rob Marsh installiert wird (das ebenfalls diese Library benötigt), stellt sich dieses Problem nicht; einmal die Library installiert und man macht sich da keine weiteren Gedanken.

WordPress Plugin Popular Posts auf Deutsch
Ich habe aktuell keine deutsche Version dieses Plugins gefunden. Ich erachte dies aber auch als nicht sehr notwendig. Die Konfiguration ist klein und übersichtlich (und in englischer Sprache). Die Ausgabe an den Leser kann angepasst werden. Eine Überschrift wie „Die populärsten Artikel“ oder „meistgelesene Blog-Beiträge“ kann im Einstellungs-Bereich des Plugin angegeben werden.

Installation von „Popular Posts“
Wie bereits erwähnt ist die Voraussetzung für dieses WordPress Plugin die Library „post-plugin Library“. Diese Library wird wie jedes Plugin einfach über das Dashboard installiert und aktiviert. Danach einfach das Plugin „Popular Posts“ installieren und aktivieren.
Beide Plugins können auch über das Dashboard/Plugins/installieren gesucht und installiert werden. Achtet bei der Auswahl einfach auf den Autor „Rob Marsh“.

Konfiguration von „Popular Posts“
Wer ein Widget-fähiges Template nutzt und die Anzeige der meistgelesenen Artikel in der Sidebar anzeigen möchte, hat die Konfiguration schnell angeschlossen: Einfach unter „Design/Widgets“ den Button „Popular Posts +“ in die Sidebar ziehen und kurz anpassen. So macht sicherlich eine deutsche Überschrift wie „Meistgelesene Artikel“ Sinn. Die Standard-Anzahl von fünf Artikeln kann bereits genügen.

Popular Posts-Plugin zeigt keine Artikel an
Dies wird bei der ersten Anzeige wahrscheinlich so sein. Denn die Zählung beginnt erst mit der Installation des Plugins. Einfach einmal zwei oder drei Artikel anklicken, und das Plugin sollte Artikel anzeigen und das englische „No Posts“ verschwindet.

WordPress: Artikel-Kategorie richtig ändern – SEO Permalink: Auswirkung auf Google-Ranking

Als richtiger SEO-Kenner nutzen Sie bestimmt Permalinks. Für alle, die keine SEO-Spezialisten sind, sei der Artikel „Permalinks und htaccess richtig anlegen“ ans Herz gelegt. Wir sind uns also der Bedeutung von Keywords in der URL eines Artikels durchaus bewusst und werden eine Änderung der URL sprichwörtlich so scheuen wie der Teufel das Weihwasser.
Nun stehen wir allerdings vor folgendem Problem: In unserem WordPress-CMS haben wir auch Kategorien angelegt, die Bestandteil der URL sind. Beispielsweise führt „domain.tdl/meine-kategorie/der-artikelname-POST_ID.html“ zu einem unserer Artikel. Wenn wir nun im Laufe der Zeit erkennen, dass wir eine Kategorie zu eng gefasst haben und die Kategorie erweitern möchten, stehen wir vor einem Problem und vor allem vor der Frage: Wie wirkt sich die Änderung der Kategorie auf das Google-Ranking aus?

Wir nehmen folgendes Beispiel der Kategorie-Änderung an:
Unsere Kategorie heißt „Computer“. Am Anfang dieses Blocks war diese Kategorie treffend genug. Heute sind hier viele Artikel über „Gimp“, „MySQL“, „SQL-Server“ und weitere Themen erschienen. Zu diesen Themen findet Ihr hier mehrere Artikel. Also ist der Wunsch naheliegend, die Kategorien zu erweitern, also eine Kategorie-Änderung oder Unter-Kategorien zu erstellen.
Mit der Kategorie-Änderung eines Artikels ändert sich auch der Permalink. Also wird beispielsweise aus „domain.tdl/computer/mein-artikel-ueber-sql-server.html“ dann „domain.tdl/sql-server/mein-artikel-ueber-sql-server.html“.

301: Moved Permanently
Die Lösung ist einfach, aber sehr aufwändig. Wie im Artikel „Weiterleitung Mod-Rewrite: 301 von altem CMS zu WordPress“ beschieben, kann über eine 301-Weiterleitung von der alten an die neue URL eine Weiterleitung erzeugt werden. Der Besucher merkt lediglich in der URL-Zeile, dass sich die Adresse geändert hat. Google und alle anderen Suchmaschinen werten diesen Fehlercode aus und bereinigen ihren Index. Negative Auswirkungen auf das Suchmaschinen-Ranking gibt es nicht. Also wie im genannten Artikel beschrieben, muss dann JEDER Artikel so in der servereigenen .htaccess-Datei aufgeführt werden. Eine kurzbeschreibende Regel kann in den meisten Fällen nicht gefunden werden.

Kann WordPress 301-Fehler nicht selbst generieren?
Gehen wir also der Frage nach, wie WordPress mit unserem „Problem“ umgeht. Wir können sehr schnell erkennen, dass die Kategorieangabe im Permalink WordPress eigentlich nicht wirklich interessiert. So führt „domain.tld/ALTE-KATEGORIE/artikel.html“ und „domain.tld/NEUE-KATEGORIE/artikel.html“ zum gleichen Artikel. Wenn wir die Permalinks in Form „%category%/%post_name%-%post_id%.html“ angelegt haben, ist auch der Post-Name unerheblich. So führt „/artikel-1.html“ zum Artikel mit der ID 1, wie auch „/blubber-1.html“. Und spätestes jetzt schellen die Alarmglocken. Denn wir wissen, dass die Suchmaschinen nichts weniger lieben, als Artikel, die über mehrere URLs zu erreichen sind. „Duplizierter Content“ oder „Duplicate Content“ und Canonical-Tag sind hier die Stichwörter für eine Google-Suche.

Warum viele SEOs gerne auf WordPress als CMS (Content Management System) setzen, liegt in der Tatsache begründet, dass WordPress aus SEO- und Suchmaschinensicht vieles richtig macht. Und so würde es sehr enttäuschen, wenn die Macher von WordPress dieses Problem nicht richtig umgesetzt hätten. Also ordnen wir einfach mal einen Artikel einer anderen Kategorie zu. Wir können diesen Artikel nun über die alte, wie auch über die neue URL aufrufen. Und wir sehen, dass sich die URL ändert. Also liegt der begründete Verdacht nahe, dass die URL per 301 automatisch von WordPress weitergeleitet wurde.
Die letzte Gewissheit gibt uns der HTTP-Header. In diesem Header muss ein eventueller 301 Fehler samt Weiterleitung enthalten sein. Am Einfachsten ist der Header über einen HTTP-Viewer wie beispielsweise „Rex Swain´s HTTP Viewer“ auszulesen. Wenn wir über diesen Viewer unseren alten Link aufrufen, sehen wir neben vielen anderen Daten auch die Zeile

HTTP/1.1 301 Moved Permanently

Nun wissen wir, dass wir uns keine Gedanken machen brauchen, wenn sich eine Kategorie in unserem WordPress-CMS bei einem Artikel ändert. WordPress selbst sorgt dafür, dass die Links über den alten wie auch über den neuen Link erreichbar sind und sorgt weiter dafür, dass die Weiterleitung suchmaschinenfreundlich erfolgt. Mehr können wir von einem CMS wirklich nicht erwarten.

[poll id=“3″]

MySQL: InnoDB jetzt mit Volltextsuche und Standard-Storage-Engine

Die Entscheidung war anfangs nicht nachvollziehbar. Mit Version 5.5 der MySQL-Datenbank haben die Entwickler die transaktionsfähige InnoDB als Standard-Storage-Engine festgelegt. MyISAM, bisher der Standard, blieb auf der Strecke. Ein Aufschrei bei vielen Datenbank-Administratoren verstummte heute, als bekannt wurde, welche Neuerungen die Engine InnoDB erfahren wird.

Was sind überhaupt Storage-Engines in MySQL?
Eine Engine ist der Motor oder das Herz der Datenbank. Im Gegensatz zu vielen anderen Datenbanken hat MySQL die Engine vom eigentlichen Server-Prozess entkoppelt. So kann der MySQL-Datenbankbenutzer unter einer Vielzahl von Engines wählen, die alle Vor- und Nachteile bieten. Eine oft gesuchte „Eierlegende-Wollmilch-Sau“ gibt es leider nicht. Oder gab es bisher nicht, um genauer zu sein.

Jede Datenbank, oft auch Schema genannt, ist im Dateisystem durch einen Unterordner festgelegt. In diesem Ordner werden die Daten abgelegt. In jedem Ordner ist mindestens eine .frm-Datei abgelegt, die den Namen Meine-Datenbank.frm trägt. In dieser Tabelle speichert MySQL seine Tabellendefinitionen. In dieser Tabellendefinition ist auch ein Verweis auf die sogenannte Storage-Engine im Feld „Engine“.

Vorteile der MyISAM-Engine
Der grundlegende Vorteil von MyISAM ist die integrierte Volltextindizierung. So ist es möglich, die ersten 500 Zeichen von BLOB- und TEXT-Spalten zu indizieren. Nahezu jede Suche über eine Webseite erfolgt durch die Funktion dieser Engine.

Nachteile der MyISAM-Engine
Das Locking von MyISAM bereitet vielen Adminstratoren starke Kopfschmerzen. Die Engine sperrt beim Schreibzugriff ganze Tabellen, keine Zeilen. Diese „exklusiven Locks“ bremsen je nach Datenbank oft die Performance.

Die Vorteile der InnoDB-Engine liegen hauptsächlich in ihrer Geschwindigkeit. Abfragen über einen Primärschlüssel gehen wesentlich schneller von der Hand, als bei einer MyISAM-Engine. Weitere Vorteile sind ein vorausschauendes Read-Ahead, also ein „Vorwärts-Lesen, welches durch das Vorabladen von Daten einen weiteren Datenbankzugriff immens beschleunigt sowie diverse Hashs und Eingabepuffer, die die Datenbank beschleunigen.

Auf alle diese Vorteile musste der Datenbankdesigner verzichten, wenn er einen Volltextindex nutzen wolle. Es gab Tricks und Kniffe, wie man eine Datenbank in einer InnoDB vorhielt, eine Volltextindexierung dann in eine separate MyISAM-Datenbank auslagerte. Doch diese Möglichkeit war für die meisten Anwendungen überdimensioniert.
Dank des Sphinx-Plugin konnte man relativ einfach über jede MySQL-Engine einen Volltextsuche durchführen. Sphinx agiert als eine Art Proxy, der über spezielle SELECT-Statements via JOIN angesprochen wird.

Aus gutem Grund war MyISAM so die Standard-Engine von MySQL. Die Engine bietet nach wie vor einen sehr guten Kompromiss aus Leistung und Funktionen. Gerade die Möglichkeit der Volltextindexierung war eben bisher nur dieser Engine vorbehalten. Doch mit dem jetzt von Oracle veröffentlichen Preview von MySQL 5.6 ist der letzte Grund, MyISAM den Vorzug zu geben, gewichen: Das Entwicklerteam rüstet die Volltextsuche bei InnoDB nach.
So dürften viele Datenbank-Administratoren die erste stabile Version der von MySQL 5.6 entgegenfiebern. Denn auf einmal gilt es nicht mehr die eigene Datenbank mühsam zu analysieren und Vor- und Nachteile abzuwägen. Dieser Schritt dürfte von da an nur noch wirklich großen Datenbankprojekten vorenthalten sein. Nach Version 5.6 werden die meisten Nutzer von MySQL sich einfach und ohne Nachdenken der Standard-Engine InnoDB bedienen können.

WordPress: Permalinks und htaccess richtig anlegen

Dieser Artikel richtet sich an alle WordPress-Nutzer, die Permalinks bereits nutzen und solche, die es nutzen möchten. Wir beschreiben im ersten Teil einen Fehler in der htaccess. Dies ist für die bisherigen Nutzer von Permalinks sehr wichtig. Neueinsteiger können gleich sich dem zweiten teil dieses Artikels widmen.

Permalinks: htacces ändern, Geschwindigkeit (Performance) erhöhen
Nutzer von Permalinks haben vielleicht einen Fehler in ihrer htaccess-Datei. Dieser Fehler wurde inzwischen in WordPress behoben (WordPress 3.0), bereinigt sich jedoch selbst bei einem Update nicht von alleine. Daher sollte jeder WordPress-Nutzer diesen Performance-Killer aufspüren und gegebenenfalls bereinigen.
Es geht um die Zeile

RewriteRule ^index.php$ - [L]

in der Standard-htaccess-Datei. Die Zeile hat früher gefehlt. Das fehlen der Zeile führt dazu, dass bei jedem Aufruf eines Artikels die Datei htaccess zweimal durchlaufen wird, was sich durchaus spürbar im Seitenaufbau niederschlagen kann. Viele Nutzer gehen von einem Geschwindigkeitszugewinn von 10 bis 20 Prozent aus. Kling natürlich auf den ersten Blick nicht viel, entlastet aber den Webserver. Daher sollte dem Fehler auf jeden Fall nachgegangen werden. Wenn die Zeile fehlt, einfach einfügen (siehe Code).

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

So ändert man die htaccess
Zuerst ist zu klären, wie die htaccess angelegt wurde. WordPress kann, wenn entsprechende Rechte vergeben wurden, die htaccess selbstständig verwalten. Jedoch bereinigt WordPress diese Datei (auch bei einem Update) nicht automatisch. Der Administrator muss die Datei über WordPress neu erstellen, dann wird diese Zeile neu eingefügt.

htaccess per FTP bereinigen
Wenn die Datei nicht per WordPress verwaltet wird, dann geht wie folgt vor: Die Datei „.htaccess“ liegt im Root der WordPress-Anwendung. Diese Datei ist per FTP und im „ASC-II“-Format (nicht „binary“) auf den lokalen Rechner herunterzuladen und mit einem Editor (zum Beispiel notepad.exe. NICHT Word oder ähnliches!) zu öffnen. Die Zeile „RewriteRule ^index.php$ – [L]“ ist einzufügen. Speichert die Datei und ladet die geänderte Dateien im „ASC-II“-Modus wieder auf den Webserver hoch.

Permalinks in WordPress anlegen
Zuerst ein kurzer Ausflug: Was sind Permalinks eigentlich? Wer WordPress neu installiert, erhält einen Link zu seinem Artikel in der Form „domain.tld?p=123“. Dieses Verhalten ist aus Sicht der Suchmaschinen alles andere als wünschenswert. Wir möchten gerne einen Aufruf wie „domain.tld/kategorie/keywords-meines-artikels.htm“. Dies möchten wir, da die Suchmaschinen nach wie vor die Keywords, die in einer URL enthalten sind, in das interne Ranking der Webseiten einbeziehen. Also machen wir uns keine großen Gedanken, sondern beugen uns diesem Trend.
Für die Verwaltung der Permalinks in WordPress emfehle ich das Plugin „WP Permalauts“. Es wird einfach installiert und sorgt bei der Artikelanlage für einen richtigen Permalink. Es sorgt ferner dafür, dass deutsche Umlaute nicht zu einem Problem werden.

Nach der Installation wählen wir im Dashboard „Einstellungen“, „Permalinks“. Wir wählen die „Bneutzerdefinierte Struktur“. Dort geben wir folgenden Code ein:

/%category%/%postname%-%post_id%.html

Dieser Code definiert den Aufbau unserer Permalinks. Es sorgt für die Kategorie im Link (wenn keine Kategorien in der WordPress-Installation vorhanden sind, kann dies weggelassen werden!), und definiert den URL des Artikels in „Postname-Artikel_ID.html“. So wird der Artikel eindeutig definiert. Der Postname wird durch das bereits installierte Plugin umlautebereinigt hinterlegt.

Wichtig für WordPress-Permalinks: Die htaccess-Datei
Damit Permalinks funktionieren, muss das Apache-Modul mod_rewrite auf dem Server installiert sein, was jedoch heutzutage fast bei allen Mietservern der Fall ist. Dieses Modul muss jedoch über die htaccess-Datei aufgerufen werden. Bei der Definition der Permalinks („Einstellungen“ „Permalinks“) kann WordPress die htaccess-Datei selbstständig anlegen (sofern Rechte gesetzt wurden). Ich persönlich sehe darin mehr Nachteile als einen Nutzen (Sicherheitsbedenken), und lege die htaccess-Datei lieber manuell an (zumal man diese Datei eigentlich nur einmal anlegt).
WordPress zeigt uns schon an, wie die Datei auszusehen hat. Einfach den Code kopieren, in einen Editor einfügen (notepad.exe) und die Datei per „ASC-II-Modus“ in das Root (Hauptverzeichnis) der WordPress-Installation hochladen. Dort muss die Datei „.htaccess“ heißen.

WordPress: Artikelbild (Vorschaubild) einfügen

Der Wunsch des WordPress-Nutzers, ein Vorschaubild bei der Übersicht der Artikel anzuzeigen, ist schon lange vorhanden. Umso unverständlicher, dass die Macher von WordPress (die jedoch wirklich einen lobenswerten Job erledigen), sich so lange vor diesem Wunsch verschlossen haben.
Mit Version 3.x kam endlich die Möglichkeit in das Dashboard, einem Artikel auch ein Artikelbild zuzuweisen. Doch wer dies ausprobiert, wird dann verzweifelt das eben eingefügte Artikelbild suchen. Der Grund wird einem klar, wenn man sich mit der Sache ein wenig Beschäftigt: Das Vorschaubild für einen Artikel muss auch das WordPress-Template unterstützen. Und die wenigsten Templates unterstützen diese neue Funktion, was noch nachvollziehbar ist. Nicht nachvollziehbar ist jedoch, dass es wohl schlichtweg vergessen wurde, auch dem Standard-Template „Twenty Ten“ (Version  1.2) diese Möglichkeit zu implantieren.

Einfügen eines Artikelbild oder Vorschaubild in ein WordPress-Template
Damit das Artikelbild in der Artikelübersicht angezeigt wird, benötigt das Template den entsprechenden Aufruf. Der Aufruf besteht aus folgendem PHP-Code:

php the_post_thumbnail();

Wenn dieser Code in einem Template nicht vorhanden ist, muss er manuell eingefügt werden.
Die folgenden Schritte beziehen sich auf das Template „Twenty Ten (Version 1.2)“. Für andere Templates muss gegebenenfalls die Änderung angepasst werden.

  1. Die Änderung bezieht sich ausschließlich auf die Datei „loop.php“. Wir können diese Datei im Editor von WordPress ändern (sofern die entsprechenden Rechte gesetzt wurden), oder machen einen FTP-Down- und Upload. In diesem Fall speichern wir via FTP die Datei lokal auf unserem Rechner, ändern diese und laden die Datei wieder hoch. Ich empfehle auf jeden Fall die Datei „loop.php“ nach dem Download zu kopieren und die Sicherheitskopie aufzuheben.
  2. Die Datei „loop.php“ ist im Ordner „wp-content/themes/twentyten“ abgelegt. Diese Datei öffnen wir über einen Text-Editor unserer Wahl.
  3. Wir fügen an der richtigen Stelle den untenstehenden Code ein. Einen größeren Ausschnitt der „loop-php“ ist weiter unten angegeben.
  4. Was macht der Code? Wir fügen einen Hyperlink mit dem Permalink des Artikel ein, denn wir möchten auch, dass das Bild zum Artikel führt. Dann führen wir die Funktion „the_post_thumbnail“ aus. Wir geben der Funktion ein Array (90,90) mit. Diese Werte definieren die Größe des Artikelbildes. Diese Werte können nach belieben angepasst werden.
  5. Das zweite Array übergibt der Funktion die CSS-Klasse. Der Wert „alignleft“ definiert, dass das Artikelbild linksbündig erscheinen soll. Wer möchte, kann hier „alignright“ angeben.

Diese Zeile einfügen

<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail(array(90,90),
array('class' => 'alignleft recent-thumbs')); ?></a>

loop php

?php /* How to display all other posts. */ ?>

    <?php else : ?>
        <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <h2><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>

            <div>
                <?php twentyten_posted_on(); ?>
            </div><!-- .entry-meta -->

    <?php if ( is_archive() || is_search() ) : // Only display excerpts for archives and search. ?>
            <div>
            <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail(array(90,90),array('class' => 'alignleft recent-thumbs')); ?></a>
                <?php the_excerpt(); ?>
            </div><!-- .entry-summary -->

Artikelbild einem Artikel hinzufügen
Um einem Artikel ein Bild hinzufügen, klickt man im Dashboard, Kasten „Artikelbild“  den Link „Artikelbild festlegen“.

Man wählt das entsprechende Bild auf der Galerie oder als neuen Upload aus. Im unteren Bereich ist der Link „Als Artikelbild nutzen“ auszuwählen.

Nun erscheint im Artikel-Kasten „Artikelbild“ das ausgewählte Bild in einer Vorschau. Wenn das hinterlegte Template Artikelbilder unterstützt, wird das Artikelbild nun in der Artikelvorschau angezeigt.

 

[UPDATE: WordPress Artikelbild festlegen wird nicht angezeigt]
Sollte bereits die Box „Artikelbild festlegen“ beim Erfassen eines Artikels nicht angezeigt werden, so liegt dies ebenfalls an der verwendeten Theme, die dann ein Artikelbild nicht unterstützt. Um die Option zu erhalten, muss in der functions.php der Theme  die nachfolgende Funktion hinzugefügt werden (also einfach innerhalb des PHP-Codes einfügen):

add_theme_support( 'post-thumbnails' );

Weitere Information zum Artikelbild kann auf codex.wordpress (Function Reference: The Post Thumbnail) nachgelesen werden.

Cron job – Mail abschalten

Je nach Einstellung sendet jeder Cronjob nach der Ausführung eine Mail an den Besitzer des Cronjob mit der Ausgabe des Bildschirminhaltes. Dies kann ein gewünschtes Verhalten sein, oder auch als sehr lästig angesehen werden. Gerade wenn ein Job vielleicht jede Minute ausgeführt wird, muss diese Mail unterdrückt werden.

Wer zum Beispiel seine Serververwaltung mit Plesk erledigt, wird feststellen, dass je nach Version und Installation diese Mail gesendet wird – oder nicht. Etliche Plesk-Installationen unter Plesk 9.x, die ich betreue, senden keine Mail, eine neue Installation unter Plesk 10.x mutiert munter zur „Spamschleuder“.

Cron Job: Don´t send emails of Cronjob
Die einfachste Möglichkeit, die Mail abzuschalten, ist sie einfach zu unterdrücken. Dies funktioniert auch unter Plesk (Plesk Control pannel), da diese Definition einfach bei der Anlage des Cronjobs getroffen wird. Es ist kein weiterer Eingriff in die Serverkonfiguration erforderlich. Das Geheimnis liegt im „unterdrücken“ der Mail mittels „> /dev/null 2>&1“
Hängen Sie diese Zeichenfolge einfach an jede Befehlzeile an. Ein Job lautet dann beispielsweise wie folgt:

30 * * * * /root/mein-ordner/mein-skript.sh > /dev/null 2>&1

Für Plesk-Nutzer: In der Befehlzeile den Aufruf (hier: „/root/mein-ordner/mein-skript.sh“ um die Zeichenkette „ > /dev/null 2>&1“ erweitern.

Cron Job: Mail generell abschalten
Die oben beschriebene Methode bedingt, das Ziel „dev/null“ an jede Cronjob-Zeile manuell anzuhängen. Dies funktioniert, doch kann bei vielen Cronjobs aufwändig sein. Auch werden viele Unix-Freaks dies als „unsauber“ bezeichnen.
Um das Mail generell abzuschalten, empfiehlt es sich, die „MAILTO“-Variable zu bearbeiten. Diese Variable wird in der Crontab definiert. Um dies zu ändern oder zu überprüfen, öffnet man die richtige Crontab (auf den (Login)User achten!) über die Shell mit

# vi /etc/crontab
   oder
$ crontab -e

(Hinweis:  „-e“ bedeutet Edit=Ändern, „-l“ kann mit „lesen“ bezeichnet werden)

In der ersten Zeile sollte in der enstprechenden Crontab folgende Zeile vorhanden sein:

MAILTO=meinuser@domain.tld

Um die Mail generell abzuschalten, muss man einfach die Email-Adresse durch „“ ersetzen:

MAILTO=""

Mit dem Speichern der Crontab (Je nach Editor: ESC, „:qw1“) sendet kein Cronjob dieser Crontab mehr eine Mail.

Cronjob-Logfile: Mail in ein Logfile umleiten
Wer auf die Daten der Mail nicht verzichten, aber von Email verschont bleiben möchte, der kann die Ausgabe in ein Log umleiten. Dies kann für die Nachverfolgung und Fehlersuche sehr wichtig sein. Und so leitet man die Cronjob Email in ein Logfile um:

30 * * * * /root/mein-ordner/mein-skript.sh > /home/mein-user/cronlogs/logfile-name.log

WordPress plugin facebook like google plus one twitter

Der Wunsch, seine Webseite auch im Social Network bekannt zu machen, nimmt immer weiter zu. Das „Mitmach-Internet“ läd dazu ein, dass Leser Webseiten bewerten, Kommentare abgeben oder einfach ein bestimmtes Ranking einer Webseite zuordnen. Neben Facebook und Twitter stieg nun auch Google mit seinem „Google plus one“-Button in das Bewertungsgeschäft ein. Spätestens mit dem Einstieg von Google ist es für den Webseitenbetreiber nun eine Pflicht, sich den Bedingungen und Anforderungen des Social Networks zu stellen.

Daran teilzunehmen ist relativ einfach. Jeder dieser großen Seitenbetreiber bietet ein Stück Code an, das der Webmaster auf seiner Seite einbinden kann. Ein Klick durch den Leser leitet diesen zur Bewertungsseite. Und letztlich erhofft sich der Webmaster durch viele positive Bewertungen noch viele weitere zufriedene Leser seiner Seite.

Twitter, Facebook Like und Google Plus one in WordPress einbinden
Obwohl das Einbinden des Codes nicht sonderlich schwer ist, macht die Installation eines Plugins Sinn. Dieses Plugin soll dafür sorgen, dass der Code bei jedem Artikel ausgeführt wird. Und nachdem nun auch Google einen solchen Button anbietet, liegt die Anforderung nahe, dass es nur ein Plugin ist, welches die großen drei „Platzhirsche“ abdeckt.

So habe auch ich zwei separate Plugins („Facebook like“ und „Google Plusone“) einem zentralen Plugin „geopfert“. Das aktuelle Plugin heißt „twitter-facebook-google-plusone-share“ und klinkt sich via Standardinstallation nahtlos in die WordPress-Installation ein.

Im Bereich „Einstellungen“ können Sie – sofern vorhanden – ihre eigene Twitter-Account-ID hinterlegen und das Aussehen und die Anordnung der Bewertungs-Box einstellen. Für diesen Blog habe ich lediglich die Anordnung von „oben“ nach „unten“ geändert.

Nachteil: Keine deutsche Installation
Einen Nachteil möchte ich an dieser Stelle natürlich auch nicht verschweigen: Es gibt keine deutsche Übersetzung zu diesem Plugin. Während das eigentliche Plugin in englischer Sprache gehalten ist, linken die Buttons im Leserbereich ebenfalls auf die englischsprachigen Seiten der entsprechenden Seiten. Während Facebook anscheinend selbstständig erkennt, dass die Standardsprache in unseren Kreisen Deutsch ist, muss für den „Google One Plus“-Button die Sprache etwas „abnorm“ innerhalb der Java-Script-Tags in geschweiften Klammern übergeben werden. Das Plugin dahingehend umzuprogrammieren, ist für Kenner von PHP und WordPress kein Problem, stellt aber doch tiefgreifendere Eingriffe in das Plugin dar, so dass bei jeder neuen Version diese Schritte geprüft und nachgezogen werden müssen. Daher nehme ich momentan vor dieser Änderung noch Abstand, da das Plugin immerhin auf die englischsprachige Seite (und nicht auf die italienische Seite wie das Plugin „WordPress Google Plus One Button“) linkt.
Und wer weiß, vielleicht nehme ich mir ja noch mal die Zeit …

UPDATE: Ein lesenswerter und sehr kritischer Artikel zum Thema Social Networks und Google+ ist bei heise/Telepolis erschienen.