Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP, MySQL: Monitasoinen puuhakemisto

ViKiNGi [18.08.2014 10:36:16]

#

Moikka,

Olisiko jollakulla tiedossa hyvää koodipätkää, jolla haetaan monitasoista puuhakemistoa (valikkoa). Ajatuksena niin, että voisi määritellä hakemiston tason jotka näkyvät valikossa.. (esim. otsikko 1, otsikko 1.1. otsikko 1.1.1)

mallilla-> ID, nimi, parent

katselin tuossa googlella kaikenlaisia koodipätkiä, mutta ei osunut silmään sellaista joka olisi muokkautunut omasta toimesta omaan käyttöön sopivaksi.

Lebe80 [18.08.2014 10:45:07]

#

Valmista koodipätkää tuskin kellään on tähän suoraan heittää, mutta juuri kuten kerroit.

Rivitietona vaan, jossa rivillä on tieto isäntärivistä (0 taso esim. juuri), lisäksi ylimääräisiä apukenttiä, jos haluat näkyvyyttä säädellä haluamallasi tavalla.

Grez [18.08.2014 15:59:48]

#

Jos kannassa on juuritaso niin sen numerolla ei ole erityisempää merkitystä. Jos juuritasolle ei ole omaa tietuetta kannassa, niin silloin se olisi mielestäni loogisemmin null kuin 0. Vierasavainkin toimii siinä tapauksessa.

Lebe80 [19.08.2014 09:52:28]

#

Grez kirjoitti:

Jos kannassa on juuritaso niin sen numerolla ei ole erityisempää merkitystä. Jos juuritasolle ei ole omaa tietuetta kannassa, niin silloin se olisi mielestäni loogisemmin null kuin 0. Vierasavainkin toimii siinä tapauksessa.

Totta turiset

Metabolix [19.08.2014 21:34:58]

#

Jos juurisolmu ei ole tietokannassa (kuten ei ehkä olekaan, jos yksittäistä juurta ei haluta tulostaa vaan alimmallakin tasolla on monta solmua), puun muodostaminen datasta tapahtuu tähän malliin:

// Haetaan kaikki solmut taulukkoon ID:n mukaan.
$nodes = [];
foreach (sql("SELECT * FROM tree") as $row) {
	$node = new Node($row);
	$nodes[$node->id] = $node;
}
// Luodaan juurisolmu.
$root = new Node();

// Liitetään solmut puuksi.
foreach ($nodes as $node) {
	if ($node->parent_id) {
		$nodes[$node->parent_id]->children[] = $node;
	} else {
		$root->children[] = $node;
	}
}

Jos juurisolmu on myös tietokannassa, koodi muuttuu näin:

// Haetaan kaikki solmut taulukkoon ID:n mukaan.
$nodes = [];
foreach (sql("SELECT * FROM tree") as $row) {
	$node = new Node($row);
	$nodes[$node->id] = $node;
	// Juurisolmu on se, jolla ei ole vanhempaa.
	if (!$node->parent_id) {
		$root = $node;
	}
}

// Liitetään solmut puuksi.
foreach ($nodes as $node) {
	if ($node->parent_id) {
		$nodes[$node->parent_id]->children[] = $node;
	}
}

Tulostus onnistuu rekursiolla:

function output($nodes) {
	echo "<p>Tree:</p>\n";
	$f = function($nodes) use(&$f) {
		if ($nodes) {
			echo "<ul>";
			foreach ($nodes as $node) {
				echo "<li>", htmlspecialchars($node->text);
				$f($node->children);
				echo "</li>\n";
			}
			echo "</ul>\n";
		}
	};
	return $f($nodes);
}
output($root->children);

Nämä koodit toimivatkin suoraan, kun vielä lisätään alkuun kokeilua varten laadittu Node-luokka ja sql-funktio:

class Node {
	public $children = [];
	public function __construct($data = []) {
		foreach ($data as $i => $j) $this->$i = $j;
	}
}
function sql() {
	for ($i = 1; $i <= 40; ++$i) {
		yield ["id" => $i, "text" => $i, "parent_id" => intval(($i + 1) / 3)];
	}
}

Eikö toimi? Päivitä PHP tai muuta koodista uudet rakenteet (lyhyt taulukkomerkintä, nimetön funktio ja yield-lausetta käyttävä generaattorifunktio) vanhemmalla versiolla toimiviksi rakenteiksi.

Antero [22.08.2014 22:34:33]

#

Tässä on yksi viritys jota oon käyttänyt. Toivottavasti on apua.

 <?php
$server="host";
$username="user";
$password="salasana";
$connect_mysql=mysql_connect($server,$username,$password) or die ("Connection Failed!");
$mysql_db=mysql_select_db("kanta",$connect_mysql) or die ("Could not Connect to Database");
$query = "SELECT * FROM kanta2";
$result=mysql_query($query) or die("Query Failed : ".mysql_error());
$i=0;
while($rows=mysql_fetch_array($result))
{
$roll[$i]=$rows['NIMI']; //// anna tähän sarakkeen nimi
$i++;
}
$total_elmt=count($roll);
?>
<form method="POST" action="">
hakuja hakuja;: <select name="sel">
<option>Valitse</option>
<?php
for($j=0;$j<$total_elmt;$j++)
{
?><option><?php
echo $roll[$j];
?></option><?php
}
?>
</select>

<input name="submit" type="submit" value="etsi"/><br />

</form>

<p>
  <?php

if(isset($_POST['submit']))
{
$value=$_POST['sel'];

$query2 = "SELECT * FROM kanta2 WHERE NIMI='$value'";
$result2=mysql_query($query2) or die("Query Failed : ".mysql_error());
while($row=mysql_fetch_array($result2))

{

	Tästä eteenpäin tulostusta

ViKiNGi [23.08.2014 10:28:37]

#

Kiitos !

testailen noita vinkkejä

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta