Eigener Blog: Kommentare werden mehrfach angezeigt

Hall liebe Tutorials Community!
Ich habe nicht viel Erfahrung mit PHP, habe gerade mal das Quakenet Tutorial durchgemacht. Dann kam ich auf die Idee meine eigene "Blog Software" zuschreiben, mit dem was ich dort gelernt habe. Leider werden nun aber die Kommentare seltsam oft angezeigt. Bei 2 Einträgen im Blog waren alle Kommentare doppelt. Bei 3 Einträgen, waren alle Kommentare 4fach und bei vier Einträgen werden jetzt alle Kommentare 5mal angezeigt, in der Datenbank sind sie nur einmal. Anschauen kann man sich das ganze unter http://blog.psoke.de . Ich poste jetzt hier den PHP Code und hoffe ihr könnt mir helfen.

PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);

readfile('general/header1.html');
echo "AKTUELLES / PS0KE POST - Philipp Stephans Weblog";
readfile('general/header2.html');
echo "<h1>AKTUELLES</h1>";

$db = @new MySQLi(XXX);
if (mysqli_connect_errno()) {
    die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
}

$entries = 'SELECT 
				ID,
				Headline,
				Content,
				Date
			FROM
				blog
			WHERE
				Category = "Aktuelles"
			ORDER BY Date DESC';
			
	
$entryresult = $db->query($entries);
if (!$entryresult) {
    die('Der Query konnte nicht ausgeführt werden: '.$db->error);
}
if ($entryresult->num_rows) {
    while ($row = $entryresult->fetch_assoc()) {
		
		$ID = ($row['ID']);
		
		echo "<!-- ID: ".$ID." -->\n";
		echo "<hr>\n";
		echo "<h2>".($row['Headline'])."</h2>\n";
		echo "\t<div class=\"text\">\n";
		echo ($row['Content'])."\n";
		echo "\t</div>\n";
		echo "\t\t<div class=\"footline\">POSTET ON ".($row['Date'])." | <a  href=\"singleentry.php?id=".$ID."\">PERMA LINK</a> | <a href=\"javascript:show('comments_".$ID."')\">COMMENTS</a></div>\n";
		echo "\t\t\t<div id=\"comments_".$ID."\" class=\"comments\" style=\"display:none;\">\n";
		
		$comments = "SELECT
						blog_comments.author,
						blog_comments.content,
						blog_comments.date,
						url
					FROM
						blog,
						blog_comments
					WHERE
						blog_comments.visible = \"1\"
						AND blog_comments.entry_ID = \"".$ID."\"";

		$commentresult = $db->query($comments);
		if (!$commentresult) {
		    die('Der Query konnte nicht ausgeführt werden: '.$db->error);
		}
		if ($commentresult->num_rows) {
		    while ($row = $commentresult->fetch_assoc()) {
				echo "\t\t\t\t<a href=\"http://".($row['url'])."\" target=\"_blank\"><h3>".($row['author'])."</h3></a>\n";
				echo "\t\t\t\t<div class=\"comment_text\">\n";
				echo ($row['content']);
				echo "\t\t\t\t</div>\n";
				echo "\t\t\t\t<div class=\"comment_footline\">POSTET ON ".($row['date'])."</div>\n";
				
			}
		}
		else {
			echo "Keine Kommentare. Posten Sie einen Kommentar!";
		}
		
		echo "\t\t\t\t<br><input type=\"button\" id=\"showformular_".$ID."\" value=\"Kommentar Schreiben\" onClick=\"javascript:show('postcomment_".$ID."');hide('showformular_".$ID."')\">\n";
		echo "\t\t\t\t\t<form action=\"postcomment.php\" method=\"post\" id=\"postcomment_".$ID."\" style=\"display:none;\">\n";
		echo "\t\t\t\t\t\t<input type=\"button\" id=\"hideformular_".$ID."\" value=\"Ausblenden\" onClick=\"javascript:show('showformular_".$ID."');hide('postcomment_".$ID."')\"><br><br>\n";
		echo "\t\t\t\t\t\t*Name:<br><input type=\"text\" name=\"author\"><br><br>\n";
		echo "\t\t\t\t\t\tWebsite:<br><input type=\"text\" name=\"site\">(ohne http://, mit www.)<br><br>\n";
		echo "\t\t\t\t\t\t*E-Mail-Adresse:<br><input type=\"text\" name=\"mail\">(Wird nicht angezeigt)<br><br>\n";
		echo "\t\t\t\t\t\t*Text:<br><textarea name=\"content\" rows=\"6\" cols=\"40\"></textarea><br><br>\n";
		echo "\t\t\t\t\t\t*Was ist 9 + 3: <input type=\"text\" name=\"captcha\"><br><br>\n";
		echo "\t\t\t\t\t\t<input type=\"hidden\" name=\"entryID\" value=\"".$ID."\">\n";
		echo "\t\t\t\t\t\t<input type=\"submit\" name=\"formaction\" value=\"Eintragen\">\n";
		echo "\t\t\t\t\t\t<input type=\"reset\" name=\"formaction\" value=\"Zur&uuml;ck setzen\">\n";
		echo "\t\t\t\t\t</form>\n";
		echo "\t\t\t</div>\n";
		echo "<!-- / ID: ".$ID." -->\n\n";
    }
}
else {
	echo "<h2>Keine Eintr&aumlge;</h2>\n";
	echo "\t<div class=\"text\">\n";
	echo "Es wurden keine Eintr&auml;ge gefunden.\n";
	echo "\t</div>\n";
}
readfile('general/footer.html');
?>

