Probleme mit Umlauten bei der Suchfunktion
Je nach Server-Konfiguration kann es bei der Suche nach Wörtern mit Umlauten zu Problemen kommen. Dieser Artikel beschreibt einen Workaround.
Überarbeitete Version. Es kann sein, dass es in bestimmten Konfigurationen zu Problemen kommt. Daher bitte vorher ein Backup machen.
Je nach Server-Konfiguration kann es vorkommen, dass bei der Suche Umlaute nicht richtig berücksichtigt werden. Im Folgenden wird beschrieben, wie man testen kann, ob man von dem Problem betroffen ist und wie es gelöst werden kann.
Ein wichtiger Hinweis vorab
Wenn ihr die Datenbank gerade erst von einem Backup wiederhergestellt habt, prüft bitte erst, ob die Daten richtig in der Datenbank vorhanden sind (Tabelle phpbb_posts_text). Wenn ihr dort auch schon keine Umlaute findet, habt ihr vermutlich beim Einspielen des Backups die falsche Kodierung verwendet. Versucht evtl. mal latin1 oder utf8.
Hintergrund
Hintergrund des Problems ist, dass die PHP-Funktion strtolower je nach Konfiguration die deutschen Umlaute (ä, ö, ü - aber ggf. auch é, è, ...) nicht richtig konvertiert und so bei der Suche nicht alle passenden Ergebnisse angezeigt werden.
So testet man, ob man betroffen ist
Um das ganze zu testen, erstellt man einen Testbeitrag, in dem beispielsweise die Zeichenfolgevorkommt. Dann sucht man nach genau dieser Zeichenfolge - und sollte den Beitrag als Ergebnis bekommen. Nun sucht man nach der gleichen Zeichenfolge in Kleinbuchstaben - als in unserem Beispiel nachNun sollte man das gleiche Ergebnis angezeigt bekommen. Ist dies nicht der Fall, so ist man von dem Fehler betroffen. Den Beitrag nach dem Testen bitte wieder löschen.
Workaround
Als Workaround öffnet man die common.php und fügt nach Code: | set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
| folgendes ein: Code: | // This board is German - so we chance the local settings
$locals = array('de_DE@euro', 'de_DE', 'de', 'deu_deu', 'ge');
reset($locals);
while (list(, $locale) = each ($locals))
{
if ( setlocale(LC_CTYPE, $locale) == $locale )
{
break; // Exit when we were successfull
}
} | Nun kann man den Test erneut durchführen - der Fehler sollte in diesem Fall nicht auftreten.
Wenn euer Board noch neu ist, so sollte es das gewesen sein. Existieren jedoch bereits Beiträge, so müssen die bereits vorhandenen Suchwörter überprüft werden. Dazu könnt ihr entweder den Suchindex neu aufbauen oder die Datei update_lang.php erstellen (siehe unten) und diese im Hauptverzeichnis des Boards ablegen. Wenn ihr die Datei ausführt, so werden die Suchwörter überprüft und ggf. aktualisiert. Allerdings kann es sein, dass dieses Script nicht zum gewünschten Ergebnis führt - in diesem Fall ist ein Neuaufbau des Suchindexes unumgänglich.
Wichtiger Hinweis:
Dieser Workaround ist sehr stark von der Konfiguration des Servers abhängig. Daher kann für ein ordnungsgemäßes Funktionieren keine Garantie übernommen werden. Insbesondere vor der Ausführung der update_lang.php sollte daher unbedingt ein Backup durchgeführt werden. Feedback ist willkommen.
Hier der Code für die update_lang.php: Code: | <?php
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
// This board is German - so we chance the local settings
$locals = array('de_DE@euro', 'de_DE', 'de', 'deu_deu', 'ge');
reset($locals);
while (list(, $locale) = each ($locals))
{
if ( setlocale(LC_CTYPE, $locale) == $locale )
{
break; // Exit when we were successfull
}
}
echo ("<p><b>Updating database</b></p>\r\n<ul>\r\n");
// Select all rows with problems
$sql = 'SELECT word_text, word_id FROM ' . SEARCH_WORD_TABLE . ' WHERE word_text != LCASE(word_text)';
if( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not query word list', '', __LINE__, __FILE__, $sql);
}
while( $row = $db->sql_fetchrow($result) )
{
$old_word = $row['word_text'];
$old_id = $row['word_id'];
$new_word = strtolower($old_word);
// Check whether word is already in db
$sql = 'SELECT word_id FROM ' . SEARCH_WORD_TABLE . " WHERE word_text = '$new_word'";
if( !($result2 = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not query word list', '', __LINE__, __FILE__, $sql);
}
if ( $row2 = $db->sql_fetchrow($result2) )
{
// Word alread exist
$new_id = $row2['word_id'];
// Update wordmatch table
$sql = 'UPDATE ' . SEARCH_MATCH_TABLE . " SET word_id = $new_id WHERE word_id = $old_id";
if( !($result2 = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not update word match table', '', __LINE__, __FILE__, $sql);
}
// Delete old word
$sql = 'DELETE FROM ' . SEARCH_WORD_TABLE . " WHERE word_id = $old_id";
if( !($result2 = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not delete from word list', '', __LINE__, __FILE__, $sql);
}
echo ("<li>$old_word -> $new_word: data updated</li>\r\n");
}
else
{
// Word does not exist - Update old entry
$sql = 'UPDATE ' . SEARCH_WORD_TABLE . " SET word_text = '$new_word' WHERE word_id = $old_id";
if( !($result2 = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not update word list', '', __LINE__, __FILE__, $sql);
}
echo ("<li>$old_word -> $new_world: changed</li>\r\n");
}
}
echo ("</ul>\r\n<p>Done :-)</p>");
?> |
|