Проблема с PDO utf-8

В настоящее время я работаю над проектом, и вместо обычных запросов MySQL я думал, что буду идти дальше и узнать, как использовать PDO.

У меня есть таблица, называемая конкурсантами, и база данных, и таблица, и все столбцы находятся в utf-8. У меня есть десять записей в таблице участников, а в их столбце «имя» содержатся такие символы, как åäö.

Теперь, когда я извлекаю запись из базы данных и var_dump имя, я получаю хороший результат, строка со всеми специальными символами нетронута. Но мне нужно сделать это, чтобы разбить строку на символы, чтобы получить их в массиве, который затем перетасовываю.

Например, у меня есть эта строка: Test ÅÄÖ Tåän

И когда я запускаю str_split, я получаю каждый символ в собственном ключе в массиве. Единственная проблема заключается в том, что все специальные символы отображаются следующим образом: , что означает, что массив будет выглядеть так:

Array ( [0] => T [1] => e [2] => s [3] => t [4] => [5] =>   [6] =>   [7] =>   [8] =>   [9] =>   [10] =>   [11] => [12] => T [13] =>   [14] =>   [15] =>   [16] =>   [17] => n ) 

Как вы можете видеть, это не только испортит символы, но и дублирует их в процессе str_split. Я пробовал несколько способов разделить строку, но все они имеют одинаковую проблему. Когда я вывожу строку перед расщеплением, она показывает специальные символы просто отлично.

Это мой код dbConn.php:

// Требовать конфигурационный файл: require_once ('config.inc.php');

 // Start PDO connection: $dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf-8", $dbUser, $dbPass); $dbHandle -> exec("SET CHARACTER SET utf8"); // Set error reporting: $dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

И это код, который я использую для извлечения из базы данных и цикла:

 // Require files: require_once('dbConn.php'); // Get random artist: $artist = $dbHandle->query("SELECT * FROM ".ARTIST_TABLE." WHERE id = 11 ORDER BY RAND() LIMIT 1"); $artist->setFetchMode(PDO::FETCH_OBJ); $artist = $artist->fetch(); var_dump($artist->name); // Split name: $artistChars = str_split($artist->name); 

Я подключаюсь к utf-8, мой php-файл – utf-8 без спецификации, и никакие другие специальные символы на этой странице не разделяют эту проблему. Что может быть неправильным, или что я делаю неправильно?

Заранее благодарен // Джонатан

str_split не работает с многобайтовыми символами, он возвращает только первый байт – таким образом, аннулирование ваших символов. вы можете использовать mb_split .

Помните, что заявка utf8, используемая в вашей строке соединения, как сообщается, не работает. В комментариях на php.net я часто вижу эту альтернативу:

 $dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); 

Функция str_split разбивается на байт, а не на символ. Вам понадобится mb_split .

эта работа для меня … надеюсь, что это полезно.

убедитесь, что база данных, apache и каждая конфигурация были в utf8.

Объект PDO

  $dsn = 'mysql:host=' . Config::read('db.host') . ';dbname=' . config::read('db.basename') .';charset=utf8'. ';port=' . Config::read('db.port') .';connect_timeout=15'; $user = Config::read('db.user'); $password = Config::read('db.password'); $this->dbh = new PDO($dsn, $user, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

он работает, если не использует другую функцию, такую ​​как str_word_count.

ИСПОЛЬЗОВАНИЕ str_word_count вам нужно использовать utf8_decode (utf8_encode).

 function cortar($str) { if (20>$count=str_word_count($str)) { return $str; } else { $array = str_word_count($str,1,'.,-0123456789()+=?¿!"<>*ñÑáéíóúÁÉÍÓÚ@|/%$#¡'); $s=''; $c=0; foreach ($array as $e) { if (20>$c) { if (19>$c) { $s.=$e.' '; } else { $s.=$e; } } $c+=1; } return utf8_decode(utf8_encode($s)); } } 

Функция возвращает строку с 20 словами.

UTF-8 Использование PDO

проблемы при написании международных (даже китайских и тайских) символов в базе данных

может быть больше способов сделать эту работу. Я не специалист, просто техник, заинтересованный, чтобы понять все это. В Linux и Windows я создал несколько CMS (системы управления контентом), используя образец со следующего веб-сайта:

' http://www.elated.com/articles/cms-in-an-afternoon-php-mysql '

В примере используется PDO для вставки, обновления и удаления.

Мне потребовалось несколько часов, чтобы найти решение. Что бы я ни делал, я всегда делал выводы о различиях между данными в моих формах и в обзорах phpmyadmin / heidi

Я следовал намекам: « https://mathiasbynens.be/notes/mysql-utf8mb4 », но успеха до сих пор нет

В моей CMS-структуре есть файл «Config.php»: после прочтения этой веб-страницы я изменил строку

  define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings); 

в

  define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings;charset=utf8'); 

Теперь все работает нормально.

UTF-8 ПРОБЛЕМЫ И РЕШЕНИЯ ФУНКЦИЯМИ PHP

1. Как сэкономить фрахтователи UTF-8 (математическая строка, специальные символы, такие как 92 ÷ 8 ÷ 2 =?)?

Отв. $ string = utf8_encode ('92 ÷ 8 ÷ 2 =? ');

2. Как распечатать фрахтователей UTF-8 из базы данных?

Отв. echo utf8_decode ($ string);

Примечание. Если вы не хотите этого делать, используя кодирование / декодирование, вы можете это сделать.

1. Если вы используете mysqli_query (), тогда

  $conn = mysqli_connect('localhost','db_username','password','your_database_name'); mysqli_set_charset($conn,"utf8"); 

2.Если вы используете PDO, тогда


     класс Database расширяет PDO {
         функция __construct () {
             parent :: __ construct ("mysql: host = localhost; dbname = your_db_name", "gurutslz_root", "Your_db_password", массив (PDO :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

        }
     }
     $ conn = new Database ();