2012-05-09 14 views
0

Я извлекаю пару таблиц из базы данных MSSQL, которую я затем просматриваю, чтобы получить информацию о заказе.

Мой код выглядит следующим образом:

while($row = sqlsrv_fetch_array($orderResult)) 
    { 
     ......code........ 
     .................. 
     while($statusRow = sqlsrv_fetch_array($statusResult)) 
     { 
      ....code.... 
     } 
     ....code.... 
    } 

Теперь моя проблема заключается в том, что после второго цикла пробегает, он никогда не работает снова. И мне нужно, чтобы он запускался каждый раз, когда запускался первый цикл.

Есть ли что-нибудь, что я могу сделать, чтобы сбросить этот второй цикл, чтобы снова запустить?

Заранее спасибо. Любая помощь или толчок в правильном направлении будут очень полезными.

+1

Извлеките данные в массив и перейдите через него вместо – zerkms

+0

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

+0

@zerkms Как мне это сделать? Я пытался это понять. Спасибо за помощь ребята. – npiani

ответ

1

Читайте о других параметрах в sqlsrv_fetch_array()

Вы можете сделать что-то вроде этого, чтобы сбросить

// reset, and get first row 
$row = sqlsrv_fetch_row($result, SQLSRV_FETCH_BOTH, SQLSRV_SCROLL_FIRST); 

// get second (and nth row) normally 
$row = sqlsrv_fetch_row($result); 

Кроме того, я думаю, вы могли бы воспользоваться делать JOIN в запросе, чтобы вернуть один результат. Слияние результатов вручную, как это кажется немного хаки.

+0

Я ищу SQL JOIN. Я проверю это прежде, чем попробовать более вложенные циклы, так как кажется, что это общий консенсус. Я дам вам, ребята, знать, как это получается! – npiani

+0

Объяснения были моим ответом. Большое спасибо. Иногда это просто требует, чтобы кто-то указал на недостатки! – npiani

0

Вы уверены, что ваш второй цикл получил результаты для второго запуска? возможно, если ваш $ statusResult откладывается на вашу строку $, а ваша строка $ имеет только записи для первого цикла, вы должны вставить некоторые псевдо-записи в ваш db.

второй цикл должен обновиться в следующем «большом» цикле, потому что весь внутренний блок будет уничтожен в конце большого блока и будет (полностью) перестроен при следующей записи.

1

У меня была аналогичная проблема при вызове хранимой процедуры из базы данных, которая возвращала несколько наборов результатов. Я нашел ответ Maček не работал для меня, но another answer сделал:

$resultSet = array(); 
$isNotLastResult = true; 
$i = 0; 

while (!is_null($isNotLastResult)) 
{ 
    $resultSet[$i] = array(); 

    while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) 
    { 
     $resultSet[$i][] = $row; 
    } 

    $isNotLastResult = sqlsrv_next_result($result); 
    $i++; 
} 

print_r($resultSet); 

PS: Я дал вам стрелок вверх, чтобы противодействовать вашу стрелку вниз. Вы задали вопрос, на который я потратил немало времени, чтобы найти ответ. Хороший вопрос!

1

Используйте следующие чтобы сбросить указатель:

sqlsrv_fetch_array ($Res, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_ABSOLUTE, -1); 

Затем использовать тот же код, как и раньше, чтобы через петлю результирующего набора. sql_fetch_array, похоже, увеличивает указатель после извлечения данных. Запрос -1-й записи не получает ничего, но затем устанавливает указатель на 0, который является первой записью.

Смежные вопросы