2015-08-15 52 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

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