suckerfish vanuit mySQL

Hallo, ik ben bezig met een scriptje die een "suckerfish menu" zou moeten genereren met PHP vanuit een MySQL database. Ik ben nu twee dagen bezig, maar ik krijg het niet voor elkaar om de <ul> en de </ul> op de goede plaatsen te echooën.

Wie kan mij de goede richting op sturen?

php

[code:1:e6c814bc4c]
function loopStructure( $id = 0 , $parent_id = 0)
{
$query = "SELECT * "
. "FROM menu "
. "WHERE parent_id=".$id." "
. "ORDER BY position ASC";

$result = mysql_query&#40;$query&#41;;

while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41;
&#123;
	$query = &quot;SELECT * &quot;
	. &quot;FROM menu &quot;
	. &quot;WHERE parent_id=&quot;.$id.&quot; &quot;
	. &quot;ORDER BY position ASC&quot;;

	$result = mysql_query&#40;$query&#41;;

	while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41;
	&#123;
		echo &quot;&lt;li&gt;&quot;.$row&#91;'title'&#93;.&quot;&lt;/li&gt;n&quot;;
		loopStructure&#40;$row&#91;'id'&#93;, $row&#91;'parent_id'&#93;&#41;;
	&#125;
&#125;

}

echo "<ul>";
$test = loopStructure();
echo "</ul>";
[/code:1:e6c814bc4c]

mySQL

[code:1:e6c814bc4c]
CREATE TABLE menu (
id int(11) unsigned NOT NULL auto_increment,
parent_id int(11) unsigned NOT NULL default ‘0’,
title varchar(50) NOT NULL default ‘’,
module_id int(11) NOT NULL default ‘0’,
position int(11) NOT NULL default ‘0’,
PRIMARY KEY (id),
KEY css_inr (id)
) TYPE=MyISAM AUTO_INCREMENT=18 ;

INSERT INTO menu VALUES (1, 0, ‘eerste’, 0, 1);
INSERT INTO menu VALUES (2, 0, ‘tweede’, 0, 2);
INSERT INTO menu VALUES (3, 0, ‘derde’, 0, 3);
INSERT INTO menu VALUES (4, 1, ‘eerste van eerste’, 0, 1);
INSERT INTO menu VALUES (5, 1, ‘tweede van eerste’, 0, 2);
INSERT INTO menu VALUES (6, 1, ‘derde van eerste’, 0, 3);
INSERT INTO menu VALUES (7, 2, ‘eerste van tweede’, 0, 1);
INSERT INTO menu VALUES (8, 2, ‘tweede van tweede’, 0, 2);
INSERT INTO menu VALUES (9, 2, ‘derde van tweede’, 0, 3);
INSERT INTO menu VALUES (10, 3, ‘eerste van derde’, 0, 1);
INSERT INTO menu VALUES (11, 3, ‘tweede van derde’, 0, 2);
INSERT INTO menu VALUES (12, 3, ‘derde van derde’, 0, 3);
INSERT INTO menu VALUES (13, 4, ‘id1->id4->id13’, 0, 1);
INSERT INTO menu VALUES (15, 4, ‘id1->id4->id15’, 0, 3);
INSERT INTO menu VALUES (14, 4, ‘id1->id4->id14’, 0, 2);
INSERT INTO menu VALUES (16, 15, ‘id1->id4->id15->16’, 0, 3);
INSERT INTO menu VALUES (17, 16, ‘laatste’, 0, 0);
[/code:1:e6c814bc4c]

De 2e parameter lijkt me overbodig, tenzij je met een stack werkt (dat zou nodig kunnen zijn, maar daar werk je nu niet mee i.i.g.).

Een snel probeerseltje, zal nog niet helemaal werken:

[code:1:a103dce34e]function loopStructure( $id = 0 )
{
$query = "SELECT * "
. "FROM menu "
. "WHERE parent_id=".$id." "
. "ORDER BY position ASC";

$result = mysql_query($query);

if (mysql_num_rows($result) > 0)
{
$printUL = 1;
echo "<ul>";
}

while($row = mysql_fetch_array($result))
{
$query = "SELECT * "
. "FROM menu "
. "WHERE parent_id=".$id." "
. "ORDER BY position ASC";

  $result = mysql_query&#40;$query&#41;; 

  while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41; 
  &#123; 
     echo &quot;&lt;li&gt;&quot;.$row&#91;'title'&#93;; 
     loopStructure&#40;$row&#91;'id'&#93;&#41;; 
     echo &quot;&lt;/li&gt;&quot;;
  &#125; 

if ($printUL)
{
$printUL = 0;
echo "</ul>";
}
}
}

$printMenu = loopStructure();[/code:1:a103dce34e]

Laat anders even de output zien van bovenstaande functies.

helemaal top Joost. hier kan ik zeker mee uit de voeten. wat bedoel je eigenlijk met "stack" ... hij genereert de ul en li's goed ! Nu ga ik verder zodat de source er ook nog mooi uitgelijnd uit komt te zzien...

