[PHP/MySQL] custom functie te verbeteren?

Pagina: 1
Acties:

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
Momenteel ben ik bezig met het bouwen van een (B2B)-shop. De shop is onderverdeeld in categorieen, en elke categorie heeft een parent-categorie. Is het een hoofdcategorie, dan is de parent als vanzelfsprekend 0.

Door de categorie-id mee te geven aan een functie, wil ik een categorie-boom opbouwen, bijvoorbeeld:
code:
1
shop index / compaq / alpha power / alpha servers / alphaserver 1200

Waarbij alle parent-categorieen klikbaar zijn. De functies die ik daarvoor heb geschreven, zijn deze:
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
<?
    function getArrayWithParentCats($currentCat) {
        while ($temp = getParent($currentCat)) {
            $arrayParentNames[] = $temp;
            list($key)          = each($temp);
            $currentCat         = $key;
        }
        return $arrayParentNames;
    }
    
    function getParent($currentCat) {
        $qParent = mysql_query("SELECT c.parent,p.naam FROM categorieen c,categorieen p WHERE c.id = $currentCat AND c.parent = p.id");
        if (mysql_num_rows($qParent) > 0) {
            $rParent = mysql_fetch_array($qParent);
            if ($rParent["parent"] > -1) {
                $arrayParent[$rParent["parent"]] = $rParent["naam"];
                return $arrayParent;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
?>

Dit roep je zo aan:
PHP:
1
2
3
<?
$shopTree   = getArrayWithParentCats($id_parent);
?>

Waarbij $id_parent de id is van de categorie waar je je nu in bevindt. Na een array_reverse ziet hij er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
    [0] => Array
      (
        [0] => shop index
      )

    [1] => Array
      (
        [2] => compaq
      )

    [2] => Array
      (
        [5] => alpha power
      )

    [3] => Array
      (
        [9] => alpha servers
      )
)

Oftewel: een array met daarin in de goeie volgorde, arrays die de id en naam van de parent-cats bevatten.

Er wordt nu alleen wel voor elke categorie apart een query uitgevoerd, en aangezien dit de eerste echte shop is die ik bouw, heb ik geen idee of het normaal is om voor zo'n functionaliteit 4 of 5 of nog wel meer query's uit te gaan voeren. Ik ben er dan ook van overtuigd dat het beter, handiger of sneller kan. En dat is dus ook mijn vraag :)
Is het wellicht met 1 enkele query op te lossen, of met een ander algoritme zo voor elkaar te boksen dat je niet voor elke parent een nieuwe query uit moet voeren?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik denk dat als je het inderdaad sneller wilt doen dan zo, dan zul je toch je structuur een beetje om moeten gooien.

Ik heb helaas ff geen tijd om wat uit te werken, maar ik zal als ik wat heb wel ff posten :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
Op donderdag 31 januari 2002 15:03 schreef drm het volgende:
Ik denk dat als je het inderdaad sneller wilt doen dan zo, dan zul je toch je structuur een beetje om moeten gooien.
Data-structuur? Die ligt al vast, en die wordt niet meer gewijzigd :)
Ik heb helaas ff geen tijd om wat uit te werken, maar ik zal als ik wat heb wel ff posten :)
Take your time, take your time :)

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Bedoel je iets zoals dit:

http://www.4guysfromrolla.com/aspfaqs/ShowFAQ.asp?FAQID=154

Hieronder een stukje van de code welke op de pagina staat!
code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<%
' add this recordset!
teamSQL = "SELECT * FROM Teams ORDER BY Teams.TeamName"
Set teamRS = conn.Execute( teamSQL )

' same as before except we only get one field from Team...
playerSQL = "SELECT Teams.TeamName, Players.* " _
      & "FROM Teams, Players " _
      & "WHERE Players.TeamID = Teams.TeamID " _
      & "ORDER BY Teams.TeamName, Players.PlayerName"
Set RS = conn.Execute( playerSQL )

