2013-04-22 3 views
4

Я не могу понять, почему sqlsrv_fetch_assoc возвращает только 1 строку, если в результирующем наборе есть 2 строки в соответствии с sqlsrv_num_rows. Я пытался жестко закодировать параметр, но я все равно получаю тот же результат.sqlsrv array не возвращает все строки

SSMS Результат Набор

id  description 
------ ------------- 
2  Administrator 
3  User

PHP

$col = 'abcd'; 
$stmt = "SELECT id, [description] FROM dbo.tbl WHERE col = ?"; 
$params = array($col); 
$options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); 

$query = sqlsrv_query($conn, $stmt, $params, $options); 
if($query === false) { 
    print(print_r(sqlsrv_errors())); 
} 

while($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC)) { 
    ... 
} 

При попытке просмотра результирующего набора

$row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC); 

print_r($row); 

Я получаю

Array 
(
    [id] => 2 
    [description] => Administrator 
)

sqlsrv_num_rows

echo sqlsrv_num_rows($query); 
//Returns 2 

ответ

6

При попытке просмотра результирующего набора

      $ строка = sqlsrv_fetch_array ($ query, SQLSRV_FETCH_ASSOC);
      print_r ($ строка); `

Поскольку вы перечислили это отдельно, я надеюсь, что вы не делаете это (показывая весь код):

$col = 'abcd'; 
$stmt = "SELECT id, [description] FROM dbo.tbl WHERE col = ?"; 
$params = array($col); 
$options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); 

$query = sqlsrv_query($conn, $stmt, $params, $options); 
if($query === false) { 
    print(print_r(sqlsrv_errors())); 
} 

while($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC)) { 
    ... 
    $row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC); 
    print_r($row); 
} 

Потому что тогда это очевидно, что вы 'повторно потребляет sqlsrv_fetch_array дважды за одну итерацию цикла, один раз для проверки состояния и один раз внутри цикл.

Удалите весь пух из цикла while и получите только это - и абсолютно ничего, даже не ... или комментарии.

while($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC)) { 
    print_r($row); 
} 
+1

Да. В цикле 'while' был еще один' $ stmt/$ query'. Это написано над предыдущим набором результатов и закончило цикл. Выяснилось, а затем попытался удалить мой вопрос. Имеют 25 представителей. – Kermit

+0

Ну, я рад, что вы этого не сделали :) Потому что теперь я получаю пользу. – Cullub

0

Я нахожусь под впечатлением, что fetch_array только извлекает строку в то время (строка является следующей строкой) ... Попробуйте что-то вроде ...

while($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC);){ 

//do something awesome 

} 
3

sqlsrv_fetch_array: Возвращает следующего доступной строки данных как ассоциативный массив, числовой массив или оба (по умолчанию).

Акцент на меня.

Возвращаемые значения: Возвращает массив при успешном выполнении, NULL, если больше нет строк, и FALSE, если возникает ошибка.

Вам нужно сделать время цикла, чтобы извлечь все записи, как это:

while ($row = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC)) { 
    //process $row 
} 
+0

Следует упомянуть, что это уже внутри цикла while. – Kermit

+0

делает ли это 1 запрос для каждой строки? –

+0

Нет, всего 1 запрос и * rownum * fetch calls. – Maerlyn