Создание вложенного цикла, выборка из базы MS SQL

Tomas

Новичок
Создание вложенного цикла, выборка из базы MS SQL

Сразу оговорюсь - в PHP полный ламер.

Суть задачи :
есть база на MS SQL. В ней есть две таблички (одна группы товаров, вторая товары). Теперь мне надо вывести имя группы, под ним ее содержимое, и опять группу и содержимое ... Я так понимаю делается это циклом.
Когда то мне показали такой механизм (человек, более не доступен) создаю файл index.php такого содержания :

<?
include( "includes/start.inc" );
$goodsgroup = getGoodsGroup( );
$smarty->assign( "goodsgroup", $goodsgroup );
$smarty->assign( "page", $files[ "index" ] );
$smarty->display( $files[ "index" ] );
?>

потом index.html и в нем вывожу полученный набор :

{foreach item=goodsgroup from=$goodsgroup}
<tr>
<td style="border-top:1 solid #c6c6c6;" class="mtext">
{$goodsgroup.GRNAME}
</td>
</tr>
{/foreach}

тут все понятно ...

а как теперь реализовать мою задачу, на том механизме, который я описал ?
 

Demiurg

Guest
сначала надо получить нужные данные, а только потом уже пытаться их вывести.
 

Tomas

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

Demiurg

Guest
Вложеных циклов не надо, все это можно сделать сделать одним запросом.
 

Tomas

Новичок
Блин, вот за шо я люблю форумы, так за то, что ответов типа"да тут все просто ! и думать нефиг" полно ...
Ты скажи конкретно "как" ... Про то, что можно , я и сам знаю ...
 

Demiurg

Guest
Tomas
Я разве говорил, что все просто ? я просто пытаюсь вести тебя в правильном направлении. готовое решение тебе тут никто не даст.

Necromant
а теперь перечитай внимательно вопрос и найди 3 ошибки в твоем ответе.
 

Tomas

Новичок
Demiurg
Мыслей правильных у меня дофига я на делфи ужо лет 10 пишу ... я затрудняюсь их в PHP реализовать ....


Хотя, такое должно прохилять однако ....

{foreach item=goodsgroup from=$goodsgroup}
<tr>
<td style="border-top:1 solid #c6c6c6;" class="mtext">
{$goodsgroup.GRNAME}
</td>
</tr>

$goods = getGoods(параметр );
$smarty->assign( "goods", $goods );

тута вывод

{/foreach}
 

Demiurg

Guest
>Мыслей правильных у меня дофига я на делфи ужо лет 10 пишу
прекрасно, значит выбрать данные из базы у тебя не составляет труда ?
 

Demiurg

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

Tomas

Новичок
Ну я ж вроде спрашивал ...

{foreach item=goodsgroup from=$goodsgroup}
<tr>
<td style="border-top:1 solid #c6c6c6;" class="mtext">
{$goodsgroup.GRNAME}
</td>
</tr>

$goods = getGoods(параметр );
$smarty->assign( "goods", $goods );

тута вывод

{/foreach}

Так ?

У меня получается ведь два массива, один группы а второй товары, при смене группы получаю новый набор товаров и его вывожу ...

Ну на косяки HTML понятно не смотрим , таблички нарисуем как надо
 

Demiurg

Guest
не надо лезть вперед. Мы еще не получили данные а ты уже их выводить собираешься. Массива достаточно одного, надо только понять какого вида он будет.
 

Tomas

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

Группа1 Товар 1
Группа1 Товар 2
Группа1 Товар 3
Группа1 Товар 4
Группа2 Товар 1
Группа2 Товар 2
Группа2 Товар 3
Группа2 Товар 4

Так что-ли ?

$goods = getGoods(параметр );
$smarty->assign( "goods", $goods ); - а это что, не получение данных ? в getGoods покладаем ХП которая по ид группы вертает товары и вот тебе набор данных ....
 

Demiurg

Guest
>ты мне предлагаешь и группы и название товаров вывести в одной выборке ?
именно

что за функция такая getGoods ?
 

Tomas

Новичок
:)
1. Хмы, а какой такой сильно офигенный смысл, делать такую выборку ? Если тока в PHP усть функция которая сама отфильтрует набор на придмет уникальных групп ...
Хотя применительно к моей задаче и теории БД эта выборка совсем не правильная ...

2.
function getGoods( $IdGr )
{
global $main_connection;
$ret = array( );

$sql_str = "exec SP_LIST_GOODSBYIDGROUP %d";
$sql_str = sprintf( $sql_str, IDGR );

$rs = mssql_query( $sql_str, $main_connection );
if ( !$rs ) return( null );

while ( $row = mssql_fetch_array( $rs ) ) $ret[ ] = $row;
mssql_free_result( $rs );

return( $ret );
}
 

Demiurg

Guest
и что, эта фукция вызывается в цикле ?
не надо так делать, лучше сделать один запрос. Представь, что у тебя будет 1000 групп .. 1000 запросов ?
 

Tomas

Новичок
Demiurg
ну при тысяче групп, запрос будет пол-дня обрабатываться :)

ну и тысячи груу не будет - 20 максимум. согласен - не универсально ....

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

У тебя ася есть ? Мож намылишь на [email protected] ...
Могет быстрее до цели доберемся ....
 

Demiurg

Guest
функции никакие не нужны.
у тебя есть массив вида:
array(
array('gid'=>1, 'gname'=>'Группа1' , 'id'=>'1' , 'name'=>'Товар 1' , ),
array('gid'=>1, 'gname'=>'Группа1' , 'id'=>'2' , 'name'=>'Товар 2' , ),
array('gid'=>1, 'gname'=>'Группа1' , 'id'=>'3' , 'name'=>'Товар 3' , ),
array('gid'=>2, 'gname'=>'Группа2' , 'id'=>'4' , 'name'=>'Товар 4' , ),
array('gid'=>2, 'gname'=>'Группа2' , 'id'=>'5' , 'name'=>'Товар 5' , ),
)

причем товары одной группы идут строго подряд.
Теперь передаем весь этот массив смарти(assign). В смарти делаем цикл, в котором смотрим поменялась ли группа( если да, то выводим её) и выводим товар. Вот и все.
 

Tomas

Новичок
ну как вариант понятно ....

в смарти есть хитро выпендренный цикл (который поймет смену группы) или надо каждый раз ид группы пихать в переменную а потом сравнивать со следующим значением ?
 
Сверху