• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PDOで取得される値がすべて文字列になる)

PDOで取得される値がすべて文字列になる

このQ&Aのポイント
  • xamppを標準インストールした環境にてPHPのPDOを利用したデータベース処理を試していると、SELECTで取得した値がすべて文字列として返されます。
  • この現象を回避するにはどのようにすればよいでしょうか。
  • やや強引なテストでも同様の現象が発生しました。

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

sqliteだけかと思ってmysqlでも調べたら、取り出しデータは、全部とりあえずstring型ですね。 PDO側取り出し時は、csv から切り出す場合や、$_POSTデータなどと同じで、全部テキスト状態で渡ってくるためかと思われます。 SQLite3 や mysql5.0 以降であれば、カラムのメタ情報が取れるので、これで判断するとよいでしょう。 <?php // fetch 後にメタ情報が取れる $info = $rs->getColumnMeta($i) ; // $i は、select 節での記述順 0 開始 $info['native_type'] に実データ型が入ってます。SQLite では integer, string, double など、Mysql では、LONG, VAR_STRING, DOUBLE など。 それ以外のgetColumnMetaで得られる連想キーは、select節での記述形式によって変わるので、適宜var_dump などで調べてください。 結論としては、数値としての扱いが必要なら php側でキャストするしかないということではある。 ほとんどは、データベース内部で処理して、phpでは、表示用途でしかないことが多いから、気にしたことなかったけど。

参考URL:
http://jp.php.net/manual/ja/pdostatement.getcolumnmeta.php
Tank2005
質問者

お礼

現行のPDOにおいて単独では無理なようなので、カラムと照らし合わせて都度変換するなどで対応したいと思います。

その他の回答 (2)

noname#244856
noname#244856
回答No.2

私も試してみました。 <?php $db = new PDO('sqlite::memory:'); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->query('CREATE TABLE test(num int)'); $db->query('INSERT INTO test VALUES(99)'); var_dump($db->query('SELECT num FROM test')->fetchColumn()); やっぱり string(2) "99" って出ちゃいますねぇ… MySQLの場合はエミュレーション無効化によりこの問題は解決するのですが、SQLiteの場合はどうしようもなさそうです。手動で (int)$result もしくは intval($result) するなりしてキャストする必要があると思います。念のため $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); も行ってみましたが、最初からここはFALSEになっているようで無駄でした。

noname#244856
noname#244856
回答No.1

以下のまとめでその現象の原因になっている「エミュレーション」について詳細に解説しているのでじっくりご覧ください。MySQL向けに書いていますが、おそらくSQLiteでも同じような結果となるでしょう。 Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 以下のコードを推奨しておきます。EXCEPTIONモードにしたので全体をTryブロックでくくり、例外処理を行ってください。 $db = new PDO('sqlite:sample.db'); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Tank2005
質問者

補足

ここで質問する前に同じサイトに行き着いたので、事前にその方法を試してみたのですが、やはり文字列として返ってきておりました。

関連するQ&A