Door
Bart Smulders
op 02-02-2019 22:47
gewijzigd op 03-02-2019 14:57
4.072 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 zijn categorieën, dus die horen in één tabel. Maar je kan voor subcategorieën dan aangeven welke categorieID de 'parent' id
indien ik naar dit kijk zie ik bv niet in hoe je dan verschillende talen gaat kunnen mengen in normalisatie.
Als ik een Parent id gebruik en dezelfde subcategorie is ergens anders ook van toepassing maar in een andere parent id dan moet ik dit veld dubbel aanmaken.
Op deze manier heb ik het woord kabels 2 keer ingevuld... Als ik dan kabels wil hernoemen...
In de volgende tabel ga ik de categorie ,subcategorie toewijzen aan een artikel.
Tabel Artikel_indexatie
ArtikelId
Categorie
Subcategorie0
Subcategorie1
Op deze manier heb ik het woord kabels 2 keer ingevuld... Als ik dan kabels wil hernoemen...
Audiokabels zijn sowieso iets anders dan industriële kabels lijkt mij, dus die zouden sowieso in twee aparte records moeten staan. Die je vervolgens prima apart kunt renamen.
Zodra je tabellen of kolommen van een numeriek suffix voorziet is het tijd om na te denken hoe je e.e.a. indeelt.
Maak één generieke tabel met hierin een kolom parent_category_id die NULL mag zijn. Betreft het een hoofdcategorie is deze NULL, betreft het een subcategorie, vul dan in parent_category_id de hoger gelegen categorie in. Linkjes in een eerder bericht van mij leggen uit hoe je al deze categorieën met één query uitleest.
Uiteindelijk is dit het resultaat geworden dat werkt.Toch vroeg ik mij af of de explode en combine array niet op een andere manier konden uitgewerkt die nog sneller/ efficiënter is.
<?php
$sql = "SELECT
(SELECT group_concat( DISTINCT CatId )
FROM Artikelen_Categorie
) AS CatId,
(SELECT group_concat( DISTINCT OmschrijvingNL )
FROM Artikelen_Categorie
) AS OmschrijvingNL,
(SELECT group_concat( DISTINCT SubcatId )
FROM Artikelen_Subcategorie
) AS SubcatId,
(SELECT group_concat( DISTINCT SomschrijvingNL )
FROM Artikelen_Subcategorie
) AS SomschrijvingNL,
(SELECT group_concat( DISTINCT SubbcatId )
FROM Artikelen_Subbcategorie
) AS SubbcatId,
(SELECT group_concat( DISTINCT SsomschrijvingNL )
FROM Artikelen_Subbcategorie
) AS SsomschrijvingNL";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$rowf[]=$row;
}
}
foreach($rowf as $rows ){
$Pre1=$rows["CatId"];
$Pre2=$rows["OmschrijvingNL"];
$Pre3=$rows["SubcatId"];
$Pre4=$rows["SomschrijvingNL"];
$Pre5=$rows["SubbcatId"];
$Pre6=$rows["SsomschrijvingNL"];
}
$Gd1 = explode(",", $Pre1);
$Gd2 = explode(",", $Pre2);
$Gd3 = explode(",", $Pre3);
$Gd4 = explode(",", $Pre4);
$Gd5 = explode(",", $Pre5);
$Gd6 = explode(",", $Pre6);
$hoofdcat[]=array_combine($Gd1,$Gd2);
$Subcat0[]=array_combine($Gd3,$Gd4);
$Subcat1[]=array_combine($Gd5,$Gd6);
?>
Vervolgens lees ik dan de nieuwe array zo uit op de plaats waar ik ze nodig heb
Geef eens een concreet voorbeeld van hoe de data gestructureerd is. Dit bepaalt doorgaans hoe je dit het beste kunt organiseren in de database.
Geef vervolgens een voorbeeld van hoe je deze data wilt representeren. Dit leidt mogelijk tot nieuwe inzichten hoe je dit anders/beter kunt organiseren in de database.
Wanneer je je in allerlei bochten moet wringen om de data uit je database te wringen op de wijze zoals je deze wilt gebruiken is dit in een indicatie dat deze niet goed is gestructureerd.
@Thomas
Dit dient om de categorie ,subcategorie,sub sub categorie weer te geven. Telkens in een option select box . Zodat je een artikel kan aanmaken op een eenvoudige manier.
Ik weet dat jij gebruikt maakt van CategorieId en parentId voor het aanmaken de categorie structuur.
Indien ik normalisatie wil toepassen kan ik deze strategie echter niet volgen aangezien ik dan null velden krijg voor sommige artikelen... helaas niet toegelaten na 1NF .
Talen? Hoe komen we ineens op talen? Dat los je toch op een hele andere plaats op en staat verder los van de structurering van data? Desnoods maak je een kolom bij per taal voor de tabellen met beschrijvingen. Of aparte taalbestanden waarbij je een standaard taal doorvertaalt naar de actuele taal, maar dat is echt een compleet apart probleem wat je ook in afzondering kunt oplossen? Dit staat verder los van het echt organiseer-vraagstuk :/
Om hier aparte tabellen voor aan te maken lijkt mij echt niet nodig.
Het probleem met bovenstaande oplossing is (ook) dat deze niet flexibel is. Wat als er nu een subcategorie bijkomt (zeg nooit nooit :))? Dan moet er weer een tabel (of twee) bijgebouwd worden en dan moet je weer code en je database openbreken.
> Indien ik normalisatie wil toepassen kan ik deze strategie echter niet volgen aangezien ik dan null velden krijg voor sommige artikelen... helaas niet toegelaten na 1NF.
Waarom blijven mensen altijd vasthouden aan een voorschrift als dit voorschrift alleen maar voor ellende zorgt? :/
In de allersimpelste vorm heb je nog steeds maar één tabel nodig:
cat_id
cat_parent_id
(eventueel cat_level, maakt queries simpeler)
cat_order
cat_label
En als je het leuk vindt om de vertalingen in die tabel te stoppen:
cat_id
cat_parent_id
(eventueel cat_level, maakt queries simpeler)
cat_order
cat_label_nl
cat_label_en
cat_label_etc?
Hiermee kun je generieke code schrijven die zelfs bepaalt hoeveel dropdowns je nodig hebt zodat je nooit een enkele letter code (noch databasestructuur) zou hoeven te veranderen, zelfs niet als er nog een sub(sub(sub))-categorie bijkomt.