форум vBSupport.ru > vBulletin > Вопрос — Ответ
Register Меню vBsupport Изображения Files Manager О рекламе Today's Posts Search
  • Родная гавань
  • Блок РКН снят
  • Premoderation
  • For English speaking users
  • Каталог Фрилансеров
  • If you want to buy some product or script
  • Администраторам
VBsupport перешел с домена .ORG на родной .RU Ура! Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже:
Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
 
 
 
 
Gostemilov
Специалист
Default Photopost Pro, нецензурное и все-все-все
3

Quote:
- Что самое прекрасное в мире? Борьба за освобождение человечества! А еще прекраснее вот что... Записывайте!
(с) В. Ерофеев, рецепт коктейля "Сучий потрох", "Москва-Петушки"
Полазив в Интернетах с большим удивлением обнаружил, что все прогрессивное человечество вместо борьбы за мир или, на худой конец, поисков чего-то вечного и светлого (желательно, не менее 40 градусов) озабочено проблемой кодировок MySQL. Ну почти все человечество. Не считая кучки отщепенцев, которые эту самую MySQL разрабатывают и не менее омерзительной кучки, которая релизит PHP 7.0

Нет, уровень "а у меня тут кракозябры" - это для неофитов. Куды как более интересны траблы с полнотекстовым поиском, сортировкой и более захватывающими вещами.

Альзо, камараден, рассмотрим пример

Берем любую версию PhotoPost Pro (начиная с 7.0 и по как минимум 8.4)

Там есть (следите за мыслью) теги. И эти теги при попытке ими воспользоваться отдаются в GET. И, сответственно, приходят опять же в GET в search.php. А там уже выполняется (страшно сказать) устрашающего вида LIKE запрос и потом, если повезет, выдача результатов.

Как сие выглядит на деле:

Берем реальный тег, к примеру, "лошадь"

Имеем для тега URL

Code:
http://photoshopia.ru/gallery_bkg/search.php?keywords=лошадь
В результате хитрых танцев с бубном выдается результат

Code:
http://photoshopia.ru/gallery_bkg/search.php?searchid=3
А вот если это вовсе даже и не лошадь, а совсем даже конь, то идете вы с результатами поиска, гм, в длительное пешее путешествие с эротическим уклоном, ибо в данном случае в поисковом запросе не могут присутствовать кириллические буквы "к", "н" и еще с десяток других.

Если более подробно

Code:
                if ( $key )
                {
                    if ( !$condition )
                    {
                        $scond = "AND";
                    }
                    elseif ( $condition == "or" )
                    {
                        $scond = "OR";
                    }
                    else
                    {
                        $scond = "AND";
                    }

                    if ( $what == "allfields" )
                    {
                        $keyphrase .= ( empty($keyphrase) ? "AND " : "$scond " );

                        $keyphrase .= "((p.title LIKE \"% $key%\" OR p.description LIKE \"% $key%\" OR p.keywords LIKE \"% $key%\" OR p.bigimage LIKE \"% $key%\"
                            OR p.extra1 LIKE \"% $key%\" OR p.extra2 LIKE \"% $key%\" OR p.extra3 LIKE \"% $key%\" OR p.extra4 LIKE \"% $key%\" OR p.extra5 LIKE \"% $key%\" OR p.extra6 LIKE \"% $key%\" OR e.selection LIKE \"% $key%\")";
                        $keyphrase .= " OR (p.title LIKE \"$key%\" OR p.description LIKE \"$key%\" OR p.keywords LIKE \"$key%\" OR p.bigimage LIKE \"$key%\"
                            OR p.extra1 LIKE \"%$key%\" OR p.extra2 LIKE \"%$key%\" OR p.extra3 LIKE \"%$key%\" OR p.extra4 LIKE \"%$key%\" OR p.extra5 LIKE \"%$key%\" OR p.extra6 LIKE \"%$key%\" OR e.selection LIKE \"%$key%\"))";
                    }
                    elseif ( $what == "title" )
                    {
                        $keyphrase .= ( empty($keyphrase) ? "AND " : "$scond " );

                        $keyphrase .= "((p.title LIKE \"% $key%\") OR (p.title LIKE \"$key%\"))";
                    }
                    elseif ( $what == "titledesc" )
                    {
                        $keyphrase .= ( empty($keyphrase) ? "AND " : "$scond " );

                        $keyphrase .= "((p.title LIKE \"% $key%\" OR p.description LIKE \"% $key%\")";
                        $keyphrase .= " OR (p.title LIKE \"$key%\" OR p.description LIKE \"$key%\"))";
                    }
                    else
                    {
                        unset( $what );
                    }
                }
            }
