MySQL-Volltextsuche – Zwei Hindernisse und ein Weg drumherum

Kein Beitragsbild

Die MySQL-Volltextsuche ist ein Segen für den Web-Programmierer, solange bis die ersten Einschränkungen für Shared-Hosting- und Managed-Server-Kunden auftreten. Schauen wir wie die Volltextsuche auch auf solchen Webservern vollständig genutzt werden kann.

Die MySQL-Volltextsuche vereinfacht bereits seit Version 4.0.1 das Suchen mit booleschen Suchoperatoren wie UND, ODER, NICHT. Das an sich ist eine schöne Erleichterung für Web-Programmierer, denn sie müssen keinen Code zur Verarbeitung komplizierter Suchanfragen wie eins UND zwei UND (“drei vier” ODER (“fünf sechs” NICHT sieben)) schreiben. Solche Anfragen können mit den von MySQL unterstützten Suchoperatoren, direkt an den Server geschickt werden. Dazu bietet MySQL einen Algorithmus, der die Bewertung der Treffer erledigt, so dass auch dieses Rad nicht neu erfunden werden muss. Eine konfigurierbare Stoppwörterliste rundet die Volltextsuche ab.

Wie die Volltextsuche funktioniert, ist bereits in der Online-Dokumentation des Datenbanksystems beschrieben. Die eingebaute Volltextsuche von MySQL birgt allerdings einige Fallstricke, welche die Nutzung dieser Funktion erschweren.

Suchworte, die weniger als vier Zeichen lang sind
In der Standardkonfiguration werden Suchworte, die drei Zeichen lang oder kürzer sind, nicht berücksichtigt. Der Grund dafür ist, dass besonders bei großen zu durchsuchenden Datenbeständen die Serverlast zu stark steigen würde. Allerdings kann auf diese Weise nicht nach Abkürzungen wie SPD, CDU, ASP, PHP oder XML und so weiter gesucht werden – eine echte Behinderung. Dieses Verhalten der Datenbank ist heimtückisch, denn wenn die Datenbank nicht entsprechend eingestellt oder der Index nicht, wie folgt beschrieben, präpariert ist, werden “zu kurze” Suchbegriffe vom Datenbank-Server stillschweigend ignoriert.

Root-Nutzer oder Systemadministratoren können diese Beschränkung durch eine entsprechende Serverkonfiguration umgehen. Dazu muss die MySQL-Konfigurationsdatei so wie in der MySQL-Dokumentation beschrieben verändert und der Server neu gestartet werden, weil die meisten Volltext-Variablen nicht zur Laufzeit zu ändern sind. Danach muss der Volltext-Index neu aufgebaut werden.

Nutzer von gemeinschaftlich genutzten Web-Servern (“Shared-Hosting”) oder verwalteten Root-Servern (“Managed-Server”) haben allerdings keinen Zugriff auf die MySQL-Konfigurationsdatei und können daher die Volltextsuche nicht für Wörter kleiner als vier Zeichen verwenden.

Eingebaute Stoppwörterliste
Das zweite Problem ist die in MySQL eingebaute Stoppwörterliste. In ihr sind alle Wörter enthalten, die statistisch gesehen häufig in Texten vorkommen und daher so wie kurze Wörter und Personalpronomen bei großen Datenbeständen zuviel Last hervorrufen würden. Die eingebaute Liste enthält englische Begriffe wie “but”, “can”, “do”, Personalpronomen wie “you”, “he”, “she” und längere Wörter wie “consequently”. In der Liste sind allerdings auch Wörter zu finden, die in der deutschen Sprache nicht so häufig vorkommen wie englische Personalpronomen, beispielsweise “Brief”, “Plus”, “All”, “Last” und “herein”. Diese Wörter gibt es sowohl im Englischen als auch – meist mit anderer Bedeutung – im Deutschen.

Selbstverständlich ist es möglich, alternative Stoppwörterlisten einzustellen – falls man Einfluss auf die MySQL-Konfiguration hat. Ansonsten gilt für die Konfiguration der Stoppwörterliste das Gleiche wie für die Suchwörter kleiner als vier Zeichen.

Kennst du unser E-Book-Bundle? Spare jetzt 6,99 €!

E-Book Bundle von Andreas Hecht

Lösung
Die Lösung für beide Probleme ist banal, vielleicht etwas unelegant – dafür funktioniert sie sehr gut. Sie ist nur für kleine Datenbestände geeignet. Wer größere Datenmengen durchsuchen lassen will, sollte auch die Mittel haben, einen eigenen Server aufzusetzen oder zu mieten – und dann kann man die Konfiguration einfach ändern.

Für alle, die es nicht können, zu kurze Wörter werden künstlich “aufgepumpt”. Aber vorsicht, man sollte Abkürzungen wie “XSL” nicht auf vier Zeichen bringen, in dem man einfach ein Zeichen anhängt, zum (schlechten) Beispiel durch ein “T”. Das wäre dann “XSLT”, was themenverwandt zu “XSL” ist, aber etwas anderes bedeutet. Bewährt hat es sich, das Wort zu doppeln und durch ein Zeichen zu trennen, etwa. “PHP” -> “PHPxPHP”. Beim indexieren eines Textes müssen dessen Wörter entsprechend behandelt werden, ebenso müssen Suchbegriffe gegebenenfalls “aufgepumpt” werden, damit Treffer erzielt werden. Wenn also jemand nach “PHP” sucht, muss in der Datenbank nach “PHPxPHP” gesucht werden.

