【PHP】MySQLとPDOとint型の取得について

PHPでPDOを使いMySQLのテーブルにアクセスした場合、int型カラムに対しSELECT文を実行すると、サーバーの環境により、int型として返すケースとstring型として返すケースの二通りがあり、WEBアプリ開発において混乱を招きます。

直感的には、int型カラムであるならば、int型を返して欲しいところなのですが、調べた限りでは、強制的にint型として返す手法は、無いようです。

もっとも、PDO::setAttributeの設定で、PDO::ATTR_EMULATE_PREPARESをfalseにすると副作用的にint型を返すのでこの手法が紹介されていることが多いようです。

//プレースホルダのエミュレート機能をオフにする。
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

しかし、この手法は本来、プリペアドステートメントのエミュレーションを有効または無効にするもので、int型を返すように強制するものではないと思います。

これに対し、string型に強制するようにするメソッドは定められています。

PDO::ATTR_STRINGIFY_FETCHES: フェッチする際、数値を文字列に変換する。boolを必要とする。

これがそうで、trueに設定するとMySQLのカラムの型がint型であっても、string型に変換されて返ってきます。

//int型カラムをstring型で返す
$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);

ところで、サーバーによって、ATTR_EMULATE_PREPARESによるint型への強制ができるかに違いがでることがあります。sakuraレンタルサーバーのスタンダードでは、int型として取得できますが、コアサーバーでは、int型への強制はできませんでした。

つまり、両サーバーで、このint型の扱いを統一しようとすると、ATTR_STRINGIFY_FETCHESの設定をtrueにして、string型で扱うのが最も簡単な方法のようです。int型に強制するメソッドが備えられていればそれが一番なのですが。

(注意)
その他の方法によってint型に統一できる可能性もあるので、必ずご自身でご確認ください。

カテゴリー: MySQL, PHP パーマリンク

広告

コメントを残す

メールアドレスが公開されることはありません。