[PHP] Verwerken SQL resultset

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb in mijn database onder andere de tabellen "nodes" en "nodes_roles":
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-----+-----+-------+----------+
| nid | pid | title | template |
+-----+-----+-------+----------+
|   1 |   0 | Home  | 2        |
+-----+-----+-------+----------+
|   2 |   1 | Fruit | 3        |
+-----+-----+-------+----------+  etc...

+-----+-----+
| nid | rid |
+-----+-----+
|   2 |   1 |
+-----+-----+
|   2 |   3 |
+-----+-----+ etc...

In het begin van de applicatie trek ik de hele nodes-tabel leeg en stop deze in de array $_nodes:
PHP:
1
2
3
4
5
$result = db_query("SELECT * FROM nodes ORDER BY pid, weight ASC");

while ($node = db_fetch_array($result)) {
  $_nodes[$node['nid']] = $node;
}

Nu wil ik de $_nodes array uitbreiden met de gebruikersgroepen die toegang hebben tot een bepaalde node:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array
(
    [...]

    [2] => Array
        (
            [nid] => 2
            [pid] => 1
            [title] => Fruit
            [template] => 3
            [access] => Array
                (
                    [0] => 1
                    [1] => 3
                )
        )
)

Nu ben ik van start gegaan met de volgende query (ipv de query in regel 1 hierboven):
code:
1
2
SELECT * FROM nodes LEFT JOIN nodes_roles ON nodes.nid = nodes_roles.nid
ORDER BY pid, weight ASC

Ik weet alleen niet hoe ik de resultset moet verwerken, omdat ik nu twee regels van "fruit" terug krijg. Wie kan mij daarmee helpen?

[ Voor 5% gewijzigd door Reveller op 13-03-2005 19:54 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Gewoon een functie maken in PHP die de array voor je opbouwt? :?

'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!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
uit de mouw geschud zeg maar (pseudo):
PHP:
1
2
3
4
5
6
7
8
9
10
$nodes = array();
while ( $rs = fetch($result) )
{
  if ( !isset($nodes[$rs['id']]) )
  {
    $nodes[$rs['id']]['value'] = $rs['value'];
    $nodes[$rs['id']]['access'] = array();
  }
  $nodes[$rs['id']]['access'][] = $rs['access_id'];
}


offtopic:
Je had ook nog een ander topic trouwens waarin ik gereageerd had: [PHP] Functie laten werken op generieke array. Ben je daar nu uitgekomen, want daar ben ik wel benieuwd naar eigenlijk :)

[ Voor 62% gewijzigd door Michali op 13-03-2005 16:38 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Michali schreef op zondag 13 maart 2005 @ 16:33:
uit de mouw geschud zeg maar (pseudo):
PHP:
1
2
3
4
5
6
7
8
9
10
$nodes = array();
while ( $rs = fetch($result) )
{
  if ( !isset($nodes[$rs['id']]) )
  {
    $nodes[$rs['id']]['value'] = $rs['value'];
    $nodes[$rs['id']]['access'] = array();
  }
  $nodes[$rs['id']]['access'][] = $rs['access_id'];
}
Op die manier krijg ik volgens mij geen array van de vorm als in de topic start. Ik ben er net mee aan het prullen geweest, maar mijn functie loopt vast zodra de JOIN LEFT aan de query wordt toegevoegd...
offtopic:
Je had ook nog een ander topic trouwens waarin ik gereageerd had: [PHP] Functie laten werken op generieke array. Ben je daar nu uitgekomen, want daar ben ik wel benieuwd naar eigenlijk :)
offtopic:
Klopt! Ik had je reaktie al gezien en vond je oplossing creatief. Wat jij alleen niet kon weten, is dat ik de 'url' van elke node middels een recursieve functie genereer. Ik neem het huidige node en klim omhoog langs de node-tree, om de url voor die node te bepalen. Een van de redenen dat ik met de originele, eerste array wil werken, is omdat ik in elk ander geval, twee keer die url moet bepalen - ook in jou geval. Ik ben er nu over aan het nadenken of het niet mogelijk is om de array geheel te herschrijven, dus de 'url' uit de originele array te pakken als array-key van een nieuwe array. Ik hoop dat ik het goed uitleg - nadere posts volgen nog :)