Technisch betrachtet ist der Lösungsansatz sehr einfach, einfacher geht es wohl nicht, abgesehen von der direkten Konfiguration des Datenbank-Servers. In PHP (und in anderen Skriptsprachen) genügt ein Einzeiler:

 $str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);x$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “$str = preg_replace(“/\b([a-zöäüß0-9]{3})\b/i”, “_XXXCODEYYY_x_XXXCODEYYY_”, $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);x$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);". Dieses Muster besteht aus dem gedoppelten Treffer "$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);",

getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);x$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);x$str = preg_replace("/\b([a-zöäüß0-9]{3})\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);

Erklärung des Ausdrucks: Ein regulärer Ausdruck wird auf die Variable $str angewandt, die Variable wird mit dem Ergebnis überschrieben. Der reguläre Ausdruck besagt, dass alles, was zwischen den zwei Wortgrenzen “\b” steht (also Leerzeichen, Punkte usw.), aus den Zeichen A bis Z, 0-9, deutschen Umlauten und ß besteht und genau drei Zeichen lang ist, ersetzt wird – und zwar durch das Muster “_XXXCODEYYY_x_XXXCODEYYY_”. Dieses Muster besteht aus dem gedoppelten Treffer “_XXXCODEYYY_”, getrennt durch ein “x”. Der Suchmuster-Modifikator “i” besagt, dass die Groß- und Kleinschreibung keine Rolle spielt. Aus “Photoshop CS2” würde also “Photoshop CS2xCS2” werden.

Auch durch die Standard-Stoppwörterliste “verbotene” Wörter können im selben Ausdruck aufgepumpt werden, damit sie nicht mehr unter den Tisch fallen. Dazu erweitert man das Muster in den Klammern durch Alternativen, die durch “|” getrennt werden:

      $str =
preg_replace("/\b([a-zöäüß0-9]{3}|plus|brief|all|last|herein)\b/i",
"_XXXCODEYYY_x_XXXCODEYYY_", $str);

Es ist auch möglich, nur ausgewählte Begriffe aufzupumpen. Der folgende Ausdruck wird nur auf “PHP” und “ASP” angewandt:

      $str = preg_replace("/\b(php|asp)\b/i", "_XXXCODEYYY_x_XXXCODEYYY_", $str);", $str);

Der Effekt ist derselbe wie bei den drei Zeichen langen Treffern. Zur Erinnerung: dieser Reguläre Ausdruck muss auf den zu durchsuchenden Textbestand und auf die eingegebenen Suchbegriffe angewandt werden. Der Textbestand muss nur einmal vor Indexieren, der Suchbegriff bei jeder Eingabe präpariert werden. ™

Links zum Thema:

Erstveröffentlichung 14.12.2006

Hinterlasse einen Kommentar

6 Kommentare auf "MySQL-Volltextsuche – Zwei Hindernisse und ein Weg drumherum"

Benachrichtige mich zu:
avatar
Sortiert nach:   neueste | älteste | beste Bewertung
trackback

[…] MySQL-Volltextsuche – Zwei Hindernisse und ein Weg drumherum […]

Illya
Gast

@chris und alle anderen: die lösung ist folgende:
$str=”photoshop cs2″;
$str = preg_replace(“/\b([a-zöäüß0-9]{3})\b/i”, “$1*$1”, $str);
str hat dann “photoshop cs2*cs2”
Ich weiss auch nicht warum der Autor _XXXCODEYYY_ verwendet, auch das Trenn-X ist nicht richtig, es funktioniert zB mit dem *, das ist ein Trennzeichen für mysql.
Ich habe es getestet und funzt…:)
Ich hoffe das Layout zerschiesst den Code nicht!

Frank
Gast

@IIIya: Deine Lösung ist so nicht ganz korrekt:
Wie du bereits richtig festgestellt hast, gilt der * in Mysql als Trennzeichen. Genau deshalb kann man ihn hier nicht verwenden, da die MySQL-Volltextsuche bei der Suche nach dem Begriff “cs2*cs2” den * als Trennzeichen verwendet und entsprechend nach “cs2 cs2” bzw. “cs2” sucht. Somit hätten wir wieder nur 3 Zeichen und die Suche würde kein Ergebnis liefern (Wenn es bei dir funktioniert, hast du bestimmt die Serverkonfiguration auf 3 Zeichen eingestellt).
Wenn man den * durch beispielsweise ein “x” ersetzt, müsste es funktionieren!

Chris
Gast

Hi,
Es scheint mir, der Lösungs-Ansatz wird hier x-mal wiederholt (in meinem Browser werden 2-3 Abschnitte ca. 10 mal identisch wiederholt!). Da vermute ich, dass vieleich andere Teile gar nicht ausgespuckt/dargestellt werden. Da mich die Lösung interessiert, möchte ich wenn möglich genau das sehen, was der Autor geschrieben hat. U.a. verstehe ich nicht, wie eine Suche mit SUCHWORTxSUCHWORT in meiner Datenbank etwas finden sollte, wenn in meiner Datenbank nur SUCHWORT drin steht…
Danke für Ihre Hilfe,
Chris

Sven Lennartz
Gast

das template validiert durchaus. es hat auch nichts mit tabellen zu tun. es liegt schlicht daran das der import in das CMS am 5.10.08 an einigen stellen nicht zu 100% geklappt hat. zum beispiel hier.

inzwischen habe ich es repariert. es war lediglich ein verrutschter pre- tag, der sorgte dann gleich für 100 weitere fehler und die kaputte optik.

Nikki
Gast

Hi,

immer wieder wird geraten CSS abstelle von Tabellen zu
nutzen, aber wenn ich sehe wie, hier zb., das Design mal
wieder durch Float zerissen wird, frage ich mich warum.

Nebenbei, wie kann es sein, dass gerade deine Seite,
schliesslich eine Referenz für Webseitenaufbau/hilfe, so viele Fehler beim Validator hat?

Nikki

wpDiscuz