2015-08-15 11 views
7

Ich nehme einige Online-Kurse und in einer der Übungen werden wir zwei Tabellen für einen Blog erstellen - Blog-Artikel und Blog-Posts - und verbinden sie durch einen Fremdschlüssel, dann alle anzeigen Inhalt von beiden. Kommentare sollten nur mit einem bestimmten Artikel verknüpft sein und gleichzeitig mehrere Kommentare zulassen.Anzeigen und Verknüpfen von Fremdschlüssel in PHP

Mein Versuch:

function list_articles() { 
    include('core/db/db_connection.php'); 
    $sql = "SELECT blog.title, blog.content, blog.posted_by, blog.date, article_comments.comments, article_comments.comment_by 
      FROM blog LEFT OUTER JOIN article_comments 
      ON blog.content_id = article_comments.content_id 
      WHERE blog.content != '' 
      ORDER BY blog.content_id DESC"; 
    $result = mysqli_query($dbCon, $sql); 
    while ($row = mysqli_fetch_array($result)) { 
     echo 
      "<h5 class='posted_by'>Posted by " . $posted_by = $row['posted_by'] . " on " . $row['date'] . "</h5>" . 
      "<h1 class='content_headers'>" . $title = $row['title'] . "</h1>" . 
      "<article>" . $content = $row['content'] . "</article>" . 
      "<div class='commented_by'>Posted by: " . $row['comment_by'] . "</div>" . 
      "<div class='comments'>Comments: " . $row['comments'] . "</div>"; 
    } 
} 

Und das ist, wie ich Kommentare in der Datenbank bin Einfügen:

function insert_comments($comment_by, $comments) { 
    include('core/db/db_connection.php'); 
    $sql = "SELECT blog.content_id, article_comments.blog_id 
      FROM blog AS blog 
      INNER JOIN article_comments AS article_comments ON article_comments.blog_id > blog.content_id"; 
    mysqli_query($dbCon, $sql); 
} 

phpMyAdmin die Fremdschlüsselwerke in Ordnung und die Kommentare zu einem bestimmten Artikel verbunden sind, . Ich möchte das auf einer Webseite umsetzen. Wenn ich einen neuen Artikel auf der Seite einfüge, funktioniert es gut, aber wenn ich versuche, einen Kommentar für diesen Artikel einzufügen, wird er nicht angezeigt.

Wenn ich ON blog.content_id = article_comments.content_id zu ON blog.content_id = article_comments.blog_id ändern (blog_id ist der Feldname für den Fremdschlüssel) - es werden alle Kommentare für einen Artikel angezeigt - aber es dupliziert diesen Artikel für jeden damit verbundenen Kommentar. Macht das irgendeinen Sinn? Ich habe versucht, es so gut wie möglich zu erklären. Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen. Dank

By the way, ist dies die Aussage, die ich verwendet, um die Fremdschlüssel zu erstellen:

ALTER TABLE article_comments ADD CONSTRAINT comment_blog_fk FOREIGN KEY (blog_id) REFERENCES wt.blog(content_id) ON DELETE NO ACTION ON UPDATE CASCADE;

EDIT: Das Ergebnis, das ich mit ON blog.content_id = article_comments.blog_id

Article title: LOREM IPSUM 
Content: LOREM IPSUM DOLOR SIT AMET.... 
-------------------------------------- 
Name: DSK 
Comment: Great article! 

-- HERE IT DUPLICATES THE ARTICLE TO INSERT A NEW COMMENT -- 

Article title: LOREM IPSUM 
Content: LOREM IPSUM DOLOR SIT AMET.... 
-------------------------------------- 
Name: DSK 
Comment: Great article! - 2nd comment 

Wie bekommen Sie sehen Sie, es dupliziert den Artikel für jeden eingefügten Kommentar. Ich habe also zwei doppelte Artikel mit unterschiedlichen Kommentaren. Wenn Wenn ich 100 Kommentare haben werden, wird der Artikel 100 Mal

Das Verhalten repliziert ich erwarte:

Article title: LOREM IPSUM 
Content: LOREM IPSUM DOLOR SIT AMET.... 
-------------------------------------- \\ COMMENTS \\ 
Name: DSK 
Comment: Great article! 
-------------------------------------- 
Name: DSK 
Comment: Great article! - 2nd comment 
+0

ich in Ihrer Frage sehen nur ** SELECT **, aber niemand ** INSERT **. Also Problem beim Einfügen von Daten oder bei der Auswahl? –

+0

@DanilaGanchar Momentan füge ich Daten direkt über die Datenbankschnittstelle ein, bis ich herausgefunden habe, wie ich sie richtig anzeigen kann, daher keine INSERT-Anweisung in meinem Code. Also, mein Problem liegt darin, es anzuzeigen. In der Datenbank sind Kommentare korrekt mit Artikeln verknüpft. Die Art, wie ich sie auf der Seite anzeige, scheint das Problem zu sein. Mehr als wahrscheinlich gibt es ein Problem mit der Art, wie ich entweder die Kommentare oder die Artikel auswähle. – Dominique

+0

Können Sie Ihr Ergebnis aus db drucken und was Sie erwarten? –

Antwort

4

Versuchen Sie folgendes:

 $posts = array(); 
     $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'password'); 
     // for example all fields 
     $query = $pdo->query(' 
      SELECT * 
       FROM blog AS blog 
      INNER JOIN article_comments AS article_comments ON article_comments.blog_id = blog.content_id 
     '); 

     while ($row = $query->fetch()) { 
      $idContent = $row['content_id']; 

      if (!isset($posts[$idContent])) { 
       $posts[$idContent] = array(
        'posted_by' => $row['posted_by'], 
        'title' => $row['title'], 
        'content' => $row['content'], 
        'comments' => array() 
       ); 
      } 

      $posts[$idContent]['comments'][] = array(
       'comment_by' => $row['comment_by'], 
       'comment' => $row['comment'], 
      ); 

     } 

     foreach ($posts as $post) { 
      echo ' 
       Post: ' . $row['title'] . ' . Posted by: ' . $row['posted_by'] . 
       '<br/>Content: ' . $row['content'] . 
       '<br/>Comments: '; 
      ; 

      foreach ($post['comments'] as $comment) { 
       echo $comment['comment'] . '. Comment by: ' .$row['comment_by'] . '<br/>'; 
      } 

     } 
+0

Versucht, die Artikel noch für jeden eingefügten Kommentar duplizieren. Ich denke, ich werde versuchen, dies in der While-Schleife zu implementieren, mit etwas Anpassung, sollte Ihre Lösung funktionieren. Danke – Dominique

+1

Ich glaube ich habe verstanden was du meinst. Überprüfe meine Antwort. –

Verwandte Themen