|
| Sql eller php Fra : Torben |
Dato : 14-05-08 05:45 |
|
Hej
Hvordan ville I gribe den her an?
Jeg har en tabel (mysql)
steder
----------
id
stedetsHedder
parentid
----------
Problem: jeg ønsker en oversigt over alle 'steder' der befinder
indenfor et konkret sted! Der vil være tale om steder indenfor steder
indenfor steder osv. Jeg er ikke på forhånd sikkert på hvormange
niveauer.
Jeg har forsøgt at løse det med SQL, men det virker ikke. Php virker -
næsten:
Jeg har brugt noget i stil med:
-----------
var $steder_streng = '1';
function mkInstans($stedID,$steder_streng){
$query = "SELECT *
FROM steder
WHERE parentid= ".$stedID;
$result = mysql_query($query) or die("Error: " . mysql_error());
while($sted= mysql_fetch_array($result)){
$steder_streng .= ",".$sted['id'];
mkInstans($sted['id'],$steder_streng);
}
return $steder_streng;
}
$steder_streng= mkInstans($_COOKIE['cur_sted'],$steder_streng);
Problemet er at $steder_streng ikke får alle forgreninger med.
| |
Philip Nunnegaard (14-05-2008)
| Kommentar Fra : Philip Nunnegaard |
Dato : 14-05-08 14:46 |
|
"Torben" <ringsoe@gmail.com> skrev i
> Problemet er at $steder_streng ikke får alle forgreninger med.
Heller ikke hvis du befinder dig på et sted der ligger øverst i hierarkiet?
Hvis min antagelse holder stik, kunne en løsning måske være at køre et
script, der arbejder sig op til toppen fra dit nuværende sted (vel
$_COOKIE['cur_sted']) for så derefter at køre din nuværende funktion derfra.
| |
Torben (14-05-2008)
| Kommentar Fra : Torben |
Dato : 14-05-08 07:55 |
|
"Philip Nunnegaard" <nunnenos...@hitsurf.dk> wrote:
> Heller ikke hvis du befinder dig på et sted der ligger øverst i hierarkiet?
> Hvis min antagelse holder stik, kunne en løsning måske være at køre et
> script, der arbejder sig op til toppen fra dit nuværende sted (vel
> $_COOKIE['cur_sted']) for så derefter at køre din nuværende funktion derfra.
Nej heller ikke det!
Problemet har måske bund i, at $steder_streng overskrives ved spring
til ny gren.
Det eneste jeg får ud fra funktionskaldet er sidste gennemløb (gren).
Jeg skal bruge alle childs til en sql-forespørgsel længere ned af
siden. Ikke fra toppen men fra hvor $-COOKIE['cur_sted'] peger ind.
| |
Bertel Lund Hansen (14-05-2008)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 14-05-08 18:03 |
|
Torben skrev:
> Det eneste jeg får ud fra funktionskaldet er sidste gennemløb (gren).
Lav en rekursiv funktion. Den gemmer automatisk status når den
kalder sig selv.
Pseudokode:
function parents ($child,$child_parents) {
$child_parents.=' '.$child;
if (child in $toplevelparents) return $child_parents;
return parents(parent_of($child),$child_parents);
}
$toplevelparents=array('Europa','Asien','Nordamerika);
$child_parents='';
echo parents('Jelling',$child_parents);
I stedet for en streng kan man også opsamle i et array.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Birger (14-05-2008)
| Kommentar Fra : Birger |
Dato : 14-05-08 16:54 |
|
"Torben" <ringsoe@gmail.com> skrev i en meddelelse
news:f1e69a0a-5852-4df3-b47b-d63dec6a8745@59g2000hsb.googlegroups.com...
Hej
Hvordan ville I gribe den her an?
Jeg har en tabel (mysql)
steder
----------
id
stedetsHedder
parentid
----------
Problem: jeg ønsker en oversigt over alle 'steder' der befinder
indenfor et konkret sted! Der vil være tale om steder indenfor steder
indenfor steder osv. Jeg er ikke på forhånd sikkert på hvormange
niveauer.
Jeg har forsøgt at løse det med SQL, men det virker ikke. Php virker -
næsten:
Jeg har brugt noget i stil med:
-----------
var $steder_streng = '1';
function mkInstans($stedID,$steder_streng){
$query = "SELECT *
FROM steder
WHERE parentid= ".$stedID;
$result = mysql_query($query) or die("Error: " . mysql_error());
while($sted= mysql_fetch_array($result)){
$steder_streng .= ",".$sted['id'];
mkInstans($sted['id'],$steder_streng);
}
return $steder_streng;
}
$steder_streng= mkInstans($_COOKIE['cur_sted'],$steder_streng);
Problemet er at $steder_streng ikke får alle forgreninger med.
For mig ser det ud somom der er rod i referencen for $steder_streng...
function mkInstans($stedID,&$steder_streng){ ... }
Ellers får du ikke resultaterne med baglæns.
Birger
-----
http://bbsorensen.dk
http://varmeretter.dk - hverdagsmad. Sundt, nemt, hurtigt og billigt. Daglig
opdatering.
| |
Martin (14-05-2008)
| Kommentar Fra : Martin |
Dato : 14-05-08 17:03 |
|
Torben wrote:
> Hej
>
> Hvordan ville I gribe den her an?
>
> Jeg har en tabel (mysql)
>
> steder
> ----------
> id
> stedetsHedder
> parentid
> ----------
>
> Problem: jeg ønsker en oversigt over alle 'steder' der befinder
> indenfor et konkret sted! Der vil være tale om steder indenfor steder
> indenfor steder osv. Jeg er ikke på forhånd sikkert på hvormange
> niveauer.
>
> Jeg har forsøgt at løse det med SQL, men det virker ikke. Php virker -
> næsten:
>
Jeg plejer at bruge denne
public function getTypes($parent=0,$asNested=true,$id=null) {
$select = array('t.id AS id','t.parent_id AS parent_id','t.name AS
name','t.can_be_selected AS selectable','t.sorter AS sorter','(SELECT
COUNT(*) FROM '.$this->db->db_prefix.'types WHERE parent_id = t.id) AS
numchilds');
$from = array('types AS t');
$where = array();
if($id) $where[] = 't.id = "'.$id.'"';
else $where[] = 't.parent_id = "'.$parent.'"';
$this->db->showQuery = false; // Set this to true if you want to see
how the DB query looks like
$lists = $this->db->b_fetchobject($select,$from,$where,'t.sorter');
if(!$id && $asNested) {
$countLists = count($lists);
for($i=0;$i<$countLists;$i++) {
if($lists[$i]['numchilds']!=0)
$lists[$i]['childs']=$this->getTypes($lists[$i]['id'],$asNested,$id);
}
}
return $lists;
}
Min $this->db->b_fetchobject outputter et lille array
array
0 =>
array
'id' => string '2' (length=1)
'parent_id' => string '1' (length=1)
'name' => string '0.33 L' (length=6)
'selectable' => string 'N' (length=1)
'sorter' => string '1' (length=1)
'numchilds' => string '2' (length=1)
'childs' =>
array
0 =>
array
'id' => string '16' (length=2)
'parent_id' => string '2' (length=1)
'name' => string 'Can' (length=3)
'selectable' => string 'Y' (length=1)
'sorter' => string '1' (length=1)
'numchilds' => string '0' (length=1)
Queryen ser iøvrigt således ud
SELECT
t.id AS id,
t.parent_id AS parent_id,
t.name AS name,
t.can_be_selected AS selectable,
t.sorter AS sorter,
(SELECT COUNT(*) FROM types WHERE parent_id = t.id) AS numchilds
FROM
types AS t
WHERE
t.parent_id = "0"
ORDER BY
t.sorter
| |
Torben (14-05-2008)
| Kommentar Fra : Torben |
Dato : 14-05-08 11:22 |
|
On 14 Maj, 18:03, Martin <ma...@SPAMscandesigns.dk> wrote:
> Jeg plejer at bruge denne
>>>>
Hej Martin
Din kode lige lovlig specifik for den opgave du har brugt den til. Kan
du forklare dens enkelte dele? Helst i forhold til det oplæg jeg har
lagt frem. Oplægget er stærkt generaliseret (annonymiseret) i forhold
til det virkelige kode.
| |
Martin (14-05-2008)
| Kommentar Fra : Martin |
Dato : 14-05-08 21:27 |
|
Torben wrote:
> On 14 Maj, 18:03, Martin <ma...@SPAMscandesigns.dk> wrote:
>> Jeg plejer at bruge denne
>
> Hej Martin
> Din kode lige lovlig specifik for den opgave du har brugt den til. Kan
> du forklare dens enkelte dele? Helst i forhold til det oplæg jeg har
> lagt frem. Oplægget er stærkt generaliseret (annonymiseret) i forhold
> til det virkelige kode.
Kan da prøve...
Jeg kan rigtig godt lide at arbejde med arrays, da det er så meget
nemmere lige at udelukke en enkelt linje end at skulle sætte /* */ rundt
om en enkelt sætning inde midt i det hele..
function getSteder($parent=0,$asNested=true,$id=null) {
// Build our SELECT statement
$select = array();
$select[] = 's.id';
$select[] = 's.parentid';
$select[] = 's.stedetsHeader';
$select[] = '(SELECT COUNT(*) FROM stedet WHERE parentid = s.id) AS
numchilds')';
// Last line is our magic
// which count how many childs there are on each row
// Where
$where = array();
if($id) $where[] = 't.id = "' . $id . '"';
else $where[] = 't.parent_id = "' . $parent . '";
$query = mysql_query('
SELECT ' . implode(',',$select) . '
FROM steder ' .
($where?'WHERE ' . implode(' AND ', $where) : '')
');
$r = mysql_fetch_array($query));
if(!$id && $asNested) {
for($i=0;$i<count($r);$i++) {
if($r[$i]['numchilds']) {
$r[$i]['childs'] = getSteder($r[$i]['id'],$asNested,$id);
// Her kalder vi så samme funktion igen
// dog bare med et nyt parent id
}
}
}
return $r;
}
var_dump(getSteder());
// Så viser den hele svineret :)
var_dump(getSteder(1));
// Så starter den ved alle som er børn til ID 1
var_dump(getSteder(0,false));
// Nu viser den kun alle de felter der har parentid = 0 og ingen børn
var_dump(getSteder(0,true,1));
// Nu viser den KUN den ting med ID = 1 og ingen børn
// (selvom der står true i asNested, dette kan ændres i linjen
// if(!$id && $asNested) {
| |
Martin (14-05-2008)
| Kommentar Fra : Martin |
Dato : 14-05-08 21:28 |
|
Martin wrote:
> $select[] = '(SELECT COUNT(*) FROM stedet WHERE parentid = s.id) AS
FROM steder skal der stå :)
| |
Martin (14-05-2008)
| Kommentar Fra : Martin |
Dato : 14-05-08 21:31 |
|
Martin wrote:
> $r = mysql_fetch_array($query));
Skal nok bruge
mysql_fetch_assoc
istedet for mysql_fetch_array, da vi ikke gider bruge $r[0], men kun
$r['id']
Ja, undskyld men er godt nok flere år siden jeg har benyttet mig af
PHP's indbyggede mysql funktioner, da jeg har min egen lille søde rare
klasse der klarer alt det der for mig :)
| |
N/A (15-05-2008)
| Kommentar Fra : N/A |
Dato : 15-05-08 11:37 |
|
| |
N/A (15-05-2008)
| Kommentar Fra : N/A |
Dato : 15-05-08 11:37 |
|
| |
Torben (14-05-2008)
| Kommentar Fra : Torben |
Dato : 14-05-08 12:00 |
|
On 14 Maj, 19:03, Bertel Lund Hansen <unosp...@lundhansen.dk> wrote:
> Pseudokode:
>
> function parents ($child,$child_parents) {
> $child_parents.=' '.$child;
> if (child in $toplevelparents) return $child_parents;
> return parents(parent_of($child),$child_parents);
>
> }
>
> $toplevelparents=array('Europa','Asien','Nordamerika);
> $child_parents='';
> echo parents('Jelling',$child_parents);
Hm...
Det kan da ikke fungere? Bl.a. fordi $toplevelparents ikke kan tilgås
i function parents - eller hvad?
| |
Bertel Lund Hansen (14-05-2008)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 14-05-08 20:15 |
|
Torben skrev:
> Det kan da ikke fungere? Bl.a. fordi $toplevelparents ikke kan tilgås
> i function parents - eller hvad?
Jeg sagde jo det var pseudokode ... host.
Så må man globalisere variablen i funktionen eller overføre den
hver gang eller definere den internt.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
N/A (14-05-2008)
| Kommentar Fra : N/A |
Dato : 14-05-08 21:27 |
|
| |
Torben (15-05-2008)
| Kommentar Fra : Torben |
Dato : 15-05-08 03:32 |
|
On 14 Maj, 22:31, Martin <mar...@aarhof.invalid> wrote:
> Martin wrote:
> Ja, undskyld men er godt nok flere år siden jeg har benyttet mig af
> PHP's indbyggede mysql funktioner, da jeg har min egen lille søde rare
> klasse der klarer alt det der for mig :)
Nu har jeg forsøgt utallige gange at få tilpasset og brugt din ide til
mit formål, men det fejler. Muligvis er det mig, det giver altså ikke
det ænskede resultat. var_dump(getSteder() ender op med et array med
kun 3 værdier. Jeg skulle bruge alle børn, børnebørn og børnebørnebørn
osv. Desuden er det ikke nødvedigt med alle de specialtilfælde for med
og uden børn. Jeg har et stedID og alle børnene skal ende i en
tekststreng (evt. et array) som jeg kan implode til en streng).
Uden brug af arrays giver din kode følgende funktionskald, men altså
stadig uden det ænskede resultat.
function getSteder($parent=0) {
$query = "SELECT t.id,
(SELECT COUNT(*)
FROM steder
WHERE t.parentID = ".$parent.") AS numchilds
FROM steder AS t
WHERE t.parentID = ".$parent;
$result = mysql_query($query) or die("Error: " . mysql_error());
$sted = mysql_fetch_array($result);
for($i=0;$i<count($sted);$i++) {
$stedersID .= ", ".$sted['id'];
if($sted['numchilds']!=0) {
getSteder($sted['id']);
}
}
return $stedersID;
}
var_dump(getSteder($_COOKIE['cur_sted']));
| |
Torben (15-05-2008)
| Kommentar Fra : Torben |
Dato : 15-05-08 04:26 |
|
Løsning på mit eget problem:
function getSteder($parent=0){
global $stedersID;
$query = "SELECT *
FROM steder
WHERE parentID = ".$parent;
$result = mysql_query($query) or die("Error: " . mysql_error());
while($sted = mysql_fetch_array($result)){
$stedersID .= ",".$sted['id'];
getSteder($sted['id']);
}
return $stedersID;
}
$steder = getSteder($_COOKIE['cur_sted']);
Mere simpelt kan det vist ikke laves! Tak for hjælpen.
| |
Martin (15-05-2008)
| Kommentar Fra : Martin |
Dato : 15-05-08 11:37 |
|
Torben wrote:
> Løsning på mit eget problem:
>
> function getSteder($parent=0){
> global $stedersID;
> $query = "SELECT *
> FROM steder
> WHERE parentID = ".$parent;
> $result = mysql_query($query) or die("Error: " . mysql_error());
> while($sted = mysql_fetch_array($result)){
> $stedersID .= ",".$sted['id'];
> getSteder($sted['id']);
> }
> return $stedersID;
> }
> $steder = getSteder($_COOKIE['cur_sted']);
Cookies... Hvorfor nu det?
>
> Mere simpelt kan det vist ikke laves! Tak for hjælpen.
| |
Martin (15-05-2008)
| Kommentar Fra : Martin |
Dato : 15-05-08 12:36 |
|
Torben wrote:
> Løsning på mit eget problem:
>
> function getSteder($parent=0){
> global $stedersID;
> $query = "SELECT *
> FROM steder
> WHERE parentID = ".$parent;
> $result = mysql_query($query) or die("Error: " . mysql_error());
> while($sted = mysql_fetch_array($result)){
> $stedersID .= ",".$sted['id'];
> getSteder($sted['id']);
> }
> return $stedersID;
> }
> $steder = getSteder($_COOKIE['cur_sted']);
>
> Mere simpelt kan det vist ikke laves! Tak for hjælpen.
Tjaa... kan bare ikke se hvorfor du skal belemre ens computer med en
cookie for sådan noget simpelt noget...
Anyway, så har jeg bygget min klasse ind i hele mit sql objekt, så jeg
kan faktisk kopier det fra projekt til projekt uden at ændre noget som
helst :)
< http://www.nomorepasting.com/getpaste.php?pasteid=15764&numbered=on>
Der er dog nogle ting som jeg ikke lige har bygget ind i den endnu,
såsom joins osv. men de kommer meget snart, for nu skal jeg til at lave
en menu med forskellige sprog, så nu skal der også joines lidt :)
| |
Torben (15-05-2008)
| Kommentar Fra : Torben |
Dato : 15-05-08 04:48 |
|
On 15 Maj, 12:37, Martin <ma...@SPAMscandesigns.dk> wrote:
> Cookies... Hvorfor nu det?
Det spiller ikke rigtig nogen rolle for løsning af problemet. Jeg
gemmer forvalgt sted i en Cookie,for på den måde at gøre siden
brugertilpasset.
| |
|
|