Страница 1 из 1
Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 03:35
makbeth
Не хочу, чтобы на сайте использовались эмодзи. Не хочу ставить utf8mb4. Если стоит просто кодировка utf8 и кто-то пытается закинуть в текст эмодзи, то вываливается ошибка mysql про неправильный тип данных (что логично), однако yii не ловит такие неправильные данные до записи в БД, что странно. Может кто сталкивался с таким? Есть ли варианты фильтрации эмодзи символов и им подобных данных до записи в БД? Использую AR.
ПС. Попробуйте использовать мой эмодзи в качестве логина на этот сайт и получите наглядный пример того, о чем я говорю.
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 10:04
maleks
FilterValidator можно настроить работать с
этим расширением, в нем есть замена
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 13:53
makbeth
Не со всеми эмоджи эта штука умеет работать. Например этот
он не обрабатывает, а вот этот
обрабатывает. Есть ли вообще возможность расширить встроенный валидатор string и через него выдавать ошибку пользователю конкретно по данному полю в случае, если кто-то пытается загрузить эмодзи или что-то другое, что текущая кодировка mysql не может съесть?
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 16:15
unknownby
А если после двоеточия ставить пробел в beforeSave?
Код: Выделить всё
$this->field_name = str_replace(':',': ', $this->field_name);
И в результате у человека будет не
"привет", а
"привет: cowboy: "
Костылёк, но почему нет?
Если уж сильно хочется. Тем более по правилам мы пишем же "Например: текст", а не "Например :текст" или "Например :текст:"
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 16:30
:cowboy:
Наглядный пример чего? Что это поле не подпадает под эмоджи? Никакой ошибки не было при регистрации имени : cowboy :
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 18:45
yiiliveext
makbeth писал(а): ↑2020.02.07, 13:53
Есть ли вообще возможность расширить встроенный валидатор string и через него выдавать ошибку пользователю конкретно по данному полю в случае, если кто-то пытается загрузить эмодзи или что-то другое, что текущая кодировка mysql не может съесть?
Легко.
Код: Выделить всё
function mysqlUtf8Compatible($str) {
foreach (preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY) as $char) {
$bytes = count(str_split($char));
if ($bytes > 3) {
return false;
}
}
return true;
}
Будет возвращать true, если можеть быть записано без ошибок в collation utf8-*
В модель добавляете
Код: Выделить всё
public function mysqlUtf8Compatible($attribute)
{
foreach (preg_split('//u', $this->$attribute, null, PREG_SPLIT_NO_EMPTY) as $char) {
$bytes = count(str_split($char));
if ($bytes > 3) {
$this->addError($attribute, "{$this->getAttributeLabel($attribute)} has an incorrect symbol.");
}
}
}
И в правилах прописываете
Код: Выделить всё
return [
[['field1', 'field2'], 'string'],
[['field1', 'field2'], 'mysqlUtf8Compatible'],
];
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Добавлено: 2020.02.07, 20:13
makbeth
Крутяк! То что надо! Спасибо!