mysql_fetch_assoc () работает только для одной итерации в цикле WHILE - PullRequest
0 голосов
/ 13 июня 2011

Обратите внимание на следующее:

$query = "SELECT legIDs FROM trip";
$result = mysql_query($query) or die("SELECT TRIPS ERROR: " . mysql_error());
while($row = mysql_fetch_assoc($result) or die("fetch error " . mysql_error())) {
    echo "<div style=\"border: 1px solid blue;float:left;\">Trip: <div style=\"float:right;\">";
    $legID = explode(",", $row['legIDs']);
        foreach($legID as $leg) {
            $query = "SELECT dep, arr FROM leg WHERE `Key` = " . $leg;
            $result = mysql_query($query) or die("SELECT LEGS ERROR: " . mysql_error());
            $row2 = mysql_fetch_assoc($result) or die("FILL ARRAY ERROR: " . mysql_error());
            echo $row2['dep'] . " - " . $row2['arr'] . "<br />";
    }
    echo "</div></div>";
}

По некоторым причинам это возвращает только один результат, даже если из цикла WHILE() возвращено несколько значений.Цикл FOREACH() работает с возвращаемой строкой.Я делаю что-то не так, чтобы возвращать только одну строку?Выполнение запроса, содержащегося в $result, непосредственно на сервере возвращает несколько строк.

Ответы [ 2 ]

7 голосов
/ 13 июня 2011

Вы используете $result дважды во внутреннем и внешнем циклах. Когда внутренний цикл завершится, $ result будет «пустым» набором результатов, поэтому внешний цикл завершится. Измените внутренний цикл на $result2, и все должно быть в порядке.

Однако, поскольку внутренний цикл просто извлекает больше результатов на основе того, что производит внешний цикл, вам следует рассмотреть возможность переписать его как объединенный запрос. Почти всегда более эффективно запускать один запрос «большого результата», чем длинную серию отдельных запросов «малого результата». В результате вы разбираете / компилируете каждый из внутренних запросов.

1 голос
/ 13 июня 2011

Это довольно грязные вещи.

  1. while($row = mysql_fetch_assoc($result) or die("FETCH ERROR: " . mysql_error()))

    Нет необходимости в or die(). Если mysql_fetch_assoc возвращает false, цикл while должен завершиться, вам также не нужно die.

  2. SQL-запросы внутри циклов, основанные на других SQL-запросах, обычно лучше обрабатываются с помощью улучшенных JOIN в исходном запросе или путем создания более интеллектуальных вторичных запросов.
  3. Вы перезаписываете переменную $result внешнего цикла во внутреннем цикле, что, вероятно, является причиной конкретной проблемы, о которой вы спрашиваете.
  4. Вы должны отделить выборку данных от вывода. Сначала выполните ваши запросы, чтобы получить все необходимые данные, а затем выведите их в <div> s. Смешивание логики представления и логики бэкэнда очень быстро становится очень грязным.
...