web-dev-qa-db-ja.com

PHP / MySQLのPDOおよびUTF-8特殊文字?

私はMySQLとPHP 5.3を使用していて、このコードを試しました。

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$con = mysql_connect("localhost", "root", "");
mysql_set_charset('utf8');
if (!$con)
{
  die('Could not connect: ' . mysql_error());
}

mysql_select_db("kdict", $con);
$sql = "SELECT * FROM `en-kh` where english='a'";
echo $sql;
$result = mysql_query($sql);

while($row = mysql_fetch_array($result))
{
  echo $row['english'] . " </br> " . $row['khmer'];
  echo "<br />";
}
?>

=>良いUTF-8レンダリング表示が得られました。

しかし今のところ、私はクラスPDOを作成して、拡張とより簡単な状態を維持しています

 class crud {
     // code..
     public function conn()
     {
         isset($this->username);
         isset($this->password);
         if (!$this->db instanceof PDO)
         {
             $this->db = new PDO($this->dsn, $this->username, $this->password);
             $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
             $this->db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");   
          }
      }
      /*more code here*/
}



/*** a new crud object ***/
$crud = new crud();
/*** The DSN ***/
$crud->dsn = "mysql:dbname=kdict;Host=localhost";

/*** MySQL username and password ***/
$crud->username = 'root';
$crud->password = '';
/*** select all records from table ***/
$records = $crud->rawSelect("SELECT * FROM `en-kh` where english='a'");

/*** fetch only associative array of values ***/
$rows = $records->fetchAll(PDO::FETCH_ASSOC);

/*** display the records ***/
foreach($rows as $row)
{
    foreach($row as $fieldname=>$value)
    {
        echo $fieldname.' = '.$value.'<br />';
    }
    echo '<hr />';
}
?>

しかし、それは私のキャラクターをこのようなもので表示します '????'

Stack Overflowでこのリンクを見つけましたが、私が遭遇したのと同じ問題のようです PHP/MySQL の特殊文字

それは私の問題と同じように見えます=>私はそれを修正しようとしましたが、それでも動作しません。

$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAME'utf8'");

誰かが問題が何であるか教えてもらえますか?どうすれば修正できますか?

ありがとう

13
sophie

[〜#〜] s [〜#〜]がありません: _SET NAMES_ であり、_SET NAME_ではありません:

_$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
_

もちろん、コメントを外す必要もあります。 また、_PDO::MYSQL_ATTR_INIT_COMMAND_ cannotset with PDO::setAttribute() =データベース接続を確立した後(定数名がすべてを示します)、次のように_$driver_options_引数を使用して コンストラクター で指定する必要があります。

_$this->db = new PDO($this->dsn, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
_

これに代わる方法は、接続直後にまったく同じクエリを実行することです。

_$this->db = new PDO($this->dsn, $this->username, $this->password);
$this->db->exec("SET NAMES 'utf8';");
_
43
Alix Axel

同じ問題が発生し、1000000の異なるオプションを試した後、デフォルトのmysqlエンジンがまだMyISAMのままであることがわかりました。

InnoDBがデフォルトのストレージエンジンであることを確認します。

コマンドSHOW VARIABLES LIKE 'have_innodb';を発行して、InnoDBがまったく使用可能であることを確認します。

次に、コマンドSHOW ENGINES;を発行して、さまざまなMySQLストレージエンジンをすべて表示します。

DEFAULT行ではなくInnoDB行でMyISAMを探します。提供された設定には、SET storage_engine=MYISAM;を使用してデフォルトのエンジンを変更できないように設定されていることに気付きました。私の場合、プロバイダーに連絡して、デフォルトのエンジンを変更できるようにオプションを変更できる場所に案内されました。お役に立てれば!

2
dorogz

PDOを使用して特殊文字を挿入する可能な方法は、次の手順に従ってください。

1)属性を接続クラスに設定します。

$this->db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAME'utf8'");

2)クエリの作成とデータベースへの挿入中にhtmlspecialcharsを使用できるようになりました。

$ShortDescription   = htmlspecialchars($_POST['ShortDescription'], ENT_QUOTES);
$LongDescription    = htmlspecialchars($_POST['LongDescription'],ENT_QUOTES);

そしてそれはうまくいくでしょう。

0

常にPDO経由でデータベースに接続することをお勧めします。

以下はサンプルコードです。

<?php

class connMysql {

    protected static $instance;
    private static $database_type = "mysql";    
    private static $hostname = "localhost";
    private static $user = “database_user”;
    private static $password = “database_user_password”;
    private static $database_name = “your_database”;

    private static $persistent = false;

    private function __construct() {

        try {
            self::$instance = new \PDO(self::$database_type . ":Host=" . self::$hostname . ";dbname=" . self::$database_name
                    , self::$user
                    , self::$password
                    , array(
                \PDO::ATTR_PERSISTENT => self::$persistent,
                \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_STRINGIFY_FETCHES => true,
                \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
            ));
        } catch (PDOException $e) {
            echo "Connection Error: " . $e->getMessage();
        }
    }

    public static function getInstance() {
        if (!self::$instance) {
            new connMysql();
        }

        return self::$instance;
    }

    public static function close() {
        self::$instance = null;
    }

}
0