2012-06-15 207 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或其他,或從查詢中消除它。