PHP:sqlsrv_fetch_array()返回false

时间:2012-06-15 03:21:41

标签: php sql-server

我遇到一个奇怪的问题,sqlsrv_query()返回一个有效的语句资源,但sqlsrv_fetch_array()随后返回false。我在MS SQL Server Management Studio中测试了我的查询($q),所以我知道它会返回一定数量的行。我的代码是......

$r = @sqlsrv_query($dbcMssql, $q, array(), array('Scrollable'=>'static'));    // works
$rowCount = sqlsrv_num_rows($r);    // this shows there are correct number of rows
$row = sqlsrv_fetch_array($r, SQLSRV_FETCH_ASSOC);    // $row is FALSE

我在另一个MSSQL数据库上使用相同的代码,它没有任何问题。与这个MSSQL DB的唯一区别在于它使用BIGINT作为其主键,并且一些列名称不同(不重要)。

我做错了什么?

更新:

Whilte $stmt并非虚假,无论如何我都看错了,它给了我

        [0] => IMSSP
        [SQLSTATE] => IMSSP
        [1] => -35
        [code] => -35
        [2] => Invalid type
        [message] => Invalid type

IMSSP让我相信,根据http://php.net/manual/en/function.sqlsrv-errors.php的文档,这是导致问题的我的SQL for PHP 2.0驱动程序。我看到PHP for PHP 3.0已经发布。这可能是我想的问题..因为我试图查询的数据库是MSSQL(2008?vs 2005)的新版本,而不是我之前使用过的没有任何问题的版本。但是,这个驱动程序只使用VC9编译(2.0可用于两者),我的PHP 5.3使用VC6编译..所以它不会加载。这是否意味着我需要使用源代码重新编译它或使用VC9版本重新安装PHP?

我不知道如何重新编译,所以我想重新安装VC9版本的PHP 5.3就是我现在的方式。

2 个答案:

答案 0 :(得分:2)

您的查询可能有问题。您可以使用sqlsrv_errors()检索错误消息,例如像这样:

$stmt = sqlsrv_query($tsql);
if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

答案 1 :(得分:1)

此错误'无效类型'当查询返回PDO无法处理的列类型时发生。例如,当你尝试

时,你会得到这个
SELECT default_value FROM sys.parameters

因为该列是sql_variant类型。如果它有意义,而是将该列CAST到varchar或其他任何内容,或者从查询中删除它。