priorTeam = ""
Do Until RS.EOF
    curTeam = RS("TeamName")
    If curTeam <> priorTeam Then
      If priorTeam <> "" Then
        Response.Write "</UL>" 
      End If
      Response.Write "TEAM: " & curTeam & "<UL>"
      priorTeam = curTeam
      ' AND HERE IS THE NEW CODE!
      If curTeam <> teamRS("TeamName") Then
        Response.Write "Something went badly wrong!"
        Response.End
      End If
      ' (field names are just for demo purposes)
      Response.Write "This team was established in " _
            & teamRS("startYear") _
            & " by " & teamRS("founder") _
            & " and its history is " _
            & teamRS("history") & "<P>"
      teamRS.MoveNext
      ' end of added code
    End If
    Response.Write "<LI>" & RS("PlayerName") 
    RS.MoveNext
Loop
Response.Write "</UL>" ' clean up the tags!
%>

Het is dan wel geen PHP/MySQL, maar toch een beetje hetgeen wat je bedoelt?

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
Op donderdag 31 januari 2002 15:20 schreef Woudloper het volgende:
Bedoel je iets zoals dit:
[..]
Het is dan wel geen PHP/MySQL, maar toch een beetje hetgeen wat je bedoelt?
Euhm.. nee. Want:
I have a database with a table of categories and a table of subcategories. How can I easily make a display that will show each category with its related subcategories?
Dit gaat over een tabel met categorieen en een tabel met subcategorieen, die men gegroupeerd onder elkaar wil krijgen. Ik wil bij 1 gegeven categorie een soort tree opzetten van alle parents, in de goeie volgorde.

Het veld 'parent' in de tabel categorieen is FK naar het veld id in die tabel.

  • Skef
  • Registratie: April 2001
  • Laatst online: 14-09 11:31

Skef

Ik scheer.me

Je zult op de een of andere manier een soort recursieve functie moeten schrijven, zodat hij iedere keer uitzoekt of er childs zijn, en als die er zijn, daar een parent aan koppelen in dat array (toch?)

Zoek anders eens op "recursive" of "recursief", er is nl. volgensmij weleens een topic op GoT over geweest!

"Computer games don’t affect kids: I mean if Pac-Man affected us as kids, we’d all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music."


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
Op donderdag 31 januari 2002 16:19 schreef Skef het volgende:
Je zult op de een of andere manier een soort recursieve functie moeten schrijven, zodat hij iedere keer uitzoekt of er childs zijn, en als die er zijn, daar een parent aan koppelen in dat array (toch?)
* Pelle weet wel wat recursie is hoor ;)
Had mijn functie ook wel recursief kunnen schrijven, maar dan blijf je toch het probleem houden dat je per keer dat je die functie doorloopt, een query doet.

En daar probeer ik dus omheen te werken, zonder aan de data-structuur te komen.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 31 januari 2002 17:05 schreef Pelle iets
ot: heej, mijn bedrijfslogo zit nog in je icoon *D

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
Op donderdag 31 januari 2002 17:06 schreef Nielsz het volgende:
ot: heej, mijn bedrijfslogo zit nog in je icoon *D
Nu niet meer hoor ;)

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
^ subtile kick ^ :)

Is er nou echt niemand die dit probleem ook heeft meegemaakt? Of kan het gewoon niet anders? In het laatste geval leg ik me er lekker bij neer, het werkt als een trein zo, maar mijn moeder zei altijd: hoe minder query's, hoe beter ;)

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 15-09 16:29
Hey Pelle als je nou gewoon alle categorieeen binnenhaalt (je hebt ze toch allemaal nodig volgens mij) en er een mooie geneste array van maakt binnen PHP...zou dat niet wat zijn ;).

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 22:43

Pelle

🚴‍♂️

Topicstarter
Op zondag 03 februari 2002 02:40 schreef McVirusS het volgende:
:X
.. aldus McVirusS nadat Pelle deze oplossing zelf al via IRC had aangedragen :)

Had hier ook al aan zitten denken dus, zal eens kijken of ik dit even snel een keer uit kan werken.

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Ja, wat je inderdaad kan doen is dit in eens binnenhalen en je een hoop php-troep op je hals halen..

Of je kan het natuurlijk cachen..
Pagina: 1