Зачем мне нужен PDOStatement :: nextRowSet с хранимой процедурой, чтобы получить результат?

Я не понимаю поведение PDO в отношении хранимой процедуры, и мне нужны некоторые объяснения (и, возможно, решение моей проблемы).

Я использую SQL Server 2008 R2 с PHP 5.4 и Apache 2.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());

Тогда у меня есть мой результат! Ура….

Хранимая процедура работает, когда я выполняю ее непосредственно в SQL Server (у меня правильный результат с теми же параметрами).

Так почему я должен это делать и есть ли какое-то решение по этому поводу? Я не хочу звонить nextRowSet () ни за что …

Заранее спасибо за ваш ответ.

0

Решение

Здесь нет fetchArray() Метод в PDO, если вы хотите получить массив, вы можете сделать что-то вроде:

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

Чтобы получить ассоциативный массив.

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

По вопросам рекламы [email protected]