Hallo.

Ik probeer zelf een forum te maken met php, maar loop tegen een probleempje aan. Ik heb dus boards en threads, en leden die berichten kunnen plaatsen. Nu wil ik onder de naam van het lid het aantal posts laten zien.

Ik zal eerst even uitleggen hoe mijn database eruit ziet.
-leden
-board(id,naam,oprichter,categorie)
-thread(id,onderwerp,bericht,boardid,tijd,oprichter)
-reply(id,naam,bericht,tijd,threadid)

Hier is dan de manier hoe ik het probeer op te lossen:


<?php
$sql = 'SELECT * FROM `thread` where `id` = \'' . $_GET['id'] . '\'';
		$result = mysql_query($sql)or die (mysql_error());
		//$inhoudCategorie = mysql_result($result , 0);
		while($thread = mysql_fetch_assoc($result))
		{
			echo '<h1>' . $thread['onderwerp'] . '</h1>';
			?>
			<div class="postborder">
				<table border="0">
					<tr>
						<td>
							<table width="150" border="0">
								<tr>
									<td align="center">
										<?php
										echo $thread['oprichter'];
										?>
									</td>
								</tr>
								<tr>
									<td align="center">
										<img src="img/ava.gif">
									</td>
								</tr>
								<tr>
									<td align="center">
										<?php
											$teller=0;
											$sql = 'SELECT * FROM `thread` where `oprichter` = \'' . $thread['oprichter'] . '\'';
											$result = mysql_query($sql)or die (mysql_error());
											while($counter = mysql_fetch_assoc($result))
											{
												$teller++;
											}
											$sql = 'SELECT * FROM `reply` where `naam` = \'' . $thread['oprichter'] . '\'';
											$result = mysql_query($sql)or die (mysql_error());
											//$inhoudCategorie = mysql_result($result , 0);
											while($counter2 = mysql_fetch_assoc($result))
											{
												$teller++;
											}
											//echo $teller;
											//einde teller
											echo $teller;
										?>
									</td>
								</tr>
							</table>
						</td>
						<td width="400" valign="top">
							<div class="post">
								<?php
									echo stripslashes(nl2br($thread['bericht']));
								?>
							</div>
						</td>
					</tr>
				</table>
			</div>
			<?php
		}

		$sql = 'SELECT * FROM `reply` where `threadid` = \'' . $_GET['id'] . '\'';
		$result = mysql_query($sql)or die (mysql_error());
		//$inhoudCategorie = mysql_result($result , 0);
		while($reply = mysql_fetch_assoc($result))
		{
			?>
			<div class="postborder">
				<table border="0">
					<tr>
						<td>
							<table width="150" border="0">
								<tr>
									<td align="center">
										<?php
										echo $reply['naam'];
										?>
									</td>
								</tr>
								<tr>
									<td align="center">
										<img src="img/ava.gif">
									</td>
								</tr>
								<tr>
									<td align="center">
											<?php
											$teller=0;
											$sql = 'SELECT * FROM `thread` where `oprichter` = \'' . $reply['naam'] . '\'';
											$result = mysql_query($sql)or die (mysql_error());
											while($counter = mysql_fetch_assoc($result))
											{
												$teller++;
											}
											$sql = 'SELECT * FROM `reply` where `naam` = \'' . $reply['naam'] . '\'';
											$result = mysql_query($sql)or die (mysql_error());
											//$inhoudCategorie = mysql_result($result , 0);
											while($counter2 = mysql_fetch_assoc($result))
											{
												$teller++;
											}
											//echo $teller;
											//einde teller
											echo $teller;
											?>
									</td>
								</tr>
							</table>
						</td>
						<td width="400" valign="top">
							<div class="post">
								<?php
									echo stripslashes(nl2br($reply['bericht']));
								?>
							</div>
						</td>
					</tr>
				</table>
			</div>
			<?php
		}
?>


De eerste while haalt dus heel eenvoudig de post van de threadstarter uit de database. Die while wordt dus maar 1x doorlopen(kan hem er net zo goed uithalen, ik weet het :P ), en daaronder zie je dus 2 while loopjes die de replies telt, maar ook de posts van de threadstarter, anders krijgt de threadstarter geen posts, en dit werkt.

