/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste