24

関連するコードは次のとおりです。

function connect(){
    // DB credentials and info defined here....
    $connection = odbc_connect("DRIVER={SQL Server Native Client 11.0}; Server=$server; Database=$db;", $loginname, $loginpass);
    return $connection;
}

function odbc_fetch_results($stmt, &$results) {
    $numrows = odbc_num_rows($stmt);
    $row = odbc_fetch_array($stmt);
    print_r($row); // Prints: Array ( [MEASUREMENT_UNI] => kg)
    if($row){
         $results = array ($row);
         while( $row = odbc_fetch_array($stmt)){
            array_push($results, $row);
         }
    }
    return $numrows;
}

$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints: Array ( [0] => Array ( [MEASUREMENT_UNI] => kg) ) 

MEASUREMENT_UNIT結果には、15文字のみprint_rに切り捨てられる(確認できる)という列が含まれている必要があります。MEASUREMENT_UNI最後の文字Tは切り取られます。

また、テストとして、SQL Serverデータベースの別のテーブルとの列を使用してクエリを実行し、作業している特定のテーブルまたは列で奇妙な設定が行われていないことを確認しました。別のテーブル/列でも同じことが発生することを確認しました。上記のようにselectクエリを実行すると、列名が最大15文字に切り捨てられます。

select MEASUREMENT_UNIT from from measurements where ID=$idの代わりにフィールド名を指定するselectも試しましたselect *が、それでも問題は解決しません。

私はこれについて他の同様の投稿を見ましたが、それらはすべて、私が見ている15文字の制限ではなく、少なくとも30文字を取得できるはずであることを示しているようです。

列名が15文字に切り捨てられるのはなぜですか?

編集:MySQLサーバーデータベースに接続しても、同じ問題が発生するようには見えませんでした。MySQLテーブルのDB列名は切り捨てられなかったため、これはODBCプラグインの問題ではないと私は信じています。

$connection = odbc_connect("DRIVER={MySQL};Server=$server; Database=$db;", $loginname, $loginpass);
$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints CORRECTLY: Array ( [0] => Array ( [MEASUREMENT_UNIT] => kg) )

上記のコードセクションは両方とも、同じPHP+ODBCがインストールされた同じサーバー上の同じファイルでテストされていることに注意してください。

4

3 に答える 3

14

どうやら問題はODBCにあります。namePHPには、列名が31文字で切り捨てられるバグがあり、これを修正する唯一の方法は、PHPを再コンパイルし、 inの配列の長さを変更することです/ext/odbc/php_odbc_includes.h(通常は32ですが、この場合は16でした)が、これは証明されていません。安全か危険か。これに関する詳細については、ここここにアクセスしてください。

于 2012-12-19T04:09:47.000 に答える
2

問題は間違いなくMicrosoftODBCドライバーバージョン11にあり、SQLServer用のODBCドライバー13プレビューで修正されています

Driver 13Previewがインストールされたubuntu14.04を実行している開発マシンが正常に動作するため、これを発見しましたが、Driver11を使用してRHEL7を実行している本番サーバーにデプロイすると、列名が15文字で切り捨てられたためにあらゆる種類の大混乱が発生しました。

MicrosoftのドキュメントはLinuxのサポートが不十分なので、ubuntuを実行している場合は、ここにインストールの要点があります。

于 2016-03-30T04:56:27.963 に答える
1

永続的な解決策は、PHPのバグスレッドで提案されているようにPHPを再コンパイルするか、新しいPHPバージョンに更新してみることです。

選択した列の名前を選択的に短い列に変更することで、問題を回避できます。

$sql = "SELECT measurement_unit AS measure_unit, * FROM measurements WHERE ID=$id";
// now in your array you will have new index called "measure_unit"
于 2012-12-20T15:07:37.693 に答える