Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Коллеги, добрый день!
Подскажите, как исправить и куда смотреть?
При регистрации нового пользователя, если написать имя Кирилицей (логин), то в базу сохраняется только первые три символа.
В файле register.php это поле
<input name="req_user" type="text" size="25" maxlength="25" value="">
На тестовом сервере всё работает нормально. Такая проблема замечена только на боевом. Раньше всё работало. Такая проблема возникла после переезда на другой хостинг.
Версия fluxbb 1.5.9
Версия PHP
На боевом 5.3.10
На тестовом 5.5.9
Offline
@Evgen, обновить версию php на боевом попробуйте. Если нет возможности выбрать более новую версию php, сверьте подключенные расширения php на тестовом и боевом.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, Обновить версию PHP на боевом не могу. Расширения с боевого и тестового серверов ниже.
Обрезанное имя пользователя возвращается уже в строке файла register.php, после этого уже в таким виде попадает в запрос к БД
$username = pun_trim($_POST['req_user']);
Функция pun_trim() обявляется в файле forum/include/functions.php.
Она служит обёрткой для функции utf8_trim()
//
// A wrapper for utf8_trim for compatibility
//
function pun_trim($str, $charlist = false)
{
return is_string($str) ? utf8_trim($str, $charlist) : '';
}
Функция utf8_trim() объявляется в файле forum/include/utf8/trim.php
Вот так выглядит объявление
function utf8_trim( $str, $charlist=false)
{
if($charlist === false)
return trim($str);
return utf8_ltrim(utf8_rtrim($str, $charlist), $charlist);
}
Update:
Загруженные расширения на тестовом сервере.
Array
(
[0] => Core
[1] => date
[2] => ereg
[3] => libxml
[4] => openssl
[5] => pcre
[6] => zlib
[7] => bcmath
[8] => bz2
[9] => calendar
[10] => ctype
[11] => dba
[12] => dom
[13] => hash
[14] => fileinfo
[15] => filter
[16] => ftp
[17] => gettext
[18] => SPL
[19] => iconv
[20] => mbstring
[21] => session
[22] => posix
[23] => Reflection
[24] => standard
[25] => shmop
[26] => SimpleXML
[27] => soap
[28] => sockets
[29] => Phar
[30] => exif
[31] => sysvmsg
[32] => sysvsem
[33] => sysvshm
[34] => tokenizer
[35] => wddx
[36] => xml
[37] => xmlreader
[38] => xmlwriter
[39] => zip
[40] => apache2handler
[41] => PDO
[42] => curl
[43] => gd
[44] => json
[45] => mcrypt
[46] => mysql
[47] => mysqli
[48] => pdo_mysql
[49] => readline
[50] => mhash
[51] => Zend OPcache
)
Расширения на боевом
Array
(
[0] => Core
[1] => date
[2] => ereg
[3] => libxml
[4] => openssl
[5] => pcre
[6] => zlib
[7] => bcmath
[8] => bz2
[9] => calendar
[10] => ctype
[11] => dba
[12] => dom
[13] => hash
[14] => fileinfo
[15] => filter
[16] => ftp
[17] => gettext
[18] => SPL
[19] => iconv
[20] => json
[21] => mbstring
[22] => session
[23] => posix
[24] => Reflection
[25] => standard
[26] => shmop
[27] => SimpleXML
[28] => soap
[29] => sockets
[30] => Phar
[31] => exif
[32] => sysvmsg
[33] => sysvsem
[34] => sysvshm
[35] => tokenizer
[36] => wddx
[37] => xml
[38] => xmlreader
[39] => xmlwriter
[40] => zip
[41] => apache2handler
[42] => gd
[43] => mcrypt
[44] => mysql
[45] => mysqli
[46] => PDO
[47] => pdo_mysql
[48] => mhash
)
Редактировался Evgen (2017-03-30 16:34:40)
Offline
Сделайте
var_dump($_POST['req_user']);
перед и после
$username = pun_trim($_POST['req_user']);
По поводу функции pun_trim. Она тут вызывается без второго параметра, то есть в дальнейшем используются стандартные функции php ltrim() и rtrim(), а не регулярные выражения.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
В phpinfo еще гляньте версию PCRE Library. Может действительно библиотека регулярок очень старая стоит.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
И еще вопрос: используете оригинальный FluxBB или мою сборку?
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, Обрезанное значение ещё приходит до этой строки.
$username = pun_trim($_POST['req_user']);
Получается что это приходит из формы регистрации?
Update:
По поводу сборки не могу сказать, давно устанавливался форум. Как идентифицировать сборка ваша или нет?
Редактировался Evgen (2017-03-30 17:04:21)
Offline
@Evgen, получается что данные приходят в php уже обрезанные. Плагины безопасности на апаче смотрите. Сухосин например. Если есть, отключайте.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, список подключённых к apache плагинов
Тестовый
Array
(
[0] => core
[1] => mod_so
[2] => mod_watchdog
[3] => http_core
[4] => mod_log_config
[5] => mod_logio
[6] => mod_version
[7] => mod_unixd
[8] => mod_access_compat
[9] => mod_alias
[10] => mod_auth_basic
[11] => mod_authn_core
[12] => mod_authn_file
[13] => mod_authz_core
[14] => mod_authz_host
[15] => mod_authz_user
[16] => mod_autoindex
[17] => mod_deflate
[18] => mod_dir
[19] => mod_env
[20] => mod_filter
[21] => mod_mime
[22] => prefork
[23] => mod_negotiation
[24] => mod_php5
[25] => mod_rewrite
[26] => mod_setenvif
[27] => mod_status
)
Боевой
Array
(
[0] => core
[1] => mod_log_config
[2] => mod_logio
[3] => prefork
[4] => http_core
[5] => mod_so
[6] => mod_alias
[7] => mod_auth_basic
[8] => mod_authn_file
[9] => mod_authz_default
[10] => mod_authz_groupfile
[11] => mod_authz_host
[12] => mod_authz_user
[13] => mod_autoindex
[14] => mod_cgi
[15] => mod_deflate
[16] => mod_dir
[17] => mod_env
[18] => mod_mime
[19] => mod_negotiation
[20] => mod_php5
[21] => mod_reqtimeout
[22] => mod_rewrite
[23] => mod_rpaf-2
[24] => mod_setenvif
[25] => mod_status
)
Update:
Вот эти плагины есть только на боевом сервер. Сухосин не нашёл
[9] => mod_authz_default
[10] => mod_authz_groupfile
[14] => mod_cgi
[21] => mod_reqtimeout
[23] => mod_rpaf-2
Редактировался Evgen (2017-03-30 17:23:26)
Offline
@Evgen, ни чего подозрительного тут.
Поставьте
var_dump($_POST['req_user']);
в самое начало файла регистрации (я про обработку входящих данных в common.php забыл) .
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, Вставил в самую первую строчку register.php. Имя приходит корректное, не обрезанное.
var_dump($_POST['req_user']);
Вот здесь уже обрезенное имя
if (isset($_POST['form_sent']))
{var_dump($_POST['req_user']);
Редактировался Evgen (2017-03-30 17:42:19)
Offline
@Evgen, предлагаю попробовать заменить строку
$array = utf8_bad_strip($array);
на
mb_substitute_character(0xFFFD);
$array = mb_convert_encoding((string) $array, 'UTF-8', 'UTF-8');
в файле functions.php и посмотреть на результат.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, Отлично! Сработало! Спасибо Вам большое.
Можете теперь пояснить, в чём была проблема этой строки? Ведь на тестовом всё работало.
$array = utf8_bad_strip($array);
И что делают ваши строчки?
mb_substitute_character(0xFFFD);
$array = mb_convert_encoding((string) $array, 'UTF-8', 'UTF-8');
Редактировался Evgen (2017-03-30 17:54:34)
Offline
@Evgen, это только тест. Верните последнее изменение на место. Нужно исправить функцию utf8_bad_strip().
mb_substitute_character(0xFFFD);
устанавливает символ замены для "плохих" символов.
$array = mb_convert_encoding((string) $array, 'UTF-8', 'UTF-8');
конвертирует содержимое $array из кодировки UTF-8 в кодировку UTF-8. При этом "плохие" символы заменяются на символ замены.
В файле include/utf8/utils/bad.php меняйте функцию
function utf8_bad_strip($original)
{
return utf8_bad_replace($original, '');
}
на
function utf8_bad_strip($original)
{
mb_substitute_character(0xFFFD);
return mb_convert_encoding((string) $original, 'UTF-8', 'UTF-8');
}
чтобы в других местах, где данная функция используется не было ошибок.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, Сделал.
Работа функции utf8_bad_strip как-то зависит от настроек окружения?
Какие символы считаются плохие? И почему именно после трёх символов обрезались данные?
Не пойму.
Получается эта строка все "плохие символы" удаляла?
return utf8_bad_replace($original, '');
}
Offline
@Evgen, зависит она только от функции utf8_bad_replace(), а та не зависит ни от чего, в ней нет ни каких заумных действий, только сравнения и конкатенация строк.
Какие символы считаются плохие?
Те которые не входят в диапазон символов UTF-8.
И почему именно после трёх символов обрезались данные?
Это тайна покрытая мраком
Получается эта строка все "плохие символы" удаляла?
Да, функция utf8_bad_replace() удаляет в данном случае все "плохие" символы. Я предложил вам ее заменить стандартной функцией mb_convert_encoding().
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
@Visman, Спасибо большое!
Offline