Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL/PHP] Drzewko SQL i pobieranie ID wskazanego elementu
Forum PHP.pl > Forum > PHP
Seth
Mam sobie nastepujace drzewko w bazie:
/ck/
/ck/teatry
/ck/teatry/Jakis teatr
/ck/teatry/Jakis inny teatr

I teraz musze na podstawie adresu - ForceType - np takiego:
.../ck/teatry
Sprawdzic czy w drzewie jest taki element i jezeli jest to pobrac jego ID.

Struktura SQL wyglada tak:
[sql:1:7b5ae2c8be]CREATE TABLE elements
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
class_id INT UNSIGNED NOT NULL,
name VARCHAR(128),

PRIMARY KEY(id)
);

CREATE TABLE elements_relations
(
first_id INT UNSIGNED NOT NULL,
second_id INT UNSIGNED NOT NULL,
depth INT UNSIGNED NOT NULL,

PRIMARY KEY( first_id, second_id )
);[/sql:1:7b5ae2c8be]
... Gdzie w elements trzymam: nazwy elementow w drzewie oraz typ klasy - folder/news itp - a w relacjach: powiazania elementow w drzewie.

Jest to prawie dokladnie to co przedstawil tutaj dragon: http://webdeveloper.pl/forum/read.php?f=3&...i=711&t=711&v=f


Czyli jeszcze raz: jak na podstawie podanej sciezki odnalezc ID elementu na ktory ona wskazuje (sciezka) :?:
piku
Hmmm, a czy upierasz sie przy takiej strukturze tabel?
Ja mam takie drzewko:
[sql:1:987e615482]CREATE TABLE `www_06` (
`id` int(4) NOT NULL auto_increment,
`ik` int(4) NOT NULL default '0',
`ip` int(4) NOT NULL default '0',
`tytul` text default NULL,
`text` text default NULL,
`ststus` tinyint(4) default NULL,

UNIQUE KEY `id` (`id`),
PRIMARY KEY (`id`)

) TYPE=MyISAM AUTO_INCREMENT=1 ;[/sql:1:987e615482]
gdzie ik to pozycja w drzewie, ip zawiera id ojca (parent).
Czyli to bedzie tak:
Kod
id   ik  ip    tytul                 text                    status

1    0   0    ck                      NULL                     1

2    1   1    teatry                  NULL                      1

3    2   2    Jakis teatr             NULL                      1

4    2   2    Jakis inny teatr        NULL                      1


I "ck" ma "id=1", "ik=0" oraz "ip=0" bo jest pierwsze w strukturze,
"teatry" ma "id=2", "ik=1" bo jest drugie w strukturze oraz "ip=1" bo należy do struktury "ck"(jego ojciec to "ck")
"Jakis teatr" ma "id=3", "ik=2" bo jest trzecie w strukturze oraz "ip=2" bo należy do struktury "teatry"
"Jakis inny teatr" ma "id=4", "ik=2" bo jest trzecie w strukturze oraz "ip=2" bo należy do struktury "teatry"
i tak dalej.
Pozdrawiam
Seth
Wszystko ladnie tylko, ze mi nie chodzi o strukture drzewa, a o pobranie id elementu w drzewie na podstawie pobranej od usera sciezki.

Jak dostane np: /ck/teatry to chcial bym dostac id=2.
I wlasnie tu jest problem - aby jak najefektywniej pobrac to id.
..:: pingu ::..
[php:1:83479ef23c]<?php
$tmp = explode("/",$sciezka);
$what = $tmp[count($tmp)-1];
$wynik = mysql_fetch_array(mysql_query("SELECT `id` FROM `www_06` WHERE `tytul` = '".$what."'"));
echo $wynik[0];
?>[/php:1:83479ef23c]
może tak ?
Seth
To odpada bo moze byc tak, ze drzewo bedzie wygladac np. tak:

...
/ck/teatry/Jakis teatr
...
/ck/program/Jakis teatr

I wtedy wyjda zle wyniki.
piku
Wiesz co, widziałem kiedyś przykład wielowątkowej listy dyskusyjnej w książce "php Receptury" z Helionu.
http://helion.pl/ksiazki/phprec.htm
ftp://ftp.helion.pl/przyklady/phprec.zip rozdzial 10 i wydaje mi sie że to mże być Ci przydate.
Pozdrawiam.
Jabol
w klasie, którą właśnie kończe, wygląda to tak:[php:1:dccd66dbd3]<?php
class xxx
//...
protected function _exists()
{
$parts=explode("/", $this->_path);
$parent=$this->_root;
$this->_trans->start();
foreach($parts as $part)
{
if(!$part) continue;
$name=$this->_adodb->Quote($part);
$rs=$this->_adodb->Execute(sprintf($this->_getChildByNameSQL
,$name
,$parent));
if(!$rs)//Error sad.gif
{
$this->_error("DBERROR");
$this->_trans->rollback(TRUE);
return NULL;
}
if($rs->RowCount()!=1)//No such node
{
return NULL;
}
$parent=intval($rs->fields[0]);
$rs->Close();
}
$this->_trans->commit();
$this->__id=$parent;
return $parent;
}
protected $_getChildByNameSQL =
"SELECT id FROM nodes WHERE name='%s' AND parent=%d;";
//...
?>[/php:1:dccd66dbd3]U Ciebie, jeżeli nie stosujesz pola parent wszystko kończy się na zmienieniu query (to będzie coś w rodzaju):[sql:1:dccd66dbd3]select nodes.id from nodes, asociations where nodes.id=asociations.second_id and asociations.depth=1 and nodes.name='%s' and asociations.first_id=%d[/sql:1:dccd66dbd3]
Seth
Dzieki przejze sobie te rozwiazania smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.