为什么我需要PDOStatement :: nextRowSet和存储过程来获得结果?

时间:2014-10-17 16:04:57

标签: php sql-server sql-server-2008 stored-procedures pdo

我不了解PDO关于存储过程的行为,我需要一些解释(也许可以解决我的问题)。

我正在使用带有PHP 5.4和Apache 2.2的SQL Server 2008 R2。 我使用PDO(使用SQLSRV驱动程序)调用带有2个参数的存储过程:

$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());

然后我有我的结果!耶....

当我在SQL Server中直接执行存储过程时,存储过程正常工作(我的结果具有相同参数的正确结果)。

那么为什么我必须这样做,是否有任何解决方案呢?我不想一无所知地打电话给 nextRowSet() ......

提前感谢您的回复。

2 个答案:

答案 0 :(得分:0)

PDO中没有fetchArray()方法,如果你想获得一个数组,你可以这样做:

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

获取关联数组。

答案 1 :(得分: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;
}

希望这会有所帮助: - )