Kommentare unterhalb des Beitrags anzeigen!

andy_tz

Mitglied
Hallo Leute,

ich versuche jetzt schon seit einiger Zeit meine Kommentare direkt unterhalb des jeweiligen Beitrags anzeigen zu lassen! Habe aber irgendwie Probleme bei der Übermittlung bzw. mit dem Aufruf der jeweiligen ID. Ich weiß nicht wie ich es anstelle das die jeweiligen Kommentare dem jeweiligen Beitrag zugeordnet und ausgegeben werden.

Aufbau der Datenbank:
Code:
CREATE TABLE news_posts (
id INT(11) NOT NULL AUTO_INCREMENT,
title VARCHAR(70) NOT NULL,
author VARCHAR(50) NOT NULL,
post TEXT NOT NULL,
DATE DATETIME NOT NULL,
PRIMARY KEY (id)
)


CREATE TABLE comments (
id INT(11) NOT NULL AUTO_INCREMENT,
nid INT(11) NOT NULL,
title VARCHAR(70) NOT NULL,
author VARCHAR(50) NOT NULL,
comment TEXT NOT NULL,
DATE DATETIME NOT NULL,
PRIMARY KEY (id)
)


news.php (Anzeige der NEWS/Kommentare)
PHP:
// Einträge aus der Datenbank auslesen und anzeigen 
$abfrage = "SELECT id, title, author, post, DATE_FORMAT(date, GET_FORMAT(DATETIME,'ISO')) as sd FROM news_posts ORDER BY id DESC";

$result = $mysqli->query($abfrage);


while ($row = $result->fetch_assoc()) {
	
	echo '<table class="table table-bordered news">
       	<thead>
           	<tr>
               	<th colspan="3"># '. $row['id'] .' | '. $row['title'] .'</th>
			</tr>
		</thead>
        <tbody>
           	<tr>
               	<td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['post']))) .'</td>
           	</tr>
        </tbody>
		<tfoot>
           	<tr>
           		<td colspan="3">
					<small>Beitrag von: '. $row['author'] .' | '. $row['sd'] .'</small>
					<small class="pull-right"><i class="icon-comment"></i> <a class="accordion-toggle" data-toggle="collapse" data-parent="#" href="#comment'. $row['id'] .'">Kommentar(e)</a></small>
				</td>
           	</tr>
        </tfoot>
	</table>
	<div id="comment'. $row['id'] .'" class="comment collapse">
    	<div>

			// Hier sollen die Kommentare ausgegeben werden...

		</div>
	</div>';
}

Ich hoffe Ihr könnt mir weiterhelfen******
 
Hey andy_tz,

kann es sein, dass LEFT bzw. RIGHT JOIN die Lösung für dich ist?
SQL:
SELECT n.id, n.title, n.author, n.post, DATE_FORMAT(n.date, GET_FORMAT(DATETIME,'ISO')) as sd, c.id as comment_id, c.title as comment_title, c.author as comment_author, c.comment, DATE_FORMAT(c.date, GET_FORMAT(DATETIME,'ISO')) as comment_date
FROM news_posts n LEFT JOIN comments c
ON n.id = c.nid
ORDER BY id DESC;
Ist ungetestet!

Hoffe wie gesagt, dass es war was du gesucht hast ;)

Schöne Grüße,
Mainz007
 
Hallo Mainz007,

vielen Dank für deine schnelle Antwort. Ich glaub schon, dass das die Funktion ist die ich benötige. Müsste dann aber noch wissen, wie ich dies in meiner news.php richtig einbinde bzw. wie die Ausgabe aussehen muss...

PHP:
while ($row = $result->fetch_assoc()) { 
     
    echo '<table class="table table-bordered news"> 
           <thead> 
               <tr> 
                   <th colspan="3"># '. $row['id'] .' | '. $row['title'] .'</th>
             </tr> 
        </thead> 
        <tbody> 
               <tr> 
                   <td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['post']))) .'</td>
                </tr> 
        </tbody> 
        <tfoot> 
               <tr> 
                   <td colspan="3"> 
                    <small>Beitrag von: '. $row['author'] .' | '. $row['sd'] .'</small>
                     <small class="pull-right"><i class="icon-comment"></i> <a class="accordion-toggle" data-toggle="collapse" data-parent="#" href="#comment'. $row['id'] .'">Kommentar(e)</a></small>
                 </td> 
               </tr> 
        </tfoot> 
    </table> 
    <div id="comment'. $row['id'] .'" class="comment collapse"> 
        <div> 

            // Hier sollen die Kommentare ausgegeben werden...

        </div> 
    </div>'; 
}

