PHP Forum Categoriën probleempje
Ik ben bezig met het scripten van een forum van een clan waar ik in zit, maar ik zit ff klem. :/
Normaal op een forum zie je iets als dit:
Categorie 1
sub1
sub2
sub3
Categorie 2
sub1
sub2
sub3
Wat ik nu heb is:
Categorie 1
sub1
sub1
sub1
Categorie 2
sub2
sub2
sub2
Categorie 2
sub3
sub3
sub3
Categorie 2
sub3
sub3
sub3
Dit hoort natuurlijk niet, haha.
Maar, hoe maak ik het zodat het een categorie laat zien, alle bijhorende subcategoriën eronder en dat dan herhalend en automatisch updatend.
Ik werk vanuit een database en ik ben nog niet zo heel lang bezig met php (ongeveer een maand of 4), maar ik vind het wel hartstikke leuk om te doen.
Hopelijk hoor ik snel van jullie.
Kan je misschien wat relevante code laten zien?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$query = "SELECT forumcategories.title as ct, forumsubcategories.title as sct, forumsubcategories.description as scd FROM forumcategories
LEFT JOIN forumsubcategories ON forumsubcategories.category_id = forumcategories.id";
$result = mysql_query($query);
$count = mysql_num_rows(mysql_query("SELECT title FROM forumsubcategories"));
echo $count;
while($c = mysql_fetch_array($result))
{
$ct = $c['ct'];
$sct = $c['sct'];
$scd = $c['scd'];
echo "<p>Category: $ct<br />";
for($i = 0; $i < $count; $i++)
{
echo $sct . '<br />';
}
}
?>
$query = "SELECT forumcategories.title as ct, forumsubcategories.title as sct, forumsubcategories.description as scd FROM forumcategories
LEFT JOIN forumsubcategories ON forumsubcategories.category_id = forumcategories.id";
$result = mysql_query($query);
$count = mysql_num_rows(mysql_query("SELECT title FROM forumsubcategories"));
echo $count;
while($c = mysql_fetch_array($result))
{
$ct = $c['ct'];
$sct = $c['sct'];
$scd = $c['scd'];
echo "<p>Category: $ct<br />";
for($i = 0; $i < $count; $i++)
{
echo $sct . '<br />';
}
}
?>
Hoe zet je dit in kleuren trouwens?
Gewijzigd op 29/06/2011 21:40:17 door Richard Augspurger
Code (php)
Door je code tussen de PHP tags te plaatsen.
Gewijzigd op 29/06/2011 21:38:27 door PHP Scripter
Oooohhhh.
1. mysql functies moet je niet nesten
2. als je _fetch_array zo graag wilt gebruiken geef dan op z'n minst de tweede parameter mee, dan ben je je ervan bewust wat je terug krijgt. Maar nog beter gebruik gewoon altijd _fetch_assco
3. maak geen overbodige variabelen aan
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$groep = '~';
while ($row = mysql_fetch_assoc($result)) {
if ($row['ct'] != $groep) {
// hier je categorie
$groep = $row['ct']
}
// hier je subjes
}
?>
$groep = '~';
while ($row = mysql_fetch_assoc($result)) {
if ($row['ct'] != $groep) {
// hier je categorie
$groep = $row['ct']
}
// hier je subjes
}
?>
}
variabelen zo duidelijk mogelijk te maken.
"Het is gebruikelijk om variabelen een korte maar (duidelijke) beschrijvende naam te geven."
En probeer ook om je "Het is gebruikelijk om variabelen een korte maar (duidelijke) beschrijvende naam te geven."
1. Ik weet wat nesten is, maar ik volg je ff niet.
2. Het is niet dat ik _fetch_array zo graag wil gebruiken, maar een vriend van mij raadde aan dat ik _fetch_array gebruik, in plaats van _fetch_assoc. Zelf werk ik altijd met _fetch_assoc en heb ik eerlijk gezegd geen idee wat _fetch_array doet tegenover de _fetch_assoc.
3. Welke overbodige variabelen? Wat bedoel je?
Ik ben nog vrij nieuw in het gebruik van PHP, vandaar.
@PHP Scripter
Ja, dat begrijp ik.
Maar ik heb dit expres zo gedaan, het zijn meer afkortingen.
ct = caterogy title
sct = subcategory title
scd = subcategory description
Gewijzigd op 29/06/2011 22:10:58 door Richard Augspurger
mysql functies moet je niet nesten, als je dat wel doet maak je het onmogelijk je code te debuggen
2. Lees dan:
http://www.php.net/mysql_fetch_array en let hier goed op de 2de parameter, doe voor de gein ook eens een var_dump van het resultaat
http://www.php.net/mysql_fetch_assoc
3. deze
$ct = $c['ct'];
$sct = $c['sct'];
$scd = $c['scd'];
oh en nu zie ik ook nog dat je je strings quote met "" ipv '' en je je variabelen ook niet buiten de quotes haalt. variabalen buiten quotes is overzichtelijker, zie o.a. kleurtjes welke je ook in editors kan hebben
4. duidelijk naamgeving
Het gaat erom dat je je variabelen moet kunnen herkennen en ook nog moet kunnen zien wat de inhoud en type ervan is (string/int/float/boolean) zonder in de code terug te moeten zoeken waar die waarde dan vandaan komt.
Ik ben hier dus gekomen omdat ik vast zit met mijn script, niet omdat ik wil dat jullie mijn code nakijken en gaan bekritiseren/verbeteren. Ik heb eenmaal mijn manier van doen, jullie waarschijnlijk ook.
Ik heb reeds laten zien hoe je dit oplost!
Let nu eens op de ~ staat tussen enkele quotes, en php maakt duidelijk onderscheid tussen '~' en "~".
Bij "~" gaat php-parser alsnog opzoek of er in de string variabelen verstopt zitten, wat bij '~' niet gebeurt. Tja en dat is zonde van die 1000ste miliseconde die php-parser daar aan moet besteden ;-). Maar ja dat is niet het issue.
Gewijzigd op 29/06/2011 23:18:47 door Noppes Homeland
Ik ga het ff verder proberen met hulp van je voorbeeld en ik laat horen of het werkt.
Toevoeging op 29/06/2011 23:20:18:
Nu werkt het zoals ik het wilde.
Hartelijk bedankt!
Zou je misschien je oplossing hier kunnen posten? Dan kunnen andere gebruikers zien wat de oplossing is.
Wat ik heb gedaan was middels het voorbeeld van Noppes Homeland.
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
<?php
$group = "~";
echo '<p>';
while($cat = mysql_fetch_assoc($result))
{
if($cat['cattitle'] != $group)
{
$group = $cat['cattitle'];
echo "<hr style='height: 3px; background-color: black;' /><h2>$cat[cattitle]</strong></h2>";
}
echo "<a href=\"?page=viewcat&subcatid=$cat[subcatid]\">$cat[subcattitle]</a><br />";
}
echo '</p>';
?>
$group = "~";
echo '<p>';
while($cat = mysql_fetch_assoc($result))
{
if($cat['cattitle'] != $group)
{
$group = $cat['cattitle'];
echo "<hr style='height: 3px; background-color: black;' /><h2>$cat[cattitle]</strong></h2>";
}
echo "<a href=\"?page=viewcat&subcatid=$cat[subcatid]\">$cat[subcattitle]</a><br />";
}
echo '</p>';
?>
$group = "~"; geeft een onbelangrijke waarde op, gewoon om de variabel te initializeren.
De while controleerd of $group niet dezelfde waarde heeft als de categorie uit de database met een if statement, als dit zo is, schrijft de while de categorie en schrijft hij de variabel over.
Dit is gedaan om ervoor te zorgen dat elke categorie maar één keer wordt geschreven.
En daarna is het gewoon de subcategoriën koppelen aan een link die een id meegeeft die dan gecontroleerd worden op een andere pagina.