Принцип поиска прост до безобразия, причем в PMA эти запросы проходят на Ура и дают корректный результат, а вот средствами PHP чего-то как-то оно не того этого...

Была предпринята попытка а-ля "стильно, модно, молодежно" перед запросом

Code:
$key=mb_convert_encoding($key, 'utf-8', mb_detect_encoding($key));
ну или иные кодировки. Результат поражает. После этой команды вместо результата "Ой, все, отстаньте от меня, я ничего не нашла" в результат поиска выдается вообще все. То есть если в галерее 30К изображений, то все они и найдутся.

В общем вопрос, как всегда один - где копать?

Code:
SHOW GLOBAL VARIABLES LIKE 'character_set%'

character_set_client 	cp1251
character_set_connection 	cp1251
character_set_database 	cp1251
character_set_filesystem 	binary
character_set_results 	cp1251
character_set_server 	cp1251
character_set_system 	utf8
character_sets_dir 	/usr/share/mysql/charsets/

SHOW VARIABLES LIKE 'character_set%'

character_set_client 	utf8
character_set_connection 	cp1251
character_set_database 	cp1251
character_set_filesystem 	binary
character_set_results 	utf8
character_set_server 	cp1251
character_set_system 	utf8
character_sets_dir 	/usr/share/mysql/charsets/
Сервер: MySQL (Localhost via UNIX socket)
Версия сервера: 5.1.73-1
Версия протокола: 10
Пользователь: root@localhost
MySQL-кодировка: UTF-8 Unicode (utf8)

Тока Христом-Богом прошу - не посылайте в Гугль, я оттуда уже 2 суток не вылезаю, везде только умные рассуждения на тему "Вот если бы с чарсетом не было проблем..." и никаких конкретных рекомендаций.. Увы-с.

Gostemilov добавил 08.04.2015 в 17:42
P.S. вообще-то полагал, что LIKE запросы прилично грузят сервер. Может, поднапрячься и сделать систему тегов, как на форуме, благо придумывать не надо, 90% простой копипаст, а на авторские права кого угодно в данном случае мне начхать?

Last edited by Gostemilov : 04-08-2015 at 06:42 PM. Reason: Добавлено сообщение
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
 
 
kerk
k0t
 
kerk's Avatar
Default
3

все ниже опианное применимо только к пост-запросам отправленным через аякс, т.к. из яваскрипта всегда приходят данные в UTF-8

Quote:
Originally Posted by Gostemilov View Post
$key=mb_convert_encoding($key, 'utf-8', mb_detect_encoding($key));
я делаю немного не так
т.е. вообще не так
нам известно:
в какой кодировке форум и таблицы + поля в таблицах + текст в полях
кодировка, указанная в настройках языков, загнанная в переменную $stylevar['charset']