Daaronder staat dus de while voor de replies. In die while heb ik ook weer 2 while loopjes staan die alles telt, maar dan loopt hij maar één keer de while loop door. Als ik deze 2 while's eruit haalt, krijg ik wel meer posts te zien.

Ik denk dat het komt omdat ik een while in een while heb, maar ik dacht dat dat wel zou werken. Maarja, wat zijn de oplossingen hiervoor?
Ik ben gewoon opzoek naar een simpel script die er gewoon steeds bij $teller optelt, van ieder gebruiker, uit de database thread EN reply.

Ik weet dat mijn website niet geniaal is, maar kun je mij helpen met dit script of niet?
Gewoon iets als:

mysql_query("UPDATE leden SET postscounter = postscounter+1 WHERE id='".$_SESSION['id']."'");

Die Session kan je e.v.t. vervangen door een andere manier hoe jij je van de ingelogde gebruikers hun ID/username opvraagt.
Dit gebruik je dan bij elke INSERT.


Maar elke keer verbinding maken/ verbreken kost ontzettend veel resources.

Ik neem aan dat je alle data van jouw als ingelogd lid al in een array zet.
Dat is al een stuk makkelijker dan mijn manier. Maar nog steeds loop ik dan op hetzelfde probleem dat ik een while loop in een while loop heb, waardoor hij de eerste while maar één keer doorloopt.

Mijn code ziet er nu zo uit.

<?php
$sql = 'SELECT * FROM `reply` where `threadid` = \'' . $_GET['id'] . '\'';
		$result = mysql_query($sql)or die (mysql_error());
		//$inhoudCategorie = mysql_result($result , 0);
		while($reply = mysql_fetch_assoc($result))
		{
			?>
			<div class="postborder">
				<table border="0">
					<tr>
						<td>
							<table width="150" border="0">
								<tr>
									<td align="center">
										<?php
										echo $reply['naam'];
										?>
									</td>
								</tr>
								<tr>
									<td align="center">
										<img src="img/ava.gif">
									</td>
								</tr>
								<tr>
									<td align="center">
										<?php
										//var_dump($_SESSION['naam']);
										$sql = 'SELECT * FROM `leden` where `naam` = \'' . $_SESSION['naam'] . '\'';
										$result = mysql_query($sql)or die (mysql_error());
										while($counter = mysql_fetch_assoc($result))
										{
											echo $counter['postscounter'];
										}
										?>
									</td>
								</tr>
							</table>
						</td>
						<td width="400" valign="top">
							<div class="post">
								<?php
									echo stripslashes(nl2br($reply['bericht']));
								?>
							</div>
						</td>
					</tr>
				</table>
			</div>
			<?php
		}
?>


Maar eigenlijk nog hetzelfde probleem. In ieder geval al bedankt want dit vind ik inderdaad beter.
Waarom zet je gewoon de berichten niet in 1 tabel. Threads zijn in het algemeen de onderwerpen zelf, die een 1-op-veel relatie hebben. Die bevatten verder de instellingen en gegevens voor de thread (gestart door, topictitel, status) en daar vallen geen berichten onder.
Inderdaad, je datamodel is fout als je topics en posts in 1 tabel hebt.
Hm, ja daarmee zou ik dit ene probleem mee kunnen verhelpen, maar ik heb dit probleem op meer plaatsen in mijn site. Een voorbeeldje; in mijn index pagina, heb ik een while met alle onderwerpen (bv sport,muziek etc.) Forums hebben dan altijd aan de rechter kant dat je kan zien wie de laatste post geplaatst heeft, dus daar heb je ook een while in een while voor nodig. Hetzelfde verhaal in me boards overzicht waar al de threads staan.
Kortom, ik heb echt een oplossing/alternatief nodig om while's in while's te hebben.

EDIT

Ik heb t al, deze sql werkt perfect.

$sql = 'SELECT * FROM `reply` JOIN `leden` ON `leden`.`naam` = `reply`.`naam` WHERE `threadid` = \'' . $_GET['id'] . '\'';

Bedankt voor de help :)

Reageren