2012-03-16 4 views
1

поэтому я работаю над «списком продуктов», и идея состоит в том, чтобы иметь имя продукта, а затем выпадающий список цветов, полученных из базы данных , Проблема в том, что я могу получить только «цвета», а цикл - итерацию один раз, я получаю первое имя продукта и цвета в раскрывающемся меню один раз, но не позже, помощь, которую мне бы хотелось, как я могу изменить этот код, чтобы он делал то, что мне нужно, я пытался в течение недели, и я действительно мог бы использовать некоторую помощь.PHP двойной цикл while, второй цикл не повторяется более одного раза

$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 


while ($get_product_rows = mysql_fetch_assoc($product_query)){ 
echo $get_product_rows['name']; 
    echo "<br \>"; 

    if ($get_product_rows['has_colour'] == '1'){ 
     while ($get_colour_row = mysql_fetch_assoc($colour_query)){ 
      // Drop down box population goes here. 


     } 
    } 
} 

Если кто-нибудь может помочь, я был бы признателен. От Grant M.

+1

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

+0

вы можете сделать 'var_dump (mysql_fetch_assoc ($ color_query))' и обновить свой вопрос с помощью вывода? – F21

+0

@kingcoyote Почему это непредсказуемо? У него два разных запроса на две разные таблицы, также он выполняет свои запросы перед циклами while. – steveoh

ответ

2

Способ mysql_fetch_assoc() заключается в том, что он имеет внутренний указатель, и каждый раз, когда вы запускаете метод, вы получаете следующий элемент, и указатель перемещается один раз. Если не было указателя, как бы цикл while в противном случае заканчивался? Это просто продолжало бы вытаскивать цвета, снова и снова.

Способ решения проблемы заключается в сбросе точки на каждой итерации. Это можно сделать, используя mysql_data_seek().

$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 

while ($get_product_rows = mysql_fetch_assoc($product_query)) { 
    echo $get_product_rows['name']; 
    echo "<br />"; 

    if ($get_product_rows['has_colour'] == '1') { 
     while ($get_colour_row = mysql_fetch_assoc($colour_query)) { 
      // Drop down box population goes here. 
     } 
    } 
    mysql_data_seek($colour_query, 0); 
} 
+0

Я попробовал ваше добавление, и я закончил со вторым в то время как цикл повторяется довольно много раз, похоже, повторяется на основе количества возвращенных строк из запроса, однако вставка «break» в цикле отсортирована. Большое спасибо за вашу помощь людям. –

+0

@GrantMackenzie Добро пожаловать. Если это решило вашу проблему, не забудьте отметить ее как ответ, нажав V влево. – kba

0

Проблема заключается в том, что второй раз, указатель уже в конце записи для $colour_query; он будет продолжать возвращать null, потому что он не знает, что вложенный цикл завершен.

Вы можете решить эту проблему путем сброса указателя с помощью mysql_data_seek:

$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 

while ($get_product_rows = mysql_fetch_assoc($product_query)) { 
    echo $get_product_rows['name']; 
    echo "<br />"; 

    if ($get_product_rows['has_colour'] == '1') { 
     while ($get_colour_row = mysql_fetch_assoc($colour_query)) { 
      // Drop down box population goes here. 
     } 

     // Reset the pointer: 
     mysql_data_seek($colour_query, 0); 
    } 
} 

Кроме того, ваш <br \> неправильно; он должен быть <br />.

2

@ Kristian Antonsen совершенно прав - после того, как вы прочтете строки, когда находитесь в конце, если вы не перемодетесь в начало набора результатов.

В качестве альтернативы другим ответам, поскольку цвета не зависят от продукта - получите их один раз, а затем повторно их использовать в памяти.

// get the colours once 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 
$colours = array(); 
while ($get_colour_row = mysql_fetch_assoc($colour_query)) { 
    array_push($colours, $get_colour_row['colour']); 
} 

// loop through each product 
$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
while ($get_product_rows = mysql_fetch_assoc($product_query)) { 
    echo $get_product_rows['name']; 
    echo "<br />\n"; 

    if ($get_product_rows['has_colour'] == '1'){ 
     foreach ($colours as $colour) { 
      echo $colour . "<br />\n"; 
     } 
    } 
} 
Смежные вопросы