<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>lily-software.com : Реализация дерева</title>
		<link>https://lily-software.com</link>
		<description>Последние сообщения в теме</description>
		<generator>Cotonti</generator>
		<language>ru</language>
		<pubDate>Sat, 16 May 2026 20:05:23 +0300</pubDate>

		<item>
			<title>Alex</title>
			<description><![CDATA[В общем есть такой вариант решения:<br />
<br />
  Допустим у нас есть БД 'test' в ней таблица 'tree' с полями: ID, parentID и title (ID узла, ID родительского узла и название соответственно)<br />
<br />
функуии вывода структуры дерева и удаления узла вместе со всем поддеревом:<br />
<br />
<pre class="code">//выводим дерево
function showTree ($parentID = 0) { 
	$result = ($parentID == 0)? &quot;ROOT&amp;nbsp;&lt;a href=https://lily-software.com/\&quot;/?do=child&amp;amp;ID=0\&quot; &gt;&lt;img src=https://lily-software.com/\&quot;/pic/child.gif\&quot; width=\&quot;16\&quot; height=\&quot;16\&quot; border=\&quot;0\&quot; align=\&quot;absmiddle\&quot; alt=\&quot;Добавить дочернее значение\&quot; /&gt;&lt;/a&gt;&quot; : '';
	$sql = &quot;SELECT * FROM tree WHERE parentID='$parentID' ORDER BY title&quot;;
	$res = mysql_query($sql); 
	if (mysql_num_rows($res) &gt; 0) { 
		$result .= &quot;&lt;ul&gt;&quot;;
		while ($row = mysql_fetch_array($res)) {
			$result .= &quot;&lt;li&gt;&quot;.$row&#091;'title'&#093;.&quot;
					  &lt;a href=https://lily-software.com/\&quot;/?do=edit&amp;amp;ID=&quot;.$row&#091;'ID'&#093;.&quot;\&quot;&gt;&lt;img src=https://lily-software.com/\&quot;pic/edit.gif\&quot; width=\&quot;16\&quot; height=\&quot;16\&quot; border=\&quot;0\&quot; align=\&quot;absmiddle\&quot; alt=\&quot;Редактировать название\&quot;/&gt;&lt;/a&gt;
					  &lt;a href=https://lily-software.com/\&quot;/?do=child&amp;amp;ID=&quot;.$row&#091;'ID'&#093;.&quot;\&quot;&gt;&lt;img src=https://lily-software.com/\&quot;/pic/child.gif\&quot; width=\&quot;16\&quot; height=\&quot;16\&quot; border=\&quot;0\&quot; align=\&quot;absmiddle\&quot; alt=\&quot;Добавить дочернее значение\&quot; /&gt;&lt;/a&gt;
					  &lt;a href=https://lily-software.com/\&quot;/?do=del&amp;amp;ID=&quot;.$row&#091;'ID'&#093;.&quot;&amp;amp;sessID=&quot;.session_id().&quot; \&quot;&gt;&lt;img src=https://lily-software.com/\&quot;/pic/del.gif\&quot; width=\&quot;16\&quot; height=\&quot;16\&quot; border=\&quot;0\&quot; align=\&quot;absmiddle\&quot; alt=\&quot;Удалить узел (удалит и все вложенные поддеревья)\&quot; onClick=\&quot;return Delete_confirm()\&quot; /&gt;&lt;/a&gt;
			&lt;/li&gt;&quot;;
			$result .= showTree ($row&#091;'ID'&#093;); 
		} 
		$result .= '&lt;/ul&gt;';
		//$result = trim($result,&quot; &quot;);
	} 
	return $result;
}

//удаляем ветку(вместе с поддеревьями)
function deleteSubTree($ID){
	$sql = &quot;SELECT ID FROM tree WHERE parentID='$ID'&quot;;
	$res = mysql_query($sql); 
	if (mysql_num_rows($res) &gt; 0) {
		while ($row = mysql_fetch_array($res)) {
			if (!deleteSubTree($row&#091;&quot;ID&quot;&#093;)) return false;
		}	
	}
	$sql = &quot;DELETE FROM tree WHERE ID='$ID' LIMIT 1&quot;;
	mysql_query($sql); 
	if (mysql_affected_rows() &lt; 1) return false;
	else return true;
	
	return false;
}

$do = (!empty($_POST&#091;'do'&#093;)) ? $_POST&#091;'do'&#093; : &quot;&quot;;
  if (empty($_POST&#091;'do'&#093;) &amp;&amp; (!empty($_GET&#091;'do'&#093;))) $do = $_GET&#091;'do'&#093;;
  
  $error = &quot;&quot;;
  $out1 = &quot;&quot;;</pre>
<br />
И в зависимости от принятого запроса выполняем те или иные действия<br />
<br />
<pre class="code">
  switch ($do) {
  	
	// редактирование узла
	case &quot;edit&quot;:
		$sql = &quot;SELECT * FROM tree WHERE ID='&quot;.$_GET&#091;&quot;ID&quot;&#093;.&quot;' LIMIT 1&quot;;
		$res = mysql_query($sql); 
		if (mysql_num_rows($res) &gt; 0) {
			$row = mysql_fetch_assoc($res);
			$out1 .= &quot;&lt;form method=\&quot;post\&quot; action=\&quot;\&quot;&gt;
					  Введите новое название для «&quot;.$row&#091;&quot;title&quot;&#093;.&quot;»: 
					  &lt;input type=\&quot;text\&quot; name=\&quot;title\&quot; /&gt;
					  &lt;input type=\&quot;hidden\&quot; name=\&quot;do\&quot; value=\&quot;save\&quot; /&gt;
					  &lt;input type=\&quot;hidden\&quot; name=\&quot;ID\&quot; value=&quot;.$_GET&#091;&quot;ID&quot;&#093;.&quot; /&gt;
					  &lt;input type=\&quot;hidden\&quot; name=\&quot;sessId\&quot; value=\&quot;&quot;.session_id().&quot;\&quot; /&gt;
					  &lt;input type=\&quot;submit\&quot; value=\&quot;Сохранить\&quot; /&gt;
					&lt;/form&gt;&quot;;
		}
      	break;
	
	// сохранение отредактированного	
	case &quot;save&quot;:
		if ($_POST&#091;&quot;sessId&quot;&#093; != session_id()) exit(&quot;Ошибка: попытка передачи данных с другого хоста&quot;);
		$_POST&#091;&quot;title&quot;&#093; = sql_prep(trim (htmlspecialchars($_POST&#091;&quot;title&quot;&#093;, ENT_QUOTES)));
	    $sql = &quot;UPDATE tree SET title='&quot;.$_POST&#091;&quot;title&quot;&#093;.&quot;' WHERE ID='&quot;.$_POST&#091;&quot;ID&quot;&#093;.&quot;' LIMIT 1&quot;;
		mysql_query($sql); 
		if (mysql_affected_rows() &lt; 1) $error .= &quot;&lt;strong&gt;Ошибка сохранения названия узла&lt;/strong&gt;&quot;;
      	break;
	
	// Удаление узла с поддеревом	
	case &quot;del&quot;:
		if ($_GET&#091;&quot;sessID&quot;&#093; != session_id()) exit(&quot;Ошибка: попытка передачи данных с другого хоста&quot;);
		if (!deleteSubTree($_GET&#091;&quot;ID&quot;&#093;)) $error .= &quot;&lt;strong&gt;Ошибка удаления узла&lt;/strong&gt;&quot;;
      	break;
	  
    // Форма ввода нового узла	
	case &quot;child&quot;:
		$out1 .= &quot;&lt;form method=\&quot;post\&quot; action=\&quot;\&quot;&gt;
					  Введите название нового узла: 
					  &lt;input type=\&quot;text\&quot; name=\&quot;title\&quot; /&gt;
					  &lt;input type=\&quot;hidden\&quot; name=\&quot;do\&quot; value=\&quot;saveChild\&quot; /&gt;
					  &lt;input type=\&quot;hidden\&quot; name=\&quot;ID\&quot; value=&quot;.$_GET&#091;&quot;ID&quot;&#093;.&quot; /&gt;
					  &lt;input type=\&quot;hidden\&quot; name=\&quot;sessId\&quot; value=\&quot;&quot;.session_id().&quot;\&quot; /&gt;
					  &lt;input type=\&quot;submit\&quot; value=\&quot;Сохранить\&quot; /&gt;
					&lt;/form&gt;&quot;;
      	break;
		
	// удаление дерева	
	case &quot;saveChild&quot;:
		if ($_POST&#091;&quot;sessId&quot;&#093; != session_id()) exit(&quot;Ошибка: попытка передачи данных с другого хоста&quot;);
		$_POST&#091;&quot;title&quot;&#093; = sql_prep(trim (htmlspecialchars($_POST&#091;&quot;title&quot;&#093;, ENT_QUOTES)));
		$_POST&#091;&quot;ID&quot;&#093; = sql_prep(trim (htmlspecialchars($_POST&#091;&quot;ID&quot;&#093;, ENT_QUOTES)));
		$_POST&#091;&quot;title&quot;&#093; = sql_prep(trim (htmlspecialchars($_POST&#091;&quot;title&quot;&#093;, ENT_QUOTES)));
	    $sql = &quot;INSERT INTO tree (parentID, title) VALUES ('&quot;.$_POST&#091;'ID'&#093;.&quot;', '&quot;.$_POST&#091;'title'&#093;.&quot;')&quot;;
		mysql_query($sql); 
		if (mysql_affected_rows() &lt; 1) $error .= &quot;&lt;strong&gt;Ошибка сохранения узла&lt;/strong&gt;&quot;;
      	break;
	
	// 	
  }</pre>
<br />
Осталось организовать вывод в браузер и все <img class="aux smiley" src="https://lily-software.com/./images/smilies/smile.gif" alt=":)" /><br />
<br />
З.Ы. Единственное, что тут в рекурсии отправляется SQL запрос. При большом дереве это не очень хорошо, т.к. будет много SQL запросов. Лучше считать дерево в переменную одним запросом и обрабатывать получившийся массив. 8)]]></description>
			<pubDate>пт, 20 июн 2008 12:39:25 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/forums?m=posts&q=48&d=0#post181]]></link>
		</item>
		<item>
			<title>aristarh</title>
			<description><![CDATA[В общем есть такая необходимость, реализовать дерево на php и MySql<br />
<br />
Недвижисость<br />
...|_ Участки<br />
...........|_ Дачи<br />
...........|_Под сельхоз. использование<br />
...........|_Под строительство<br />
...|_ Квартиры<br />
...........|_Однокомнатные<br />
...........|_Двухкомнатные<br />
................|_новостройки<br />
................|_вторичное жилье<br />
<br />
Нужно реализовать следующие функции:<br />
•  добавление элементов в дерево на любой уровень (для этого выбирается родитель и вписывается имя нового элемента)<br />
•  переименование любого элемента дерева, кроме корневого элемента 'Недвижисость'<br />
•  удаление любого элемента дерева (c удалением ветки)<br />
<br />
Буду рад любым идеям]]></description>
			<pubDate>чт, 19 июн 2008 12:50:35 +0300</pubDate>
			<link><![CDATA[https://lily-software.com/forums?m=posts&q=48&d=0#post180]]></link>
		</item>
	</channel>
</rss>