проверяю, что пришло в запросе и как пришло
PHP Code:
if($vbulletin->GPC['ajax'])
{
      
// проверяем кодировку
      
if(strtoupper($stylevar['charset']) != 'UTF-8')
      {
            
// конвертирую строку из пост-запроса
            
$search_str krfm_convert_string('UTF-8'$stylevar['charset'], $search_str);
      }

функция из файловика для перекодировки
PHP Code:
// Convert string using existing functions, return non converted string otherwise
function krfm_convert_string($convert_from$convert_to$string)
{
      if(
function_exists('iconv'))
      {
            return @
iconv($convert_from$convert_to$string);
      }
      else if(
function_exists('mb_convert_encoding'))
      {
            return @
mb_convert_encoding($string$convert_to$convert_from);
      }
      return 
$string;

а пхпшная функция mb_detect_encoding() вообще ниачём =)
она не корректно определяет кодировки (вернее определяет только латинские типы кодировок)
я по началу тоже обрадовался, думал, вот универсальное решение
хрен там
что бы определить кодировку более/менее нормально, подключал целый файл с набором возможных сочетаний символов (который так же используется в файловике charset_krfilesmanager.php и charset_UTF-8_krfilesmanager.php)
упоминания о библиотеке
1. http://www.askdev.ru/php/5316/Проблема-с-кодировкой/
2. http://forum.php.su/topic.php?forum=28&topic=75
гугл. https://www.google.com/webhp?complet...=a.charset.php
так как сайт автора в дауне, может потому что домен в "зоне" военных действий UA popoff.donetsk.ua/text/work/libs/a/charset/
 
 
kerk
k0t
 
kerk's Avatar
Default
1

кстати, в файловике используется поиск похожий на вобловский, сама система поиска скопирована из воблы и адаптирована под свои нужды (используется полнотекстовый поиск, а не %LIKE% в разных вариантах, если включен полнотекстовый в настройках и поддерживается серваком)
на форумах с кодировкой UTF все работает нормально
поиск находит именно то, что запрошено, если это есть в БД оно будет найдено
тоже самое с тегами в файловике

пример ссылки с меткой "русификатор"
http://vbsupport.ru/forum/krfilesman...82%D0%BE%D1%80

как это работает на форумах с кодировкой cp1251, мне не ведомо, т.к. никто пока не отписывался о таких проблемах
 
 
Luvilla
Гость
Default

Quote:
Originally Posted by Gostemilov View Post
релизит PHP 7.0
эмммм....
 
 
Smalesh
В Черном списке
Default
0

Quote:
Originally Posted by Luvilla View Post
эмммм....
Еще в Internet Brands подсуетятся, и будет "какая боль, какая боль, пхп и вбулетин 7.0"
 
 
Gostemilov
Специалист
Default
0

Quote:
Originally Posted by kerk View Post
как это работает на форумах с кодировкой cp1251, мне не ведомо, т.к. никто пока не отписывался о таких проблемах
- и не отпишется. Оно работает на cp1251

Gostemilov добавил 09.04.2015 в 05:18
Quote:
Originally Posted by Smalesh View Post
Еще в Internet Brands подсуетятся, и будет "какая боль, какая боль, пхп и вбулетин 7.0"
Не-а. Debian 7.0 + PHP 7.0 + Vbulletin 7.0 - вот чего бояться-то надо!

Quote:
После того как разработчики PHP определились с номером версии для нового PHP (новая версия будет PHP 7.x, а не PHP 6.x, наработки по 6.x были перенесены в ветку 5.x), пришло время спланировать график выпуска PHP 7.x. Было принято решение закончить разработку 7.0 в течение года, с датой релиза в ноябре 2015.

Чтобы PHP развивался быстрее, было решено сократить цикл разработки новых версий PHP, чтобы можно было добавлять новые возможности языка в каждую мажорную версию. За год наберется достаточное количество изменений, которые приведут к несовместимости версий, чтобы выносить их в новую мажорную версию PHP. Также все дополнительные изменения в PHP будут добавлятся в минорные версии 7.1, 7.2 и т.д.
Gostemilov добавил 09.04.2015 в 05:24
То есть в итоге ( в код пока не лез)

1. Из поста берутся теги в виде "тег1, тег2,тег3"
2. explode эту строку
3. Каждый тег в таблицу тегов , в первое поле сам тег, во второе номер поста, проверять уникальность не нужно

При поиске -
4. стандартный поиск без LIKE в поле тегов, дает массив ID постов
5. Дальше все просто

Quote:
Ну это и я могу... Мурку давай!
Gostemilov добавил 09.04.2015 в 06:25
Оффтоп

Last edited by Gostemilov : 04-09-2015 at 07:25 AM. Reason: Добавлено сообщение
 
 
kerk
k0t
 
kerk's Avatar
Default
0

Quote:
Originally Posted by Gostemilov View Post
которых ЗАСТАВЛЯЮТ постоянно переписывать код
"автор" может указать в требованиях к скрипту, что работает на версии ХХ пхп (актуальной на момент написания скрипта)
и для обновления скрипта при переходе на новую версию пхп, будльте добры оплатить время кодера, потраченное на адаптацию
как это происходит у огрызков/андроидов в их "маркетах", хз... =)
 

Tags
mysql, photopost, php, кодировка


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 12:54 AM.


Powered by vBulletin® Version Х.З.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.