Есть ли решение на фильтрацию эмодзи перед записью в БД?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
makbeth
Сообщения: 55
Зарегистрирован: 2014.01.06, 11:27

Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение makbeth »

Не хочу, чтобы на сайте использовались эмодзи. Не хочу ставить utf8mb4. Если стоит просто кодировка utf8 и кто-то пытается закинуть в текст эмодзи, то вываливается ошибка mysql про неправильный тип данных (что логично), однако yii не ловит такие неправильные данные до записи в БД, что странно. Может кто сталкивался с таким? Есть ли варианты фильтрации эмодзи символов и им подобных данных до записи в БД? Использую AR.🤠
ПС. Попробуйте использовать мой эмодзи в качестве логина на этот сайт и получите наглядный пример того, о чем я говорю.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение maleks »

FilterValidator можно настроить работать с этим расширением, в нем есть замена
Yii2 universal module sceleton - for basic and advanced templates
makbeth
Сообщения: 55
Зарегистрирован: 2014.01.06, 11:27

Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение makbeth »

Не со всеми эмоджи эта штука умеет работать. Например этот 🦾 он не обрабатывает, а вот этот 🤠 обрабатывает. Есть ли вообще возможность расширить встроенный валидатор string и через него выдавать ошибку пользователю конкретно по данному полю в случае, если кто-то пытается загрузить эмодзи или что-то другое, что текущая кодировка mysql не может съесть?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение unknownby »

А если после двоеточия ставить пробел в beforeSave? :)

Код: Выделить всё

$this->field_name = str_replace(':',': ', $this->field_name);
И в результате у человека будет не "привет:cowboy:", а "привет: cowboy: "

Костылёк, но почему нет? ;) Если уж сильно хочется. Тем более по правилам мы пишем же "Например: текст", а не "Например :текст" или "Например :текст:"
:cowboy:
Сообщения: 1
Зарегистрирован: 2020.02.07, 16:26

Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение :cowboy: »

Наглядный пример чего? Что это поле не подпадает под эмоджи? Никакой ошибки не было при регистрации имени : cowboy :
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение 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'],
];
makbeth
Сообщения: 55
Зарегистрирован: 2014.01.06, 11:27

Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?

Сообщение makbeth »

Крутяк! То что надо! Спасибо!
Ответить