Das ist die "blog" Tabelle:
http://dl.dropbox.com/u/6274093/sql_blog.png
Das ist die "blog_comments" Tabelle:
http://dl.dropbox.com/u/6274093/sql_blog_comments.png
 
Zuletzt bearbeitet:
PHP:
        $comments = "SELECT
                        blog_comments.author,
                        blog_comments.content,
                        blog_comments.date,
                        url
                    FROM
                        blog,
                        blog_comments
                    WHERE
                        blog_comments.visible = \"1\"
                        AND blog_comments.entry_ID = \"".$ID."\"";
Hier solltest du blog noch mit blog_comments verbinden. So zeigst du zu jedem Blog alle Kommentare.

Also irgendwetwas wie "WHERE blog.id = blog_comments.blog_id AND ..." fehlt da
 
Hier solltest du blog noch mit blog_comments verbinden. So zeigst du zu jedem Blog alle Kommentare.

Also irgendwetwas wie "WHERE blog.id = blog_comments.blog_id AND ..." fehlt da

Ich vergleiche ja garnicht die Tabellen, sonden die $ID, die oben als $row['ID‘] definiert ist. Bei jedem Schleifendurchlauf wird die ja mit der Aktuell gefetchten ID vom Eintrag überschrieben, das stimmt so. Außerdem wird das auf der Homepage schon richtig dargestellt. Das Problem ist ja, das die Einträge für bei dem entsprechenden Eintrag mehrfach angezeigt werden.

Ich hab auch mal die $row in der Kommentar Schleife in $commentrow geändert, da die Variable sonst ja doppelt verwendet wird. Hat auch nichts gebracht :(
 
Zuletzt bearbeitet:
Du hast ein Select auf 2 Tabellen die du nicht verknüpfst. Somit gibt das die Mange von ANzahl Eintrag in A mal Anzahl Einträge in B.
In deinem Fall filterst du nur auf blog_comments. Also hast du
[Anzahl Comments mit der entry_id X]x[Anzahl Einträge in der Tabelle Blogs]
 
Hab ich. Du hast ihn sogar selber zitiert....
SQL:
... WHERE blog.id = blog_comments.blog_id AND ...
 
Zuletzt bearbeitet von einem Moderator:
Zurück