Door
Bart Smulders
op 02-02-2019 22:47
gewijzigd op 03-02-2019 14:57
4.074 views
Ten einde raad.
Wat ik tot hiertoe heb.
$sql = "SELECT DISTINCT CatId, SubcatId0, SubcatId1, SUbcatId2,Omschrijving,Omschrijving0,Omschrijving1,Omschrijving2
FROM Artikelen_Categorie,Artikelen_Subcategorie0,Artikelen_Subcategorie1,Artikelen_Subcategorie2 ORDER BY Omschrijving DESC";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_array()) {
$hoofdcat = [
$row["CatId"] =>
$row["Omschrijving"]
];
foreach ($hoofdcat1 as $k => $v ) {
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
}
$con->close();
}
Wat ik wil verwezenlijken is een option selectbox (meerdere) maar beginnen met 1 waarbij de output van mijn query ook als Unique word getoond per selectbox.
autos
-<volvo>
-<bmw>
kleur
-<wit>
-<rood>
enz.
Ik kan de output niet uniek krijgen met array_unique waardoor ik een lange lijst krijg.
Tevens kan ik de foreach niet gebruiken buiten de while loop. Hoe kan ik dat het beste oplossen?
Het helpt als je je code netjes inspringt. Dit verbetert de leesbaarheid. En dan zie je ook direct dat dingen mogelijk op de verkeerde plaats staan. Zo sluit je alleen de connectie als er een queryresultaat was. Hoe snijdt dat precies hout? Na afloop van het script / overige PHP-code wordt de connectie sowieso impliciet gesloten, dus het is helemaal niet nodig om dit expliciet te doen. If anything, geef het resultaat van je query vrij als je hiermee klaar bent.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
<?php
foreach ($hoofdcat as $row) {
foreach ($row as $k => $v) {
// doe je ding...
}
}
?>
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Het helpt als je je code netjes inspringt. Dit verbetert de leesbaarheid. En dan zie je ook direct dat dingen mogelijk op de verkeerde plaats staan. Zo sluit je alleen de connectie als er een queryresultaat was. Hoe snijdt dat precies hout? Na afloop van het script / overige PHP-code wordt de connectie sowieso impliciet gesloten, dus het is helemaal niet nodig om dit expliciet te doen. If anything, geef het resultaat van je query vrij als je hiermee klaar bent.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
<?php
foreach ($hoofdcat as $row) {
foreach ($row as $k => $v) {
// doe je ding...
}
}
?>
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Je hebt gelijk van dat inspringen. Alhoewel dat reeds meerdere dagen broeden op dit probleem ook niet echt helpt om het dan nog netjes te houden.
Vervolgens heb ik deze aanpassing getest maar heeft hetzelfde resultaat.
Hij geeft na de query 29 resultaten, die dan nog op unique moeten gesorteerd worden naar de 3 dat het moeten zijn. Vandaar dat ik nog goed snap hoe het komt dat deze waarden zoveel worden vermenigvuldigd.
[size=xsmall]Toevoeging op 03/02/2019 18:44:09:[/size]
Thomas van den Heuvel op 03/02/2019 17:57:12
Het helpt als je je code netjes inspringt. Dit verbetert de leesbaarheid. En dan zie je ook direct dat dingen mogelijk op de verkeerde plaats staan. Zo sluit je alleen de connectie als er een queryresultaat was. Hoe snijdt dat precies hout? Na afloop van het script / overige PHP-code wordt de connectie sowieso impliciet gesloten, dus het is helemaal niet nodig om dit expliciet te doen. If anything, geef het resultaat van je query vrij als je hiermee klaar bent.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
<?php
foreach ($hoofdcat as $row) {
foreach ($row as $k => $v) {
// doe je ding...
}
}
?>
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Ik heb de query bekeken en deze levert mij idd geen 29 maar 600 resultaten weer als gevolg van de samentrekking van de rijen over de verschillende tabellen .
Misschien kan ik dit oplossen met een multiquery . Ik heb nog nergens gelezen of deze een beperkt aantal aan query's kan uitvoeren noch hoe ze deftig te gebruiken.
De organisatie in je tabel is niet echt fantastisch.
Het lijkt erop dat je een soort van boomstructuur wilt opzetten? Of wellicht meerdere bomen in deze tabel wilt opslaan en apart wilt kunnen uitlezen?
Ook weet ik niet of een dropdown de beste manier is om een boom te representeren. Of stop je subcategorieën van een bepaald niveau in een aparte dropdown?
Anyhow, je kunt altijd volstaan met één query om alles op te halen. Vervolgens verplaats je het sorteerprobleem naar PHP, hier bouw je dan met behulp van een recursieve (zichzelf aanroepende) functie een datastructuur (een genest array) in PHP.
Maar hoe deze er uitziet hangt natuurlijk af van wat je probeert te bereiken, wat mij tot op heden niet bepaald duidelijk is, oftewel, wat wil je hiermee uiteindelijk kunnen bouwen / doen?
Misschien zou je ook kunnen denken aan een andere indeling van je tabellen? Je hebt het over automerken en kleuren. Een kleur is niet echt een subcategorie van een merk. Je moet dan waarschijnlijk meer denken in eigenschappen en waarden. Een bepaald type/serie auto omvat dan een collectie van eigenschappen in een concrete uitvoering, maar dit heeft verder niets weg van een boomstructuur.
Misschien dat je van grof naar fijn wilt in een soort van facetted search ofzo, maar simpelweg omdat iets het uiterlijk van een boomstructuur heeft wil dat niet per se zeggen dat je het ook op die manier zou moeten organiseren in je database.
Eigenlijk wel interessant.
Ik herinner me net dat ik daar ook tegen aan loop in een overzicht op mijns ite. Nu heb ik dus een zes categorieën die ik uit de database ophaal met while. En in die while haal ik alle 10 laatste nieuwsberichten uit die categorie op. Toch 6 queries teveel.... (hoewel Smarty toch enigzins wat bespaart met caching)
Toch ben ik benieuwd naar een opzetje hoe recursie hierin verwerkt kan worden.
Dat is eigenlijk altijd hetzelfde:
1. Haal alle (relevante) categorieën op, gesorteerd op diepte en rangorde van dat niveau (als je dit bijhoudt)
2. bouw bij het ophalen van deze informatie de datastructuur in PHP
Vervolgens zou je ook een "lineaire lijst" uit deze datastructuur kunnen halen waarbij je zelf het startpunt (de "root") van de boom aangeeft. Deze kun je dan gebruiken om een equivalente boom in HTML te bouwen, bijvoorbeeld een bulleted list ofzo.
@Thomas,
Het voorbeeld van de auto's was een fictief voorbeeld. Niet iedereen hier heeft voor deze materie een studie genoten en veel moeten we leren van input (waarvoor dank) .
Aan mij database structuur is overigens niets mis. De query zal beter kunnen geen twijfel.
Zodra ik de nieuwe query heb geïmplementeerd en getest ga ik deze hier posten. Mocht er nog meer verbeterwerk aan zijn dan zie ik het wel.
@Arien,
Misschien dat met deze post ook jou probleem verholpen kan.
Oef, categorieën als tabellen nummeren.
Dat is niet bepaald genormaliseerd ;-)
Ik tracht nochtans echt men best te doen in deze...
Nergens heb ik een veld dat 2keer word beschreven.
waarbij de eerste hoofdcat bv de automatisatie is
waarbij de 2e cat slagbomen zijn
enz
Telkens de juiste taal als vertaling nodig zou zijn , uitbreidbaar voor talen...