2014-10-17 75 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

相关问题