Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Иероглифы в БД

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Inferial
Отправлено: 18 Октября, 2015 - 17:48:23
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2015  


Помог: 0 раз(а)




Добрый день всем.
Наткнулся на проблему, которую не в получается решить.
Есть запрос в БД:
PHP:
скопировать код в буфер обмена
  1.   public function insert() {
  2.  
  3.     if ( !is_null( $this->id ) ) trigger_error ( "Article::insert(): Attempt to insert an Article object that already has its ID property set (to $this->id).", E_USER_ERROR );
  4.  
  5.     $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  6.     $sql = "INSERT INTO articles ( publicationDate, categoryId, title, summary, content ) VALUES ( FROM_UNIXTIME(:publicationDate), :categoryId, :title, :summary, :content )";
  7.         array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
  8.         $st = $conn->prepare ( $sql );
  9.     $st->bindValue( ":publicationDate", $this->publicationDate, PDO::PARAM_INT );
  10.     $st->bindValue( ":categoryId", $this->categoryId, PDO::PARAM_INT );
  11.     $st->bindValue( ":title", $this->title, PDO::PARAM_STR );
  12.     $st->bindValue( ":summary", $this->summary, PDO::PARAM_STR );
  13.     $st->bindValue( ":content", $this->content, PDO::PARAM_STR );
  14.     $st->execute();
  15.     $this->id = $conn->lastInsertId();
  16.     $conn = null;
  17.   }

Проблема: в БД отображается иероглифами, но выводит как положено.
Прошу помощи знатоков!
SQL:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `articles` (
  2.   `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `publicationDate` date NOT NULL,
  4.   `categoryId` smallint(5) UNSIGNED NOT NULL,
  5.   `title` varchar(255) NOT NULL,
  6.   `summary` text NOT NULL,
  7.   `content` mediumtext NOT NULL,
  8.   PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15


Все файлы в кодировке UTF-8.

(Отредактировано автором: 18 Октября, 2015 - 17:50:55)

 
 Top
andrewkard
Отправлено: 18 Октября, 2015 - 17:52:07
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Inferial
Проверьте кодировку БД, таблицы и полей.
 
 Top
Inferial
Отправлено: 18 Октября, 2015 - 17:55:51
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2015  


Помог: 0 раз(а)




andrewkard пишет:
Inferial
Проверьте кодировку БД, таблицы и полей.


Везде utf8_general_ci стоит, это не первая таблица в БД, у меня все в UTF-8.
А запись именно в эту иероглифами идёт. (Новая Тема)
 
 Top
Мелкий Супермодератор
Отправлено: 18 Октября, 2015 - 18:05:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Inferial пишет:
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");

Идея указать кодировку коннекту пытаетесь реализовать хоть и не самым правильным методом, но идея нужная. Вопрос - почему эта идея висит тупо в воздухе? В таком виде настройка ни на что не повлияет.
В DSN должен указывается charset. У вас указан?
До версий, емнип, PHP5.3.5 был баг в PDO, charset в DSN игнорировался и надо было извращаться с MYSQL_ATTR_INIT_COMMAND.

Вопрос в целом - с какого перепуга у вас явно модель сама напрямую открывает и закрывает соединение на отдельно-взятую операцию?


-----
PostgreSQL DBA
 
 Top
Inferial
Отправлено: 18 Октября, 2015 - 18:08:17
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2015  


Помог: 0 раз(а)




Мелкий пишет:
Inferial пишет:
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");

Идея хоть и не самая правильная, но нужная. Вопрос - почему висит тупо в воздухе? В таком виде настройка ни на что не повлияет.
В DSN указывается charset. У вас указан?

Вопрос в целом - с какого перепуга у вас явно модель сама напрямую открывает и закрывает соединение на отдельно-взятую операцию?


Не совсем понял Ваш вопрос, но по поводу DSN:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         ini_set( "display_errors", true );
  3.         date_default_timezone_set( "Europe/Moscow" );
  4.         define( "DB_DSN", "mysql:host=localhost;dbname=name;charset=utf8" );
  5.         define( "DB_USERNAME", "name" );
  6.         define( "DB_PASSWORD", "pass" );
  7.         define( "CLASS_PATH", "classes" );
  8.         define( "TEMPLATE_PATH", "templates" );
  9.         define( "HOMEPAGE_NUM_ARTICLES", 5 );
  10.         define( "ADMIN_USERNAME", "login" );
  11.         define( "ADMIN_PASSWORD", "pass" );
  12.         require( CLASS_PATH . "/Article.php" );
  13.         require( CLASS_PATH . "/Category.php" );
  14.         function handleException( $exception )
  15.                 {
  16.                 echo "Sorry, a problem occurred. Please try later.";
  17.                 error_log( $exception->getMessage() );
  18.                 }
  19.         set_exception_handler( 'handleException' );
  20. ?>
 
 Top
Мелкий Супермодератор
Отправлено: 18 Октября, 2015 - 18:14:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Хорошо, если не пользуетесь музейными версиями php, то запись должна проходить нормально.
Потому вопрос: как вы проверяете, что было записано? Может, кодировка неверно указана при попытке прочитать из базы.


-----
PostgreSQL DBA
 
 Top
Inferial
Отправлено: 18 Октября, 2015 - 18:19:05
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2015  


Помог: 0 раз(а)




Мелкий пишет:
Потому вопрос: как вы проверяете, что было записано? Может, кодировка неверно указана при попытке прочитать из базы.


Вижу что запись сохраняется в БД, именно там она сохраняется в иероглифах.
Но при этом выводится из базы как должно быть! (на русском)
 
 Top
andrewkard
Отправлено: 18 Октября, 2015 - 18:31:02
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Inferial пишет:
именно там она сохраняется в иероглифах.

чем смотрите, данные видимо сохраняются как раз в UTF-8, но отображаются в WIN-1251?
 
 Top
Inferial
Отправлено: 18 Октября, 2015 - 18:39:11
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2015  


Помог: 0 раз(а)




andrewkard пишет:
чем смотрите, данные видимо сохраняются как раз в UTF-8, но отображаются в WIN-1251?


В самой Mysql, скрин прилагаю.
(Добавление)
В проблеме разобрался, правильный запрос:
PHP:
скопировать код в буфер обмена
  1. $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ));

Прикреплено изображение (Нажмите для увеличения)
2015-10-18 18-38-05 Скриншот экрана.png
 
 Top
Мелкий Супермодератор
Отправлено: 18 Октября, 2015 - 19:21:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Inferial пишет:
Вижу что запись сохраняется в БД

Вы крутой, бинарник читать. Я на первую попытку даже не придумаю, где искать документацию по бинарному формату дата-файлов.

Inferial пишет:
В самой Mysql, скрин прилагаю.

А показываете почему-то phpmyadmin. Странно.

Сама mysql - это демон, не имеющий в принципе никакого пользовательского интерфейса.
Даже консольный клиент - это только клиент. Просто так совпало, что он обычно поставляется за компанию с сервером.
Поэтому в саму mysql можно смотреть одним единственным образом - напрямую в бинарные файлы. А всё, что обращается к api mysql - лишь клиенты и обязаны корректно указывать кодировку соединения.
phpmyadmin - тоже клиент и тоже имеет настройки соединения и кодировки для этого самого соединения. Вот только где они - пусть напомнит кто-то ещё, я за давностью не помню.
(Добавление)
И оказалась музейная версия PHP. Ну да.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB