0

ユーザーがブログを送信し、他のユーザー (ログインしている) がコメントを投稿できる、PHP を使用した単純なサイトを作成します。各ブログの下に「コメント」と呼ばれるリンクを作成しました。クリックすると、特定のブログに関連するすべてのコメントが表示/非表示になります (また、ユーザーがログインしている場合は、新しいコメントを送信できるフォーム フィールドが表示されます)。 . したがって、基本的に各ブログには複数のコメントがあります。私はこれに対して 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);
4

1 に答える 1

0

問題は、最初の例のこのクエリにあります。

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

blog テーブルに対しては既にクエリを実行しているため、再度クエリを実行する必要はありません。これを単純に

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

問題を解決する必要があります。

ただし、考えなければならないことがたくさんあります。

  • なぜ車輪の再発明をしているのですか?世の中には優れたブログ アプリケーションがたくさんあります。そのうちの1つを使用する方がよいでしょう。
  • mysql_ ファミリーの関数を使用することは推奨されなくなりました。離れて、 mysqli_ またはより良いPDOを学びましょう。
  • 関心の分離について学ぶ必要があります。少なくとも、データ アクセス/ビジネス ロジックが表示ロジックから分離されていることを確認する必要があります。MVCは PHP で非常に一般的です。
  • JOIN についても学ぶ必要があります。この単純なインライン スクリプトでも、ループ内にクエリがあり、あまり効率的ではありません。クエリを 1 つに結合できます (内側のクエリで試したように)。違いは、1 つのクエリがメイン ループの外にある必要があることです。
于 2012-04-15T11:25:27.713 に答える