2012-06-15 137 views
0

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

$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数据库的唯一区别在于它使用BIGINT作为主键,并且一些列名称是不同的(这不重要)。

我在做什么错?

UPDATE:

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 3.0的SQL已经发布。这可能是我想的问题..因为我试图查询的数据库是MSSQL(2008?vs 2005)的一个较新版本,而不是我之前使用过的没有任何问题的版本。但是,这个驱动程序只用VC9编译(两者都可用),而我的PHP 5.3是用VC6编译的,所以不会加载。这是否意味着我需要使用源代码重新编译它,或者使用VC9版本重新安装PHP?

我不知道如何重新编译,所以我猜想重新安装PHP 5.3版本的PHP 5.3是我现在的选择。

+0

删除'@'标志,看看你是否得到一个错误 –

+0

嗨,约翰,我也试过。没有任何错误。 – musicliftsme

+0

我删除了'$ stmt === false'检查错误,因为'sqlsrv_query()'没有返回false。所以,有一个错误,但它不会被'sqlsrv_error()'块的if语句捕获。 – musicliftsme

回答

2

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

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

请看我上面更新的帖子。 sqlsrv_query()不会返回false,但仍然有一个错误源自我用于PHP 2.0驱动程序的MS SQL。 – musicliftsme

+0

@ user796837那么错误消息说“无效类型”,所以我会去检查是否所有的输入都是正确的。例如,你是否尝试过传递'array('Scrollable'=> SQLSRV_CURSOR_STATIC)'而不是'static'?我不明白你是如何得出结论的,这是一个版本问题。它只是说,IMSSP是源于驱动程序内错误的错误,而不是数据库。 – dbrumann

+0

嘿mahok,我已经将问题缩小到我的查询中的一个单词(请注意,此查询在MS SQL Server Management Studio中可用)。一个Exmaple查询看起来像......'“SELECT * FROM [db_name]。[dbo]。[table_name] WHERE OrderID ='47725006';”'。它适用于'table_name ='Order''的任何'table_name'。出于原因,'[Order]'被确定为无效..任何想法? – musicliftsme

1

当查询返回PDO无法处理的列类型时,会发生此错误“无效类型”。例如,当您尝试使用

SELECT default_value FROM sys.parameters 

,因为该列的类型为sql_variant。如果它是有意义的,而不是CAST那列到varchar或其他,或从查询中消除它。