le domande qui sopra restano valide, comunque sia ho fatto un "giochino"


questo file, se richiamato in una cartella si connette al database tree_menu.db ( utenti linux, createlo e metetelo a chmod 777 o quello che e' ) , installa un' esempio simile a quello di questo articolo, vi permette di giocare con i rami, se clickate sul [+] vi chiede con che nome inserire in db, se clickate sul nome, rimuove quel ramo ... e' non troppo stabile pero' magari serve a qualcuno che sta' smanettando con questo approccio alla gerarchia su database ... si basa su SQLITE, quindi per PHP5 , fatemi sapere



codice:

// CONNESSIONE AL DATABASE
$db = sqlite_open( 'tree_menu.db' );

// CONTROLLI E GESTIONE INSERIMENTI
if( isSet( $_GET['add'], $_GET['name'] ) ) {
	$_GET['add'] = (int)$_GET['add'];
	$_GET['name'] = sqlite_escape_string( $_GET['name'] );
	$q1 = sqlite_unbuffered_query(
		$db,
		"SELECT
			*
		FROM
			tree
		ORDER BY
			sx
		ASC"
	);
	$row = 0;
	$q2 = "BEGIN;
	";
	while( $r = sqlite_fetch_array( $q1, SQLITE_NUM ) ) {
		$r[2] = (int)$r[2];
		if( (int)$r[1] <= $_GET['add'] ) {
			$q2 .= "UPDATE tree SET dx = ".( $r[2] + 2 )." WHERE id = {$r[0]};
			";
		}
		else {
			$q2 .= "UPDATE tree SET sx = ".( (int)$r[1] + 2 ).", dx = ".( $r[2] + 2 )." WHERE id = {$r[0]};
			";
		}
		$row = &$r[0];
	}
	$q2 .= "INSERT INTO tree VALUES ( NULL, ".( ++$_GET['add'] ).", ".( ++$_GET['add'] )." );
	INSERT INTO branch VALUES ( NULL, ( SELECT MAX(id) FROM tree ), '{$_GET['name']}' );
	COMMIT;";
	sqlite_unbuffered_query( $db, $q2 );
}
// CONTROLLI E GESTIONE ELIMINAZIONI
elseif( isSet( $_GET['remove'] ) ) {
	$_GET['remove'] = (int)$_GET['remove'];
	$q1 = sqlite_query(
		$db,
		"SELECT branch.tree_id, tree.sx FROM branch, tree WHERE branch.tree_id = tree.id AND branch.id = ".$_GET['remove']
	);
	if( sqlite_num_rows( $q1 ) === 1 ) {
		$tree_id = $tree_sx = 0;
		while( $r = sqlite_fetch_array( $q1, SQLITE_NUM ) ) {
			$tree_id = $r[0];
			$tree_sx = (int)$r[1];
		}
		sqlite_unbuffered_query( $db, "DELETE FROM tree WHERE id = ".$tree_id );
                $q1 = sqlite_unbuffered_query(
			$db,
			"SELECT
				*
			FROM
				tree
			ORDER BY
				sx
			ASC"
		);
		$row = 0;
		$q2 = "BEGIN;
		";
		while( $r = sqlite_fetch_array( $q1, SQLITE_NUM ) ) {
			$r[2] = (int)$r[2];
			if( (int)$r[1] < $tree_sx ) {
				$q2 .= "UPDATE tree SET dx = ".( $r[2] - 2 )." WHERE id = {$r[0]};
				";
			}
			else {
				$q2 .= "UPDATE tree SET sx = ".( (int)$r[1] - 2 ).", dx = ".( $r[2] - 2 )." WHERE id = {$r[0]};
				";
			}
			$row = &$r[0];
		}
		$q2 .= "DELETE FROM branch WHERE id = {$_GET['remove']};
		COMMIT;";
		sqlite_unbuffered_query( $db, $q2 );	
	}
}

// PRENDO TUTTO L' ALBERO
$q1 = @sqlite_query(
	$db,
	"SELECT
		branch.id, branch.name, tree.sx
	FROM
		branch, tree
	WHERE
		branch.tree_id = tree.id
	ORDER BY
		tree.sx
	ASC"
);
// SE C'E' LO MOSTRO
if( $q1 && sqlite_num_rows( $q1 ) > 0 ) {
	$redirect = false;
	$output = "
	<script type=\"text/JavaScript\">
		function add( where ) {
			var w = window.prompt( 'Insert the name of the new branch' );
			var str = '{$_SERVER['PHP_SELF']}?add=' + where + '&name=' + w.split(\"'\").join(\"\\\'\");
			window.open( str, '_self' );
		}
	</script>
	<pre>";
	$last_sx = 1;
	$tab = 0;
	while( $r = sqlite_fetch_array( $q1, SQLITE_NUM ) ) {
		$compare = (int)$r[2];
		if( $compare === ( $last_sx + 1 ) ) {
			$tab++;
		}
		elseif( $compare > ( $last_sx + 2 ) && $tab >= ( $compare - ( $last_sx + 2 ) ) ) {
			$tab -= $compare - ( $last_sx + 2 );
		}
		$output .= str_repeat( "\t", $tab )."- ";
		$output .= "<a title=\"remove this branch\" href=\"{$_SERVER['PHP_SELF']}?remove={$r[0]}\">{$r[1]}</a>";
		$output .= "[<a title=\"add in this branch\" href=\"#\" onclick=\"add( {$r[2]} ); return false;\">+</a>]\r";
		$last_sx = $compare;
	}
	echo $output."</pre>";
}
// ALTRIMENTI CREO IL DATABASE
else {
	$redirect = true;
	sqlite_unbuffered_query(
		$db,
		"BEGIN;
		CREATE TABLE tree (
			id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
			sx INTEGER UNSIGNED NOT NULL,
			dx INTEGER UNSIGNED NOT NULL
		);
		CREATE TABLE branch (
			id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
			tree_id INTEGER UNSIGNED NOT NULL,
			name VARCHAR(255) NOT NULL 
		);
		CREATE TABLE leaf (
			id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
			branch_id INTEGER UNSIGNED NOT NULL,
			content TEXT
		);
		INSERT INTO tree VALUES( NULL, 1, 16  );
		INSERT INTO tree VALUES( NULL, 2, 15  );
		INSERT INTO tree VALUES( NULL, 3, 6  );
		INSERT INTO tree VALUES( NULL, 4, 5  );
		INSERT INTO tree VALUES( NULL, 7, 8  );
		INSERT INTO tree VALUES( NULL, 9, 14  );
		INSERT INTO tree VALUES( NULL, 10, 11  );
		INSERT INTO tree VALUES( NULL, 12, 13  );
		INSERT INTO branch VALUES( NULL, 1, 'Massimiliano'  );
		INSERT INTO branch VALUES( NULL, 2, 'Francesco' );
		INSERT INTO branch VALUES( NULL, 3, 'Mario' );
		INSERT INTO branch VALUES( NULL, 4, 'Luigi' );
		INSERT INTO branch VALUES( NULL, 5, 'Fabio' );
		INSERT INTO branch VALUES( NULL, 6, 'Piero' );
		INSERT INTO branch VALUES( NULL, 7, 'Gianni' );
		INSERT INTO branch VALUES( NULL, 8, 'Luca' );
		COMMIT;"
	);
}
// CHIUDO LA CONNESSIONE
sqlite_close( $db );

// VERIFICO SE HO CREATO O MENO IL DATABASE
if( $redirect === true ) {
	// IN CASO RICARICO LA PAGINA
	header('Location:'.$_SERVER['PHP_SELF']);
}