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. } } } 

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

Способ 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); } 

@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"; } } } 

Проблема в том, что во второй раз указатель уже находится в конце записи для $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 /> .