Groepenbeheer, hoe subgroepen van subgroepen maken ?
zit hier nu al sinds deze morgen op te zoeken en wordt bijna gek ...
de functie :
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function Lijst_Beroepen(){
$dbconnect = mysql_connect (DBhost,DBgebruiker,DBwachtwoord) or die ("Kan niet verbinden: " . mysql_error());
$dbselect = mysql_select_db (DBnaam,$dbconnect);
$sql_result = mysql_query ("SELECT * FROM webcms_groepen WHERE subgroepVan = '0'");
$tmpHtml = '<select name="F_GBberoepen">';
while ($row=mysql_fetch_array ($sql_result)) {
$HoofdGroep = $row['groepnaamNL'];
$HoofdGroepId = $row['groepId'];
$sql_result2 = mysql_query ("SELECT * FROM webcms_groepen WHERE subgroepVan='".$HoofdGroepId."'");
while ($subrow=mysql_fetch_array ($sql_result2)) {
$tmpHtml .= '<option value="'.$subrow['id'].'">'.$HoofdGroep.' - '.$subrow['groepnaamNL'].'</option>';
}
}
$tmpHtml .= '</select>';
return $tmpHtml;
}
$dbconnect = mysql_connect (DBhost,DBgebruiker,DBwachtwoord) or die ("Kan niet verbinden: " . mysql_error());
$dbselect = mysql_select_db (DBnaam,$dbconnect);
$sql_result = mysql_query ("SELECT * FROM webcms_groepen WHERE subgroepVan = '0'");
$tmpHtml = '<select name="F_GBberoepen">';
while ($row=mysql_fetch_array ($sql_result)) {
$HoofdGroep = $row['groepnaamNL'];
$HoofdGroepId = $row['groepId'];
$sql_result2 = mysql_query ("SELECT * FROM webcms_groepen WHERE subgroepVan='".$HoofdGroepId."'");
while ($subrow=mysql_fetch_array ($sql_result2)) {
$tmpHtml .= '<option value="'.$subrow['id'].'">'.$HoofdGroep.' - '.$subrow['groepnaamNL'].'</option>';
}
}
$tmpHtml .= '</select>';
return $tmpHtml;
}
De tabel :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `webcms_groepen` (
`groepId` int(10) NOT NULL auto_increment,
`subgroepVan` int(10) NOT NULL default '0',
`groepnaamNL` text,
`groepnaamFR` text,
PRIMARY KEY (`groepId`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `webcms_groepen` VALUES ('1', '0', 'Hoofdgroep 1 NL', 'Hoofdgroep 1 FR');
INSERT INTO `webcms_groepen` VALUES ('2', '0', 'Hoofdgroep 2 NL', 'Hoofdgroep 2 FR');
INSERT INTO `webcms_groepen` VALUES ('3', '1', 'Subgroep 1 NL', 'Subgroep 1 FR');
INSERT INTO `webcms_groepen` VALUES ('4', '2', 'Subgroep 2 NL', 'Subgroep 2 FR');
INSERT INTO `webcms_groepen` VALUES ('5', '4', 'Subgroep 2 subgroep NL', null);
`groepId` int(10) NOT NULL auto_increment,
`subgroepVan` int(10) NOT NULL default '0',
`groepnaamNL` text,
`groepnaamFR` text,
PRIMARY KEY (`groepId`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `webcms_groepen` VALUES ('1', '0', 'Hoofdgroep 1 NL', 'Hoofdgroep 1 FR');
INSERT INTO `webcms_groepen` VALUES ('2', '0', 'Hoofdgroep 2 NL', 'Hoofdgroep 2 FR');
INSERT INTO `webcms_groepen` VALUES ('3', '1', 'Subgroep 1 NL', 'Subgroep 1 FR');
INSERT INTO `webcms_groepen` VALUES ('4', '2', 'Subgroep 2 NL', 'Subgroep 2 FR');
INSERT INTO `webcms_groepen` VALUES ('5', '4', 'Subgroep 2 subgroep NL', null);
Gewijzigd op 01/01/1970 01:00:00 door Major Apollo
Zet code tags om het script en lees de regels om te posten eens door. Verzin daarna de bijbehorende vraag.
CREATE TABLE `webcms_groepen` (
`groepId` int(10) NOT NULL auto_increment,
`subgroepVan` int(10) NOT NULL default '0',
`groepnaamNL` text,
`groepnaamFR` text,
groepnaamNL en groepnaamFR zet je in een aparte tabel. Dan kun je de overige talen er ook bijzetten zonder dat je extra kolommen aan hoeft te maken. Het datamodel mag nooit afhankelijk zijn van de data en dit is hier wel het geval. Voor de taal NL heb jij een andere kolom nodig dan de taal FR. NL en FR zijn gewoon records in de tabel 'talen'.
talen:
id
iso_code
webcms_groepen:
groepnaam
+ de rest
groepnaam
id_webcms_groepen (foreignkey)
id_talen (foreignkey)
naam
Weer een probleem opgelost!
Er zijn maar twee belangrijke velden in je tabel (excl. de naam): groepId, parentGroepId (alleen je noemt ze iets anders).
Zou zoiets niet werken?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
[code]<?php
function getGroups( $f_iParent = 0, $f_szLevels = '' )
{
$qThisLevelGroups = _query("SELECT groupId, groupName FROM groups WHERE parentGroupId = '".$f_iParent."';");
$szHTML = "";
while ( $arrGroup = _fetch_assoc($qThisLevelGroups) )
{
$szHTML .= $f_szLevels.'<option value="'.$arrGroup['groupId'].'">'.$f_szLevels.$arrGroup['groupName'].'</option>' . PHP_EOL;
$szHTML .= getGroups($arrGroup['groupId'], $f_szLevels."\t");
}
return $szHTML;
}
?>
?>
[code]<?php
function getGroups( $f_iParent = 0, $f_szLevels = '' )
{
$qThisLevelGroups = _query("SELECT groupId, groupName FROM groups WHERE parentGroupId = '".$f_iParent."';");
$szHTML = "";
while ( $arrGroup = _fetch_assoc($qThisLevelGroups) )
{
$szHTML .= $f_szLevels.'<option value="'.$arrGroup['groupId'].'">'.$f_szLevels.$arrGroup['groupName'].'</option>' . PHP_EOL;
$szHTML .= getGroups($arrGroup['groupId'], $f_szLevels."\t");
}
return $szHTML;
}
?>
?>
Edit:
Normaliseren heeft in dit geval absoluut geen zin en is misschien wel onmogelijk. Je wil namelijk een recursieve tabel...
Gewijzigd op 01/01/1970 01:00:00 door rudie dirkx
bedankt voor de reakties, trouwens weet er niemand een voorbeeldscript van iets soortgelijks ?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
mysql_connect();
mysql_select_db("phphulp");
echo '<select name="groups">'.PHP_EOL . getGroups() . '</select>';
function getGroups( $f_iParent = 0, $f_szLevels = '' )
{
$qThisLevelGroups = mysql_query("SELECT groupId, groupName FROM groups WHERE parentGroupId = '".$f_iParent."';");
$szHTML = "";
while ( $arrGroup = mysql_fetch_assoc($qThisLevelGroups) )
{
$szHTML .= "\t".$f_szLevels.'<option value="'.$arrGroup['groupId'].'">' . str_replace("\t", ' ', $f_szLevels.$arrGroup['groupName']) . '</option>' . PHP_EOL;
$szHTML .= getGroups($arrGroup['groupId'], $f_szLevels."\t");
}
return $szHTML;
}
?>
mysql_connect();
mysql_select_db("phphulp");
echo '<select name="groups">'.PHP_EOL . getGroups() . '</select>';
function getGroups( $f_iParent = 0, $f_szLevels = '' )
{
$qThisLevelGroups = mysql_query("SELECT groupId, groupName FROM groups WHERE parentGroupId = '".$f_iParent."';");
$szHTML = "";
while ( $arrGroup = mysql_fetch_assoc($qThisLevelGroups) )
{
$szHTML .= "\t".$f_szLevels.'<option value="'.$arrGroup['groupId'].'">' . str_replace("\t", ' ', $f_szLevels.$arrGroup['groupName']) . '</option>' . PHP_EOL;
$szHTML .= getGroups($arrGroup['groupId'], $f_szLevels."\t");
}
return $szHTML;
}
?>
Edit:
Als je je tabel innoDB maakt (is een aanrader), kan je zorgen dat je nooit overhead data in je tabel hebt en altijd correcte keys. Moet je parentGroupId linken naar groupId en wel ff parentGroupId standaard op NULL zetten (in sql) en niet op '0' controleren in de functie, maar op NULL.
0 is namelijk geen valid groupId, dus dan gaat je constriction zeiken. NULL is wel valid.
0 is namelijk geen valid groupId, dus dan gaat je constriction zeiken. NULL is wel valid.
Gewijzigd op 01/01/1970 01:00:00 door rudie dirkx
werkt prima en je hebt me wel ff heel hard gehlpen want zit met een deadline voor morgen... dus nogmaals van harte bedankt !
Quote:
Daar denk ik dus anders over, ik zou dit wel willen normaliseren. Ik wil niet voor het toevoegen van een nieuwe taal mijn hele database-model overhoop halen en alle API's gaan aanpassen, moet er niet aan denken.Normaliseren heeft in dit geval absoluut geen zin en is misschien wel onmogelijk. Je wil namelijk een recursieve tabel...
Maar beide oplossingen zijn mogelijk, daar heb je gelijk in.
Voor de taal heb je trouwens helemaal gelijk hoor :) De taal zou perfect normaliseerbaar zijn. Dat is een feit. Ik bedoelde echter het recursief zijn van de tabel (daar ging het probleem over toch!?).
@vercetti: We zijn het dus helemaal met elkaar eens, ik was wellicht niet helemaal duidelijk in mijn reactie over het normaliseren. Het ging mij uitsluitend om de talen, met de rest is namelijk niets mis. Soms is een half woord niet genoeg, communicatie via een forum verdient toch wat meer aandacht... Zal er op letten!
frank, lol, let er vooral op ;)
kzit nog met 1 vraag, hoe moet ik mijn SQL query opbouwens als ik een groep/subgroep (en de subgroepen daaronder) wens te wissen ?
Maar helaas krijg ik een fout:
Warning: Missing argument 3 for toongroepen()
de html waar ik de funtkie in oproep:
en dan de funktie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function toonGroepen( $f_iParent = 0, $f_szLevels = '',$groepID ) {
echo $groepID;
exit;
$dbconnect = mysql_connect (DBhost,DBgebruiker,DBwachtwoord) or die ("Kan niet verbinden: " . mysql_error());
$dbselect = mysql_select_db (DBnaam,$dbconnect);
$qThisLevelGroups = mysql_query("SELECT groepId, groepnaamNL FROM webcms_groepen WHERE subgroepVan = '".$f_iParent."';");
$szHTML = "";
while ( $arrGroup = mysql_fetch_assoc($qThisLevelGroups) )
{
if ($groepID == $arrGroup['groepId']){ $selectcode='selected="selected"'; } else { $selectcode=''; }
$szHTML .= $f_szLevels.'<option value="'.$arrGroup['groepId'].'" '.$selectcode.'>' . str_replace("\t", ' ', $f_szLevels.$arrGroup['groepnaamNL']) . '</option>' . PHP_EOL;
$szHTML .= toonGroepen($arrGroup['groepId'], $f_szLevels."\t",$groepID);
}
return $szHTML;
}
echo $groepID;
exit;
$dbconnect = mysql_connect (DBhost,DBgebruiker,DBwachtwoord) or die ("Kan niet verbinden: " . mysql_error());
$dbselect = mysql_select_db (DBnaam,$dbconnect);
$qThisLevelGroups = mysql_query("SELECT groepId, groepnaamNL FROM webcms_groepen WHERE subgroepVan = '".$f_iParent."';");
$szHTML = "";
while ( $arrGroup = mysql_fetch_assoc($qThisLevelGroups) )
{
if ($groepID == $arrGroup['groepId']){ $selectcode='selected="selected"'; } else { $selectcode=''; }
$szHTML .= $f_szLevels.'<option value="'.$arrGroup['groepId'].'" '.$selectcode.'>' . str_replace("\t", ' ', $f_szLevels.$arrGroup['groepnaamNL']) . '</option>' . PHP_EOL;
$szHTML .= toonGroepen($arrGroup['groepId'], $f_szLevels."\t",$groepID);
}
return $szHTML;
}
Wat ik dus heb bijgevoed is :
moest gewoon in de html extra args meegeven: