Не хочу, чтобы на сайте использовались эмодзи. Не хочу ставить utf8mb4. Если стоит просто кодировка utf8 и кто-то пытается закинуть в текст эмодзи, то вываливается ошибка mysql про неправильный тип данных (что логично), однако yii не ловит такие неправильные данные до записи в БД, что странно. Может кто сталкивался с таким? Есть ли варианты фильтрации эмодзи символов и им подобных данных до записи в БД? Использую AR.
ПС. Попробуйте использовать мой эмодзи в качестве логина на этот сайт и получите наглядный пример того, о чем я говорю.
Есть ли решение на фильтрацию эмодзи перед записью в БД?
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
FilterValidator можно настроить работать с этим расширением, в нем есть замена
Yii2 universal module sceleton - for basic and advanced templates
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Не со всеми эмоджи эта штука умеет работать. Например этот он не обрабатывает, а вот этот обрабатывает. Есть ли вообще возможность расширить встроенный валидатор string и через него выдавать ошибку пользователю конкретно по данному полю в случае, если кто-то пытается загрузить эмодзи или что-то другое, что текущая кодировка mysql не может съесть?
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
А если после двоеточия ставить пробел в beforeSave?
И в результате у человека будет не "привет", а "привет: cowboy: "
Костылёк, но почему нет? Если уж сильно хочется. Тем более по правилам мы пишем же "Например: текст", а не "Например :текст" или "Например :текст:"
Код: Выделить всё
$this->field_name = str_replace(':',': ', $this->field_name);
Костылёк, но почему нет? Если уж сильно хочется. Тем более по правилам мы пишем же "Например: текст", а не "Например :текст" или "Например :текст:"
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Наглядный пример чего? Что это поле не подпадает под эмоджи? Никакой ошибки не было при регистрации имени : cowboy :
-
- Сообщения: 910
- Зарегистрирован: 2019.08.13, 01:49
Re: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Легко.
Код: Выделить всё
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;
}
В модель добавляете
Код: Выделить всё
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: Есть ли решение на фильтрацию эмодзи перед записью в БД?
Крутяк! То что надо! Спасибо!