2013-04-21 5 views
12

PHPコードをmysql(5.5で廃止予定)からPDO_MySQLに移行しています。ただし、は整数を返し、PDOStatement::fetchは数値の文字列を返します。 PDOを元のように動作させるにはどうすればよいですか?なぜPDO_MySQLは整数を返しますか?

mysql_fetch_row

結果:

array(1) { 
    ["id"]=> 
    int(1) 
} 

結果PDOStatement::fetchの:あなたは本当にあなたがint型緩く型付けされたPHP

mysql_fetch_rowもし戻って、それを必要とする場合はfalseに

array(1) { 
    ["id"]=> 
    string(1) "1" 
} 

答えて

13

設定しPDO::ATTR_EMULATE_PREPARES、 SUMのために(私はチェックすることは心配しなかった) - そしてそれはif (ctype_digit($val)) $row[$key] = (int)$val;のようないくつかの魔法をする - だからyあなたのDBALで行うことができます

準備されたステートメントの仕組みを理解する限り、データの送信と取得に同じパケット構造を使用し、このパケットにはデータ型が含まれています。

サーバーは、ネイティブとmysqlndの2つの形式でデータを返すことができるようですが、要求の種類によって異なります。後者は、結果の値をキャストするためにクライアントライブラリによって解釈できます。レコードの場合

+0

その名が示すようにそれは、また、ほとんどの場合で動作しますが、 'SELECT SUM(...'のために動作しません。準備された陳述書の利点はこのオプションで無効になるのですか? – Haocheng

+0

将来この回答を読む人には:1)いいえ、彼は質問を誤解しませんでした。 2)はい、実際には戻り値のデータ型が変更されます。 –

+0

@Haochengこの文を慎重に読んでください、それは二重否定です;) –

5

、PDOはPDO::ATTR_STRINGIFY_FETCHES、これを変更するであろう機能を提供します。

フェッチする際、数値を文字列に変換します。 boolが必要です。

データベースエンジンは非常に大きな数(Oracleでは38桁の数字を許可します)を処理でき、PHPでは処理できないという根拠があります。これらの数値を文字列として取り出すことは、安全を保ちデータ損失を防ぐ方法です。

不幸、the MySQL driver does not support it

<?php 

$pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); 
$sql = 'SELECT 1 AS integer_number, 3.14 AS floating_point'; 
$res = $pdo->query($sql); 
while($row = $res->fetch(PDO::FETCH_ASSOC)){ 
    var_dump($row); 
} 

 

array(2) { 
    ["integer_number"]=> 
    string(1) "1" 
    ["floating_point"]=> 
    string(4) "3.14" 
} 
+0

答えの正当な部分が好きですが、正しく使用されていると見ても、MySQL PDOは 'PDO :: ATTR_STRINGIFY_FETCHES'をサポートしていません。これは、すでに' string'データ型として返されていますつまり、この属性がそのドライバでは無用であることを意味します。 – Jon

+0

@Jon - あなたは正しいです、私は自分で見つけました。 –

関連する問題