2014-04-22 34 views
0

由於某種原因,下面的while循環從不會觸發。 所有這些都在課堂內。任何人都可以告訴我他們是否在以下PHP代碼中看到錯誤?

$code = $this->get_postal_state_no('Western Cape'); 

private function get_postal_state_no($psn) 
    { 
     $sql = " 
       SELECT 
        no 
       FROM 
        ct_state 
       WHERE 
        name LIKE('".$psn."');"; 
     $stmt = sqlsrv_query($this->conn1, $sql); 
     // This statement is not false, so the error handling does not happen, this is expected. 
     if($stmt === FALSE) 
     { 
      if(($errors = sqlsrv_errors()) != NULL) 
      { 
       foreach($errors as $error) 
       { 
        $sqlstate  = $error['SQLSTATE']; 
        $code   = $error['code']; 
        $sqlmessage  = $error['message']; 
       } 
      } 
      $msg = 'Error in $stmt in get_postal_state_no() method.'; 
      $this->do_error_log($error_msg, $sqlstate, $code, $sqlmessage, $msg, __LINE__, __FILE__, __FUNCTION__, __CLASS__, __METHOD__); 
      sqlsrv_free_stmt($stmt); 
     } 
     //This loop is never entered. This is not expected. 

     while($obj = sqlsrv_fetch_object($stmt)) 
     { 
      echo "I am here now"; 
      break; 
      if(!empty($obj->no) && $obj->no != '') 
      { 
       echo "Hello, I exist"; 
       break; 
       // This break never happens 
       return $obj->no; 
      } 
      else 
      { 
       echo "Hello, I don't exist"; 
       break; 
       // This break never happens 
       $code = $this->sp_aa_iud_ct_state($psn); 
       return $code; 
      } 
      sqlsrv_free_stmt($stmt); 
     } 
    } 

有沒有人有一個想法,爲什麼?我正在使用php_sqlserv驅動程序。 SQL服務器分析器購買第一部分執行的查詢。

感謝

Ĵ

+1

您是否已經進行過任何調試?查詢是否實際返回> 0行?您是否收到任何錯誤/通知(可能會被抑制)? 'while()'實際到達了嗎? – kero

+0

@kingkero是的,我有。我在自定義日誌記錄中沒有遇到任何錯誤。 while循環中的if語句或者返回一個代碼,或者如果沒有,則調用另一個創建新代碼並將其返回給此方法的方法。如果我在此之前休息,它會中斷。如果我在任何情況下中斷,它就會繼續下去,因爲它看起來好像已經達到了,但從未執行過。 – Jacques

+1

來自'sqlsrv_fetch_object'的PHP文檔:*返回一個成功的對象,如果沒有更多的行要返回,則返回NULL,如果發生錯誤或者指定的類不存在,則返回FALSE。*因此,考慮使用適當的條件你的while子句,否則它可能會以無限循環結束。 –

回答

2

望着文檔頁面sqlsrv_fetch_object它說,這對返回值:

成功則返回一個對象,NULL,如果沒有更多的行返回如果發生錯誤或者指定的類不存在,則返回FALSE。

我懷疑函數返回NULLFALSE,雖然原因有點不清楚。嘗試添加此while環以上,看看輸出是什麼:

$obj = sqlsrv_fetch_object($stmt) 
var_dump($obj); 
die; 
while($obj = sqlsrv_fetch_object($stmt)) 
{ // ... 

另一個有用的調試技巧是傾倒了查詢,然後複製/粘貼到你的DBMS系統並運行你的代碼執行查詢直接針對數據庫查看是否有實際返回的結果:

$sql = " 
    SELECT 
     no 
    FROM 
     ct_state 
    WHERE 
     name LIKE('".$psn."');"; 
var_dump($sql); 
+0

謝謝!我回來了一個未處理的NULL。 – Jacques

+1

:)恩,很高興我能幫上忙 –

相關問題