Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация suggest: проблемы с кирилицей 
:(
    Опции темы
kulikoff
Дата 16.2.2011, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



Помогите, пожалуйста, не могу понять, в чем дело. Иcпользую плагин jQuery Autocomplete. При выполнении запроса Ajax возникла фигня - при вводе английских букв - всё работает, а русских - ничего не находит. Помогите, как обойти эту проблему. Код файлика, коотрый генеритв ыборку привожу ниже:
Код

if($_GET['q']) {
    $q = strtolower($_GET['q']);
              include("module/dbconn"); 
    $text="select good_name from good where good_status=1";
    $query=mysql_query($text);
    while($temp=mysql_fetch_array($query)) {
        if (mb_strpos(mb_strtolower($temp['good_name'],'windows-1251'), $q) !== false) {
            print $temp['good_name']."\n";
        }
    }
  }

PM MAIL WWW ICQ Skype   Вверх
z-END
Дата 16.2.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 5
Всего: 102



я бы начал вот с чего:
Код

$text="select good_name from good where good_status=1 AND good_name LIKE '$q%' ";




--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
kulikoff
Дата 16.2.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



Это не решает проблемы, разве что время выполнения запроса, по идее должно вырости... Но не в этом суть. Оно как не находило ничего по русским буквам, так и не находит. Всё упирается в строку 
Код

if (mb_strpos(strtolower($temp['good_name']), $q) !== false) {

А чего ей не нравятся советские буквы - никак не пойму.

Это сообщение отредактировал(а) kulikoff - 16.2.2011, 22:56
PM MAIL WWW ICQ Skype   Вверх
z-END
Дата 16.2.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 5
Всего: 102



Цитата(kulikoff @  16.2.2011,  23:53 Найти цитируемый пост)
Это не решает проблемы, разве что время выполнения запроса, по идее должно вырости...

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

есть логическое обоснование использования mb_strtolower при обработке данных mysql и strtolower для GET? 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
kulikoff
Дата 16.2.2011, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: нет
Всего: 1



нет, логического нет, просто было указано в примере. Но преобразование в строку вида
Код

if (strpos(strtolower($temp['good_name']), $q) !== false) {

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

setlocale (LC_CTYPE, array ('ru_RU.CP1251', 'rus_RUS.1251'));

глухо, как в танке. Эмперическим путем вывел, что всё упирается в функцию strtolower Она не может переварить кириллицу. Как побороться с ней?

Это сообщение отредактировал(а) kulikoff - 16.2.2011, 23:15
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 17.2.2011, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



во-первых, проблема может быть в БД(set name перед первым же запросом делаешь?)
во-вторых, зачем использовать strtolower, которая завязана на проблемы однобайтности кодировок, если есть СУБДшные функции(mysql, да?)?
PM MAIL   Вверх
MoLeX
Дата 17.2.2011, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(kulikoff @  16.2.2011,  22:53 Найти цитируемый пост)
разве что время выполнения запроса, по идее должно вырости...

видимо я пропустил, что то в этой жизни.

Вытащить ВСЕ данные (а их по всей видимости будет очень много) будет быстрее, чем искать нужные. Мда


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Dima 2015
Дата 18.2.2011, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



Текс... тут много чего хочется поведать автору, начнем наверное с вопроса, а потом уже будем наставлять на путь истинный.

Во-первых если работаем с mb_string то хорошо бы ему 1 раз и навсегда выставить кодировку:
mb_internal_encoding("cp-1251");
mb_regex_encoding("cp-1251");

Вот например в этой строке
(mb_strpos(mb_strtolower($temp['good_name'],'windows-1251'), $q) !== false)

Тут для mb_strtolower кодировка указана а для mb_strpos нет, почем ее обделили?

Хотя вообще говоря не очень понятно даже зачем тут mb_, ибо если все в ср-1251 то вполне можно использовать обычные ф-ции строчные и на заморачиваться.

Далее, где может быть зарыта собака. Надо бы понять в какой кодировке приходят данные от ajax-запроса. Могу поделиться вот такой вот ф-цией для определения "а не ютф ли нам пришло", ф-ция реально помогла мне сохранить много нервов. Дело в том, что разные браузеры могут передавать данные в разной кодировке, если данные передаются аяксом, тем более через GET.
http://www.php.net/manual/en/function.mb-d...oding.php#68607
Только советую проверить, свою я потерял где-то, не уверен именно ли эту использовал сам.

Ну и наставления.
Как тут уже совершенно справедливо заметили - это не дело - доставать ВСЮ таблицу и перебирать средствами рнр. Никогда так не делайте. Действительно, что будет если в таблице будут десятки или сотни тысяч значений?

Можно начать с того, что предлагали во 2м посте:
Цитата

$text="select good_name from good where good_status=1 AND good_name LIKE '$q%' ";

Кстати не забудте про mysql_real_escape_string() и слэшировать символы _ и % в ручную, т.к. вышеназванная ф-ция их не обрабатывает.

Но вот беда, такой запрос все равно вызовет перебор всей таблицы даже если имеется индекс по полю good_name. По моему опыту нормально это будет до тех пор, пока в таблице не более 3-5 тыс. записей. Если больше - начнет подтормаживать. Автокомплит вызывается часто, поэтому в перспективе этим можно и сервер завалить.

Я у себя применял такую практику. Я создал в базе поле first_3_chars, куда, как следует из названия, поместил первые 3 символа из основного поля good_name в нашем случае. По полю first_3_chars ставится индекс. Далее когда приходит запрос от пользователя мы откусываем от запроса первые 3 символа и целиком запрос к БД выглядит так:
Цитата

$text="select good_name from good where first_3_chars = '".mb_substr($q, 0, 3)."' AND good_status=1 AND good_name LIKE '$q%' ";


Ну понятно дело, что его еще все к нижнему регистру привести надо, это я уж тут не обсуждаю. Так вот, такая практика позволяет использовать индекс в тяжелых запросах на автокомплит. У меня успешно работает на таблице в 20к записей при весьма приличном числе обращений. Но такой подход не позволяет ничего показать, когда введено меньше 3х символов. Если это критично, я бы сложил результаты таких запросов в кеш и выдавал бы оттуда. Просто 3 символа в моем случае было оптимальной границей, т.к. полей с одинаковыми первыми тремя символами было максимум 500-600, т.е. LIKE-запрос делает перебор не более 600 строк, в противном бы случае он перебирал все 20к.

Добавлено через 4 минуты и 51 секунду
Ну и да, следите за тем, в какой кодировке данные в базе. SET NAMES в помощь.

Это сообщение отредактировал(а) Dima 2015 - 18.2.2011, 05:44
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.