2015-08-15 49 views
7

我正在參加一些在線課程,並在其中一項練習中爲博客創建兩個表格 - 博客文章和博客文章 - 並通過外鍵連接它們,然後顯示所有內容來自兩者的內容。評論應該僅與特定文章相關聯,同時也允許多個評論。在PHP中顯示和鏈接外鍵內容

我嘗試:

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

這就是我如何在數據庫中插入註釋:

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外鍵的作品好嗎和評論鏈接到一個特定的文章。我想在網頁上轉置它。當我在頁面上插入新文章時,它可以正常工作,但當我嘗試插入該文章的評論時,它將不會顯示它。

如果我將ON blog.content_id = article_comments.content_id更改爲ON blog.content_id = article_comments.blog_id(blog_id是外鍵的字段名稱) - 它將顯示文章的所有評論 - 但它會爲與其關聯的每個評論重複該文章。這有任何意義嗎?我試着盡我所能解釋它..如果您需要進一步澄清,請讓我知道。由於

順便說一句,這是我用來創建外鍵的語句:

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;

編輯:結果我用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 

,你可以得到看到它會複製插入的每條評論的文章。所以我最終得到兩個重複的文章,持有不同的評論。如果如果我有100篇評論,文章都會複製100次

行爲我期待:

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

我在你的問題只看到** SELECT **,但沒有人** INSERT **。所以當你插入數據時,或者當你選擇時有問題? –

+0

@DanilaGanchar現在,我直接通過數據庫接口插入數據,直到我弄清楚如何正確顯示它,因此我的代碼中沒有INSERT語句。所以,我的問題在於展示它。在數據庫中,評論與文章正確關聯。我在頁面上顯示它們的方式似乎是問題所在。我選擇評論或文章的方式很可能存在問題。 – Dominique

+0

你可以打印你的結果從數據庫和你的期望? –

回答

4

試試這個:

 $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

試過了,對於插入的每條評論,文章仍然重複。我想我會試着在while循環中實現這一點,並進行一些調整,你的解決方案應該可以工作。謝謝 – Dominique

+1

我想我明白你的意思。檢查我的答案。 –