Kommentare unterhalb des Beitrags anzeigen!

Hallo saftmeister,

ich habe es jetzt mal probiert. Habe verschiedene Kommentare eingetragen. Leider werden diese nicht ausgegeben! Es wird immer "Es wurden noch keine Kommentare zu diesem Thema verfasst!" angezeigt.

Ich versteh es einfach nicht...

Nochmals Hallo,

ich habe die Comment-Variablen auf der Seite mal aufrufen wollen, ohne Erfolg! Ich denke das irgendwas mit dem Abfrage/Ausgabe nicht stimmt :(

Mein aktueller Code sieht folgendermaßen aus:

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> Kommentar: <a class="accordion-toggle" data-toggle="collapse" data-parent="" href="#show_comment'. $row['id'] .'">anzeigen</a> | <a href="'. $url .'">verfassen</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="show_comment'. $row['id'] .'" class="comment collapse pagination-centered">
    		<h4>Kommentare zu</h4>
			<p>'. $row['title'] .'</p>
			<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 '<div id="show_comment'. $row['id'] .'" class="comment collapse pagination-centered">
			<h4>Kommentare</h4>
			<div class="alert alert-info">Es wurden noch keine Kommentare zu diesem Thema verfasst!</div>
		</div>';
	}
}

$comment_stmt->close();

Was auf alle Fälle sein muss ist, das die Spalte nid in der Tabelle comments die gleiche sein muss wie id in der Tabelle news_posts!

Die nid in comments ist die selbe wie id in news_posts, ist als Zuordnung für das Kommentar für den jeweiligen Beitrag gedacht ist!

Ich bin schon den ganzen Abend/Morgen daran am arbeiten aber es will nicht gelingen... :(
 
Solche Logikfehler lassen sich am einfachsten mit vernünftigem Debuggen finden und lösen.

Dazu gehört:
-error_reporting(E_ALL) am Anfang rein
-alle zusammengesetzten Queries mal mit echo ausgeben lassen und beuspielsweise mit PHPMA auf das gewünschte resultset hin überprüfen (heißt, ist die Abfrage auch richtig)
-Alle wichtigen Variablen ausgeben lassen (var_dump()) und überprüfen ob der Wert richtig gesetzt ist. Evt auch mehrmals; vielleicht wird die variable ja irgendwo überschrieben....
-Schleifen und andere Konstrukte überpüfen! Testausgaben machen um herauszufinden, was ausgegeben wird und was nicht. (Nacher wiede löschen nicht vergessen :D )
 
Hallo,

also ich habe error_reporting(E_ALL); an, keinerlei Fehlermeldungen...

Ausgabe: var_dump($comment_stmt);
Code:
object(mysqli_stmt)[2]
  public 'affected_rows' => null
  public 'insert_id' => null
  public 'num_rows' => null
  public 'param_count' => null
  public 'field_count' => null
  public 'errno' => null
  public 'error' => null
  public 'error_list' => null
  public 'sqlstate' => null
  public 'id' => null

Ausgabe: var_dump($result);
Code:
object(mysqli_result)[3]
  public 'current_field' => null
  public 'field_count' => null
  public 'lengths' => null
  public 'num_rows' => null
  public 'type' => null

SQL-Befehl:
Code:
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

gibt folgende Fehlermeldung aus:
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? ORDER BY id DESC LIMIT 0, 30' at line 1

Hallo,

also es liegt eindeutig an der oberen SQL-Abfrage! Ich habe Abfrage geändert und den Code etwas umgeschrieben.

Nun wird mir das 3. Kommentar des 3. Beitrag angezeigt! Ich habe aber 3 Kommentare die auch alle als nid = 3 eingetragen sind.

Hoffe Ihr könnt mir irgendwie weiterhelfen?

Hier der aktuelle PHP-Code

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);
}


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> Kommentar: <a class="accordion-toggle" data-toggle="collapse" href="#show_comment'. $row['id'] .'">anzeigen</a> | <a href="'. $url .'">verfassen</a></small>
				</td>
           	</tr>
        </tfoot>
	</table>';
	
	// Kommentare aus der Datenbank auslesen und anzeigen
	$abfrage2 = "SELECT id AS comment_id, title AS comment_title, author AS comment_author, comment AS comment_text, DATE_FORMAT(DATE, GET_FORMAT(DATETIME,'ISO')) AS comment_date FROM comments WHERE nid = ". $row['id'] ." ORDER BY id DESC";
	if (!$comment_stmt = $mysqli->prepare($abfrage2)) {
    	die($mysqli->error);
	}
	
	$total_comm = $comment_stmt->num_rows;
	
	$comment_stmt->execute();
    
	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);
		}
				
		echo '<div id="show_comment'. $row['id'] .'" class="comment collapse pagination-centered">
    		<h4>Kommentare zu</h4>
			<p>'. $row['title'] .'</p>
			<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 '<div id="show_comment'. $row['id'] .'" class="comment collapse pagination-centered">
			<h4>Kommentare</h4>
			<div class="alert alert-info">Es wurden noch keine Kommentare zu diesem Thema verfasst!</div>
		</div>';
	}
}

