2012-02-07 5 views
5

Хорошо, мой синтаксис, вероятно, можно описать без кода. В принципе, это должно быть легко ... но никогда не бывает.

У меня есть 2 петли в ряд ... в основном то же самое. I SELECT * каждая переменная из моей базы данных, а затем мне нужно построить 2-слойный javascript на основе двух sep. переменные.

Так

у меня есть:

while ($row = mysql_fetch_array($myVariable)) { 

// do events 

} 

затем после этого

while ($row2 = mysql_fetch_array($myVariable)) { 

// do events 

} 

По какой-то причине он не будет полностью возвращающегося НИЧЕГО на второй ... есть некоторые, где мне нужно сброс моего массива, возможно ли это, и я не могу просто перезапустить. Такой основной вопрос, но я не могу понять, что еще может быть неправильно для моей жизни. Таким образом, этот вопрос состоит в том, что общая проблема заключается в том, чтобы сделать это дважды подряд и ожидать, что PHP будет запускаться каждый раз в начале $ myVariable, который содержит инструкцию SELECT?

Спасибо ... проверит весь день и обновит по мере необходимости. Первый таймер для переполнения стека, я бы хотел увидеть помощь.

+2

первая вставка все записи в массиве затем сделать Еогеасп – ZiTAL

+0

http://uk.php.net/mysql-fetch-array mysql_fetch_array перемещает внутренний указатель на данные, кто-то умнее, чем я объясню это более , но в основном во втором цикле вы уже прошли до конца! – TommyBs

+0

Возможный дублирующий вопрос: [Второй цикл while не работает. Почему?] (Http://stackoverflow.com/questions/8333145/second-while-loop-not-running-why) – Wiseguy

ответ

4

Перед началом второго цикла, попробуйте использовать mysql_data_seek():

mysql_data_seek($myVariable, 0); 

указатель на набор записей должен быть сброшен, в противном случае он будет по-прежнему показывают, что это в конце.

Возможно, это лучший вариант, поскольку ZiTAL указывает, чтобы хранить ваши записи в массиве и просто перебирать массив.

+1

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

+0

@AngusWalker Я думаю, я должен был бы квалифицироваться «лучше» с точки зрения потенциальной удобочитаемости/ремонтопригодности. Как написано, это неоднозначно. – Wiseguy

0

Если ваши петли вложены и предполагается, что $ myVariable одинаково для обеих петель, просто скопируйте его и затем каждый раз перебирайте другую копию.

$myVariable = mysql_result($query); 
$myVariable2 = $myVariable; 

while ($row = mysql_fetch_array($myVariable)) { 
    while ($row = mysql_fetch_array($myVariable2)) { 
... 

Еще один +1 для «сделайте это массив», хотя гораздо приятнее работать.

+0

Создается впечатление, что петли искателя не вложены. Но если бы они были, у вас есть хороший момент. – Wiseguy

+0

Я в основном разместил это в случае, если они были вложенными, а затем полностью забыл упомянуть об этом ха-ха. Хороший улов :) – Joe

7

Проблема заключается в том, что запрос возвращает resource. У этого ресурса есть собственный внутренний указатель (счетчик, чтобы помнить, какую строку возвращать). mysql_fetch_array будет продвигать этот внутренний указатель и возвращать каждую строку из ресурса по одному за раз. как только он заканчивается (осталось больше строк), он возвращает false. поэтому в последнем цикле $ row равно false, который выходит из цикла while. Однако указатель не сбрасывается. Итак, в следующем цикле while вы вызываете mysql_fetch_array, указатель находится в конце и поэтому возвращает false, который полностью обходит второй цикл while. То, что вы должны сделать, - это циклический анализ данных один раз и сохранение каждой строки в массив. Затем вы можете скопировать/петлю по массиву столько, сколько хотите, и все работает так, как ожидалось.

$data = array(); 
while ($row = mysql_fetch_array($myVariable)) { 
    $data[] = $row; 
} 
//now $data has all the rows. a simple foreach will loop over the data. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 

//and you can loop over data again and again. 
foreach($data as $row){ 
    //do events 
    print_r($row); 
} 
Смежные вопросы