
お知らせ
2023.12.5(Tue)
目次
こんにちは。堀部です。
CODEMATIC-PHP版のver3.0の目玉でもある、MBD2からPDOへの変更を行っている中で、文字化けが発生しました。そこでどのようにしたら解決できるのか対処方法を調べてみました。
PDOの文字コード指定は、PHPのバージョンによって対応方法が異なります。まずはお使いのPHPのバージョンを確認して下さい。
PDOの接続文字列(DSN:Data Source Name)によって文字コードの指定ができます。
記述例:
<?php $username = 'user'; $password = 'password'; $dbh = new PDO("mysql:host=localhost;dbname=DB名;charset=utf8;", $username, $password );
この場合は接続文字列の指定が無視されてしまうので、別の方法で対処する必要があります。
まず、お使いの環境が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', ) );
[client] default-character-set = utf8
<?php $username = 'user'; $password = 'password'; $dbh = new PDO("mysql:host=localhost;dbname=DB名;", $username, $password , array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ) );
上記いずれかの対応を行うと無事文字化けが解消されていると思います。
動作させる環境が複数あり、それぞれの環境でPHPのバージョンが異なる場合に、PHPのバージョンをプログラム内で判断したいという際は以下のように記述することで処理を分岐させることができます。
記述例:
<?php if( version_compare( phpversion() , '5.3.6' , '>=' ) ) { // PHP5.3.6以降のバージョン } else { // PHP5.3.5以前のバージョン }
PDOでSQLインジェクション対策を行うためには、以下のことを実施する必要があります。
PDOで静的プレースホルダを使用するためには、以下の指定をします。
記述例:
PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
今回DB接続方式をMDB2からPDOに変更したことにより、旧バージョンのベースプロジェクトとの互換性はなくなってしまいましたが、CODEMATICをより良いものとする為、これからもいろいろなものを取り入れていきたいと思います。