$comment_stmt->close();

Hallo Leute,

ich wollte mich kurz nochmal bei euch melden. Aktuell habe ich folgenden Code:

PHP:
// Kommentare aus der Datenbank auslesen und anzeigen
	$abfrage2 = "SELECT title AS comment_title, author AS comment_author, comment AS comment_text, DATE_FORMAT(DATE, GET_FORMAT(DATETIME,'ISO')) AS comment_date FROM comments WHERE nid = ? ORDER BY id DESC";
	if (!$comment_stmt = $mysqli->prepare($abfrage2)) {
    	die($mysqli->error);
	}
    
	if(!$comment_stmt->bind_param('i', $row['id'])) {
        die($comment_stmt->error);
    }
	
	$comment_stmt->execute();
	
	$comment_stmt->store_result();
	
	if(!$comment_stmt->bind_result($comment_title, $comment_author, $comment_text, $comment_date)) {
        die($comment_stmt->error);
    }
	
    while ($comment_stmt->fetch()) {
		if($comment_stmt->errno) {
			die($comment_stmt->error);
		}
				
		echo '<div id="show_comment'. $row['id'] .'" class="comment collapse pagination-centered">
    		<h4>Kommentare zu</h4>
			<p>'. $row['title'] .'</p>
			<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>';
	}
	
	$total_comm = $comment_stmt->num_rows;

	if($total_comm == 0) {
	
		echo '<div id="show_comment'. $row['id'] .'" class="comment collapse pagination-centered">
			<h4>Kommentare</h4>
			<div class="alert alert-info">Es wurden noch keine Kommentare zu diesem Thema verfasst!</div>
		</div>';
	}
}

$comment_stmt->close();

Dabei bekomme ich aber wie auch schon oben geschrieben immer nur den 3. Kommentar aus der Tabelle "comments" mit der nid=3 ausgeben!

Dies ist die Tabelle comments

table_comments.jpg


Jemand hat mir geraten es mit

PHP:
while ($commentRow = $comment_stmt->fetch_assoc())

anstelle des obigen Codes zu versuchen!

Da erhalte ich aber immer folgende Fehlermeldung:

Fatal error: Call to undefined method mysqli_stmt::fetch_assoc()

Vielleicht hast ja noch jemand eine Idee...?

Vielen Dank!
andy_tz
 
Hi,

nimm meinen ersten Vorschlag. Nimm das real_query() wieder raus und füge $comment_stmt->execute(); ein. Dann geht alles ;-)

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);
    }
    
    $comment_stmt->execute();
    
    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

Ich hatte lediglich das execute() vergessen.
 
Hallo,

die anzeige der Kommentare funktioniert immer noch nicht richtig! Die 3 Kommentare mit der nid = 3 werden angezeigt, wenn ich bei dem Beitrag 1, 2 und 3 auf "Kommentare anzeigen" klicke!

Der Fehler liegt würde ich sagen an dieser Zeile:
PHP:
echo '<div id="comment'. $comment_id .'" class="comment collapse">

Der Aufruf der
PHP:
'. $comment_id .'
ist in diesem Falle nicht richtig! Es muss über die nid laufen.

Ändere ich aber den o. g. Code in
PHP:
echo '<div id="comment'. $row['.id.'] .'" class="comment collapse">

wird wieder nur das Kommentar mit der ID = 3 und nicht alle 3 Kommentare mit der nid = 3 angezeigt!

Irgendwas stimmt da noch nicht...!
 
Hi und guten Morgen,

ich habe dir bereits eine PN gesendet. Am besten wäre es, wenn du mir mal einen Dump der zwei Tabellen news_posts und comments zukommen lassen würdest. Ich komm mit deinen Erklärungen nicht ganz klar und spekuliere wild rum... Schick mir mal Beispiel-Daten, das Script habe ich ja hier. Dann kann ich es mal selbst ausprobieren.
 
Hallo Leute,

das Thema wird geschlossen...! Habe die passende Antwort erhalten. Nochmals vielen dank an SAFTMEISTER für schnelle Hilfe.
 
Zurück