portseven: Ergebnis wird im falschen Bereich angezeigt. PHP (mysql)

Guten Tag.

Ich hab ein kleines Problem.

Erstmal Allgemein gefasst: -Ich habe ein User der ein Beitrag posten kann. Ebenso kann man ein Kommentar senden. Jeder Beitrag wird mit While angezeigt. Das Problem ist, wenn ich auf ein Button klicke und die Kommentare des jeweiligen Beitrags sehen möchte (sagen wir mal, die Kommentare von Beitrag 3) dann wird dies angezeigt jedoch bei dem Beitrag 1.

http://test.liscon.bplaced.net/test.php

Macht euch ein Bild drauß. Drückt bei der Post-Id 3 den Button, da nur da Kommentare vorhanden sind. Bei den anderen passiert nichts da keine Kommentare eingetragen sind.

Sitze seit knapp 2 Tagen an dem Problem & hab alle Methoden ausprobiert. Mir fällt nichts mehr ein bin sehr verwirrt.

<?php

	include 'config/connect.php';
	
	$sql = "
	SELECT
	user.id,
	user.username,
	u_post.p_id,
	u_post.post,
	comments.u_id,
	comments.p_id AS commentid,
	comments.comment,
	comments.date_comment
	
	FROM u_post
	
	LEFT JOIN user
	ON u_post.u_id = user.id
	
	LEFT JOIN comments
	ON user.date_insert = comments.date_comment
	
	LIMIT 5";
	
	$stmt = $pdo->prepare($sql);
	
	if(!$stmt->execute()) {
		print_r($stmt->errorInfo());
	}
	
	
	if(isset($_POST['show'])) {
	$post_nummer = $_POST['post-id'];
	$sql2 = "
	SELECT 
	comments.u_id,
	comments.p_id,
	comments.comment,
	u_post.p_id,
	u_post.u_id,
	u_post.post
	
	FROM comments
	
	LEFT JOIN u_post
	ON comments.p_id = u_post.p_id
	
	WHERE comments.p_id = :p_id";

	
	$result = $pdo->prepare($sql2);
	$result->BindParam(':p_id', $post_nummer);
	if(!$result->execute()) {
		print_r($result->errorInfo());
	}

}


	while($row = $stmt->fetch()) {
	echo '<form action="" method="POST">';
	
		echo '<br>Post-Id: '. $row['p_id'] . '<br>' .  $row['post'] . '<br>';
		
		if(isset($_POST['show'])) {
			while($row2 = $result->fetch()) {
				echo 'Kommentar: ' . $row2['comment'] .'<br>';
			}
		}
		echo '<p><input type="submit" name="show"></p>';
		echo '<p><input type="hidden" name="post-id" value="' . $row['p_id'] . '"></p>';
	echo '</form>';
}

?>

akzeptierte Antworten

  1. Guten morgen,

    Ohne jetzt die ganzen HTML sachen zu berichtigen, tippe ich auf einen kleinen Logik Fehler hier:

    	while($row = $stmt->fetch()) {
    	echo '<form action="" method="POST">';
    	
    		echo '<br>Post-Id: '. $row['p_id'] . '<br>' .  $row['post'] . '<br>';
    		
    		if(isset($_POST['show'])) // Hier mal versuchen die post-id abzufragen um die kommentare                                  bei der richtigen id auszugenben. also `&& $_POST['post-id'] === $row['p_id']`
        {
    			while($row2 = $result->fetch()) {
    				echo 'Kommentar: ' . $row2['comment'] .'<br>';
    			}
    		}
    		echo '<p><input type="submit" name="show"></p>';
    		echo '<p><input type="hidden" name="post-id" value="' . $row['p_id'] . '"></p>';
    	echo '</form>';
    }
    
    ?>
    

    Gruß
    Jo

    1. Hallo j4nk3y,

      yup, das ist der Punkt. Man darf die Kommentare nur bei dem Beitrag einlesen und ausgeben, zu dem sie gehören.

      @@portseven,

      du solltest deine SQLs nochmal überarbeiten. Im ersten SQL verstehe ich diesen Join nicht:

      LEFT JOIN comments
      	ON user.date_insert = comments.date_comment
      

      Warum verknüpfst Du die Kommentare mit dem gleichen Datum? Du verwendest die so ermittelten Spalten nicht, UND du läufst Gefahr, einen Post doppelt anzuzeigen wenn mehr als ein Kommentat zum Tag da ist. Die Kommentare zum Post fragst Du eh mit einer eigenen Query ab.

      Im zweiten Select verstehe ich den JOIN mit u_post nicht. Einen JOIN mit der User-Tabelle wäre sinnvoll, um den Namen des Kommentators anzeigen zu können.

      Rolf

      --
      sumpsi - posui - clusi
    2. Jetzt bin ich perplex. Es hat so geklappt mit der Abfragen...aber das verstehe ich nicht. Ich frage doch lediglich nur ob die Post gleich ist wie die Row ID. Es hat ja nichts mit der Position zu tun sondern ob der Wert mit dem anderen Identisch ist.

      1. Hallo

        Jetzt bin ich perplex. Es hat so geklappt mit der Abfragen...aber das verstehe ich nicht. Ich frage doch lediglich nur ob die Post gleich ist wie die Row ID. Es hat ja nichts mit der Position zu tun sondern ob der Wert mit dem anderen Identisch ist.

        Das passiert bei der Abfrage, aber bei der Ausgabe prüfst du da nichts.

        Nach Ausführung der beiden Abfragen gehst du das Ergebnis der ersten Abfrage in einer Schleife Zeile für Zeile durch. Im ersten Durchlauf, also beim ersten Datensatz des ersten Ergebnisses, gehst du nun unter der Bedingung, dass $_POST['show'] existiert, in die Schleife, um die Ergebniszeilen der zweiten Abfrage auszugeben. Du prüfst bei dieser Ausgabe aber nicht, zu welchem Datensatz der ersten Abfrage die Ergebnisse der zweiten Abfrage gehören.

        Das ist, was @Rolf B gleich zu Beginn seines Postings anmerkte.

        Tschö, Auge

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
      2. Hey,

        Jetzt bin ich perplex. Es hat so geklappt mit der Abfragen...aber das verstehe ich nicht. Ich frage doch lediglich nur ob die Post gleich ist wie die Row ID. Es hat ja nichts mit der Position zu tun sondern ob der Wert mit dem anderen Identisch ist.

        Die Position ändert sich ja mit jedem Iterations Schritt.

        Geh mal die Schleifen Schritt für Schritt in Gedanken durch, und stell dir die selbe Frage wie das was in 'if()' steht. Dann sollte es klar werden.

        Du Fragst ja nur ob es angezeigt werden soll, du fragst aber nicht, ob dies die richtige Stelle (iteration) ist wo es angezeigt werden soll.

        Gruß
        Jo

  2. Dein Fehler kann verschiedene Ursachen haben:

    1. HTML
    2. PHP
    3. DB Design
    4. SQL

    Das würde ich zur weiteren Vorgehensweise zunächst ersteinmal einschränken. MfG