web-dev-qa-db-ja.com

PDOを使用してMySQLから数値型を取得するにはどうすればよいですか?

私はPDOとMySQLを使用していますが、何らかの理由でデータベースからint型の値を取得すると、PDOStatementは数値型の値ではなく数値の文字列表現を返します。これを防ぐにはどうすればよいですか?

PDOクラスの属性があることに気づきました:PDO::ATTR_STRINGIFY_FETCHESこれはこれを処理することになっていますが、それを変更しようとすると、属性がMySQLドライバーに対して無効であることを示すエラーがスローされます。

データベースを参照するときに、数値ではなく文字列を取得するのは正常ですか?

61
victrnava

PHP 5.2で「数字」を持つことはできないと思います

PHP 5.3では、新しい(PHP> = 5.3のように新しい mysqlnd (MySQL Native Driver)ドライバー。

さて、私のブックマークをさらに掘り下げた後、私はmysqlndに関するこの記事を見つけました:---(PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

これは言っています(引用):

mysqldoをPDOに使用する利点

サーバー側の準備済みステートメントを使用すると、mysqlndはネイティブデータタイプを返します。たとえば、INT列は文字列としてではなく整数変数として返されます。つまり、内部でのデータ変換が少なくなります。

しかし、これはPHP 5.3のみです(PHP 5.3がmysqlndでコンパイルされている場合(かつ古いlibmysqlではありません)))、)準備されたステートメントの場合のみのようです:

ごめんなさい...

解決策は、PHP側で、マッピングシステム(ORMのように--(Doctrine を参照することです; ORMの例と同じです:それはあなたが求めていることを行います) DBからの結果をPHPデータ型に変換します...

そして、はい、これは===!==のような、タイプに依存する演算子を使用したい場合には悪いです...

39
Pascal MARTIN

最初の最後の質問に「はい」と答えるには、残念ながら、数値を文字列として受け取るのが普通です。 Pascalによって引用されたマニュアルが言うように、mysqlnd(PHP 5.3)は、PDOからの準備済みステートメントエミュレーションをオフにすると、準備済みステートメントからネイティブデータ型を返します。

new PDO($dsn, $user, $pass, array(
    PDO::ATTR_EMULATE_PREPARES => false
))

PDO :: ATTR_STRINGIFY_FETCHESはMySQLとは無関係です。

明るい面を見れば、とにかく準備されたステートメントを使用するのは良い習慣なので、...;)

63
Josh Davis

パスカルの答え は正しいです。私はそれがすべてうまくいくようにそれが問題を抱えていました。これがあなたがしなければならないことです。

まず、mysqlndがインストールされ、アクティブ化されていることを確認します。見る php --info。 pdo_mysqlセクションでは、次のようになります。

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321

クライアントAPIバージョンでmysqlndを表示する代わりに、次のような行が表示されます...

Client API version => 5.5.29

...その後、mysqlndがインストールされていません。最初に注意してください。

次に、PDOはエミュレートされた準備済みステートメント デフォルトではすべてのMySQL 接続を使用します。ばかげていますが、あります。また、実際の準備済みステートメント(リンクされたブログ投稿では「サーバー側準備済みステートメント」と呼ばれ、現在 here )を使用する場合にのみ、ネイティブデータタイプを取得します。したがって、次のようにPDO :: ATTR_EMULATE_PREPARESをfalseに設定する必要があります。

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

最後に、PDO :: ATTR_STRINGIFY_FETCHESをtrueに設定していないことを確認してください。

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
27

あなたはmysqlndをインストールしているかもしれませんが、それが通常のPDO拡張機能(pdo_mysql)で使用できることを意味しているわけではありません。 nd_pdo_mysql拡張機能を必ず有効にし、他の拡張機能pdo_mysqlを無効にしてください。競合が発生する可能性があります。

@screenshot

enter image description here

私はこれを見つけました question 、ここに私の考えを投稿することにしました。

5
AamirR