プロが教える店舗&オフィスのセキュリティ対策術

http://www.ajaxray.com/blog/2009/08/29/simple-ph …
を利用しpdo接続をしています。そのまま使用すると日本語が文字化けしていまいます。
※ファイルの文字コードはUTF-8に変更してます。

function setConnectionInfo内に以下のソースを入れてみたのですがエラーになってしまいました。
どのようにすればエラーなく動作させる事ができるのでしょうか?

$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->query("SET NAMES 'utf8'");
self::$_pdoObject = null;

また、調べてみた際に気になったのですがこのスクリプトのエントリー的なページはあっても
使用しての感想等のページはありませんでした。操作はかなり楽にできそうな感じなのですが
あまり使われてないのでしょうか?

メジャーに知られているようなラッパーなどがありましたら是非おしえてください!

A 回答 (3件)

先に詰め込むか、実行時に詰め込むかの違いでしょう。



そうしたところにまで気をつける姿勢をお持ちなのですからこそ、このようなラッパークラスを利用せず、PDOをそのまま使うべきです。どこで何をしているのかはっきりしている方が、気分がいいじゃないですか!

本当はMDB2を使っています。しかし、文字セットを設定するメソッドでは相変わらず「SET NAMES」を発行しているので、お勧めは出来ません。

どうしてもPDOで無ければならない理由があるならまだしも、安全第一、文字化け無しのストレスフリーを目指すなら、やっぱりMySQL改良版拡張モジュール(MySQLi)がいいですよ。

こちらも勉強になりました。ありがとうございます。

参考URL:http://www.php.net/manual/ja/pdostatement.execut …
    • good
    • 0

例えば、MySQLの設定ファイルに以下のようなクライアントセクションがあったとします。



[client]
port=3306
default-character-set=utf8

ファイルのパスは「PATH_TO_MY_INI」に定義されているものとして考えたとき、大体こんな感じです。これで接続の文字セット設定が完了し、エスケープ関連メソッドも正常に機能することになります。

require_once 'PHP-PDO-Wrapper/Db.php';

Db::setConnectionInfo('basecamp', 'dbuser', 'password');
Db::setDriverOptions(array(
  PDO::MYSQL_ATTR_READ_DEFAULT_FILE => PATH_TO_MY_INI,
  PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'client',
));

PDOオブジェクトの操作は、ラッパークラスが用意するゲッターメソッド経由で行うことが出来るようです。

Db::getPDOObject()->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);

後は目的に応じてクエリを発行すれば、適切なタイミングで接続してくれるようです。
実体は「PDO::prepare()」ですので、バインドパラメータは適宜エスケープされるはずです。

しかし、正直な感想ですが、これを使うことで得られる便利さがよくわかりませんでした。ことMySQLへの接続では、PDOを利用するよりMySQL改良版拡張モジュールをそのまま利用するほうが便利です。文字セットの設定を変更するために専用メソッドが準備されており、接続後でも安全に文字セットを変更することが出来ます。

参考URL:http://www.php.net/manual/ja/mysqli.set-charset. …

この回答への補足

度々のお返事本当にありがとうございます。やっと意味が理解できました^^

使用するきっかけは、マニュアルに載ってる通りで書くと1ページ内で複数問い合わせをする場合に
同じようなソースを書かなくてはならずこれを利用すれば単調なソースを書くことなくすっきりできるのでは?
と思ったからです。

自分でラッパークラスを作れればいいのですがそれもできないので探していたところこのクラスをみつけました。

原文が英語で理解できなかったので他のものもないかと探してみたのですが見つける事ができなかったのが現状です。

理解しようと読み解いていたところ気になったのですがプリペアは使っているようなのですが値を
バインドしている箇所(bindValueやbindParam)が見当たらないのですがセキュリティ的には不安なものでしょうか?

補足日時:2010/02/04 16:47
    • good
    • 0

PDOを利用してMySQLへ接続する場合、PDOインスタンスを生成する際、ドライバ固有のオプションを指定することで接続の文字コードを操作することが出来ます。

接続後はこれを操作するメソッドなどが用意されておりませんので、PDOを使う限りは必須の手順となります。

件のラッパークラスをご利用でしたら、接続情報を設定し、ドライバオプションを設定した後データベースへの問い合わせをすることで上手く動作することでしょう。MySQLの設定ファイルに直接アクセスできない場合や、編集する権限が無い場合は、自分で用意した設定ファイルを読み込むように指定してください。

属性の設定は、ラッパークラスに用意されているPDOオブジェクトのゲッターメソッド経由で行うのがわかりやすいと思います。

こちらのラッパークラスは初めて知りました。

参考URL:http://www.php.net/manual/ja/ref.pdo-mysql.php

この回答への補足

お返事ありがとうございます。
どのように組み込めばいいものか方法がわからないのですが具体的に教えていただけないでしょうか?
宜しくお願いいたします。

補足日時:2010/02/03 18:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!