2015-08-15 12 views
7

Bazı çevrimiçi kurslar alıyorum ve alıştırmalardan birinde bir blog için iki tablo oluşturmamız gerekiyor - blog makaleleri ve blog gönderileri - ve bunları yabancı bir anahtarla birbirine bağlayın, sonra tümünü görüntüle her ikisinden de içerik. Yorumlar, yalnızca belirli bir makaleye bağlıyken, birden çok yoruma da izin vermelidir.PHP'de Yabancı Anahtar İçeriğini görüntüleme ve bağlama

girişimim:

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

Ve bu veritabanındaki yorumlarımızı ekleyerek ediyorum nasıl: phpMyAdmin'de

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

yolunda yabancı anahtar eserler ve yorumlar belirli makalesine bağlanmış . Bunu bir web sayfasına aktarmak istiyorum. Sayfada yeni bir makale eklediğimde tamam çalışıyor, ancak bu makaleye bir yorum eklemek istediğimde onu göstermeyecek.

ON blog.content_id = article_comments.content_id - ON blog.content_id = article_comments.blog_id - (blog_id, yabancı anahtarın alan adıdır) değiştirirse - bir makalenin tüm yorumlarını görüntüler - ancak bu, onunla ilişkili her bir yorum için bu makaleyi çoğaltır. Bu bir anlam ifade ediyor mu? Bunu en iyi şekilde açıklamayı denedim. Daha fazla açıklama gerekiyorsa lütfen bildirin.

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: Ben olabildiğince gibi 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 

ile olsun sonuç sayesinde

arada

, bu şimdiye yabancı anahtarı oluşturmak için kullanılan bir ifadedir bakın, eklenen her yorum için makaleyi çoğaltır. Bu yüzden farklı yorumları olan iki tane yinelenen makaleyle sonuçlandım. Ben 100 yorum gerekecek olursa, makale 100 kez

ben bekliyorum davranış çoğaltılmış alacak olursa:

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

sadece ** SELECT **, ancak hiç kimse ** INSERT **. Yani veri eklediğinizde veya seçtiğinizde sorun mu yaşıyorsunuz? –

+0

@DanilaGanchar Şu an için, doğru şekilde nasıl görüntüleneceğini anlayana kadar veri tabanı arayüzüne doğrudan veri ekliyorum, dolayısıyla kodumda INSERT ifadesi yok. Yani, benim problemim onu ​​sergilemede yatıyor. Veritabanında yorumlar doğru şekilde makalelerle ilişkilendirilmiştir. Onları sayfada görüntülemenin yolu sorun gibi görünüyor. Muhtemelen bir konuyla ilgili yorum ya da makaleleri seçiyorum. – Dominique

+0

Sonuçlarınızı db'den ve beklediğinizden basabilir misiniz? –

cevap

4

bu deneyin: Ben sorunuzu bakınız

 $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

Denendi, makaleler eklenen her yorum için hala yineleniyor. Sanırım bunu biraz zaman içinde, adapte edip, çözümün işe yarayacağını deneyeceğim. Teşekkürler – Dominique

+1

Sanırım ne demek istediğini anladım. Cevabımı kontrol et. –