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
Форумы портала PHP.SU :: Версия для печати :: Иероглифы в БД
Форумы портала PHP.SU » » Вопросы новичков » Иероглифы в БД

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

1. Inferial - 18 Октября, 2015 - 17:48:23 - перейти к сообщению
Добрый день всем.
Наткнулся на проблему, которую не в получается решить.
Есть запрос в БД:
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.
2. andrewkard - 18 Октября, 2015 - 17:52:07 - перейти к сообщению
Inferial
Проверьте кодировку БД, таблицы и полей.
3. Inferial - 18 Октября, 2015 - 17:55:51 - перейти к сообщению
andrewkard пишет:
Inferial
Проверьте кодировку БД, таблицы и полей.


Везде utf8_general_ci стоит, это не первая таблица в БД, у меня все в UTF-8.
А запись именно в эту иероглифами идёт. (Новая Тема)
4. Мелкий - 18 Октября, 2015 - 18:05:25 - перейти к сообщению
Inferial пишет:
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");

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

Вопрос в целом - с какого перепуга у вас явно модель сама напрямую открывает и закрывает соединение на отдельно-взятую операцию?
5. Inferial - 18 Октября, 2015 - 18:08:17 - перейти к сообщению
Мелкий пишет:
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. ?>
6. Мелкий - 18 Октября, 2015 - 18:14:29 - перейти к сообщению
Хорошо, если не пользуетесь музейными версиями php, то запись должна проходить нормально.
Потому вопрос: как вы проверяете, что было записано? Может, кодировка неверно указана при попытке прочитать из базы.
7. Inferial - 18 Октября, 2015 - 18:19:05 - перейти к сообщению
Мелкий пишет:
Потому вопрос: как вы проверяете, что было записано? Может, кодировка неверно указана при попытке прочитать из базы.


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

чем смотрите, данные видимо сохраняются как раз в UTF-8, но отображаются в WIN-1251?
9. Inferial - 18 Октября, 2015 - 18:39:11 - перейти к сообщению
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\'' ));
10. Мелкий - 18 Октября, 2015 - 19:21:16 - перейти к сообщению
Inferial пишет:
Вижу что запись сохраняется в БД

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

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

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

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

 

Powered by ExBB FM 1.0 RC1