В настоящее время я работаю над проектом, и вместо обычных запросов 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');
Теперь все работает нормально.
1. Как сэкономить фрахтователи UTF-8 (математическая строка, специальные символы, такие как 92 ÷ 8 ÷ 2 =?)?
Отв. $ string = utf8_encode ('92 ÷ 8 ÷ 2 =? ');
2. Как распечатать фрахтователей UTF-8 из базы данных?
Отв. echo utf8_decode ($ string);
Примечание. Если вы не хотите этого делать, используя кодирование / декодирование, вы можете это сделать.
$conn = mysqli_connect('localhost','db_username','password','your_database_name'); mysqli_set_charset($conn,"utf8");
класс 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 ();