Nochmals Danke!
 
Hey andy_tz,

klar, also die Funktion ersetzt einfach die alte. Der Teil mit dem post bleibt gleich und die einzelnen Felder kannst du dann aufrufen über $row['comment_id'], $row['comment_author'], usw. Immer das was nach dem AS steht (du rufst ja auch das Datum vom Beitrag mit AS sd auf und dann $row['sd'].

Schöne Grüße,
Mainz007
 
Hallo,

also ich habe jetzt folgenden Code:

news.php (komplette Datei)
PHP:
<?php

// aktuellen Dateipfad ermitteln, wichtig fuer die Links der Seitennavigation
$pfad = $_SERVER['PHP_SELF'];


// Datenbank auslesen
$query = "SELECT id FROM news_posts";
$result = $mysqli->query($query);


// Anzahl der Datensaetze die Pro Seite angezeigt werden sollen
$datensaetze_pro_seite = "10";


// Anzahl der Links die in der Seitenavigation ausgegeben werden
$p = "5";


// liefert die Anzahl der Datensaetze der Abfrage
$total = $result->num_rows;


// Berechnet die Seitenanzahl insgesamt
$seiten = ceil($total / $datensaetze_pro_seite);


if(empty($_GET['page'])) {

    $page = 1;

} elseif($_GET['page'] <= 0 || $_GET['page'] > $seiten) {

    $page = 1;

} else {

    $page = $mysqli->real_escape_string($_GET['page']);
}


// Linkkette bilden
$links = array();


// Seite die vor der aktuellen Seite kommt definieren
if(($page - $p) < 1) { $davor = $page - 1;  } else { $davor = $p; }            


// Seite die nach der aktuellen Seite kommt definieren
if(($page + $p) > $seiten) { $danach = $seiten - $page; } else { $danach = $p; }   


// Variable definieren     
$off = ($page - $davor);


// Link definieren => Zur Erste Seite springen
if ($page- $davor > 1) {
    $first = 1;
       $links[] = "<a href=\"$pfad?page=$first\" title=\"Erste Seite\">&laquo; Erste ...</a>\n";      
}      


// Link definieren => eine Seite zurueck blaettern
if($page != 1) {          
    $prev = $page-1;
    $links[] = "<a href=\"$pfad?page=$prev\" title=\"Seite zurück\"> &laquo;</a>\n";     
}

   
// Einzelne Seitenlinks erzeugen  
for($i = $off; $i <= ($page + $danach); $i++) {

	if ($i != $page) {           
  		// Link definieren 
    	$links[] = "<a href=\"$pfad?page=$i\">$i</a>\n";
        
	} elseif($i == $seiten) {             
        // aktuelle Seite, ein Link ist nicht erforderlich
		$links[] = "<span class=\"current\">[ $i ]</span>\n";  
        
  	} elseif($i == $page) {             
  		// aktuelle Seite, ein Link ist nicht erforderlich
        $links[] = "<span class=\"current\">[ $i ]</span>\n";     
  	}     
}                


// Link definieren => eine Seite weiter blaettern
if($page != $seiten) {       
    $next = $page+1;
    $links[] = "<a href=\"$pfad?page=$next\" title=\"Seite vor\"> &raquo; </a>\n";
}      


// Link definieren => Zur letzen Seite springen
if($seiten - $page - $p > 0 ) {   
    $last = $seiten; 
    $links[] = "<a href=\"$pfad?page=$last\" title=\"Letzte Seite\">... Letzte &raquo;</a>\n";
}      


// Startwert für die Datenbank berechnen
$start = ($page-1) * $datensaetze_pro_seite;


// Zusammenfuegen der einzelnen Links zu einem String
$link_string = implode(" ", $links);


// Einträge aus der Datenbank auslesen und anzeigen 
$abfrage = "SELECT id, title, author, post, DATE_FORMAT(date, GET_FORMAT(DATETIME,'ISO')) as sd FROM news_posts ORDER BY id DESC LIMIT $start,$datensaetze_pro_seite";
$result = $mysqli->query($abfrage);


// Kommentare aus der Datenbank auslesen und anzeigen
$abfrage2 = "SELECT n.id, n.title, n.author, n.post, DATE_FORMAT(n.DATE, GET_FORMAT(DATETIME,'ISO')) AS sd, c.id AS comment_id, c.title AS comment_title, c.author AS comment_author, c.comment, DATE_FORMAT(c.DATE, GET_FORMAT(DATETIME,'ISO')) AS comment_date FROM news_posts n LEFT JOIN comments c ON n.id = c.nid ORDER BY id DESC";
$comment = $mysqli->query($abfrage2);

$total_comm = $comment->num_rows;


while ($row = $result->fetch_assoc()) {
	
	$url = 'news/comments.php?id='. $row['id'];
	
	echo '<table class="table table-bordered news">
       	<thead>
           	<tr>
               	<th colspan="3"># '. $row['id'] .' | '. $row['title'] .'</th>
			</tr>
		</thead>
        <tbody>
           	<tr>
               	<td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['post']))) .'</td>
           	</tr>
        </tbody>
		<tfoot>
           	<tr>
           		<td colspan="3">
					<small>Beitrag von: '. $row['author'] .' | '. $row['sd'] .'</small>
					<small class="pull-right"><i class="icon-comment"></i> <a class="accordion-toggle" data-toggle="collapse" data-parent="#" href="#comment'. $row['id'] .'">Kommentar(e)</a></small>
				</td>
           	</tr>
        </tfoot>
	</table>';
	
	if ($total_comm > 1) {
			
		while ($row = $comment->fetch_assoc()) {
				
			echo '<div id="comment'. $row['id'] .'" class="comment collapse">
    			<div>
					<table class="table table-bordered news">
       					<thead>
           					<tr>
               					<th colspan="3">'. $row['comment_title'] .'</th>
							</tr>
						</thead>
        				<tbody>
           					<tr>
               					<td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['comment']))) .'</td>
           					</tr>
        				</tbody>
						<tfoot>
           					<tr>
           						<td colspan="3">
									<small>Beitrag von: '. $row['comment_author'] .' | '. $row['comment_date'] .'</small>
								</td>
           					</tr>
        				</tfoot>
					</table>
				</div>
			</div>';
		}
	
	} else {
		
		echo 'Es wurden noch keine Kommentare zu diesem Thema geschrieben!';
	}
}


