2014-10-17 30 views
0

我不明白PDO關於存儲過程的行爲,我需要一些解釋(也許解決我的問題)。爲什麼我需要使用存儲過程的PDOStatement :: nextRowSet來獲取結果?

我使用SQL Server 2008 R2與PHP 5.4和Apache 2.2。 我打電話使用PDO(帶司機SQLSRV)有兩個參數的存儲過程:

$pdoStmt = $pdo->prepare('MY_STORED_PROCEDURE ?, ?'); 
$pdoStmt->bindValue(1, 'MyValue1', PDO::PARAM_STR); 
$pdoStmt->bindValue(2, 'MyValue2', PDO::PARAM_STR); 
$pdoStmt->execute(); 

好了,在這裏,一切都完美的作品。所調用的存儲過程的結果是一個數組,所以我應該使用fetchArray()。所以我這樣做:

$result = $pdoStmt->fetchArray(); 

但是結果是空的。我不知道爲什麼,我必須撥打幾個時間nextRowSet()才能得到結果。所以我這樣做:

do { 
    $result = $pdoStmt->fetchAll(PDO::FETCH_ASSOC); 
} while ($pdoStmt->nextRowSet()); 

然後我有我的結果! Yay ....

當我直接在SQL Server中執行存儲過程(我有一個正確的結果與相同的參數)存儲過程。

那麼爲什麼我必須這樣做,有沒有解決方案呢?我不想撥打nextRowSet()什麼也沒有...

在此先感謝您的回覆。

回答

0

後的研究,在這裏我自己fetchArray()方法:

function fetchArray($single = false) 
{ 
    $this->row = array(); 
    do { 
     $tmp = $this->cur->fetchAll(PDO::FETCH_ASSOC); 
     $cnt = $this->cur->columnCount(); 
     if($cnt) { 
      $this->nb_fields = $cnt; 
      for($i=0; $i<$cnt; $i++){ 
       $this->fields[] = $this->cur->getColumnMeta($i)['name']; 
      } 
     } 
     $this->row = array_merge($this->row, $tmp); 
    } while ($this->cur->nextRowSet()); 
    if (count($this->row) == 1 && $single == true) { 
     $this->row = $this->row[0]; 
    } 
    if (empty($this->row)) { 
     $this->row = false; 
    } 
    return $this->row; 
} 

希望這將有助於:-)

0

有一個在PDO沒有fetchArray()方法,如果你想獲得一個數組,你可以這樣做:

$result = $pdoStmt->fetch(PDO::FETCH_ASSOC); 

爲了得到一個關聯數組。

+0

感謝您的答覆!我試過但仍然是,我有同樣的行爲。 – 2014-10-17 16:17:57

+0

@VincentNicopolsky你的程序包含多少個sql語句?如果有多個,你只需要'nextRowSet()'。 – jeroen 2014-10-17 16:21:17

+0

有條件檢查參數是否爲空。如果它是空的,我做一個'SELECT'FALSE'AS RESULT',否則我做一個'SELECT R1,R2 FROM MyTable WHEN R1 = @ MyValue1 AND R2 = @ MyValue2'。 只有這個: - / – 2014-10-17 16:43:16

相關問題