5

コメント付きのニュース更新システムをプログラミングしています。私は3つのテーブルを持っています。

  1. news_tbl
  2. users_tbl(ニュース投稿の作者)
  3. comments_tbl(外部キーに接続されています-news_id)

を使用した場合と使用しない場合の2つの方法を試しGROUP_CONCATました。

私はこれを試しました:

SELECT *, COUNT(comments_tbl.comments_id) AS `comments_count` 
FROM news_tbl AS n
LEFT JOIN users_tbl AS u
ON n.user = u.username 
LEFT JOIN comments_tbl AS c
ON c.news_id = n.news_id
GROUP BY n.news_id;

動作しますが、最初に書かれたコメントしか表示できませんが、ニュースの更新に添付されたすべてのコメントを表示したいと思います。

コメントにも使用GROUP_CONCATしたので、コメントごとにニュース投稿の重複はありません。それが正しい方法かどうかはわかりませんが、機能します。

私の問題は、ログインシステムがあり、ユーザーがコメントごとに削除ボタンを使用して、コメントを個別に削除できるようにすることです。しかし、コメントを個別に分離し、各コメントからIDを取得する方法がわかりません。PHPを試してみましたexplodeが、うまくいきませんでした。

これは私のコードです:

<?php
require_once('connect.inc.php');
$conn = dbConnect('pdo') or die('no connection');

$sqlquery = "SELECT news_tbl.*, users_tbl.*,
GROUP_CONCAT(comments_tbl.comments_id) AS commentsid,
GROUP_CONCAT(CONCAT ('<hr><h6>Navn: ', comments_tbl.name,'</h6>','<p>',comments_tbl.comment, '</p>') SEPARATOR '<br><br>') AS comments, 
COUNT(comments_tbl.comments_id) AS comments_count
FROM news_tbl
LEFT JOIN comments_tbl ON comments_tbl.news_id = news_tbl.news_id
LEFT JOIN users_tbl ON news_tbl.user = users_tbl.username
GROUP BY news_tbl.news_id
ORDER BY news_tbl.news_id DESC LIMIT 5";

$result = $conn->query($sqlquery);
foreach($result as $row) {
  // AS
  $commentsid = $row['commentsid'];
  $comments = $row['comments'];
  $count = $row['comments_count'];

  //users_tbl
  $username = $row['username'];

  //news_tbl
  $newsid = $row['news_id'];
  $headline = $row['headline'];
  $bodytext = $row['bodytext'];
  $picture = $row['picture'];
  $date = $row['date'];

  //comments_tbl
  $commentid = $row['comments_id'];
  $name = $row['name'];
  $comment = $row['comment'];
?>

  <div class="row-fluid">
    <div class="news">
      <div class="text-left">
        <h3 class="pull-top"><?php echo $headline ?></h3>
          <div class="row-fluid span12">
            <img src="<?php echo 'upload/'.$picture ?>" class="span9 img-news"/>
          </div>
          <div class="row-fluid">
            <div class="span3">
              <p class="author"><i><span class="red">Skrevet af: </span> </i><?php echo $username ?></p>
            </div>
            <div class="span4">
              <p><i ><span class="red">Oprettet:</span> </i> <?php echo $date ?></p>
            </div>
          </div><!--/ End author-row -->
        <!--<p class="author"><i><span class="red">Skrevet af: </span> </i><?php echo $username ?>&nbsp;&nbsp;|&nbsp;&nbsp;<i ><span class="red">Oprettet:</span> </i> <?php echo $date ?></p>-->
        <p class="push-top-bottom"><?php echo $bodytext ?></p>
      </div>
      <hr>
      <p class="text-left pull-top3"> <b><?php echo $count ?> kommentar</b></p>
      <hr class="grey">
      <div class="row-fluid pull-top2">
        <div class="pull-left span12 text-left well">
          <?php echo $comments; ?>
        </div>
        <!-- Opret kommentar -->
        <div class="row-fluid pull-left">
          <form action="insert.php?<?php echo 'news_id=' . $newsid; ?>" method="post" class="pull-left leave-comment">
            <input type="text" name="name" id="name" class="comment" placeholder="Navn" required/> <br> <br>
            <textarea type="text" name="comment" id="comment" class="comment" placeholder="Skriv kommentar" rows="5" required></textarea> <br> <br>
            <input type="submit" value="Opret kommentar" class="btn pull-left"/>
          </form>
        </div>
      </div><!--/ End comments-row -->
    </div><!--/ End news-container -->
  </div><!--/ End news row -->
<?php  
  if (isset($_SESSION['valid_user'])) {
    // onClick slet nyhed med alert box
    echo '<div class="row-fluid">';
    echo '  <div class="pull-left">';
    echo '    <a class="btn btn-danger" onclick="deleteNews('. $newsid.')" style="margin-right:20px;">Slet nyhed</a>';
    echo '    <a href=update.php?news_id='.$newsid.'&username='. $username .' class="btn btn-info">Updater nyhed</a>';
    echo '    <br><br><br><br>';
    echo '  </div>';
    echo '</div>';
  }
?>
  <hr>
<?php  
  //End foreach
}
?> 
4

2 に答える 2

1

関数 GROUP_CONCAT には、結果の連結文字列の長さに制限があります。HTML または潜在的に長いコメントを連結しようとすると、すぐにこの制限に達する可能性が非常に高くなります。

news_tbl から最初のクエリを実行し、news_tbl のすべての一意の ID を使用して PHP で配列を作成する方が良いことがわかりました。次に、2 番目のクエリを実行して、ニュース レコードのすべてのコメントを取得します。例えば:

$sqlquery = "SELECT * FROM news_tbl LIMIT 10";

$result = $conn->query($sqlquery);
$newsIds = array();
foreach($result as $row) {
    $newsIds[] = $row['id'];
}
$sql = "SELECT * FROM comments_tbl WHERE news_id IN (".implode(', ', $newsIds).")";
$result2 = $conn->query($sql);

// process each comment individually from $result2
于 2013-01-12T06:30:05.383 に答える
0

私があなたの質問を正しく理解していれば、group_concat(comments_tbl.comments_id) と現在の group_concat() コンテンツを 1 つの列として表示できますか?

GROUP_CONCAT(CONCAT(comments_tbl.comments_id,'|||','<hr><h6>Navn: ', comments_tbl.name,'</h6>','<p>',comments_tbl.comment, '</p>')) as something

そしてphpで

list($comment_id,$comment_content) = explode('|||',$row['something']);
于 2012-12-19T18:01:53.567 に答える