// Seitennavigation ausgeben
if ($total > 1) {
	
	echo '<div class="pagination pagination-centered pagination-small">
		<ul>
			<li>'. $link_string .'</li>
		</ul>
		<p>Seite ' .$page. ' von ' .$seiten. '</p>
	</div>';

} else {
	
	echo '<div class="pull-right"><p>Es wurden noch keine Beiträge eingetragen!</p></div>';
	
}

$mysqli->close();

?>

Die Einträge werden ganz normal angezeigt. Wenn ich bei einen Eintrag dann auf den Link "Kommentare" klicke, sollten eigentlich nur die Kommentare zu diesem Eintrag angezeigt werden. Es ist aber so, dass dieser Code-Bereich:

PHP:
if ($total_comm > 1) {
			
		while ($row = $comment->fetch_assoc()) {
				
			echo '<div id="comment'. $row['id'] .'" class="comment collapse">
    			<div>
					<table class="table table-bordered news">
       					<thead>
           					<tr>
               					<th colspan="3">'. $row['comment_title'] .'</th>
							</tr>
						</thead>
        				<tbody>
           					<tr>
               					<td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['comment']))) .'</td>
           					</tr>
        				</tbody>
						<tfoot>
           					<tr>
           						<td colspan="3">
									<small>Beitrag von: '. $row['comment_author'] .' | '. $row['comment_date'] .'</small>
								</td>
           					</tr>
        				</tfoot>
					</table>
				</div>
			</div>';
		}
	
	} else {
		
		echo 'Es wurden noch keine Kommentare zu diesem Thema geschrieben!';
	}

immer NUR im obersten Eintrag geöffnet wird, egal auf welche Kommentar-Link ich klicke (ID 2 / ID 1)...

