Simpel groeperen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marc rc is as

Marc rc is as

31/08/2010 20:12:07
Quote Anchor link
Ik haal gegevens uit een database. Als voorbeeld: Mensen die hun favoriete fruit opgegeven hebben.

NAAM FRUIT
Jan Appel
Kees Peer
Klaas Appel
Piet Kers
Joep Appel
Koos Peer

Op het scherm wil ik dan het volgende tonen:

Appel
Jan
Joep
Klaas


Kers
Piet

Peer
Kees
Om het uit de database te krijgen lukt me wel, maar hoe kan ik met php die groepen maken?
 
PHP hulp

PHP hulp

08/03/2025 05:31:35
 
Jelmer -

Jelmer -

31/08/2010 20:27:11
Quote Anchor link
Een trucje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

$sql_res
= mysql_query('...');

$groepen = array();

while($row = mysql_fetch_assoc($sql_res))
{

    $groepen[$row['fruit']][] = $row;
}

?>

Groepen is nu iets als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
array(
    'banaan' => array(
        array(
            'naam' => 'Kees',
            'fruit' => 'banaan'
        ),
        array(
            'naam' => 'Jaap',
            'fruit' => 'banaan'
        )
    ),
    'appel' => array(
        array(
            'naam' => 'Karel',
            'fruit' => 'appel'
        )
    )
);

Printen kan dan gemakkelijk met een foreach-lusje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// even snel een functie om tekst uit de database veilig in de pagina te tonen
function html($text) {
    return htmlspecialchars($text);
}


foreach($groepen as $fruit => $mensen)
{

    echo '<h2>' . html($fruit) . '</h2>';
    echo '<ul>';
    foreach($mensen as $mens)
    {

        echo '<li>' . html($mens['naam']) . '</li>';
    }

    echo '</ul>';
}

?>
Gewijzigd op 31/08/2010 20:28:38 door Jelmer -
 
Marc rc is as

Marc rc is as

01/09/2010 10:27:03
Quote Anchor link
Fantastisch! Dit werkt perfect!

Nog één vraagje: Waarom schrijf je "// even snel een functie om tekst uit de database veilig in de pagina te tonen".

Is dat op een andere manier niet veilig dan? En wat is dan het gevaar?
 
Jelmer -

Jelmer -

01/09/2010 10:48:52
Quote Anchor link
Stel dat je op de een of andere manier de naam '<em>ma' in je database krijgt. Zou je deze direct echo'en in je html, dan wordt die <em> gezien als html, en staat alles daarna schuin gedrukt.

htmlspecialchars zorgt ervoor dat alle tekens die betekenis hebben binnen html, zoals &, < en >, omgezet worden naar de html-beschrijvingen voor die tekens die je bedoelt, zoals &amp;, &lt; en &gt;.
 
Marc rc is as

Marc rc is as

01/09/2010 10:58:39
Quote Anchor link
Oké, helemaal duidelijk. Zal ik zeker vaker gaan gebruiken.
Thanks!
 
Joakim Broden

Joakim Broden

01/09/2010 12:21:55
Quote Anchor link
Zo kan het toch ook?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        $query = "SELECT fruit FROM tabel_fruiten GROUP BY fruit ORDER BY fruit";
        $uitvoer = mysql_query($query);
        while($lijst = mysql_fetch_object($uitvoer))
        {
            $fruit = $lijst->fruit;

            $query2 = "SELECT naam FROM tabel_fruiten WHERE fruit = '".$fruit."' ORDER BY naam";
            $uitvoer2 = mysql_query($query2);
            while($lijst2 = mysql_fetch_object($uitvoer2))
            {
                $naam = $lijst2->naam;

                echo $naam;
            }
        }
 
Pim -

Pim -

01/09/2010 12:25:56
Quote Anchor link
Zo gebruik je onnodig een extra query.
 
Hipska BE

Hipska BE

01/09/2010 12:34:07
Quote Anchor link
Nee, veel meer dan 1 extra query.

Je doet namelijk eerst 1 query, en daarna nog voor elke fruitsoort nog een query. Zo kan je snel aan 10 query's komen of nog veel meer.

En onthou dat query's uitvoeren relatief traag is, dus creëer je x aantal vertragingen in je script.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.