Data Groeperen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter Overdam

Peter Overdam

25/04/2018 14:10:26
Quote Anchor link
Beste formleden,

Ik zit een beetje te worstelen met een script. Ik ben momenteel bezig om mij PDO aan te leren en omdat het net allemaal anders werkt kom ik er niet echt uit en hoop dat jullie mij een beetje op weg kunnen helpen.
Ik heb een script gemaakt waarin het volgende stukje code in zit verwerkt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
        foreach ($parkerenPlaatsen as $row):
            echo '<div class="content-wrapper"><h1>'. $row->plaatsnaam .'</h1>';
            foreach($parkerenPlaatsen as $row):
                echo '<div><a href="main.php?page=bus-parkeerplaatsen&resultaat='. $row->id .'">'. $row->straatnaam .'</a></div>';
            endforeach;
            echo '</div>';
        endforeach;
?>


Hierbij heb ik een function gemaakt om hem werkend te krijgen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
    function parkerenPlaatsen(&$pdo){
        if(is_null($pdo)) return array();
            $land = filter_var( trim($_GET['land']), FILTER_SANITIZE_STRING );
            $sql = 'SELECT * FROM parkeren WHERE land = :land GROUP BY plaatsnaam ORDER BY plaatsnaam ASC';
            $stmt = $pdo->prepare($sql);
            $stmt->execute(['land' => $land]);
            return $query = $stmt->fetchAll();
    }

?>


Nu zit ik dus met het volgende probleem hij moet de per plaatsnaam de parkeerplekken in die plaatsnaam weergeven maar momenteel weergeeft hij onder elke plaatsnaam alle adressen.

Nu is mijn vraag hoe ik dit correct kan oplossen en wat niet al te moeilijk is aangezien ik nog niet alles van PHP/MySQL snap.

Groetjes
Peter
 
PHP hulp

PHP hulp

16/04/2024 07:25:53
 
Thomas van den Heuvel

Thomas van den Heuvel

25/04/2018 16:59:59
Quote Anchor link
Allereerst is het een nogal vreemde constructie: je hebt een loop met $parkerenPlaatsen met daarin nogmaals een loop met $parkerenPlaatsen, ook gebruik je twee keer $row, ook al zou dat op een miraculeuze wijze het gewenste resultaat geven, dit is op zijn minst enorm verwarrend.

De query is ook een beetje vreemd: je selecteert alle kolommen van "parkeren" en groepeert deze vervolgens op plaatsnaam. Hoe zouden deze records dan precies samengevoegd moeten worden, of liever gezegd, welke waarden zouden de records die na groeperen overblijven moeten hebben? Als je de query in afzondering uitvoert en de resultaten bekijkt, zijn dat dan ook de resultaten die je wilt hebben?

Waar je -uit optiek van informatie- waarschijnlijk naar op zoek bent zijn alle parkeerplaatsen uit een bepaald land, gesorteerd op plaatsnaam (hier komt groeperen niet aan te pas?). Een manier om dit vervolgens uit te draaien is door binnen de buitenste foreach-lus onder bepaalde condities een div te openen (en mogelijk een eerder geopende div te sluiten) voor de plaatsnaam van het huidige record en deze naam vervolgens bij te houden. Verandert de plaatsnaam, sluit je de div en open je een nieuwe plaatsnaam-div waarna dit proces zich herhaalt. En na afloop nog even de laatst geopende div afsluiten uiteraard. Je hebt in dat geval maar één foreach-lus nodig en enkele if-statements voor het bouwen van je HTML.

Over de HTML gesproken: je doet er verstandig aan om alle DATA die je in de HTML weergeeft te escapen, dus $row->plaatsnaam, $row->id en $row->straatnaam zouden onschadelijk gemaakt moeten worden in de HTML-context.

Daarnaast zou ook de ampersand in de hyperlink (&resultaat) omgezet moeten worden naar &amp;, ten einde mogelijke verwarring met HTML-entiteiten te voorkomen.