Irgendwas stimmt doch da nicht, ich weiß aber leider immernoch nicht was! :(
 
Der Join ist völlig unnötig und könnte hier sogar das Problem verursachen, das nur ein Eintrag angezeigt wird. Du setzt ohnehin 2 Queries ab, der zweiter für die Comments benötigt lediglich eine WHERE mit nid=$aktuelle_news_id aus der $row für die News. Du solltest evtl auch 2 Variablen für die Rows verwenden, damit es keine Verwechslung gibt.

Die IF-Abfrage, ob es Kommentare gibt, kannst du dir auch sparen. Der Code-Body für das Auslesen der Kommentare innerhalb der while wird ohnehin nur ausgeführt, wenn Einträge gefunden worden sind. Du solltest in jedem Falle unbuffered Results (siehe http://php.net/manual/en/mysqli.real-query.php) verwenden, um an die Anzahl der Kommentare zu kommen, bevor alle ausgelesen werden. Alles in allem könnte es so funktionieren:

PHP:
// Einträge aus der Datenbank auslesen und anzeigen 
$abfrage = "SELECT id, title, author, post, DATE_FORMAT(date, GET_FORMAT(DATETIME,'ISO')) as sd FROM news_posts ORDER BY id DESC LIMIT $start,$datensaetze_pro_seite";
if($mysqli->real_query($abfrage))
	$result = $mysqli->use_result();
else {
	die($mysqli->error);
}

// Kommentare aus der Datenbank auslesen und anzeigen
$abfrage2 = "SELECT c.id AS comment_id, c.title AS comment_title, c.author AS comment_author, c.comment, DATE_FORMAT(c.DATE, GET_FORMAT(DATETIME,'ISO')) AS comment_date FROM comments c WHERE nid = ? ORDER BY id DESC";
if(!$comment_stmt = $mysqli->prepare($abfrage2)) {
	die($mysqli->error);
}

while ($row = $result->fetch_assoc()) {
    
    $url = 'news/comments.php?id='. $row['id'];
    
    echo '<table class="table table-bordered news">
           <thead>
               <tr>
                   <th colspan="3"># '. $row['id'] .' | '. $row['title'] .'</th>
            </tr>
        </thead>
        <tbody>
               <tr>
                   <td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['post']))) .'</td>
               </tr>
        </tbody>
        <tfoot>
               <tr>
                   <td colspan="3">
                    <small>Beitrag von: '. $row['author'] .' | '. $row['sd'] .'</small>
                    <small class="pull-right"><i class="icon-comment"></i> <a class="accordion-toggle" data-toggle="collapse" data-parent="#" href="#comment'. $row['id'] .'">Kommentar(e)</a></small>
                </td>
               </tr>
        </tfoot>
    </table>';
    
    $total_comm = 0;
    if(!$comment_stmt->bind_param('i', $row['id']))
    {
    	die($comment_stmt->error);
    }
    if(!$comment_stmt->bind_result($comment_id, $comment_title, $comment_author, $comment_text, $comment_date))
    {
    	die($comment_stmt->error);
    }
    while ($comment_stmt->fetch()) {
    	      if($comment_stmt->errno)
    	      {
    	      	die($comment_stmt->error);
    	      }
            $total_comm++;
            echo '<div id="comment'. $comment_id .'" class="comment collapse">
                <div>
                    <table class="table table-bordered news">
                           <thead>
                               <tr>
                                   <th colspan="3">'. $comment_title .'</th>
                            </tr>
                        </thead>
                        <tbody>
                               <tr>
                                   <td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $comment_text))) .'</td>
                               </tr>
                        </tbody>
                        <tfoot>
                               <tr>
                                   <td colspan="3">
                                    <small>Beitrag von: '. $comment_author .' | '. $comment_date .'</small>
                                </td>
                               </tr>
                        </tfoot>
                    </table>
                </div>
            </div>';
    }
    
    if($total_comm == 0) {
        echo 'Es wurden noch keine Kommentare zu diesem Thema geschrieben!';
    }
}
// Aufräumen
$comment_stmt->close();


// Seitennavigation ausgeben

PS: Nutze die Prepared Statements, wo immer möglich ;-)
 
Hallo saftmeister,

vielen Dank für deine schnelle und ausführliche Antwort. Ich bekomm immer eine Fehlermeldung:

Commands out of sync; you can't run this command now


A.2.13. Command out of sync-Fehler in Client

Wenn Commands out of sync; you can't run this command now in Ihrem Clientcode gemeldet wird, rufen Sie Clientfunktionen in der verkehrten Reihenfolge auf.

Dies kann zum Beispiel geschehen, wenn Sie mysql_use_result() benutzen und versuchen, eine neue Anfrage auszuführen, ehe Sie mysql_free_result() aufgerufen haben. Oder wenn Sie versuchen, zwei Anfragen, die Daten liefern, auszuführen, ohne dazwischen mysql_use_result() oder mysql_store_result() aufzurufen.

