[PHP & MYSQL] Breadcrumb maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Voor een CMS zou ik een breadcrump willen maken. De databasestructuur die ik gebruik is volgens de methode van crisp. Met de code die ik nu heb kan ik alleen huidige pagina en vorige pagina laten zien maar ik zou alle voorgaande pagina's willen zien in een breadcrump dus:
Auto > Onderdelen > Remschijven.

De code die ik nu heb voor het huidige id en parentid (ik weet niet of dit om te zetten is in een breadcrump):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if(isset( $_GET['id']) && is_numeric($_GET['id']))
{$id = $_GET['id'];} 
else{$id = 0; echo "<a href='index.php'>Home</a>";}
$qu = mysql_query("SELECT * FROM paginas WHERE id='". $id ."'");
$resultaat = mysql_fetch_array($qu);


$pid = $resultaat['parentid'];
$qw = mysql_query("SELECT * FROM paginas WHERE id='". $pid ."'");
$resultaa = mysql_fetch_array($qw);
echo "<a href='index.php?id=$pid'>$resultaa[pagina]</a> > "; 
echo "<a href='index.php?id=$id'>$resultaat[pagina]</a>";

?>

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik gebruik voor dergelijke structuren sindskort de MySQL hierarchy structuur: http://dev.mysql.com/tech...es/hierarchical-data.html Je moet t concept even doorhebben maar dan werkt het echt top. Makkelijk te CMS-en ook als een klant tot oneindig diep zelf pagina's (danwel producten) wil kunnen toevoegen :)

Overigens zou ik niet vertrouwen op een is_numeric() check, pak beter ctype_digit(). Dingen als "0.123" en "+0123.45e6" zijn gewoon geldig volgens de is_numeric() functie namelijk. http://nl2.php.net/is_numeric

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

"De MySQL hierachy structuur"? Ze leggen daar gewoon uit hoe je zaken als een boom moet opslaan ;) De eerste methode (met een parentId) is de meest voor de hand liggende en de tweede methode (met gt en lt) is precies de methode van crisp die Spin1 nu al gebruikt ;) (Daar zit dus niks MySQL specifieks in)

[ Voor 7% gewijzigd door Creepy op 03-11-2009 09:02 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Crisp gebruikt niet de lft/rgt manier zover ik t artikel gelezen heb :?

edit: in de comments staat er iets over, in t artikel zelf niet.

[ Voor 96% gewijzigd door Cartman! op 03-11-2009 09:05 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
De id/parent_id method kan net zo goed gebruikt worden als nested sets / MPTT / lft-rgt (hoe je het ook wilt noemen). Het gaat erom dat je uiteindelijk een complete set inlaadt die je in een geneste array (of beter: netjes in de juiste objecten) gaat bekijken. Je kan dan iets doen als dit (OO voorbeeld):
PHP:
1
2
3
4
5
6
7
$elements = array($this->getName());
$parent   = $this->getParent();
while (null !== $parent) {
  $elements[] = $parent->getName();
  $parent     = $parent->getParent();
}
return array_reverse($elements;)


Want zoals ik kan zien gebruik je niet de methode van crisp. Daar laadt hij in een keer de gehele dataset in. Jij doet dit nu apart voor twee rijen :)
Cartman! schreef op dinsdag 03 november 2009 @ 09:03:
edit: in de comments staat er iets over, in t artikel zelf niet.
O-)

[ Voor 11% gewijzigd door mithras op 03-11-2009 09:13 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

:X Wat schrijf je je if-structuren onverzichtelijk, Spin1. Inspringen is er niet alleen voor de sier, dat heeft als functie dat de code makkelijker te doorgronden is.

Wat betreft je vraag: haal gewoon de hele tree tegelijk op uit de database en bepaal in PHP (recursief danwel iteratief) hoe de hiërarchie is. Dit ga je niet in een simpele SQL-query stoppen en stiekem is een relationele database ook niet echt gemaakt op dit soort datasets. :)

offtopic:
Het zijn breadcrumbs, niet breadcrumps. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
NMe schreef op dinsdag 03 november 2009 @ 09:46:Wat betreft je vraag: haal gewoon de hele tree tegelijk op uit de database en bepaal in PHP (recursief danwel iteratief) hoe de hiërarchie is. Dit ga je niet in een simpele SQL-query stoppen en stiekem is een relationele database ook niet echt gemaakt op dit soort datasets. :)
Toch kent SQL daar wel standaard oplossingen voor, een recursieve SELECT (common table expression) staat keurig beschreven in de standaard en wordt ook door diverse databases ondersteund, o.a. door DB2, PostgreSQL en SQL Server.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat het kán wil niet zeggen dat zo'n relationele DB er echt voor gemaakt is. :P Bovendien zijn recursieve selects in MySQL sowieso niet mogelijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
mithras schreef op dinsdag 03 november 2009 @ 09:11:
Je kan dan iets doen als dit (OO voorbeeld):
PHP:
1
2
3
4
5
6
7
$elements = array($this->getName());
$parent   = $this->getParent();
while (null !== $parent) {
  $elements[] = $parent->getName();
  $parent     = $parent->getParent();
}
return array_reverse($elements;)

