Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z poprawnym ID przy komentowaniu newsów...
Forum PHP.pl > Forum > Przedszkole
nightmoon
Witam, Panowie mam problem z poprawnym odesłaniem na forum, żeby można było komentować na nim newsa, każde ID przy opcji komentowania jest identyczne, zapewne jest to problem z pętlą ale nie mam za choinkę pojęcia jak to zrobić, kod wygląda następująco:

  1. $res = mysql_query("SELECT * FROM news ORDER BY added DESC LIMIT 5") or sqlerr(__FILE__, __LINE__);
  2.  
  3. if (mysql_num_rows($res) > 0) {
  4. print("<table width=100% border=1 cellspacing=0 cellpadding=10><tr><td align=center>\n");
  5.  
  6. while($array = mysql_fetch_array($res)) {
  7.  
  8. print("<table class='kratka' width=100% border=1 cellspacing=0 cellpadding=5><tr><td class='colhead' colspan='2'>" . gmdate("Y-m-d G:i:s",strtotime($array['added'])) . " - " . $array['title'] . "");
  9.  
  10.  
  11. $ros = mysql_query("SELECT id FROM topics WHERE forumid = 77 ORDER BY id DESC LIMIT 1") or sqlerr();
  12. while ($orr = mysql_fetch_assoc($ros)) {
  13. $topicid = $orr["id"];
  14. }
  15.  
  16. print(" <font class='small'>[<a class=altlink href='forums.php?action=viewtopic&topicid=$topicid'><b><u>Skomentuj</u></b></a>]</font>");
  17.  
  18. if (get_user_class() >= UC_MODERATOR) {
  19. print(" <font class='small'>[<a class=altlink href=news.php?action=edit&newsid=" . $array['id'] . "&returnto=" . urlencode($_SERVER['PHP_SELF']) . "><b><u>Edycja</u></b></a>]</font>");
  20. print(" <font class='small'>[<a class=altlink href=news.php?action=delete&newsid=" . $array['id'] . "&returnto=" . urlencode($_SERVER['PHP_SELF']) . "><b><u>Usuń</u></b></a>]</font></td></tr>");
  21. }
  22. print("<tr><td width='10%'><img src=" . htmlspecialchars($array["img"]) . "></td><td class='text' width='90%'>" . format_comment($array["body"],0) . "</td>");
  23.  
  24.  
  25. print("</tr></table><br>");
  26.  
  27. }
  28.  
  29. }


Jak zmienię zapytanie na:

  1. $ros = mysql_query("SELECT id FROM topics WHERE forumid = 77 ORDER BY id DESC LIMIT 2") or sqlerr();


Wtedy opcja [Skomentuj] przy obudwu postach zmienia wartość na poprzedni temat napisany w forumid = 77 np. 3030...

Jak dopisać tam pętle, żeby to działało?

Zdjęcie:

lukasamd
Zauważ, że przy każdym przebiegu pętli zapytanie wygląda identycznie, więc MUSI pobrać taki sam id, i tu błędu nie ma smile.gif
Błąd jest w logice rozwiązania - skoro nie ma warunku, nie możesz w wewnątrz pętli pobierać czegoś takiego, trzeba zmodyfikowac pierwsze zapytanie:


  1. $res = mysql_query("SELECT n.*, t.id FROM news as n, topics as t WHERE t.forumid = 77 ORDER BY n.added DESC LIMIT 5") or sqlerr(__FILE__, __LINE__);


ew. robisz dwa zapytania:

  1. $res = mysql_query("SELECT * FROM news ORDER BY added DESC LIMIT 5") or sqlerr(__FILE__, __LINE__);
  2. $ros = mysql_query("SELECT id FROM topics WHERE forumid = 77 ORDER BY id DESC LIMIT 5") or sqlerr();


Pętlą pobierasz dane z $res, a w pętli z $ros:

  1. while($array = mysql_fetch_array($res)) {
  2. $orr = mysql_fetch_assoc($ros);
  3. $topicid = $orr["id"];
  4. <-- INNY KOD ->>
  5. }


nightmoon
Dziękuję za pomoc teraz dopiero w 100% zrozumiałem zasadę działania.

Całość ostatecznie wygląda tak i wszystko śmiga smile.gif

  1. $res = mysql_query("SELECT * FROM news ORDER BY added DESC LIMIT 3") or sqlerr(__FILE__, __LINE__);
  2. $ros = mysql_query("SELECT id FROM topics WHERE forumid = 77 ORDER BY id DESC LIMIT 3") or sqlerr();
  3.  
  4. if (mysql_num_rows($res) > 0) {
  5.  
  6. print("<table width=100% border=1 cellspacing=0 cellpadding=10><tr><td align=center>\n");
  7.  
  8. while($array = mysql_fetch_array($res)) {
  9.  
  10. print("<table class='kratka' width=100% border=1 cellspacing=0 cellpadding=5><tr><td class='colhead' colspan='2'>" . gmdate("Y-m-d G:i:s",strtotime($array['added'])) . " - " . $array['title'] . "");
  11.  
  12. $orr = mysql_fetch_assoc($ros);
  13. $topicid = $orr["id"];
  14.  
  15. print(" <font class='small'>[<a class=altlink href='forums.php?action=viewtopic&topicid=$topicid'><b><u>Skomentuj</u></b></a>]</font>");
  16.  
  17. if (get_user_class() >= UC_MODERATOR) {
  18. print(" <font class='small'>[<a class=altlink href=news.php?action=edit&newsid=" . $array['id'] . "&returnto=" . urlencode($_SERVER['PHP_SELF']) . "><b><u>Edycja</u></b></a>]</font>");
  19. print(" <font class='small'>[<a class=altlink href=news.php?action=delete&newsid=" . $array['id'] . "&returnto=" . urlencode($_SERVER['PHP_SELF']) . "><b><u>Usuń</u></b></a>]</font></td></tr>");
  20. }
  21. print("<tr><td width='10%'><img src=" . htmlspecialchars($array["img"]) . "></td><td class='text' width='90%'>" . format_comment($array["body"],0) . "</td>");
  22.  
  23.  
  24. print("</tr></table><br>");
  25.  
  26. }
  27.  
  28. }



Chociaż jeśli dało by radę wytłumaczyć zawartość tego wywołania a raczej zasadę jego działania to był bym również wdzięczny, ponieważ nie mogę go rozszyfrować...

Kod
   1.
      $res = mysql_query("SELECT n.*, t.id FROM news as n, topics as t WHERE t.forumid = 77 ORDER BY n.added DESC LIMIT 5") or sqlerr(__FILE__, __LINE__);


Co to robie pobierz n.*?, t.id forum nes as n, to niby rozumiem ale dalej to samo t t.forumid no nie bardzo :/
lukasamd
Aliasy, aby mysql wiedział o jakie pola w jakich tabelach Ci chodzi, no i żeby skrócić zapis, bo można pisać i tak:

Kod
$res = mysql_query("SELECT news.*, topics.id FROM news, topics WHERE topics.forumid = 77 ORDER BY news.added DESC LIMIT 5") or sqlerr(__FILE__, __LINE__);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.