Как можно избежать появления пустых строк в базе данных при добавлении кириллических символов?

Как избежать проблем с добавлением кириллических символов через админ-панель в БД, в то время как при изменении данных на кириллицу в самой БД всё работает корректно? Я понял, что проблема связана с функцией htmlspecialchars, но не могу понять, как ее исправить. Я пытался декодировать с помощью iconv и htmlspecialchars_decode, но безуспешно, вероятно, из-за неправильного подхода. Мой стек технологий: PHP 8.1, MySQL 8.

```php
function secureSuperGlobalPOST($key)
{
    if (is_array($key)) {
        $valrets = $value;
    } elseif ($key) {
        $return = '';
        for ($i = 0; $i < strlen($key ); ++$i) {
            $char = htmlspecialchars($key[$i], ENT_QUOTES, 'UTF-8');
            $ord = ord($char);
            if ($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
                $return.=$char;
            else
                $return.='';

        }
        $valrets = $return;
    }
}
```
  • 19 января 2024 г. 7:58
Ответы на вопрос 3
Для того чтобы корректно обрабатывать данные с кириллическими символами и избежать пустых строк в базе данных, важно убедиться, что все компоненты вашего приложения работают в правильной кодировке. Обычно для работы с кириллическими символами используется кодировка UTF-8. Вот несколько советов, которые могут помочь:

1. **Кодировка БД:** Убедитесь, что ваша база данных и таблицы в ней используют кодировку UTF-8 (например, utf8_general_ci или utf8mb4_unicode_ci для MySQL 8+). Для этого можно использовать следующие команды SQL:
   ```sql
   ALTER DATABASE `your_database_name` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
   ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
   ```

2. **Соединение с БД:** Установите кодировку UTF-8 для соединения с базой данных в вашем PHP-скрипте. Для PDO можно использовать следующий код при создании соединения:
   ```php
   $pdo = new PDO("mysql:host=localhost;dbname=your_database_name;charset=utf8mb4", "username", "password");
   ```

   Для MySQLi:
   ```php
   $mysqli = new mysqli("localhost", "username", "password", "your_database_name");
   $mysqli->set_charset("utf8mb4");
   ```

3. **Функция htmlspecialchars:** Обработка функцией `htmlspecialchars` не должна приводить к исчезновению кириллических символов, если указана правильная кодировка. Убедитесь, что вы используете `'UTF-8'` как третий аргумент функции, как у вас и указано:
   ```php
   $char = htmlspecialchars($key[$i], ENT_QUOTES, 'UTF-8');
   ```

4. **HTTP Headers:** Не забудьте отправлять правильный заголовок Content-Type с кодировкой UTF-8 для вашей веб-страницы или API. Это можно сделать с помощью функции `header` в PHP:
   ```php
   header('Content-Type: text/html; charset=utf-8');
   ```

5. **Файлы PHP в UTF-8:** Проверьте, что ваши PHP-файлы сохранены в кодировке UTF-8 без BOM (byte order mark).

6. **HTML Meta тег:** Ваши HTML страницы также должны указывать правильную кодировку в meta теге:
   ```html
   <meta charset="UTF-8">
   ```

Теперь о вашей функции `secureSuperGlobalPOST`. Она, похоже, предназначена для очистки полученных данных, но в ней есть проблемы:
- Она не возвращает значение для массива.
- Цикл сравнивает каждый символ и исключает все символы вне диапазона ASCII. Это не имеет смысла для кириллических символов, которые находятся за пределами диапазона ASCII.

Вот более простой и правильный способ использования `htmlspecialchars` для обработки данных, включая кириллические символы:
```php
function secureSuperGlobalPOST($value)
{
    if (is_array($value)) {
        return array_map('secureSuperGlobalPOST', $value);
    } else {
        return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
    }
}
```

Применение `htmlspecialchars` в вашей функции должно безопасно эскейпить символы, подлежащие преобразованию, и не должно удалять кириллические символы. Проверьте используемую вами кодировку во всём стеке и убедитесь, что о
задайте кодировку для БД, поддерживающую кириллицу 
И учтите, что возможно придется задавать кодировку и для таблиц, и для отдельных полей.
Ваша функция functionsecureSuperGlobalPOST() ломает юникодную кирилическую строку. Так происходит потому-что в юникоде utf8 символы могут занимать от 1 до 4 байт https://ru.wikipedia.org/wiki/UTF-8 , а функции strlen и ord работают только с однобайтовыми строками. В PHP для обработки utf8 строк нужно использовать только mb_ функции https://www.php.net/manual/ru/book.mbstring.php 

Судя по всему функция пытается вырезать "плохие символы" перед сохранением в базу. Обычно в PHP наоборот: в базу сохраняют строки как есть, но перед выводом обязательно(!) прогоняют строки через htmlspecialchars: htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
Похожие вопросы