Форумы » VOC++ чаты (больше не поддерживаются) »

Исправление ошибок в коде чатов VOC++



298
mychatik
В коде чатов VOC++, к сожалению, довольно много ошибок.
К тому же, некоторые переменные и функции, используемые в коде чата и некоторых модов - являются уже устаревшими и подлежат замене.

И хотя эти ошибки пока не стали критичными, и чат с ними работоспособен, их наличие может проявиться при [url=https://forum.vmeste.eu/viewtopic.php?pid=327946#p327946]смене версии [b]php[/b][/url] или переносе на другой сервер, который перестал поддерживать устаревшие функции, либо сказываться на кроссбраузерности и СЕО.

В этой теме буду выкладывать способы исправления данных проблем.
[b]Все предложенные правки - 100% рабочие, сделаны и протестированы мною в чате «Глобус».[/b]

Не обязательно делать все изменения сразу. Можно заменять по мере их обнаружения, во время установки модов, или правки кода.
Если вы сразу замените не все, а только часть устаревших функций, то от этого чат не "сломается", а будет работать, как и работал.

Я буду стараться выкладывать списки всех файлов, в которых необходимо делать замены. Но могу что-то забыть, или сам ещё не найти.
Поэтому, если вы встретите в файлах чата описанные ниже функции - можете заменить их самостоятельно.

[color=red][b]Напоминаю, что перед правкой файла (особенно с заменой функций) - обязательно (!!!) делайте его бэкап![/b][/color]
298
mychatik
[b]И начнем с самого начала. С заголовка страницы - DOCTYPE[/b].

Согласно спецификациям HTML и XHTML тег [b]DOCTYPE[/b] (что означает «объявление типа документа») сообщает валидатору, какую именно версию (X)HTMLвы используете в своей странице. Этот тег должен всегда находиться в первой строке каждой страницы сайта.
Тег DOCTYPE — ключевой компонент web-страниц, претендующих на соответствие стандартам: без него ваш код и CSS не пройдут проверку валидатором.
Он также важен для правильного отображения и работы страницы в броузерах, соответствующих стандартам (Mozilla, IE5/Mac, и IE6/Win).
Тег, в атрибутах которого указывается полный URI (полный web-адрес), сообщает броузерам, что страницу нужно вывести с соблюдением определенного стандарта или подвида этого стандарта.
Если вы будете пользоваться неполным тегом DOCTYPE, устаревшим его видом, или вообще забудете про него, броузер перейдет в «загадочный» (quirk) режим и будет исходить из предположения, что вы писали код страницы с ошибками и вольно отступали от стандартов, т.е. так, как писали в конце 90-ых годов.
В этом режиме броузер попытается разобрать вашу страницу по правилам обратной совместимости и выведет на экран, например, CSS так, как его вывел бы Internet Explorer 4-ой версии, а DOM будет работать так, как он работал именно в этом броузере (IE переключается в свой старый DOM, а Mozilla и Netscape 6 переключается вообще в непонятно что).
Понятно, что для вас эти выкрутасы не желательны. Но именно это вы можете получить, если будете пользоваться неполным или неправильным тегом DOCTYPE.

В файлах [b]/js_frameset.php[/b], [b]/дизайн/fullinfo.php[/b] и [b]/admin/index.php[/b] указан DOCTYPE, как
[code]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">[/code]
Но этот DOCTYPE - для обычных страниц. И он невалиден для документов с фреймами, которыми и являются указанные файлы.

Его необходимо заменить на
[code]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">[/code]
Этот DTD идентичен [b]HTML 4.01 Transitional DTD[/b], за исключением содержимого [b]<HTML>[/b]: в наборе фреймов, тег [b]<FRAMESET>[/b] заменяет тег [b]<BODY>[/b].

К тому же указанный в чате DOCTYPE - устаревший.
На остальных страницах нужно только сменить версию с [b]HTML 4.0[/b] на [b]HTML 4.01[/b].

В одной из сборок я встретил вообще раритетный DOCTYPE (спецификация 1995 г.)
[code]<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//RU//4.0">[/code]
Если у вас тоже что-то подобное - меняем на правильный.
298
mychatik
[b]Замена $HTTP_SERVER_VARS на $_SERVER[/b]
[b]Замена $HTTP_GET_VARS на $_GET[/b]
[b]Замена $HTTP_POST_VARS на $_POST[/b]
[b]Замена $HTTP_POST_FILES на $_FILES[/b]
[b]Замена $HTTP_ENV_VARS на $_ENV[/b]

В PHP » 4.1.0 были добавлены суперглобальные массивы:
[b]$_GET[/b], [b]$_POST[/b], [b]$_COOKIE[/b], [b]$_SERVER[/b], [b]$_FILES[/b], [b]$_ENV[/b], [b]$_REQUEST[/b], [b]$_SESSION[/b] и [b]$ _FILES[/b].
А с PHP 5.4.0, старые массивы [b]$HTTP_*_VARS[/b] и [b]$HTTP_POST_FILES[/b] удалены.

Соответственно, [b]$HTTP_GET_VARS[/b] устарел и заменён на суперглобальный массив [b]$_GET[/b], [b]$HTTP_POST_VARS[/b] — на [b]$_POST[/b] и т.д.

Например, в [b]/admin/check_session.php[/b] необходимо найти:
[code]while (list($var, $val) = each($HTTP_GET_VARS)) $$var = $val;
while (list($var, $val) = each($HTTP_POST_VARS)) $$var = $val;[/code]
и [i]заменить[/i] на:
[code]while (list($var, $val) = each($_GET)) ${$var} = $val;
while (list($var, $val) = each($_POST)) ${$var} = $val;[/code]
В [b]/data/engine/files/log_message.php[/b], кроме замены устаревших массивов, необходимо удалить один из них:
в строке (в файле она встречается 3 раза):
[quote]global $data_path[color=red], $HTTP_SERVER_VARS[/color];[/quote]
удаляем всё, выделенное красным.
То же самое и в [b]/inc_common.php[/b]:
[quote]global[color=red] $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS,[/color] ${$variable_name};[/quote]
Делается это потому, что массивы [b]$_SERVER[/b], [b]$_GET[/b], [b]$_POST[/b], [b]$_COOKIE[/b] и так уже является суперглобальными (т.е. доступными в любом месте скрипта), поэтому дополнительное указание для них не нужно.
--------------------------------------

Файлы, в которых необходима замена:

Эта информация скрыта и доступна только зарегистрированным пользователям.
298
mychatik
[b]Переменные переменных (символические ссылки)[/b]

Переменная переменная берет значение переменной и рассматривает его как имя переменной.
То есть, это имя переменной, которое может быть определено и изменено динамически.
Переменная переменная обозначается оператором [b]$$[/b].

[code]$foo = 'bar';
$bar = 'I am text';
echo $$foo; // I am text[/code]
В выражение [b]$$foo[/b] вместо [b]$foo[/b] будет подставлено его значение и получится [b]$bar[/b].

Теоретически, знаков [b]$[/b] перед именем переменной может быть сколько угодно.

[code] $Bar = "a";
$Foo = "Bar";
$World = "Foo";
$Hello = "World";
$a = "Hello";

$a; // выведет Hello
$$a; // выведет World
$$$a; // выведет Foo
$$$$a; // выведет Bar
$$$$$a; // выведет a

$$$$$$a; // выведет Hello
$$$$$$$a; // выведет World

//... и так далее ...//[/code]
Подробнее можно прочитать [url=http://f9r.ru/dollar.html]ЗДЕСЬ[/url].

Этот синтаксис уже устарел в [b]PHP5[/b], а в [b]PHP7[/b] - удалён.
Для эмуляции предыдущего поведения необходимо использовать фигурные скобки.

Переменные переменные используются довольно редко, но в коде чата они есть.
Поэтому, если вы при редактировании кода встретите запись, подобную [b]$$var = ...[/b] - её нужно заменить на [b]${$var} = ...[/b]

Примеры подобной замены - в предыдущем посте.

------------------------------------

Файлы, требующие редактирования:

Эта информация скрыта и доступна только зарегистрированным пользователям.
298
mychatik
[b]Замена ereg (eregi) на preg_match
Замена ereg_replace (ereg_replacei) на preg_repalce[/b]
(для тех, кто не в курсе, символ "[b]i[/b]" в конце функции означает регистронезависимый поиск)

Начиная с[b] PHP 5.3[/b], разработчки решили избавиться от POSIX регулярных выражений ([url=http://fi2.php.net/manual/ru/reference.pcre.pattern.posix.php]ПОДРОБНЕЕ[/url]).
В самом деле, зачем нужны две библиотеки для работы с регулярными выражениями, если можно обойтись одной?
К тому же, POSIX регулярные выражения гораздо медленнее чем Perl совместимые регулярные выражения (PCRE).

Просто взять и заменить одно выражение на другое нельзя. Будет выдано сообщение об ошибке.
Для корректной замены, необходимо:

[b]1.[/b] Заменить [b]ereg[/b] и [b]eregi[/b] на [b]preg_match[/b], [b]ereg_replace[/b] и [b]ereg_replacei[/b] на [b]preg_repalce[/b];
[b]2.[/b] Добавить разделители в начало и конец регулярного выражения;
[b]3.[/b] Если POSIX функция кончается на [b]i[/b] ([b]eregi[/b], [b]ereg_replacei)[/b], то добавить [b]i[/b] в конец регулярного выражения, после разделителя.

[b]P.S.[/b] Не забывайте экранировать обратным слешем [color=red][b]\[/b][/color] мета-символы [b]^ $ * + - ? . \ |[/b], если они используются в регулярных выражениях в качестве того символа, каким они есть, а не в качестве специального символа.

---------------------------------

[b]Примеры замены:[/b]

В [b]/admin/search.php[/b] ищем:
[code]if (eregi($ttt,$t_nickname)) $users_to_show[] = $user;[/code]
и меняем на:
[code]if (preg_match("/".$ttt."/i", $t_nickname)) $users_to_show[] = $user;[/code]
В этом файле можно сделать ещё лучше:
[code]if (mb_stripos($t_nickname, $ttt) !== false) $users_to_show[] = $user;[/code]
[b]P.S.[/b] Данная функция намного проще и быстрее регулярки, но её нужно использовать осторожно.
Не везде она сможет заменить регулярное выражение.
К примеру, если применить её в [b]/data/engine/files/users_search.php[/b] - то поиск по [b]*[/b] перестаёт работать.

В [b]/plugins/antihack/plugin.php[/b] ищем:
[code]$string = ereg_replace ("[^a-zA-Z0-9.]", "", $string);[/code]
и меняем на:
[code] $string = preg_replace("/[^A-Za-z0-9\.]/", "", $string);[/code]
(В этом примере, спецсимвол [b].[/b] был заэкранирован)

---------------------------------

Я буду стараться выложить все файлы, где необходима замена.
Но если что упущу - добавляйте и спрашивайте, если не получается сделать самим.

Файлы, в которых необходимо производить замену (некоторых файлов у вас может не быть):

Эта информация скрыта и доступна только зарегистрированным пользователям.
298
mychatik
Замена [b]split[/b] на [b]explode[/b] или [b]preg_split[/b].

С версии [b]PHP 5.3.0[/b] функция [b]split[/b] считается УСТАРЕВШЕЙ. В [b]PHP 7.0[/b] - удалена.

Меняется она на функцию [b]explode[/b], которая не использует регулярных выражений и поэтому работает намного быстрее.
Если же нужно разбить строку по регулярному выражению - тогда применяется более быстрая функция [b]preg_split[/b].

В чатах на движке [b]VOC++[/b] - все [b]split[/b] меняются на [b]explode[/b], без каких-либо дополнительных изменений в коде.


Файлы, в которых нужна замена:

Эта информация скрыта и доступна только зарегистрированным пользователям.
298
mychatik
В некоторых чатах возникает проблема с ответами в викторине, при использовании юзером [u]транслитерации[/u].

Проблема заключается в том, что в языковом файле, в функции транслита, почему-то вместо русских букв написали аналогичные по виду английские.
И викторина, соответственно, их не принимает. Хотя на читаемость текста это не влияет.
Для исправления бага - полностью заменить аналогичный массив в [b]languages/ru.php[/b].

Вот исправленный мною и дополненный массив соответствия транслитерации => русским буквам:

Эта информация скрыта и доступна только зарегистрированным пользователям.
298
mychatik
[b]Убираем дублирование атрибута style:[/b]

В чате "кликабельность" ника осуществляется подобным образом:
[code]<a style='text-decoration: underline' style='{cursor: pointer}' onClick=\"javascript:parent.Whisper('НИК');\">НИК</a>[/code]
Вроде как всё в порядке. Данный код работает не один десяток лет во всех чатах на движке VOC++.
А вот валидатор ругается на двойной атрибут [b]style[/b] в теге.
И до сих пор никто не обратил внимания, и не не устранил ошибку.

Исправляется очень просто:
[code]<a style='text-decoration: underline; cursor: pointer;' onClick=\"javascript:parent.Whisper('НИК');\">НИК</a>[/code]
Эта строка встречается в коде чата много раз, в разных вариантах и в разных файлах.
В том числе и в главной админке [b]Конфигурирование[/b] => [b]Внешний вид[/b] => [b]Шаблоны сообщений[/b]
298
mychatik
[b]Проблема с Style Selection Plugin for VOC++ BSE[/b] от [b]CyberDream[/b]

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

Проблема возникает только там, где установлен мод [b]Style Selection Plugin for VOC++ BSE[/b] от [b]CyberDream[/b] - товар набора шрифтов.
И именно тогда, когда был приобретён этот товар в магазине, но ещё не применён.
После применения данного товара - проблема с подарками исчезает.

Проблема не явно выраженная. Так как шрифты меняют нечасто, плюс в этот период не каждый решает удалить какой-то подарок.
У меня в чате, в течении нескольких лет, время от времени кто-то да и обращался с такой проблемой.
Но так, как проблема "самоустранялась" после применения шрифтов - всё списывалось на банальный глюк браузера, или ещё что-то.

Но оказалось, что это не глюк.
Проблема - в вышеназванном моде. Все его копии имеют ошибку в коде. То ли случайную, то ли кем-то внесённую.
В файле [b]frontend.php[/b] мода отсутствует закрывающий тег формы [b]</form>[/b].

Для устранения проблемы достаточно добавить этот тег после всего кода.
Чтобы в конце было так:

[code] <td><input type="Submit" class="input_button" value="OK"></td>
</tr>
</table>
</form>[/code]
[b]P.S.[/b] Данный мод, выложенный мною на форуме - исправлен.
298
mychatik
В коде чата есть несколько неправильных записей кода цвета в шестнадцатеричном формате (не указан префикс «[b]#[/b]»).

[code]<font color=\"bf0d0d\">[/code]
Но сделано это не просто так.
В дальнейшем символ [b]#[/b] с помощью регулярного выражения преобразуется в ник пользователя и правильная запись кода цвета приводит к неправильному выводу текста в чат.

Но можно исправить код так, чтобы и запись кода была правильной, и вывод сообщения - тоже.
Для этого нужно записать код цвета не в шестнадцатеричном [b]HEX[/b], а в десятичном [b]RGB[/b] формате.

Для этого, открываем корневой файл [b]voc.php[/b] и ищем строку:

[code]$sw_rob_login = "<font color=\"bf0d0d\"><b>".$current_user->login_phrase."</b></font>";[/code]
И меняем её на:
[code]$sw_rob_login = '<b style="color:rgb(191,13,13);">'.$current_user->login_phrase.'</b>';[/code]
То же самое делаем и в корневом [b]who.php[/b], только с двумя строками:
[code]$sw_rob_login = "<font color=\"bf0d0d\"><b>".$current_user->login_phrase."</b></font>";[/code]
Меняем на:
[code]$sw_rob_login = '<b style="color:rgb(191,13,13);">'.$current_user->login_phrase.'</b>';[/code]
И
[code]$sw_rob_logout = "<font color=\"bf0d0d\"><b>".$current_user->logout_phrase."</b></font>";[/code]
Меняем на:
[code]$sw_rob_logout = '<b style="color:rgb(191,13,13);">'.$current_user->logout_phrase.'</b>';[/code]
А в строке:
[code]$sw_rob_login = str_replace("||", "<font color=\"bf0d0d\">".ucfirst($current_user->chat_status)."</font>", $sw_rob_login);[/code]
префикс [b]#[/b] можно просто добавить:
[code]$sw_rob_login = str_replace("||", '<font color="#bf0d0d">'.ucfirst($current_user->chat_status).'</font>', $sw_rob_login);[/code]
или сделать так:
[code]$sw_rob_login = str_replace("||", '<span style="color:#bf0d0d;">'.ucfirst($current_user->chat_status).'</span>', $sw_rob_login);[/code]

Неавторизованные и новички не могут отправлять сообщения.

© 2008-2020
Контакты | Группа | Privacy и Cookie | Правила