

xamppを標準インストールした環境にてPHPのPDOを利用したデータベース処理を試しているのですが、SELECTで取得した値がすべて文字列として返されます。
$db = new PDO("sqlite:sample.db");
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$rs = $db->query("select 1 as res");
$rs = $rs->fetch();
結果:
array(1) (
[res] => (string) 1
)
これに加え、やや強引なテストを行ってみたのですが、こちらも結果は同じく文字列となりました
$db = new PDO("sqlite:sample.db");
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$rs = $db->prepare("select ? as res");
$rs->bindValue(1, 1, PDO::PARAM_INT);
$rs->execute();
$rs = $rs->fetch();
この現象を回避するにはどのようにすればよいでしょうか。
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.getcolu …
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になっているようで無駄でした。
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);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文が実行できません
-
テキストボックスに入れた内容...
-
実行時エラー3131 FROM 句の構...
-
時刻型にNULLでセットしたい
-
VBAをつかってクエリの情報を抽...
-
MySQLでデータベースにデータin...
-
php データ削除
-
JAVA SQLServerException 列名 ...
-
mysql_real_escape_string
-
Pro*Cの構文エラー
-
エクセルVBAのデータベース接続...
-
会員登録したらメールが送られ...
-
csvをDBへ読み込んだら、NULLが...
-
INSERT,DELETEを同時に
-
テーブルの最後のレコードしか...
-
PHP+MySQLの構造
-
アポストロフィを含む文字列の追加
-
ODBC接続でデータ件数を求...
-
Resource id #3 をフィールドの...
-
データベースサーバーにあるデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスに入れた内容...
-
VBAをつかってクエリの情報を抽...
-
実行時エラー3131 FROM 句の構...
-
Accessのテーブルへ複数の主キ...
-
LocalのNotesメールDBをVBAで参...
-
エラー3011
-
SQL文が実行できません
-
phpのPEARのMDB2を使って出たエ...
-
SQL文の実行に失敗しました???
-
PDOで取得される値がすべて文字...
-
SQLiteのデータベースについて
-
SELECT文を発行して、ACCESSよ...
-
時刻型にNULLでセットしたい
-
zend(phpフレームワーク)でトラ...
-
pearのdisconnect()が使えない。
-
classの使い方について
-
DBデータをcsvで出力の際カンマ...
-
ExcelVBAでAccessのデータを検...
-
PHP(PDO)でDBの情報を完全一...
-
例外処理
おすすめ情報