Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Guest RSS-Bot

Важное с Sysman.Ru: Проблема с поиском в разных регистрах

Recommended Posts

Guest RSS-Bot

Song:

Сиптомы:

Если в Админ-центре у вас установлен "обычный" поиск (не полнотекстовый) и база данных вашего форума создана в регистрозависимом чарсете (определить какой у вас, см. файл в конце статьи), вы можете испытывать проблемы с поиском.

 

Причина:

При поиске в файле search_mysql_man.php в запросе текст поста приводится к нижнему регистру:

[color=#048284]$title_like[/color] = " LOWER(t.title) LIKE '%".trim([color=#048284]$keywords[/color])."%' ";[color=#048284]$post_like[/color]  = " LOWER(p.post) LIKE '%".trim([color=#048284]$keywords[/color])."%' ";

 

Однако сама строка поиска остаётся в том регистре, в котором её задал пользователь. Т.е. например, если пользователь задал поиск "маша", то найдётся только "маша".

Ни "Маша", ни "МАША" не найдутся.

 

Исправление:

 

1-ый вариант: добавить выделенный ниже код:

Цитата (1.x)
[b]function[/b] do_main_search(){    [b]global[/b] [color=#048284]$ibforums[/color], [color=#048284]$DB[/color], [color=#048284]$std[/color], [color=#048284]$HTTP_POST_VARS[/color], [color=#048284]$print[/color];    [color=#048284]$ibforums[/color]->input['keywords'] = strtolower([color=#048284]$ibforums[/color]->input['keywords']);

Цитата (2.1.x)
[b]function[/b] do_main_search(){    [color=#048284]$this[/color]->ipsclass->input['keywords'] = strtolower([color=#048284]$this[/color]->ipsclass->input['keywords']);

 

2-ой вариант: поменять чарсет БД на регистронезависимый.

Собственно, если Вы смените чарсет на регистронезависимый можно вообще убрать LOWER из запросов выше, т.к. они не сказываются на результат, а только замедляют поиск.

 

Примечания:

 

1) Если после исправления в 1-ом варианте глюк всё ещё присутствует, воспользуйтесь этой статьёй: Самопроизвольное изменение регистра букв

 

2) Определить какой у вас чарсет можно из следующего справочного руководства phpMyAdmin (html файл):

 

Song_Bot: К посту прикреплены вложения, но посмотреть Вы их можете, только открыв статью в Форуме.

Share this post


Link to post
Share on other sites
Guest RSS-Bot

Song:

Сиптомы:

Если в Админ-центре у вас установлен "обычный" поиск (не полнотекстовый) и база данных вашего форума создана в регистрозависимом чарсете (определить какой у вас, см. файл в конце статьи), вы можете испытывать проблемы с поиском.

 

Причина:

При поиске в файле search_mysql_man.php в запросе текст поста приводится к нижнему регистру:

[color=#048284]$title_like[/color] = " LOWER(t.title) LIKE '%".trim([color=#048284]$keywords[/color])."%' ";[color=#048284]$post_like[/color]  = " LOWER(p.post) LIKE '%".trim([color=#048284]$keywords[/color])."%' ";

 

Однако сама строка поиска остаётся в том регистре, в котором её задал пользователь. Т.е. например, если пользователь задал поиск "маша", то найдётся только "маша".

Ни "Маша", ни "МАША" не найдутся.

 

Исправление:

 

1-ый вариант: добавить выделенный ниже код:

Цитата (1.x)
[b]function[/b] do_main_search(){    [b]global[/b] [color=#048284]$ibforums[/color], [color=#048284]$DB[/color], [color=#048284]$std[/color], [color=#048284]$HTTP_POST_VARS[/color], [color=#048284]$print[/color];    [color=#048284]$ibforums[/color]->input['keywords'] = strtolower([color=#048284]$ibforums[/color]->input['keywords']);

Цитата (2.1.x)
[b]function[/b] do_main_search(){    [color=#048284]$this[/color]->ipsclass->input['keywords'] = strtolower([color=#048284]$this[/color]->ipsclass->input['keywords']);

 

2-ой вариант: поменять чарсет БД на регистронезависимый.

Собственно, если Вы смените чарсет на регистронезависимый или у вас уже регистронезависимый (что в принципе в большинстве случаев) можно вообще убрать LOWER из запросов выше, т.к. они не сказываются на результат, а только замедляют поиск.

 

Примечания:

 

1) Если после исправления в 1-ом варианте глюк всё ещё присутствует, вам нужно поставить локаль для вашей кодировки, воспользуйтесь этой статьёй: Самопроизвольное изменение регистра букв

 

2) Определить какой у вас чарсет можно из следующего справочного руководства phpMyAdmin (html файл):

 

Song_Bot: К посту прикреплены вложения, но посмотреть Вы их можете, только открыв статью в Форуме.

Share this post


Link to post
Share on other sites
Guest RSS-Bot

Song:

Сиптомы:

Если в Админ-центре у вас установлен "обычный" поиск (не полнотекстовый) и база данных вашего форума создана в регистрозависимом чарсете (определить какой у вас, см. файл в конце статьи), вы можете испытывать проблемы с поиском.

 

Причина:

При поиске в файле search_mysql_man.php в запросе текст поста приводится к нижнему регистру:

[color=#048284]$title_like[/color] = " LOWER(t.title) LIKE '%".trim([color=#048284]$keywords[/color])."%' ";[color=#048284]$post_like[/color]  = " LOWER(p.post) LIKE '%".trim([color=#048284]$keywords[/color])."%' ";

 

Однако сама строка поиска остаётся в том регистре, в котором её задал пользователь. Т.е. например, если пользователь задал поиск "маша", то найдётся только "маша".

Ни "Маша", ни "МАША" не найдутся.

 

Исправление:

 

1-ый вариант: добавить выделенный ниже код:

Цитата (1.x)
[b]function[/b] do_main_search(){    [b]global[/b] [color=#048284]$ibforums[/color], [color=#048284]$DB[/color], [color=#048284]$std[/color], [color=#048284]$HTTP_POST_VARS[/color], [color=#048284]$print[/color];    [color=#048284]$ibforums[/color]->input['keywords'] = strtolower([color=#048284]$ibforums[/color]->input['keywords']);

Цитата (2.1.x)
[b]function[/b] do_main_search(){    [color=#048284]$this[/color]->ipsclass->input['keywords'] = strtolower([color=#048284]$this[/color]->ipsclass->input['keywords']);

 

2-ой вариант: поменять чарсет БД на регистронезависимый.

Собственно, если Вы смените чарсет на регистронезависимый или у вас уже регистронезависимый (что в принципе в большинстве случаев) можно вообще убрать LOWER из запросов выше, т.к. они не сказываются на результат, а только замедляют поиск.

 

Примечания:

 

1) Если после исправления в 1-ом варианте глюк всё ещё присутствует, вам нужно проставить локаль для вашей кодировки, воспользуйтесь этой статьёй: Самопроизвольное изменение регистра букв

 

2) Определить тип используемого у вас чарсета можно из следующего справочного руководства phpMyAdmin (html файл):

 

Song_Bot: К посту прикреплены вложения, но посмотреть Вы их можете, только открыв статью в Форуме.

Share this post


Link to post
Share on other sites
Guest RSS-Bot

Song: Также в порядке рекомендации упомяну, что на регистронезависимых чарсетах LOWER в запросах не нужен вообще.

Наоборот, при его наличии он действует губительно: применённый к индексному полю, он не даёт использовать этот индекс и, если запрос был расчитан на использование индекса, например, см.:

1.x:

Цитата (Login.php)
        [color=green]//-------------------------------------------------[/color]        [color=green]// Attempt to get the user details[/color]        [color=green]//-------------------------------------------------[/color]                [color=#048284]$DB[/color]->query("SELECT id, name, mgroup, password, ip_address FROM ibf_members WHERE LOWER(name)='$username'");

 

2.1.x:

Цитата (mysql_queries.php)
    [b]function[/b] general_get_by_display_name( [color=#048284]$a[/color] )    {        [b]return[/b] "SELECT id, members_display_name, name, email, mgroup, member_login_key, ip_address, login_anonymous                FROM ".SQL_PREFIX."members                WHERE LOWER(members_display_name)='{$a['members_display_name]}'";    }

 

то выборка будет через полный перебор таблицы (FULL SCAN), а не с использованием индекса (см. тему LOWER).

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...