[code:1:206023f27a] function loopStructure( $id = 0 ) { $query = "SELECT * " . "FROM menu " . "WHERE parent_id=".$id." " . "ORDER BY position ASC";

$result = mysql_query($query);

if (mysql_num_rows($result) > 0)
{
$printUL = 1;
echo "<ul>n";
}

while($row = mysql_fetch_array($result))
{
$query = "SELECT * "
. "FROM menu "
. "WHERE parent_id=".$id." "
. "ORDER BY position ASC";

  $result = mysql_query&#40;$query&#41;; 

  while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41; 
  &#123; 
     echo &quot;&lt;li&gt;&quot;.$row&#91;'title'&#93;; 
     loopStructure&#40;$row&#91;'id'&#93;&#41;; 
     echo &quot;&lt;/li&gt;n&quot;; 
  &#125; 

if ($printUL)
{
$printUL = 0;
echo "</ul>";
}
}
}
[/code:1:206023f27a]

dit genereerd ie nu:

[code:1:206023f27a]
<ul>
<li>eerste<ul>
<li>eerste van eerste<ul>
<li>id1->id4->id13</li>
<li>id1->id4->id14</li>
<li>id1->id4->id15<ul>

<li>id1->id4->id15->16<ul>
<li>laatste</li>
</ul></li>
</ul></li>
</ul></li>
<li>tweede van eerste</li>
<li>derde van eerste</li>
</ul></li>
<li>tweede<ul>
<li>eerste van tweede</li>
<li>tweede van tweede</li>

<li>derde van tweede</li>
</ul></li>
<li>derde<ul>
<li>eerste van derde</li>
<li>tweede van derde</li>
<li>derde van derde</li>
</ul></li>
</ul>
[/code:1:206023f27a]

Dat is valide code, dus als het is wat je wilt is het zo goed!

Uiteindelijk wil ik hier naar toe:

http://www.alistapart.com/d/complexdynamiclists/finder.html

Eindelijk heb ik het scriptje compleet werkende. Het scriptje genereert verglijkbare html als op: http://www.alistapart.com/d/complexdynamiclists/finder.html

Aangezien dit mij veel moeite heeft gekost om het script werkende te maken, post ik hem hier nu compleet. @joostbastings héél erg bedankt dat je mij de goede richting op hebt gestuurd.

[code:1:2fe103b149]

function loopStructure( $id=0, $t=2)
{
$ul = 0;

$query = &quot;SELECT * &quot; 
. &quot;FROM menu &quot; 
. &quot;WHERE parent_id=&quot;.$id.&quot; &quot; 
. &quot;ORDER BY position ASC&quot;; 

$result = mysql_query&#40;$query&#41;; 

if &#40;mysql_num_rows&#40;$result&#41; &gt; 0 &amp;&amp; $id == 0&#41; &#123; 		
	$ul = 1; 
	echo &quot;nt&lt;ul id=&quot;finder&quot;&gt;n&quot;;
&#125; elseif&#40;mysql_num_rows&#40;$result&#41; &gt; 0&#41; &#123;
	$tab = str_repeat&#40;&quot;t&quot;, $t&#41;;
	$t++;
	$ul = 1; 
	echo &quot;n&quot;.$tab.&quot;&lt;ul&gt;n&quot;;
&#125;

$x = 0;
while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41; 
&#123; 
	$query = &quot;SELECT * &quot; 
	. &quot;FROM menu &quot; 
	. &quot;WHERE parent_id=&quot;.$id.&quot; &quot; 
	. &quot;ORDER BY position ASC&quot;; 
	
	$result = mysql_query&#40;$query&#41;; 

	$tab = str_repeat&#40;&quot;t&quot;, $t&#41;;
	$t++;
	
	while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41; 
	&#123;
		$countQuery = &quot;SELECT * &quot; 
		. &quot;FROM menu &quot; 
		. &quot;WHERE parent_id=&quot;.$row&#91;id&#93;;

		$countResult = mysql_query&#40;$countQuery&#41;; 

		$rows = mysql_num_rows&#40;$countResult&#41;;

		if &#40;$rows &gt; 0&#41; &#123; 
			$href = 1;
		&#125; else &#123;
			$href = 0;
		&#125;

		if&#40;$href == 1&#41; &#123;	
			echo $tab.&quot;&lt;li&gt;&quot;.$row&#91;'title'&#93;;
			loopStructure&#40;$row&#91;'id'&#93;, $t&#41;;
		&#125; elseif&#40;$href == 0&#41; &#123;
			echo $tab.&quot;&lt;li&gt;&lt;a href=&quot;#&quot;&gt;&quot;.$row&#91;'title'&#93;.&quot;&lt;/a&gt;&quot;;
			loopStructure&#40;$row&#91;'id'&#93;, $t&#41;; 
		&#125;
		
		if&#40;$rows &gt; $x&#41; &#123;
			echo &quot;n&quot;.$tab.&quot;&lt;/li&gt;n&quot;;	
		&#125; else &#123;
			echo &quot;&lt;/li&gt;n&quot;;
		&#125;

	&#125; 

	if &#40;$ul == 1&#41; 
	&#123; 
		$tab = str_repeat&#40;&quot;t&quot;, &#40;$t - 2&#41;&#41;;

		echo $tab.&quot;&lt;/ul&gt;n&quot;;
		$t = $t-1;
	&#125;
$x++;	
&#125; 

}

echo "<div id="finderparent">";
$printMenu = loopStructure();
echo "</div>";

[/code:1:2fe103b149]