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(当我做一个print_r我可以验证时)被截断MEASUREMENT_UNI为只有 15 个字符。最后一个字母T被剪掉了。

我还尝试了使用SQL Server 数据库上的不同表和不同列的查询作为测试,以确保我正在使用的特定表或列没有任何奇怪的设置。我验证了不同的表/列会发生同样的事情:当我运行上面的选择查询时,列名被截断为最多 15 个字符。

我还尝试了一个选择,它指定了字段名称,select MEASUREMENT_UNIT from from measurements where ID=$id而不是,select *但这也不能解决问题。

我在这里看到了其他类似的帖子,但它们似乎都表明我应该能够获得至少 30 个字符,而不是我看到的 15 个字符的限制。

为什么列名被截断为 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 上。PHP 中有一个错误,其中列名被截断为 31 个字符,解决此问题的唯一方法是重新编译 PHP,更改namein的数组长度/ext/odbc/php_odbc_includes.h(通常为 32,但显然在您的情况下为 16),但这并未证明要么安全,要么不安全。转到此处此处以查看有关此的更多信息。

于 2012-12-19T04:09:47.000 回答
2

问题肯定出在 Microsoft ODBC 驱动程序版本 11 上,并且已在ODBC Driver 13 Preview for SQL Server中得到修复。

我发现这是因为我的开发机器运行 ubuntu 14.04 并安装了驱动程序 13 预览版工作正常,但是当我部署到运行 RHEL 7 和驱动程序 11 的生产服务器时,由于列名被截断为 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 回答