2012-04-15 3 views
0

Я создаю простой сайт с PHP, где пользователи могут отправлять блоги и другие пользователи (которые вошли в систему) могут оставлять комментарии к ним. После каждого блога я сделал ссылку под названием «комментарии», которая при нажатии будет показывать/скрывать все комментарии, относящиеся к конкретному блогу (также если пользователь вошел в систему, он отобразит поле формы, в котором они могут отправлять новые комментарии) , Поэтому в основном каждый блог будет иметь несколько комментариев. Для этого я сделал два разных кода, но у них одинаковая проблема: каждый комментарий появляется дважды (все остальное работает нормально). Может ли кто-нибудь указать, почему?Результаты цикла, выполняющиеся дважды

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

// вторая версия внутреннего цикла: //

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

Проверьте свой второй запрос: 'select * from blog, blogcomment, где $ a = blogID' вы присоединяетесь к двум таблицам, но не указав отношения, которые приводят к' 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") 

должен решить эту проблему.

Однако есть много вещей, о которых вам нужно подумать.

  • Почему вы изобретаете колесо? Там есть много хороших приложений для блогов. Вам будет лучше использовать один из них.
  • Не рекомендуется больше использовать семейство функций mysql_. Уходите и изучайте mysqli_ или еще лучше PDO.
  • Вы должны узнать о separation of concerns. По крайней мере, вы должны убедиться, что ваш доступ к данным/бизнес-логика отделен от вашей логики отображения. MVC очень распространен в PHP.
  • Вы также должны узнать о СОЕДИНЕНИЯХ. Даже в этом простом встроенном скрипте у вас есть запрос в цикле, который не очень эффективен. Вы можете комбинировать свои запросы в один (как вы пробовали с внутренним запросом). Разница заключается в том, что один запрос должен находиться за пределами вашего основного цикла.
+0

Я делаю это для проекта uni, поэтому я просто тренирую материал, который мне показали лекторы. Спасибо за ваш ответ, он работал – ozzysmith

+0

@ozzysmith Достаточно честный, это отвечает на мою первую точку. Остальные все еще актуальны. Надеюсь, вы не платите за курс, если ваши преподаватели демонстрируют код, как вы уже писали выше. Я бы попросил вернуть ваши деньги. – liquorvicar

Смежные вопросы