Intereting Posts
Проблемы с полномочиями cURL 407 Неустранимая ошибка: вызов неопределенного метода mysqli_result :: fetch_all () Как обрабатывать несколько файлов с помощью PHP Facebook PHP SDK 5 :: API 2.4 :: Ошибка проверки подделки на основе межсайтового запроса. Обязательное состояние «состояние» отсутствует Сохранить файл с файлом_put_contents в папке Почему только некоторые устройства получают push-уведомления Как безопасно записывать данные JSON в файл с помощью PHP Разбор больших текстовых файлов с PHP без убийства сервера Часовой пояс php.ini по умолчанию против date.timezone Что такое расширение пользовательского кэша APCu в PHP? Изображение как файл PHP Как сохранить данные с помощью сеансовой службы Symfony2 во время функционального теста? Автоматическая отправка формы с использованием таймера Числовая сортировка массива со значениями смешанных типов Cant login: mysqli_query () ожидает как минимум 2 параметра, 1

PDO + MySQL и сломанная кодировка UTF-8

Я использую библиотеку PDO с базой данных MySQL в PHP, но если я вставляю какие-либо данные, закодированные в UTF-8, например арабские слова, они вставляются в базу данных, но как ????????? ,

В моих собственных рамках после создания PDO-соединения я отправляю два запроса – SET NAMES utf8 и SET CHARACTER SET utf8 . Это все еще не работает.

Пример:

 loadclass('PDO', array( sprintf( 'mysql:host=%s;port=%s;dbname=%s', confitem('database', 'host'), confitem('database', 'port'), confitem('database', 'name') ), confitem('database', 'username'), confitem('database', 'password'), array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect')) )); $this->query('SET NAMES ' . confitem('database', 'charset')); $this->query('SET CHARACTER SET ' . confitem('database', 'charset')); 

Обход проблемы: используйте функцию json_encode для преобразования данных перед их вставкой в ​​базу данных и используйте json_decode для декодирования после извлечения. Вот как я это делаю сейчас.

Вероятно, это было решено много лет назад, но для будущих поколений:

 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); 

Он заставляет UTF-8 подключаться к pdo. Работал для меня.

Вы должны установить правильную кодировку для соединения. Добавьте charset=utf8 в DSN. (Это зависит от MySQL!)

 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName;charset=utf8', 'username', 'password' ); 

Однако в PHP-версиях под 5.3.6 вы должны использовать обход, поскольку опция charset не поддерживается.

 $pdo = new PDO( 'mysql:host=hostname;dbname=defaultDbName', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); 

Попробуйте установить значение default_charset в php.ini для UTF-8. Или вы можете установить его с помощью функции ini_set .

Кроме того, если вход поступает через представления формы, убедитесь, что ваши веб-страницы настроены на UTF-8, используя метатег.

Все попытки:

 PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' " 

или

 $this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt); 

или

 $this->connection->exec("set names utf8"); 

все еще генерируется нечитаемый текстовый беспорядок.

В моем случае причиной была проблема: htmlentities используемые до вставки данных в базу данных. Кириллические буквы были полностью уничтожены.