сохранить Ø в таблице MySQL и не - PullRequest
1 голос
/ 23 апреля 2011

Мой стол выглядит так:

CREATE TABLE `friends` 
(
    `id` bigint(20) NOT NULL default '0',
    `fb_id` bigint(20) NOT NULL default '0',
    `name` varchar(100) NOT NULL default '',

) TYPE=MyISAM charset=utf8;

Я добавляю в БД вот так:

            $sql = "insert ignore into `friends` (`id`, `fb_id`, `name`)" .
                            "values (:id, :fb_id, :name)";
                try 
                {
                    $stmt = $this->db->prepare($sql); 
                    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
                    $stmt->bindParam(':fb_id', $fb_id, PDO::PARAM_INT);
                    $stmt->bindParam(':name', $name, PDO::PARAM_STR);

                    $result = $stmt->execute();
                    $stmt->closeCursor(); 
                }       
                catch (Exception $e)
                {
                die ($e->getMessage() ); 
                }

Как я могу сохранить Øystein, а не Øystein. Я установил кодировку на utf8, не уверен, что еще я могу сделать.

EDIT:

Обновлена ​​моя функция db_connect:

        $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME;
        $driver_options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8' );

        try
        {
            $this->db = new PDO($dsn, DB_USER, DB_PASS, $driver_options);
        }

Все еще есть та же проблема ..

Ответы [ 4 ]

0 голосов
/ 26 апреля 2011

Вы пытались добавить кодировку в DSN следующим образом:

$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ';charset=UTF-8';

Не могли бы вы запустить этот тестовый код, чтобы отследить проблему еще на шаг?

<?php

echo '<html>'
   . '<head>'
   . '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>'  
   . '</head>'
   . '<body>'
   ;

error_reporting(E_ALL);
ini_set("display_errors", 1);

define( 'DB_HOST', 'localhost' );
define( 'DB_NAME', 'test' );
define( 'DB_USER', 'root' );
define( 'DB_PASS', 'root' );

$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ';charset=UTF-8';

$db = new PDO($dsn, DB_USER, DB_PASS ); 

$id = 12;
$fb_id = '23';

if ( ! isset( $_POST[ 'name'] )) {

    echo '<form method="POST" >Strange letters go here <input type="text" name="name"></form>'
       . '</body>' 
       ;
    exit;
}

$name = $_POST[ 'name'];


$sql = "insert ignore into `friends` (`id`, `fb_id`, `name`)" .
                            "values (:id, :fb_id, :name)";
try
{
    $stmt = $db->prepare($sql);
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->bindParam(':fb_id', $fb_id, PDO::PARAM_INT);
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);

    $result = $stmt->execute();
    $stmt->closeCursor();

    echo 'OK';
}
catch (Exception $e)
{
    die ($e->getMessage() );
}

$sql = 'SELECT *'
     . 'FROM `friends` '
     ;

try
{
    $stmt = $db->prepare($sql);

    $result = $stmt->execute();

    while( $result = $stmt->fetch(PDO::FETCH_ASSOC) ) {

        echo '<br />' . print_r( $result );

    }

    $stmt->closeCursor();

    echo 'OK';
}
catch (Exception $e)
{
    die ($e->getMessage() );
}


echo '<body>';

Если яотправьте это

öäüÖÄÜß

страница читает и отправляет обратно

öäüÖÄÜß

, пока я вижу это в phpMyAdmin (вероятно, ошибка в phpMyAdmin):

öäüÃ-А «ÃœÃŸ

0 голосов
/ 23 апреля 2011

Вы сказали браузеру, какую кодировку текста использовать на странице, которая отправляет форму и страницу, которая позже показывает результат, полученный из базы данных?

В заголовке вашей HTML-страницы должно появиться следующее:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  
0 голосов
/ 23 апреля 2011

Вы также можете попробовать запустить SET NAMES utf8: Как заставить PDO запускать SET NAMES utf8 при каждом подключении, в ZendFramework

0 голосов
/ 23 апреля 2011

Попробуйте добавить $this->db->exec('SET CHARACTER SET utf8') после подключения к БД.

...