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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с UTF-8 - регистр, Затруднения при поиске с регистром 
:(
    Опции темы
Ze1ym
Дата 18.7.2009, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.3.2008
Где: г. Грозный

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



У меня есть таблица, в этой таблице все данные записаны в кодировке UTF-8. Допустим, эта таблица предназначена для сообщений форума. И пришло мне в голову сделать функцию поиска. Да вот проблема одна встает - как мне сделать так, чтобы при поиске регистр не был важен? Кодировка же UTF-8. У меня у самого такое решение:
Код

$newstring = iconv("utf-8","windows-1251",$string); //Это строка поиска, она тоже в utf-8, поэтому перекодировал
$q = mysql_query("select something from table");
while($p = mysql_fetch_array($q)) {
$convert = iconv("utf-8","windows-1251",$p[something]);
if(eregi($newstring,$convert,$result)) { 
$rresult = iconv("windows-1251","utf-8",$result[0]);
$find .= str_replace($rresult,"<b>$rresult</b>",$p[something]); } //Тут как бы всё найденное записываем в одну переменную, выделяя при этом найденные промежутки
}
print "Вот вам и найденная кучка: $find<br/>";


Ну примерно вот так вот. Это, конечно, грубый пример, но  всё же - я использовал при поиске функцию iconv() и проверял каждую запись. Это слишком затягивается, порой даже на 3 секунды. Будут ли альтернативные варианты?
PM MAIL WWW   Вверх
youri
Дата 18.7.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а что в mysql есть utf-8 case sensiitive кодировки? Зачем ты все к windows-1251 приводишь, если в таблице utf-8 используется?
PM   Вверх
Ze1ym
Дата 18.7.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.3.2008
Где: г. Грозный

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



Да, в таблице используется utf8. Тогда смотрите, если я сделаю вот так:

Код

$string = "Слово" //Строка поиска "Слово" - на utf8
$search = mysql_query("select * from table where message LIKE '%$string%' ");
while($result = mysql_fetch_array($search)) {
$message .= str_replace($string,"<b>$string</b>",$result[message]); }

print "Вот найденная кучка: $message";



В результате этого мне база данных найдет только те сообщения, в которых точно присутствует Слово, то есть "Слово". Но может быть, что в сообщениях может быть "слово" или "сЛово", или "СЛОВО", а на utf8 это будут совсем разные строчки, типа слово, сЛово и СЛОВО. 
Так как мне сделать так, чтобы все они находились? В предыдущем примере я переводил строчки в windows-1251 для того, чтобы потом с помощью eregi() я смог игнорировать регистр букв.
PM MAIL WWW   Вверх
unicross
Дата 18.7.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

<?php
/* БД test
CREATE TABLE `w` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `words` varchar(255) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `w` (`id`, `words`) VALUES
(1, 'Слово'),
(2, 'слово'),
(3, 'сЛово'),
(4, 'СЛОВО');
*/
header("Content-Type: text/html; charset=utf-8");
if ($db = mysql_connect('localhost', 'root', '123456')) {
   mysql_select_db("test");
   mysql_query("SET NAMES utf8");
   $string = "Слово";
   $pattern = '/(' . preg_quote($string) . ')/iu';
   $query = "SELECT * FROM `w` WHERE `words` LIKE '%$string%'";
   if ($res = mysql_query($query)) {
      while ($row = mysql_fetch_row($res)) {
         echo preg_replace($pattern, "<b>$1</b>", $row[1]) . "<br>\n";
      }
   }
   else {
       echo 'Ошибка ' . mysql_errno() . ' ' . mysql_error();
   }
}
else {
   echo 'Ошибка ' . mysql_errno() . ' ' . mysql_error();
}
/*
Результат в исходном коде
<b>Слово</b><br>
<b>слово</b><br>
<b>сЛово</b><br>
<b>СЛОВО</b><br>
*/
?>

Сам файл должен быть в UTF-8 (без BOM)... Сравнение в поле words должно быть utf8_general_ci
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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