PHP5 & msqli - не получаеться сделать запрос внутри while лупа

kaibest

Новичок
PHP5 & msqli - не получаеться сделать запрос внутри while лупа

у меня 2 таблицы, одну зовут groups, вторую subgroups выглядят так:

groups:
id | name

subgroups:
id | name | group

все что мне нужно это напечатать на странице группы и их сабгруппы. делаю так:

PHP:
        $conn = db_connect();
	$r = $conn->query("SELECT * FROM groups");
	if(!$r) throw new Exception('problems with query...');
	
	$context .= '<table width="150" border="1">';
	while($row = $r->fetch_assoc())
	{
		$context .= "<tr><td align=\"center\"><b>$row[name]</b></td></tr>";
		
		$r2 = $conn->query("SELECT * FROM subgroups WHERE group=$row[id]");
	        while($row2 = $r2->fetch_assoc())
	       {
	           echo $row2[name];
	       }

	}
выдает ошибку:
Fatal error: Call to a member function fetch_assoc() on a non-object in T:\home\virtual\rabota\index.php on line 23

23-я линия: while($row2 = $r2->fetch_assoc())

прошу помочь
 

Popoff

popoff.donetsk.ua
kaibest

1. На твой ответ я могу только повторить то, что сказал РНР: такой функции не существует.

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

kaibest

Новичок
Popoff
"такой функции не существует." - пхп так не сказал.

ок, не подскажешь как тогда мне выбрать правильно и группы и сабгруппы?

тоесть мне бы хотелось все выводить в таком виде:

Раздел машины:
- БМВ
- Ламборгини
- Мерседес

Раздел обувь:
- 8-го размера
- 9-го размера
- 10-го размера

Раздел еще что-то:
- номер раз
- номер два
- номер три


выводить таблицей (<table>), я так пологаю мне все-равно нужно использовать два while лупа? один в другом.. подскажите пожалуйста
 

Mols

Новичок
Скорее всего там какой-то конфликт с резалтами. В общем я бы попробовал для начала достать все, что пришло после первого запроса в массив. Освободить резалт и двигаться дальше используя данные из полученного массива(просто предположение)

Для вывода в одном цикле может и JOIN подойти. Просто логики чуток в ПХП добавить надо будет.
З.Ы.
есть хорошее слово "цикл". Очень режет глаз когда его заменяют на "луп".
 

kaibest

Новичок
Mols
спасибо. попробую разобраться. если у кого-то заволялся кусочек кода - буду очень благодарен.

ps: есть слово PS, режет глазки когда его на ЗЫ заменяют..) вообще я учил на английском, и цикл - не знакомое слово) но учту. спасибо.
 

dr-sm

Новичок
var_dump($r2)

-~{}~ 20.05.08 06:07:

kaibest, твой стиль написания называется spaghetti code, он коченчно невсегда приемлим ).
в данном случае, оптимально обойтись одним запросом к базе,
ключевое слово inner join.
 

kaibest

Новичок
ок, вроде пришел к чему-то. код выводит все сабгруппы. осталось только вывести группу, к которой они принадлежат. кто-нить подскажет как это реализуеться? :)

PHP:
	$conn = db_connect();
	$r = $conn->query("SELECT * FROM groups g INNER JOIN subgroups sb ON g.id = sb.group ORDER BY g.id");
	if(!$r) throw new Exception('problems with query...');
	
	$context .= '<table width="150" border="1">';

	while($row = $r->fetch_assoc())
	{
		$context .= "<tr><td>$row[subname]</td></tr>";
	}
	$context .= '</table>';
-~{}~ 24.05.08 21:30:

переменная $row[name] - содержит имя группы. но если выводить ее в том же while цикле то ессно оно будет выводиться столько раз, сколько сабгруп. вот тут мне не понятно, как же вывести ее только один раз?
 

Wicked

Новичок
а что, у тебя самого совсем никаких мыслей на этот счет?
 

kaibest

Новичок
Wicked
ну зачем дразнить то? :) чесно говоря у меня была мысль сделать так:

PHP:
    $row = $r->fetch_assoc();
    echo '<tr><td>'.$row[name].'</td></tr>';

    while($row)
    {
        $context .= "<tr><td>$row[subname]</td></tr>";
    }
    $context .= '</table>';
что получилось не знаю, т.к. страница начала грузить что-то ооочень долго. видимо луп бесконечный.

-~{}~ 24.05.08 21:51:

и еще мне кажеться что код будет выводить только одну группу, и ее сабгруппы. как быть когда у меня много груп, и куча сабгруп?

-~{}~ 25.05.08 18:20:

ну может быть все-таки кто-нибудь подскажет..?

-~{}~ 26.05.08 20:43:

короче как я понимаю помогать тут не любят... вот к чему я пришел:

PHP:
try 
{
	$conn = db_connect();
	$r = $conn->query("SELECT * FROM groups g INNER JOIN subgroups sb ON g.id = sb.group ORDER BY g.id");
	if(!$r) throw new Exception('problems with query...');
	
	$context .= '<table width="150" border="1">';
	
	$gname = 1;
	while($row = $r->fetch_assoc())
	{
		if($gname == 1)
		{
			$context .= "<tr><td>$row[name]</td></tr>";
		}
		$context .= "<tr><td>$row[subname]</td></tr>";
		$gname = 0;
	}
	$context .= '</table>';
	
}
catch (Exception $e)
{
	echo $e->getMessage();
}
 
Сверху