私はPDOとMySQLを使用していますが、何らかの理由でデータベースからint型の値を取得すると、PDOStatementは数値型の値ではなく数値の文字列表現を返します。これを防ぐにはどうすればよいですか?
PDOクラスの属性があることに気づきました:PDO::ATTR_STRINGIFY_FETCHES
これはこれを処理することになっていますが、それを変更しようとすると、属性がMySQLドライバーに対して無効であることを示すエラーがスローされます。
データベースを参照するときに、数値ではなく文字列を取得するのは正常ですか?
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データ型に変換します...
そして、はい、これは===
や!==
のような、タイプに依存する演算子を使用したい場合には悪いです...
最初の最後の質問に「はい」と答えるには、残念ながら、数値を文字列として受け取るのが普通です。 Pascalによって引用されたマニュアルが言うように、mysqlnd(PHP 5.3)は、PDOからの準備済みステートメントエミュレーションをオフにすると、準備済みステートメントからネイティブデータ型を返します。
new PDO($dsn, $user, $pass, array(
PDO::ATTR_EMULATE_PREPARES => false
))
PDO :: ATTR_STRINGIFY_FETCHESはMySQLとは無関係です。
明るい面を見れば、とにかく準備されたステートメントを使用するのは良い習慣なので、...;)
パスカルの答え は正しいです。私はそれがすべてうまくいくようにそれが問題を抱えていました。これがあなたがしなければならないことです。
まず、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);
あなたはmysqlnd
をインストールしているかもしれませんが、それが通常のPDO
拡張機能(pdo_mysql)
で使用できることを意味しているわけではありません。 nd_pdo_mysql
拡張機能を必ず有効にし、他の拡張機能pdo_mysql
を無効にしてください。競合が発生する可能性があります。
@screenshot
私はこれを見つけました question 、ここに私の考えを投稿することにしました。