2012-04-15 11 views
0

ユーザーがブログや他のユーザー(ログインしている人)を投稿できる簡単なサイトをPHPで作成すると、コメントを投稿できます。私はクリックしたときに、特定のブログに関連するすべてのコメントを表示/非表示にする(ユーザーがログインしている場合は、新しいコメントを送信できるフォームフィールドを表示する)、各ブログの下に「コメント」というリンクを作成しました。したがって、基本的に各ブログには複数のコメントがあります。私はこれに対して2つの異なるコードを実行しましたが、両方とも同じコメントを2回表示するという問題を抱えています。なぜ誰かが指摘できますか?内側のループの2回実行するループ結果

mysql_select_db ("ooze"); 
$result = mysql_query ("select * from blog") or die(mysql_error()); 
$i = 1; 
while($row = mysql_fetch_array($result)) 
{ 
    echo "<h1>$row[title]</h1>"; 
    echo "<p class ='second'>$row[blog_content]</p> "; 
    echo "<p class='meta'>Posted by .... &nbsp;&bull;&nbsp; $row[date] &nbsp;&bull;&nbsp; <a href='#' onclick=\"toggle_visibility('something$i'); return false\">Comments</a><div id='something$i' style='display: none;'>";  
    $i++; 
    $a = $row["ID"]; 
    $result2 = mysql_query ("select * from blog, blogcomment where $a=blogID") or die(mysql_error()); 
    while($sub = mysql_fetch_array($result2)) 
    { 
    echo "<p class='third' >$sub[commentdate] &nbsp;&bull;&nbsp; $sub[username]</p><p>said:</p> <p>$sub[comment]</p>"; 
    } 
if (isset ($_SESSION["gatekeeper"])) 
{ 
    echo '<form method="post" name="result_'.$row["ID"].'" action="postcomment.php"><input name="ID" type = "hidden" value = "'.$row["ID"].'" /><input name="comment" id="comment" type="text" style="margin-left:20px;"/><input type="submit" value="Add comment" /></form>'; 
} 
else 
{ 
    echo '<p class="third"><a href="register.html">Signup </a>to post a comment</p>'; 
} 
echo "</div>"; 
} 
mysql_close($conn); 

// 2番目のバージョン://

if (isset ($_SESSION["gatekeeper"])) 
{ 
    while($sub = mysql_fetch_array($result2)) 
    { 
    echo "<p class='third' >$sub[commentdate] &nbsp;&bull;&nbsp; $sub[username] said:</p> <p>$sub[comment]</p>"; 
    } 
echo '<form method="post" name="result_'.$row["ID"].'" action="postcomment.php"><input name="ID" type = "hidden" value = "'.$row["ID"].'" /><input name="comment" id="comment" type="text" style="margin-left:20px;"/><input type="submit" value="Add comment" /></form>'; 
} 
else 
{ 
    while($sub = mysql_fetch_array($result2)) 
    { 
    echo "<p class='third' >$sub[commentdate] &nbsp;&bull;&nbsp; $sub[username] said:</p> <p>$sub[comment]</p>"; 
    } 
echo '<p class="third"><a href="register.html">Signup </a>to post a comment</p>'; 
} 
echo "</div>"; 
} 
mysql_close($conn); 
+0

2つ目のクエリをチェックしてください: 'select * from blog、blogcomment where $ a = blogID'あなたは2つのテーブルを結合していますが、' cross join'(http://en.wikipedia .org/wiki/Join_(SQL)#Cross_join) – Yaniro

答えて

0

あなたの問題は、最初の例から、このクエリです。

$result2 = mysql_query ("select * from blog, blogcomment where $a=blogID") 

ブログテーブルを再度クエリする必要はありません。既にクエリを実行しています。これを単に

$result2 = mysql_query ("select * from blogcomment where $a=blogID") 

に変更してください。

しかし、あなたが考える必要があることはたくさんあります。

  • なぜホイールを再発明していますか?そこには多くの良いブログアプリケーションがあります。あなたはそのうちの1つを使う方が良いでしょう。
  • これ以上関数のmysql_ファミリを使用することはお勧めしません。離れてmysqli_またはそれ以上にはまだPDOを学びなさい。
  • separation of concernsについて学ぶ必要があります。少なくとも、データアクセス/ビジネスロジックが表示ロジックとは別のものであることを確認する必要があります。 MVCはPHPで非常に一般的です。
  • また、JOINについても学習する必要があります。この単純なインラインスクリプトでも、非常に効率的ではないループ内でクエリが発生します。クエリを1つにまとめることができます(内側のクエリで試したように)。違いは、1つのクエリがメインループ外にあることです。
+0

私はユニプロジェクトのためにこれをやっていますので、私は講師が見せてくれたものを練習しています。あなたの答えをありがとう – ozzysmith

+0

@ozzysmith十分に公正、私の最初のポイントに答える。他のものはすべてまだ関連性があります。講師があなたが上に投稿したようなコードをデモンストレーションしている場合は、コースにお金を払っていないことを願っています。私はあなたのお金を返すように頼んでいます。 – liquorvicar

関連する問題