PHPのPDOでMySQL使ったら文字化けしたときの対処方法

こんにちは。堀部です。
 
CODEMATIC-PHP版のver3.0の目玉でもある、MBD2からPDOへの変更を行っている中で、文字化けが発生しました。そこでどのようにしたら解決できるのか対処方法を調べてみました。

文字化けしたときの対処方法

PDO_1
 
PDOの文字コード指定は、PHPのバージョンによって対応方法が異なります。まずはお使いのPHPのバージョンを確認して下さい。

PHP5.3.6以降の場合

PDOの接続文字列(DSN:Data Source Name)によって文字コードの指定ができます。
 
記述例:

<?php
$username = 'user';
$password = 'password';
$dbh = new PDO("mysql:host=localhost;dbname=DB名;charset=utf8;",  $username,  $password );

PHP5.3.5以前の場合

この場合は接続文字列の指定が無視されてしまうので、別の方法で対処する必要があります。
 
まず、お使いの環境がLinux環境の場合は「/etc/my.cnf」による指定が可能です。
 
記述例:

<?php
$username = 'user';
$password = 'password';
$dbh = new PDO("mysql:host=localhost;dbname=DB名;",  $username,  $password
               ,  array(
                       PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf', 
                      )
              );

 
/etc/my.cnf
[client]
default-character-set = utf8

 
Windows環境の場合は「/etc/my.cnf」が使用できませんので、「’SET NAMES utf8’」を使用します。ただし、sjisの指定は脆弱性があるため使用できません。
 
記述例:
<?php
$username = 'user';
$password = 'password';
$dbh = new PDO("mysql:host=localhost;dbname=DB名;",  $username,  $password
               ,  array(
                       PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
                      )
              );

 
PDO_2
 
《参考サイト》

  • PHP:PDO_MYSQL DSN
  • PHPでデータベースに接続するときのまとめ
  •  
    上記いずれかの対応を行うと無事文字化けが解消されていると思います。

    PHPのバージョンを判定する方法

    動作させる環境が複数あり、それぞれの環境でPHPのバージョンが異なる場合に、PHPのバージョンをプログラム内で判断したいという際は以下のように記述することで処理を分岐させることができます。
     
    記述例:

    <?php
    if( version_compare( phpversion() ,  '5.3.6' ,  '>=' ) ) {
        // PHP5.3.6以降のバージョン
    } else {
        // PHP5.3.5以前のバージョン
    }

    SQLインジェクション対策

    PDOでSQLインジェクション対策を行うためには、以下のことを実施する必要があります。
     

  • DSNに文字コードを指定する。
  • 静的プレースホルダを使用する。
  •  
    PDOで静的プレースホルダを使用するためには、以下の指定をします。
     
    記述例:

    PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES,  false);
    

    プレースホルダには静的と動的があり、静的プレースホルダは脆弱性が生じず安全な方法となります。詳しくはIPA の  安全な SQL の呼び出し方を参照して下さい。

    まとめ

    今回DB接続方式をMDB2からPDOに変更したことにより、旧バージョンのベースプロジェクトとの互換性はなくなってしまいましたが、CODEMATICをより良いものとする為、これからもいろいろなものを取り入れていきたいと思います。

    記事をシェア
    MOST VIEWED ARTICLES