私は以前、これを通常の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));
あなたはあなたの接続文字列のようにそれを持っているでしょう:
"mysql:Host=$Host;dbname=$db;charset=utf8"
ただし、PHP 5.3.6より前のバージョンでは、文字セットオプションは無視されていました。古いバージョンのPHPを実行している場合は、次のようにする必要があります。
$dbh = new PDO("mysql:$connstr", $user, $password);
$dbh->exec("set names utf8");
PHP 5.3.6より前では、文字セットオプションは無視されていました。古いバージョンのPHPを実行している場合は、次のようにする必要があります。
<?php
$dbh = new PDO("mysql:$connstr", $user, $password);
$dbh -> exec("set names utf8");
?>
これはおそらく最もエレガントな方法です。
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"
)
);
私にとっては素晴らしい作品です。
完全を期すために、PDOからMySQLに接続するときにエンコーディングを設定する方法は実際にはあり、使用可能な方法はPHPバージョンによって異なります。優先順位は次のようになります。
charset
パラメータSET NAMES utf8
接続オプションを指定してPDO::MYSQL_ATTR_INIT_COMMAND
を実行するSET NAMES utf8
を実行するこのサンプルコードは、3つすべてを実装しています。
<?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);
}
つすべてをやるのはやり過ぎです(あなたが配布または再利用する予定のクラスを書いているのでない限り)
DSNのcharsetオプションは実際には無視されるため、追加のクエリが必要だと思います。他の回答のコメントに掲載されているリンクを参照してください。
// 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');
}
私はあなたのデータベースがCOLLATE utf8_general_ciまたはあなたが使いたい照合のいずれかで作成されていることを確認しなければならないことを付け加えたいです。
Phpmyadminでは、データベースをクリックして操作を選択することで照合を見ることができます。データベースとは別の照合順序でテーブルを作成しようとすると、いずれにせよテーブルはデータベースの照合順序になります。
そのため、テーブルを作成する直前にデータベースの照合順序が正しいことを確認してください。これが誰かに数時間の節約を願っていますLOL
$conn = new PDO("mysql:Host=$Host;dbname=$db;charset=utf8", $user, $pass);
このコードをテストして
$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'];
}
$ con = new PDO( "mysql:ホスト= $ dbhost; dbname = $データベース; charset = $ encoding"、 "$ dbuser"、 "$ dbpassword");
$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 );