PDA

View Full Version : PHP Nesting?


DevilYellow
05-28-2006, 03:00 AM
I am not the most fluent with PHP but I am with other languages ...

What I am trying to do is one query and list out the info, but for each listing it needs its own query. I may be going about it the wrong way (well obviously since its not working).

function getlist()
{
global $db;

$list1 = $db->query_read("
SELECT *
FROM top_list
ORDER BY id
");

if ($db->num_rows($classlist) == 0)
return NULL;

while($list1row = $db->fetch_array($list1)) {

$list2 = $db->query_read("

SELECT *
FROM top_list_info
WHERE listid = $list1row[id]
ORDER BY id
");

$retStr .= "

<tr>
<td class=\"tcat\" colspan=\"6\"><b>$classrow[class_name]</b></td>
</tr>
<tr>
<tr>
<td class=\"alt1\" colspan=\"6\">$classrow[class_desc]</td>
</tr>
<tr>
<td class=\"alt2\" width=\"10%\"><div class=\"smallfont\"><b>Username</b></div></td><td class=\"alt2\"><div class=\"smallfont\"><b>option1</b></div></td><td class=\"alt2\"><div class=\"smallfont\"><b>option2</b></div></td><td class=\"alt2\"><div class=\"smallfont\"><b>option3</b></div></td><td class=\"alt2\" ><div class=\"smallfont\"><b>option4</b></div></td><td class=\"alt2\" width=\"45%\"><div class=\"smallfont\"><b>Notes</b></div></td>
</tr>


";

}

return "$retStr";

}

$timelist = getlist();

This functions fine, but I wanted to add another "while" loop thru the second query but it doesnt like nesting it.

Can anyone get me a step into the right direction?

calorie
05-28-2006, 05:13 AM
This is my best guess as to what you are trying to do. Hope it helps. :)

function getlist()
{
global $vbulletin;

$list_infos = $vbulletin->db->query_read("
SELECT top_list_info.class_name AS class_name,
top_list_info.class_desc AS class_desc
FROM top_list, top_list_info
WHERE top_list.id = top_list_info.listid
ORDER BY top_list.id ASC, top_list_info.id ASC
");

$ret_str = '';

while ($list_info = $db->fetch_array($list_infos))
{
$ret_str .= "
<tr>
<td class=\"tcat\" colspan=\"6\"><b>" . $list_info['class_name'] . "</b></td>
</tr>
<tr>
<td class=\"alt1\" colspan=\"6\">" . $list_info['class_desc'] . "</td>
</tr>
<tr>
<td class=\"alt2\" width=\"10%\"><div class=\"smallfont\"><b>Username</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>option1</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>option2</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>option3</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>option4</b></div></td>
<td class=\"alt2\" width=\"45%\"><div class=\"smallfont\"><b>Notes</b></div></td>
</tr>
";
}

$vbulletin->db->free_result($list_infos);

return $ret_str;
}

$timelist = getlist();

DevilYellow
05-28-2006, 11:28 AM
That is where I started to take it by doing a Join ...

but then I still run into a problem

for every class_name/class_desc there might be quite a few options that I want to loop thru - and I want each class to only be listed once. So thats also where I am confused.


function getetlist()
{
global $db;
//THE LIMIT IN THE FOLLOWING QUERY IS MEANT ONLY FOR
THE RESULTS OF THE SECOND TABLE
$classlist = $db->query_read("
SELECT toplist1.class_name AS class_name,
toplist1.class_desc AS class_desc,
toplist2.option1 AS option1,
toplist2.option2 AS option2,
toplist2.option3 AS option3,
toplist2.option4 AS option4,
toplist2.option5 AS option5,
toplist2.option6 AS option6
FROM toplist1, toplist2
WHERE toplist1.id = toplist2.toplist1id
ORDER BY toplist1.id, toplist2.option2
LIMIT 10
");

if ($db->num_rows($classlist) == 0)
return NULL;

while($classrow = $db->fetch_array($classlist)) {



$retStr .= "

<tr>
<td class=\"tcat\" colspan=\"6\"><b>$classrow[class_name]</b></td>
</tr>
<tr>
<tr>
<td class=\"alt1\" colspan=\"6\">$classrow[class_desc]</td>
</tr>
<tr>
<td class=\"alt2\" width=\"10%\">
<div class=\"smallfont\"><b>Option1</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option2</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option3</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option4</b></div></td>
<td class=\"alt2\" ><div class=\"smallfont\"><b>Option5</b></div></td>
<td class=\"alt2\" width=\"45%\">
<div class=\"smallfont\"><b>Option6</b></div></td>

</tr>
// THIS IS WHAT I WANT TO RE-LOOP
<tr>
<td class=\"alt1\">$classrow[option1]</td>

<td class=\"alt2\">$classrow[option2]</td>
<td class=\"alt1\">$classrow[option3]</td>
<td class=\"alt2\">$classrow[option4]</td>
<td class=\"alt1\">$classrow[option5]</td>
<td class=\"alt2\">$classrow[option6]</td>
</tr>



";

}

return "$retStr";

}

$timelist = getetlist();

eXtremeTim
05-28-2006, 01:51 PM
You can do a groupby and group all the classes with the same name together so they are only showed once.

DevilYellow
05-28-2006, 01:57 PM
When I was thinking of doing two queries I could understand how I wanted to loop each query differently - but writing a query as already mentioned or with a join I still dont know how it would loop thru the classes and then loop each list of options for each class

Paul M
05-28-2006, 04:21 PM
What fields etc are in your two tables and what exactly are you trying to do with them, display etc - I'm somewhat confused reading this.

DevilYellow
05-28-2006, 04:27 PM
Table 1:
id
name
desc

Table 2:
id
"table1_id"
user
time
notes

...display
Class 1 Desc 1
user time 1.2
user time 1.3
user time 1.4

Class 2 Desc 2
user time 2.2
user time 2.3

So to query the first table and loop the results, but for each listing it would loop the times under that class .

calorie
05-28-2006, 04:38 PM
This is another guess as to what you are trying to do. Hope it helps. ;)

function getetlist()
{
global $vbulletin;

$classlist = $vbulletin->db->query_read("
SELECT toplist1.class_name AS class_name,
toplist1.class_desc AS class_desc,
toplist2.option1 AS option1,
toplist2.option2 AS option2,
toplist2.option3 AS option3,
toplist2.option4 AS option4,
toplist2.option5 AS option5,
toplist2.option6 AS option6
FROM toplist1, toplist2
WHERE toplist1.id = toplist2.toplist1id
ORDER BY toplist1.id, toplist2.option2
LIMIT 10
");

$ret_str = '';
$temp_str = '';

while ($classrow = $vbulletin->db->fetch_array($classlist))
{
if ($classrow['class_name'] != $temp_str)
{
$ret_str .= "
<tr>
<td class=\"tcat\" colspan=\"6\"><b>" . $classrow['class_name'] . "</b></td>
</tr>
<tr>
<td class=\"alt1\" colspan=\"6\">" . $classrow['class_desc'] . "</td>
</tr>
<tr>
<td class=\"alt2\" width=\"10%\"><div class=\"smallfont\"><b>Option1</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option2</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option3</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option4</b></div></td>
<td class=\"alt2\"><div class=\"smallfont\"><b>Option5</b></div></td>
<td class=\"alt2\" width=\"45%\"><div class=\"smallfont\"><b>Option6</b></div></td>
</tr>
";

$temp_str = $classrow['class_name'];
}

$ret_str .= "
<tr>
<td class=\"alt1\">" . $classrow['option1'] . "</td>
<td class=\"alt2\">" . $classrow['option2'] . "</td>
<td class=\"alt1\">" . $classrow['option3'] . "</td>
<td class=\"alt2\">" . $classrow['option4'] . "</td>
<td class=\"alt1\">" . $classrow['option5'] . "</td>
<td class=\"alt2\">" . $classrow['option6'] . "</td>
</tr>
";
}

return $ret_str;
}

$timelist = getetlist();

DevilYellow
05-28-2006, 04:58 PM
Thanks calorie :)

This works :) ... I did do a join tho in the query to make it list it all out.