[ Voor 6% gewijzigd door Reveller op 13-03-2005 19:53 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Reveller schreef op zondag 13 maart 2005 @ 19:52:
[...]

Op die manier krijg ik volgens mij geen array van de vorm als in de topic start. Ik ben er net mee aan het prullen geweest, maar mijn functie loopt vast zodra de JOIN LEFT aan de query wordt toegevoegd...
Bekijk het nog eens goed. Die value waarde moet uiteraard nog vervangen worden door nid, pid, title en template, maar ik wilde het niet te veel voorkauwen. Volgens mij moet het verder gewoon werken. Probeer eens in je hoofd een resultaat er op uit. Je zult zien dat wel gaat zo.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Reveller schreef op zondag 13 maart 2005 @ 19:52:
Op die manier krijg ik volgens mij geen array van de vorm als in de topic start. Ik ben er net mee aan het prullen geweest, maar mijn functie loopt vast zodra de JOIN LEFT aan de query wordt toegevoegd...
Probeer eens LEFT JOIN i.p.v. JOIN LEFT. :P

PHP:
1
2
3
4
5
6
7
8
9
10
$nodes = array();
while ( $rs = fetch($result) )
{
  if ( !isset($nodes[$rs['id']]) )
  {
    $nodes[$rs['id']] = $rs;
    $nodes[$rs['id']]['access'] = array();
  }
  $nodes[$rs['id']]['access'][] = $rs['access_id'];
}

Zo krijg je hem wel zoals je erom vroeg in de topicstart. Maar zo erg verschillend van wat Michali postte is dit toch niet? Dit had je met een beetje moeite zelf moeten kunnen bedenken. :)

'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!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
-NMe- schreef op maandag 14 maart 2005 @ 00:14:
[...] Probeer eens LEFT JOIN i.p.v. JOIN LEFT. :P

Zo krijg je hem wel zoals je erom vroeg in de topicstart. Maar zo erg verschillend van wat Michali postte is dit toch niet? Dit had je met een beetje moeite zelf moeten kunnen bedenken. :)
Heb ik ook :) Gisteravond nog. Maar mijn router deed wat raar (wat instellingen veranderd), waardoor mijn internetverbining wegviel. Had het vanmiddag nog willen post, maar je was me voor :) Toch bedankt iedereen voor de reakties. Overigens heb ik zelf deze regel:
PHP:
1
$nodes[$rs['id']]['access'] = array();

er tussenuit gelaten. Hij werkt dan ook perfect. Het enige voordeel van die regel is imho dat je expliciet een array-variabele declareert, maar door de "[]" in de regel daaronder geef je dat toch ook impliciet aan?

[ Voor 28% gewijzigd door Reveller op 14-03-2005 12:50 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Reveller schreef op maandag 14 maart 2005 @ 12:46:
[...]
Overigens heb ik zelf deze regel:
PHP:
1
$nodes[$rs['id']]['access'] = array();

er tussenuit gelaten. Hij werkt dan ook perfect. Het enige voordeel van die regel is imho dat je expliciet een array-variabele declareert, maar door de "[]" in de regel daaronder geef je dat toch ook impliciet aan?
De reden waarom die regel er staat is dat er een grote kans is dat een pagina geen access regels heeft. Stel dat je dan deze waarde in een foreach lus gebruikt of wat dan ook, dan krijg je dus een error als je daar niet op controleert. Daarom is het beter om dit wel te doen. (overigens klopt het stukje nog niet helemaal. Je moet nog controleren of access_id niet null is. Dit is namelijk wel mogelijk met een left join.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
In dit geval heeft elke pagina access rules. Als gebruikersgroep 2 bijvoorbeeld toegang heeft tot een pagina, hebben zij automatisch ook toegang tot alle parents van die pagina. Ook anonieme gebruikers (niet ingelogd) is bij mij een access groep (groep 0) :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Pagina: 1