Страница 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:", а "привет: 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
Крутяк! То что надо! Спасибо!