Kannst du mir da weiterhelfen...?
 
Ok, ich wusste das auch nicht, dass das mit dem unbuffered Result so funktioniert. In diesem Falle empfehle ich, für den ersten Query wieder ohne unbuffered zu arbeiten, also deinen originalen Code zu verwenden (nur für den ersten). Das dürfte dann so aussehen:

PHP:
// Einträge aus der Datenbank auslesen und anzeigen 
$abfrage = "SELECT id, title, author, post, DATE_FORMAT(date, GET_FORMAT(DATETIME,'ISO')) as sd FROM news_posts ORDER BY id DESC LIMIT $start,$datensaetze_pro_seite";
if( !$result = $mysqli->query($abfrage) ) {
    die($mysqli->error);
}
 
// Kommentare aus der Datenbank auslesen und anzeigen
$abfrage2 = "SELECT c.id AS comment_id, c.title AS comment_title, c.author AS comment_author, c.comment, DATE_FORMAT(c.DATE, GET_FORMAT(DATETIME,'ISO')) AS comment_date FROM comments c WHERE nid = ? ORDER BY id DESC";
if(!$comment_stmt = $mysqli->prepare($abfrage2)) {
    die($mysqli->error);
}
 
while ($row = $result->fetch_assoc()) {
    
    $url = 'news/comments.php?id='. $row['id'];
    
    echo '<table class="table table-bordered news">
           <thead>
               <tr>
                   <th colspan="3"># '. $row['id'] .' | '. $row['title'] .'</th>
            </tr>
        </thead>
        <tbody>
               <tr>
                   <td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $row['post']))) .'</td>
               </tr>
        </tbody>
        <tfoot>
               <tr>
                   <td colspan="3">
                    <small>Beitrag von: '. $row['author'] .' | '. $row['sd'] .'</small>
                    <small class="pull-right"><i class="icon-comment"></i> <a class="accordion-toggle" data-toggle="collapse" data-parent="#" href="#comment'. $row['id'] .'">Kommentar(e)</a></small>
                </td>
               </tr>
        </tfoot>
    </table>';
    
    $total_comm = 0;
    if(!$comment_stmt->bind_param('i', $row['id']))
    {
        die($comment_stmt->error);
    }
    if(!$comment_stmt->bind_result($comment_id, $comment_title, $comment_author, $comment_text, $comment_date))
    {
        die($comment_stmt->error);
    }
    while ($comment_stmt->fetch()) {
              if($comment_stmt->errno)
              {
                die($comment_stmt->error);
              }
            $total_comm++;
            echo '<div id="comment'. $comment_id .'" class="comment collapse">
                <div>
                    <table class="table table-bordered news">
                           <thead>
                               <tr>
                                   <th colspan="3">'. $comment_title .'</th>
                            </tr>
                        </thead>
                        <tbody>
                               <tr>
                                   <td colspan="3">'. nl2br(htmlspecialchars(preg_replace('~\S{30}~', '\0 ', $comment_text))) .'</td>
                               </tr>
                        </tbody>
                        <tfoot>
                               <tr>
                                   <td colspan="3">
                                    <small>Beitrag von: '. $comment_author .' | '. $comment_date .'</small>
                                </td>
                               </tr>
                        </tfoot>
                    </table>
                </div>
            </div>';
    }
    
    if($total_comm == 0) {
        echo 'Es wurden noch keine Kommentare zu diesem Thema geschrieben!';
    }
}
// Aufräumen
$comment_stmt->close();
 
 
// Seitennavigation ausgeben

Sonst könnte der Umbau komplizierter werden ;-)
 
Hallo,

nochmals Danke für deine Antwort. Ich werde es morgen alles in Ruhe testen. Die Anzeige funktioniert jetzt auf alle Fälle.

Ich habe gesehen das du den folgenden HTML-Code

HTML:
<div id="comment'. $row['id'] .'" class="comment collapse">

in

HTML:
<div id="comment'. $comment_id .'" class="comment collapse">

geändert hast. Das geht durch die JS-Funktion
Code:
data-toggle="collapse"
nicht. Ansonsten wird der o. g. DIV-Container per Link nicht geöffnet.

Ich hoffe nur dass das keinen Einfluss auf die Ausgabe der Kommentare hat?
 
Warum sollte das mit JS kollidieren? Ich habe lediglich eine PHP-Variable durch eine andere ersetzt. JS sollte das nicht jucken.
 
Zurück