PHP PDO: кодировка, набор имен? - PullRequest
177 голосов
/ 06 декабря 2010

У меня было это ранее в моем обычном соединении mysql_ *:

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");

Нужно ли это для PDO? И где мне его взять?

$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

Ответы [ 10 ]

426 голосов
/ 06 декабря 2010

Это будет в строке подключения, например:

"mysql:host=$host;dbname=$db;charset=utf8"

ОДНАКО до PHP 5.3.6 опция charset была проигнорирована. Если вы используете старую версию PHP, вы должны сделать это так:

$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh->exec("set names utf8");
61 голосов
/ 29 марта 2011

До PHP 5.3.6 опция charset игнорировалась.Если вы используете старую версию PHP, вы должны сделать это так:

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");

?>
40 голосов
/ 06 сентября 2011

Это, вероятно, самый элегантный способ сделать это.
Прямо в вызове конструктора PDO, но избегая ошибочной опции кодировки (как упомянуто выше):

$connect = new PDO(
  "mysql:host=$host;dbname=$db", 
  $user, 
  $pass, 
  array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
  )
);

Прекрасно работает для меня.

16 голосов
/ 28 апреля 2013

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

  1. charset параметр в строке DSN
  2. Выполнить SET NAMES utf8 с PDO::MYSQL_ATTR_INIT_COMMAND опция подключения
  3. Выполнить SET NAMES utf8вручную

В этом примере кода реализованы все три:

<?php

define('DB_HOST', 'localhost');
define('DB_SCHEMA', 'test');
define('DB_USER', 'test');
define('DB_PASSWORD', 'test');
define('DB_ENCODING', 'utf8');


$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);

if( version_compare(PHP_VERSION, '5.3.6', '<') ){
    if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
        $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
    }
}else{
    $dsn .= ';charset=' . DB_ENCODING;
}

$conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);

if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
    $sql = 'SET NAMES ' . DB_ENCODING;
    $conn->exec($sql);
}

Выполнение всех трех, вероятно, излишне (если вы не пишете класс, который вы планируете распространять или использовать повторно).

2 голосов
/ 04 июля 2014

Я просто хочу добавить, что вы должны убедиться, что ваша база данных создана с COLLATE utf8_general_ci или любым другим способом сортировки, который вы хотите использовать, иначе у вас может получиться другой, чем предполагалось.

В phpmyadmin вы можете увидеть параметры сортировки, щелкнув базу данных и выбрав операции. Если вы попытаетесь создать таблицы с другим сопоставлением, чем в вашей базе данных, ваши таблицы в любом случае получат сопоставление в базе данных.

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

2 голосов
/ 17 февраля 2011

Я думаю, что вам нужен дополнительный запрос, потому что опция charset в DSN фактически игнорируется. см. ссылку, размещенную в комментарии другого ответа.

Посмотрим, как это делает Drupal 7 в http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7:

// Force MySQL to use the UTF-8 character set. Also set the collation, if a
// certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
// for UTF-8.
if (!empty($connection_options['collation'])) {
  $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
}
else {
  $this->exec('SET NAMES utf8');
}
0 голосов
/ 23 мая 2018
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
0 голосов
/ 06 апреля 2018

Я проверяю этот код и

$db=new PDO('mysql:host=localhost;dbname=cwDB','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$sql="select * from products  ";
$stmt=$db->prepare($sql);
$stmt->execute();
while($result=$stmt->fetch(PDO::FETCH_ASSOC)){                  
    $id=$result['id'];
}
0 голосов
/ 17 мая 2017

$ con = новый PDO ("mysql: host = $ dbhost; dbname = $ database; charset = $ encoding ", "$ dbuser", "$ dbpassword");

0 голосов
/ 16 декабря 2016
$con="";
$MODE="";
$dbhost = "localhost";
$dbuser = "root";
$dbpassword = "";
$database = "name";

$con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...