【问题标题】:Displaying and linking Foreign Key content in PHP在 PHP 中显示和链接外键内容
【发布时间】:2015-11-08 11:42:17
【问题描述】:

我正在参加一些在线课程,在其中一项练习中,我们将为博客创建两个表 - 博客文章和博客文章 - 并通过外键将它们连接起来,然后显示两者中的所有内容。评论应该只链接到特定的文章,同时也允许多个 cmets。

我的尝试:

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

这就是我在数据库中插入 cmets 的方式:

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 中,外键可以正常工作,并且 cmets 链接到特定文章。我想将其转置在网页上。当我在页面上插入新文章时,它可以正常工作,但是当我尝试为该文章插入评论时,它不会显示它。

如果我将ON blog.content_id = article_comments.content_id 更改为ON blog.content_id = article_comments.blog_id(blog_id 是外键的字段名称) - 它会显示一篇文章的所有 cmets - 但它会为与之关联的每个评论复制该文章。这有任何意义吗?我尽力解释它。如果您需要进一步澄清,请告诉我。谢谢

顺便说一下,这是我用来创建外键的语句:

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

如您所见,它会为插入的每条评论复制文章。所以我最终得到了两篇包含不同 cmets 的重复文章。如果我有 100 个 cmets,这篇文章将被复制 100 次

我期望的行为:

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

【问题讨论】:

  • 我在您的问题中只看到 SELECT,但没有看到 INSERT。插入数据或选择时出现问题?
  • @DanilaGanchar 现在,我直接通过数据库接口插入数据,直到我弄清楚如何正确显示它,因此我的代码中没有 INSERT 语句。所以,我的问题在于显示它。在数据库中,cmets 与文章正确关联。我在页面上显示它们的方式似乎是问题所在。我选择 cmets 或文章的方式很可能存在问题。
  • 你能从 db 打印你的结果吗?
  • @DanilaGanchar 请查看我的编辑,这有助于理解问题吗?

标签: php mysql sql view


【解决方案1】:

试试这个:

        $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/>';
            }

        }

【讨论】:

  • 试过了,插入的每条评论文章仍然重复。我想我会尝试在 while 循环中实现这一点,通过一些调整,你的解决方案应该可以工作。谢谢
  • 我想我明白你的意思了。检查我的答案。
猜你喜欢
  • 2011-01-03
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多