[...]
O-)
Ik heb een tijdje zitten kijken en proberen, maar ik heb met deze code omzetten tot bruikbare code nog vrij veel moeite. |:(

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan schrijf je je eigen code gebaseerd op de uitgeschreven opmerkingen die we hier hebben gepost?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

Welk stuk uit de voorbeeldcode snap je dan niet?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 20:43
Ik denk dat hij niet bekend is met classes{} en daarom niet de voorbeeldcode begrijpt,.

Een echte golver is nooit uitgeput


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
PHP:
1
2
3
4
5
6
7
$elements = array($this->getName());
$parent   = $this->getParent();
while (null !== $parent) {
  $elements[] = $parent->getName();
  $parent     = $parent->getParent();
}
return array_reverse($elements;)


Ik snap eigenlijk niet waarvoor die $this-> staat, of wat je daarmee moet doen.
Getname en getparent snap ik ook niet echt helemaal.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Spin1 schreef op woensdag 04 november 2009 @ 09:38:
Ik snap eigenlijk niet waarvoor die $this-> staat, of wat je daarmee moet doen.
Getname en getparent snap ik ook niet echt helemaal.
Dan loont 't zich dus om je eens te verdiepen in OOP ;)

[ Voor 35% gewijzigd door RobIII op 04-11-2009 09:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

Juist ja, je kent classes dus totaal niet. Hoewel niet noodzakelijk voor een simpele breadcrumb, kan het toch zeker nuttig zijn je daar op in te lezen. Ze kunnen je leven een stuk prettiger maken (of een hel, maar dat ligt aan de programmeur).

* MueR mept RobIII.
Niet zo snel typen :/

[ Voor 10% gewijzigd door MueR op 04-11-2009 09:42 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Om je een beetje op weg te helpen: het was een klein stukje binnen een klasse waarvan in verwachtte dat je zoiets er wel omheen zou kunnen verzinnen. Voor de volledigheid, je krijgt meer iets als dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MenuItem{
  protected $_name;
  protected $_parent;

  public function getBreadcrumb ()
  {
    $elements = array($this->getName());
    $parent   = $this->getParent();
    while (null !== $parent) {
      $elements[] = $parent->getName();
      $parent     = $parent->getParent();
    }
    return array_reverse($elements;) 
  }

  public function getName ()
  {
    return $this->_name;
  }
  
  public function getParent ()
  {
    return $this->_parent;
  }
}
Je kan ook procedureel werken en het in arrays stoppen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$element = array(
 // Hier de key=>value pairs van je element
);

$elements = array($element['name']);
$parent   = $element['parent'];
while (null !== $parent) {
  $elements[] = $parent['name'];
  $parent     = $parent['parent']();
}
$elements = array_reverse($elements;)

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

mithras schreef op woensdag 04 november 2009 @ 09:52:
PHP:
1
return array_reverse($elements);

PHP:
1
$elements = array_reverse($elements);
FTFY :Y)

[ Voor 12% gewijzigd door MueR op 04-11-2009 10:06 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
mithras schreef op woensdag 04 november 2009 @ 09:52:
Om je een beetje op weg te helpen: het was een klein stukje binnen een klasse waarvan in verwachtte dat je zoiets er wel omheen zou kunnen verzinnen. Voor de volledigheid, je krijgt meer iets als dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MenuItem{
  protected $_name;
  protected $_parent;

  public function getBreadcrumb ()
  {
    $elements = array($this->getName());
    $parent   = $this->getParent();
    while (null !== $parent) {
      $elements[] = $parent->getName();
      $parent     = $parent->getParent();
    }
    return array_reverse($elements;) 
  }

  public function getName ()
  {
    return $this->_name;
  }
  
  public function getParent ()
  {
    return $this->_parent;
  }
}
Je kan ook procedureel werken en het in arrays stoppen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$element = array(
 // Hier de key=>value pairs van je element
);

$elements = array($element['name']);
$parent   = $element['parent'];
while (null !== $parent) {
  $elements[] = $parent['name'];
  $parent     = $parent['parent']();
}
$elements = array_reverse($elements;)

[ Voor 11% gewijzigd door Spin1 op 23-11-2009 14:29 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dan zou het je sieren als je eens probeerde te begrijpen wat je aan 't doen bent (en je dus verdiepen in de materie en een tutorial doornemen of iets dergelijks). Je kunt niet van ons verwachten dat we je handje gaan (of blijven) vasthouden.

Gewoon maar wat aanklooien tot 't werkt is géén programmeren; en hier in de devschuur gaat het nou nét over wél programmeren ;)

[ Voor 25% gewijzigd door RobIII op 04-11-2009 14:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1