2015-07-10 84 views
1

我想從存儲在遠程MSSQL服務器上的過程中提取數據。 PHP documentationsqlsrv_fetch($stmt)中表示,$stmt表示由sqlsrv_query()sqlsrv_execute()返回的資源。sqlsrv_fetch與MS SQL服務器sqlsrv_execute

這裏是我的代碼片段 - >

$sql = "exec USP_ABC_ABC_REPORT 'Apple','06/01/2014','10/29/2014','H','A'"; 

     $segment ='apple'; 
     $start_date='06/01/2014'; 
     $end_date ='10/29/2014'; 
     $something2 ='H'; 
     $something3 ='A';  

     $abc = sqlsrv_prepare($conn, $sql, array(&$segment, &$start_date, &$end_date, &$something2, &$something3)); 


     if($abcd = sqlsrv_execute($abc)){ 
       if(sqlsrv_fetch($abcd)){ 
        $id = sqlsrv_get_field($abcd, 0); 
        echo $id; 
      } else{ 
        echo "fetch failed"; 
       } 
     } 

該片段顯示了一個錯誤:

sqlsrv_fetch() expects parameter 1 to be resource, boolean given.

sqlsrv_fetch()如果我使用sqlsrv_query(正常工作),而不是sqlsrv_execute /準備。可能的原因是sqlsrv_query()返回混合輸出而不是布爾值。

任何人都可以幫助使用sqlsrv_fetch執行。

回答

0

sqlsrv_execute返回指示成功或失敗的布爾值。

如果sqlsrv_prepare的調用成功,則返回語句資源。所以,你可以只通過$abcsqlsrv_fetchsqlsrv_get_field參數:

if (sqlsrv_fetch($abc)){ 
    $id = sqlsrv_get_field($abc, 0); 
    echo $id; 
} 
+0

是的我的準備聲明工作正常。所以我已經刪除了我的execute語句,並使用了sqlsrv_fetch($ abc),正如你所提到的那樣。這會顯示「提取失敗」(上面的代碼中的else語句)。這是由於遠程服務器中的錯誤嗎?另外,爲什麼官方的PHP sqlsrv_fetch()帖子沒有提及我們可以使用prepare資源作爲參數? –

0

你對事業的見解是正確的。檢查文檔sqlsrv_execute和每個功能。

sqlsrv_execute返回任一,(布爾)。這不是提取期望的輸入。

一旦您不需要在每個函數上匹配預期參數類型的需求,您將可以通過任何類型的代碼更容易地相處。

while into a develpment environment, try to var_dump($abcd); just after assigning to see its value.

+0

var_dump轉儲有關變量的信息。我知道這一點。但是由於execute總是返回布爾值,所以我如何更改上面的代碼片段。如果我沒有正確地關注你,請使用代碼片段進行解釋。 –

+0

我的意思是sqlsrv_fetch()期待一個資源作爲參數,而不是布爾值。因此,不會以這種方式工作。請參閱http://php.net/manual/en/function.sqlsrv-fetch.php,參數是abc,而不是abcd。正如良好的做法,避免使用混淆的var名稱。 – alariva

+0

我已將sqlsrv_fetch($ abcd)替換爲sqlsrv_fetch($ abc)。這會顯示「提取失敗」(上面的代碼中的else語句)。這是由於遠程服務器中的錯誤嗎?我的準備聲明工作正常。另外,爲什麼官方的PHP sqlsrv_fetch()帖子沒有提及我們可以使用prepare資源作爲參數? –