Ook zou ik geen lappen statische HTML echo'en, maar dat is misschien een conventie / persoonlijke voorkeur.

Deze beide acties lijken in dit geval overbodig en dat zijn ze misschien ook, maar als je dit soort escaping consequent toepast, dan heb je hier nooit meer omkijken naar omdat je dan nooit meer de afweging hoeft te maken of dit ge-escaped dient te worden of dat dat wellicht vergeten was. Gewoon altijd escapen is simpelweg eenvoudiger.

EDIT, zoiets dus:
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
// initialisatie
$plaatsnaam = false;
$divOpen = false;

foreach ($parkerenPlaatsen as $row):
    if ($plaatsnaam != $row->plaatsnaam):
        // plaatsnaam veranderd, was er een div geopend?
        if ($divOpen):
            ?>
</div><?php
            $divOpen
= false;
        endif;
    endif;


    // moet er een nieuwe div geopend worden? oftewel, was de plaatsnaam gewijzigd?
    if ($divOpen === false):
        ?>
<div class="content-wrapper"><h1><?php echo escapeHtml($row->plaatsnaam) ?></h1><?php
        $divOpen
= true;
    endif;


    // draai huidige record uit
    ?>
<div><a href="main.php?page=bus-parkeerplaatsen&amp;resultaat=<?php echo escapeHtml(escapeUrl($row->id)) ?>"><?php echo escapeHtml($row->straatnaam) ?></a></div><?php

    // sla nieuwe plaatsnaam op voor volgende iteratie
    $plaatsnaam = $row->plaatsnaam;
endforeach;

// sluit laatste content wrapper
if ($divOpen):
    ?>
</div><?php
endif;
?>

Waarbij escapeHtml() een functie is om zaken in de HTML-context te escapen, en escapeUrl() een functie is om zaken in een hyperlink te escapen. Dit zijn geen standaard functies maar wellicht werk je met een pakket waarbij daar al voorzieningen voor zijn.
Gewijzigd op 25/04/2018 17:31:21 door Thomas van den Heuvel
 
Peter Overdam

Peter Overdam

25/04/2018 17:49:18
Quote Anchor link
Hey Thomas,

Bedankt voor je hulp. Ben nog beginnend met PHP en dat escapeHTML was mij nog niet bekend ben ook altijd aan het stoeien met nieuwe scripts om nieuwe dingen correct aan te leren. Ik weet zeker dat ik met jou input wat kan. Ga hiermee ook zeker aan de slag om het correct in mijn script werkend te krijgen.
 
Marthijn Buijs

Marthijn Buijs

25/04/2018 18:32:18
Quote Anchor link
Je dient de functie escapeHtml zelf te implementeren, vandaar dat het je nog niet bekend was.
Gewijzigd op 25/04/2018 18:33:04 door Marthijn Buijs
 
Thomas van den Heuvel

Thomas van den Heuvel

25/04/2018 19:06:47
Quote Anchor link
Een mogelijke implementatie is bijvoorbeeld, afhankelijk van welke character encoding je gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function escapeHtml($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}

?>

Het voordeel van het (indirect) gebruiken van htmlspecialchars(), of in het algemeen, van dit soort functies, is dat je daarmee ook hardcoding van een specifiek gebruik voorkomt.

Mocht er ooit iets veranderen in de gebruikte character encoding of de manier waarop er ge-escaped dient te worden, dan hoef je niet alle instanties van htmlspecialchars() in code na te gaan, maar hoef je simpelweg alleen de implementatie van deze hulpfunctie te veranderen mits je overal deze hulpfunctie gebruikt als wrapper voor htmlspecialchars().

Dit houdt overigens niet in dat je voor alles dit soort aliassen in zou moeten zetten :).

Voor escapeUrl() zou je iets met urlencode() kunnen doen.
Gewijzigd op 25/04/2018 19:08:30 door Thomas van den Heuvel
 



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.