Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]System komentarzy
Forum PHP.pl > Forum > Przedszkole
kamil1114
Proszę o pomoc , nakierowanie mnie , bo nie wiem jak się za to zabrać Mam system newsów , które dodaje co jakiś czas nowsze i mam napisać skrypt , który pozwoliłby dodać do każdego newsa komentarz (od zwykłych użytkowników , którzy czytają te newsy). Myślałem , czy zrobić to w mysqlu , albo na plikach. Wolałbym jednak w mysqlu. Te newsy , które się wyświetlają na stronie są zapisane w bazie danych mysql. Myślałem , czy można jakoś relacjami to powiązać , ale nie mam pomysłu , a z relacyjnymi bazami danych nigdy nie miałem do czynienia.
MateuszS
pola w tabeli komentarze

id (int, auto-inc, prim-key)
id_newsa (int) - id newsa do ktorego ma byc przypisany komentarz
tytul (text)
tresc (text)
email/nick (text) - dane jakies autora
ip (text) - ip autora

przykladowa prosta tabela

reszta tak jak w dodawaniu newsa, tylko pamietaj o tym id_newsa, zeby tam wlepic id tego newsa pod ktorym jest komentarz i dobrze wyswietlic zapytaniem

zalozmy nasza strona ma adres news.php?id=15 <- gdzie 15 to id newsa
dajemy zapytanie do komentarzy
SELECT * FROM `komentarze` WHERE `id_newsa`='".$_GET['id']."'";

to taka ogolna prosta koncepcja
kamil1114
Ok , dziękuję za nakierowanie mnie , spróbuję coś z tego zrobić.
Mam tylko jeszcze jedno pytanie:

Bo napisałeś tak:
"zalozmy nasza strona ma adres news.php?id=15 <- gdzie 15 to id newsa
dajemy zapytanie do komentarzy
SELECT * FROM `komentarze` WHERE `id_newsa`='".$_GET['id']."'"; "

Tylko te newsy dodają się tak , że na stronie nic się nie zmienia ( chodzi mi o id w urlu). Po prostu na stronie głównej , newsy się wyświetlają , a nazwa strony to www.jakasnazwa.pl , nie mam czegoś takiego jak id=x , nie wyświetla mi się to w ogóle w urlu. Czemu mi się to nie wyświetla , co mogę zrobić w takim przypadku ?
Chodzi mi o to ,że pod każdym z osobna newsem był by link zobacz komentarze i ten link przenosił by do strony na której wyświetlał by się tylko ten jeden komentowany news i można było go skomentować i zobaczyć komentarze.
Kroolik1
Musisz w skrypcie wyświetlającym kolejne newsy dodać linijkę "<a href='strona.php?id=".$id_newsa.">Zobacz komentarze</a>' (w skrócie) w miejscu w którym chcesz aby ten napis się wyświetlał, np.

  1.  
  2. $newsy = mysql_query("SELECT id, autor, tresc, data FROM `newsy` LIMIT 5 SORT BY id DESC");
  3.  
  4. while($newsy_arr = mysql_fetch_array($newsy, MYSQL_ASSOC){
  5.  
  6. $result .= "Dodano ".$newsy_arr['data']." przez ".$newsy_arr['autor']."<br/>".$newsy_arr['tresc']."<br/><a href='strona.php?id=".$newsy_arr['id'].">Zobacz komentarze</a>";
  7.  
  8. }
  9.  
  10. echo $result;
Blame
A na stronie na której wyświetlasz komentarze dajesz:

  1. $id=$_GET['id'];
  2.  
  3. $zapytanie = "SELECT * FROM `komentarze` WHERE `id_newsa`=".$id."";
  4.  
  5. $komentarze = mysql_query($zapytanie)
  6.  
  7. while($komentarz = mysql_fetch_array($komentarze){
  8.  
  9. echo "Tytuł:<br>".$komentarz['tytuł']."<br>Treść komentarza:<br>".$komentarz['tresc'].
  10. }
  11. //itd.
  12.  
kamil1114
Ale dla każdego newsa , muszę stworzyć osobną stronę , na której będą wyświetlane komentarze ?
thek
Masz jedna stronę, jeden plik PHP, ale jej zawartość jest generowana dynamicznie. Tak samo jak newsy na głównej, tyle że tutaj zamiast newsów masz komentarze użytkowników.
kamil1114
Czyli podsumowując , jeżeli mój plik wyświetlający newsy wygląda tak:
  1. <?php
  2. mysql_connect('www','login','haslo');
  3.  
  4. $wyswietl=mysql_query('select * from newsy ORDER BY id DESC');
  5.  
  6. while($i=mysql_fetch_assoc($wyswietl)){
  7.  
  8. $tytul=$i['tytul'];
  9. $tresc=$i['tresc'];
  10. $data=$i['data'];
  11.  
  12. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  13. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  14. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  15.  
  16. }
  17. ?>


to muszę go zmodyfikować , żeby wyglądał tak:

  1. <?php
  2.  
  3.  
  4. mysql_connect('www','login','haslo');
  5. mysql_select_db('baza');
  6.  
  7. $wyswietl=mysql_query('select * from newsy ORDER BY id DESC');
  8.  
  9. while($i=mysql_fetch_assoc($wyswietl)){
  10.  
  11. $tytul=$i['tytul'];
  12. $tresc=$i['tresc'];
  13. $data=$i['data'];
  14.  
  15. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  16. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  17. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  18.  
  19. $komentarze=mysql_query('select * from komentarze ORDER BY id DESC');
  20.  
  21. while($a=mysql_fetch_assoc($komentarze)){
  22.  
  23. $id_newsa=$a['id_newsa'];
  24. $nick=$a['nick'];
  25. $tresc=$a['tresc'];
  26.  
  27. echo "<a href='index.php?id=".$id_newsa."'>Zobacz komentarze</a>";}
  28.  
  29. }
  30. ?>




A skrypt wyświetlający komentowanego newsa i komentarz tak:

  1. <?php
  2. $id=$_GET['id'];
  3.  
  4.  
  5. $zapytanie = "SELECT * FROM `komentarze` WHERE `id_newsa`=".$id."";
  6.  
  7. $komentarze = [url="http://www.php.net/mysql_query"]mysql_query[/url]($zapytanie)
  8.  
  9. while($komentarz = [url="http://www.php.net/mysql_fetch_array"]mysql_fetch_array[/url]($komentarze){
  10.  
  11. [url="http://www.php.net/echo"]echo[/url] "Tytuł:<br>".$komentarz['tytuł']."<br>Treść komentarza:<br>".$komentarz['tresc'].
  12.  
  13. }
  14.  
  15. echo "<b>Dodawanie komentarzy:</b></br</br>";
  16. echo "<form method='post'>";
  17. echo "Twój nick: </br>";
  18. echo "<input type='text' name='nick'> </br>";
  19. echo "Tresć komentarza: </br>";
  20. echo "<textarea name='text' cols='40' rows='15'></textarea> </br>";
  21. echo "<input type='submit' value='Dopisz'>";
  22. echo "</form>";
  23.  
  24. ?>
  25.  
  26.  



Coś mi tu nie gra. Proszę o poprawkę , chciałbym , żeby jeszcze komentowany news był wyświetlany.

Proszę o pomoc , bo się gubię w tym.
thek
Jeśli ma być jeszcze wyświetlany news to sobie wyciągnij go z bazy. Znasz jego ID, więc napisać zapytanie by go z niej wyciągnąć to pryszcz smile.gif Potem wyświetl przed komentarzami i masz po sprawie.
kamil1114
Ok , wyciągnę go sobie , tylko powiedzcie mi co źle robię w skrypcie:
  1.  
  2. mysql_connect('serwer','login','haslo');
  3.  
  4. $wyswietl=mysql_query('select * from newsy ORDER BY id DESC');
  5.  
  6. while($i=mysql_fetch_assoc($wyswietl)){
  7.  
  8. $tytul=$i['tytul'];
  9. $tresc=$i['tresc'];
  10. $data=$i['data'];
  11.  
  12. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  13. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  14. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  15.  
  16. //TU SIĘ ZACZYNA WYŚWIETLANIE LINKU ODSYŁAJĄCE DO KOMENTARZY
  17. $link=mysql_query('SELECT id from newsy order by id desc');
  18. while($wiersz=mysql_fetch_array($link)){
  19.  
  20. echo '<a href="komentarze.php?id='.$wiersz['id'].'">Komentarze</a>';
  21. }
  22.  
  23. }

Na stronie pod każdym newsem wyświetla się link Komentarze ,ale problem jest taki , że tych linków , wyświetla się tyle ile w danej chwili jest newsów w bazie. Pierwszy wyświetlony link ma id=1 ,drugi id=2 , trzeci id=3 itd.

Proszę o pomoc.
Blame
To dlatego, że wyświetlanie newsa i linku do niego musisz zrobić w jednej pętli. Czyli powinno to wyglądać tak:

  1. mysql_connect('serwer','login','haslo');
  2.  
  3. $wyswietl=mysql_query('select * from newsy ORDER BY id DESC');
  4.  
  5. while($i=mysql_fetch_assoc($wyswietl)){
  6.  
  7. $tytul=$i['tytul'];
  8. $tresc=$i['tresc'];
  9. $data=$i['data'];
  10.  
  11. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  12. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  13. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  14.  
  15. echo '<a href="komentarze.php?id='.$i['id'].'">Komentarze</a>';
  16.  
  17. }

kamil1114
Teraz wszystko działa , dziękuję za pomoc. Zaraz będę kombinował nad samym skryptem wyświetlania i dodawania komentarzy.

Tym razem zatrzymałem się na skrypcie wyświetlania komentarzy i ich dodawania. Nie umiem znaleźć błędu w tym kodzie:

  1. <?php
  2. if(isset($_GET['id'])){
  3. $id=$_GET['id'];
  4. mysql_connect('serwer','login','haslo');
  5.  
  6.  
  7. $wyswietl=mysql_query("select * from newsy where id='$id'");
  8.  
  9. while($i=mysql_fetch_assoc($wyswietl)){
  10.  
  11. $tytul=$i['tytul'];
  12. $tresc=$i['tresc'];
  13. $data=$i['data'];
  14.  
  15. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  16. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  17. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  18.  
  19. }
  20.  
  21.  
  22.  
  23. $kom=mysql_query("select * from komentarze where id='$id'");
  24. while($a=mysql_fetch_assoc($kom)){
  25.  
  26. $nick=$a['nick'];
  27. $tresc=$a['tresc'];
  28. $ip=$a['ip'];
  29.  
  30. if(!empty($nick) && !empty($tresc))
  31. {
  32.  
  33.  
  34. echo "<center>$nick</center>";
  35. echo "<center>$tresc</center>;
  36.  
  37.  
  38. }
  39.  
  40. }
  41.  
  42.  
  43. echo "<b>Dodawanie komentarzy:</b></br>";
  44.  
  45. echo "<form method='post'>";
  46.  
  47. echo "Twój nick: </br>";
  48.  
  49. echo "<input type='text' name='nick'> </br>";
  50.  
  51. echo "Tresć komentarza: </br>";
  52.  
  53. echo "<textarea name='text' cols='40' rows='15'></textarea> </br>";
  54.  
  55. echo "<input type='submit' value='Dopisz'>";
  56.  
  57. echo "</form>";
  58.  
  59.  
  60. $nick=$_POST['nick'];
  61. $text=$_POST['text'];
  62. $ip=$_SERVER["REMOTE_ADDR"];
  63.  
  64.  
  65. if(!empty($nick) && !empty($tresc)){
  66.  
  67.  
  68. mysql_query("insert into komentarze (nick,tresc,ip) values ('$nick,'$tresc','$ip')");
  69.  
  70.  
  71.  
  72.  
  73. }
  74.  
  75.  
  76.  
  77. }
  78. ?>



A na stronie wyskakuje mi cały czas błąd :Parse error: syntax error, unexpected '>' in /home/accounts_l/lockerzo/public_html/komentarze.php on line 44
Czy widzi ktoś tutaj jakiś błąd ?
thek
Ty lepiej sprawdź czemu kod po wklejeniu tutaj jest wyświetlany zrąbany winksmiley.jpg Podpowiadam... Linia 36 smile.gif
kamil1114
A dziękuję , taki mały znaczek(") , a tyle zmienia winksmiley.jpg

Wybaczcie , że Was tak męczę , ale zależy mi na tym skrypcie , a dużo rzeczy mi nie wychodzi. Nie wiem , czemu ten kod nie działa:
  1. <?php
  2. if(isset($_GET['id'])){
  3. $id=$_GET['id'];
  4. mysql_connect('baza','login','haslo');
  5.  
  6.  
  7. $wyswietl=mysql_query("select * from newsy where id='$id'");
  8.  
  9. while($i=mysql_fetch_assoc($wyswietl)){
  10.  
  11. $tytul=$i['tytul'];
  12. $tresc=$i['tresc'];
  13. $data=$i['data'];
  14.  
  15. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  16. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  17. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  18.  
  19. }
  20.  
  21. echo "<br/><br/>";
  22.  
  23. $kom=mysql_query("select * from komentarze where id='$id'");
  24. while($a=mysql_fetch_assoc($kom)){
  25.  
  26. $nick=$a['nick'];
  27. $tresc1=$a['tresc'];
  28. $ip=$a['ip'];
  29.  
  30. if(!empty($nick) && !empty($tresc1)){
  31. echo "<center>$nick</center>";
  32. echo "<center>$tresc1</center>";
  33. }
  34. else {
  35. echo "Brak komentarzy do tego newsa";
  36. }
  37.  
  38. }
  39.  
  40.  
  41. echo "<b>Dodawanie komentarzy:</b></br>";
  42.  
  43. echo "<form method='post'>";
  44.  
  45. echo "Twój nick: </br>";
  46.  
  47. echo "<input type='text' name='nick'> </br>";
  48.  
  49. echo "Tresć komentarza: </br>";
  50.  
  51. echo "<textarea name='komentarz' cols='40' rows='15'></textarea> </br>";
  52.  
  53. echo "<input type='submit' value='Dopisz'>";
  54.  
  55. echo "</form>";
  56.  
  57.  
  58. $nick=$_POST['nick'];
  59. $text=$_POST['komentarz'];
  60. $ip=$_SERVER['REMOTE_ADDR'];
  61.  
  62.  
  63. if(!empty($nick) && !empty($tresc)){
  64. mysql_query("insert into komentarze (nick,tresc,ip) values ('$nick,'$text','$ip')");
  65. }
  66.  
  67.  
  68. }
  69. ?>


Nie dodaje do bazy danych komentarzy i nie wyświetla ich. Gdzieś w tym skrypcie umieściłem polecenie , że jeżeli w bazie nie ma komentarzy do tego newsa , to wypisać , na ekranie , że nie ma komentarzy w bazie , ale też nie wypisuje , więc domyślam się że coś jest nie tak. Proszę o pomoc.
Blame
Wydaje mi się, że coś jest nie tak z formularzem, ale nie jestem pewny. Spróbuj na samym końcu wyświetlić $nick, $text i $ip. Możesz też ręcznie wstawić jakiś komentarz do bazy i zobaczyć czy się wyświetli.
kamil1114
Jak wyświetlę $nick,$text i $ip , to wszystko działa , zmienne się wyświetlają. A jak ręcznie dodam dane , to na stronie też się wyświetla. Proszę o pomoc w znalezieniu błędu.
potreb
Stosuj dla zapytań or die(mysql_error()); oraz error_reporting(E_ALL) dla wyświetlania błędów.
Jest jeszcze taki coś jak var_dump(); i print_r(); które też ułatwiają pracę.
Blame
Spróbuj zamiast:
  1. mysql_query("insert into komentarze (nick,tresc,ip) values ('$nick,'$text','$ip')");

dać:
  1. mysql_query("INSERT INTO komentarze ('nick', 'tresc', 'ip') VALUES('$nick,'$text','$ip')");


A w pierwszym nawiasie wypisujesz wszystkie pola tabeli? Bo jeśli masz na przykład jeszcze na początku pole id o wartość AUTO_INCREMENT to zapytanie powinno wyglądać tak:
  1. mysql_query("INSERT INTO komentarze ('id', 'nick', 'tresc', 'ip') VALUES(0 '$nick,'$text','$ip')");

Lub tak:
  1. mysql_query("INSERT INTO komentarze VALUES(0 '$nick,'$text','$ip')");


Chociaż nie wiem czy to coś da...
Spawnm
@Blame -> to nic nie zmieni winksmiley.jpg

@kamil1114 -> poczytaj o sql injection...

Cytat
że jeżeli w bazie nie ma komentarzy do tego newsa , to wypisać , na ekranie , że nie ma komentarzy w bazie , ale też nie wypisuje

Dziwne?
echo z info o braku dajesz w while dla mysql_fetch_assoc która wykona się tyle razy ile znajdzie pól ,a tych nie ma.Przed while daj ablo mysql_num_rows albo count(*) i mysql_result, jeśli zwróci 0 dajesz echo 'brak wpisów'; else -> pętla z assoc
kamil1114
Dziękuję już znalazłem błąd , brakowało znaku ' , w zapytaniu: mysql_query("INSERT INTO komentarze ('nick', 'tresc', 'ip') VALUES('$nick','$text','$ip')");
Teraz wyświetla się news i dodaje się na stronę. Znalazłem jeszcze jeden duży problem , mam nadzieję że ostatni. Jak dodaję komentarz do któregoś newsa , to one się zapisują w bazie , ale jak je później wyświetlam , to do każdego newsa powinny być inne komentarze , ale jak wejdę w komentarz , gdzie id newsa jest równe 1 , to wyświetla mi się komentarz , którego id też jest równe 1. Mam jeszcze kolumnę id_newsa , ale tam wyświetlają się same zera. Domyślam się że trzeba jeszcze jakoś połączyć to , tak żeby do każdego newsa były określone komentarze. Mam nadzieję , że już Was ostatni raz proszę o pomoc w tym systemie komentarzy.
Spawnm
to przy insercie daj
  1. mysql_query("insert into komentarze (nick,tresc,ip,news_id) values ('$nick','$text','$ip','$news_id')");

Blame
Oczywiście musisz ją zadeklarować wcześniej poprzez:

  1. $news_id=$_GET['id'];
kamil1114
Teraz id komentarza już poprawnie przypisuje do id newsa. Tylko teraz nie wyświetla tego poprawnie , chodzi mi o to , że do newsa o id=1 nie wyświetla komentarzy , które mają id newsa=1
A taki mam kod teraz:
  1. <?php
  2. if(isset($_GET['id'])){
  3. $id=$_GET['id'];
  4. mysql_connect('strona','login','haslo');
  5.  
  6.  
  7. $wyswietl=mysql_query("select * from newsy where id='$id'");
  8.  
  9. while($i=mysql_fetch_assoc($wyswietl)){
  10.  
  11. $tytul=$i['tytul'];
  12. $tresc=$i['tresc'];
  13. $data=$i['data'];
  14.  
  15. echo "<div align='right'><img src='./cal.gif'></img> $data</div>";
  16. echo "<h2><center><dig style='color:#4682B4'>$tytul </div></center></h2><br/><br/>";
  17. echo "$tresc<br/><br/><hr color='olivedrab'/>";
  18.  
  19. }
  20.  
  21. echo "<br/><br/>";
  22. $kom=mysql_query("select * from komentarze where id='$id'");
  23. while($a=mysql_fetch_assoc($kom)){
  24.  
  25. $nick=$a['nick'];
  26. $tresc1=$a['tresc'];
  27. $ip=$a['ip'];
  28.  
  29. echo "<center>$nick</center><br/>";
  30. echo "<center>$tresc1</center>";
  31.  
  32.  
  33. }
  34.  
  35.  
  36. echo "<b>Dodawanie komentarzy:</b></br>";
  37.  
  38. echo "<form method='post'>";
  39.  
  40. echo "Twój nick: </br>";
  41.  
  42. echo "<input type='text' name='nick'> </br>";
  43.  
  44. echo "Tresć komentarza: </br>";
  45.  
  46. echo "<textarea name='komentarz' cols='40' rows='15'></textarea> </br>";
  47.  
  48. echo "<input type='submit' value='Dopisz'>";
  49.  
  50. echo "</form>";
  51.  
  52.  
  53. $nick=$_POST['nick'];
  54. $text=$_POST['komentarz'];
  55. $ip=$_SERVER['REMOTE_ADDR'];
  56.  
  57.  
  58.  
  59. if(!empty($nick) && !empty($tresc)){
  60. $id_newsa=$_GET['id'];
  61. mysql_query("insert into komentarze (id,nick,tresc,ip,id_newsa) values (0,'$nick','$text','$ip','$id_newsa')");
  62.  
  63. echo '<script type="text/javascript">
  64. window.location.href = "index1.php";
  65. </script>';
  66.  
  67. }
  68.  
  69.  
  70. }
  71. ?>
Blame
Cytat(kamil1114 @ 22.10.2009, 19:21:53 ) *
Mam jeszcze kolumnę id_newsa , ale tam wyświetlają się same zera. Domyślam się że trzeba jeszcze jakoś połączyć to , tak żeby do każdego newsa były określone komentarze. Mam nadzieję , że już Was ostatni raz proszę o pomoc w tym systemie komentarzy.

  1. $kom=mysql_query("select * from komentarze where id='$id'");

Widzisz błąd? winksmiley.jpg
kamil1114
Czy powinno być:
  1. $kom=mysql_query("select * from komentarze where id='$id_newsa'");


?
Blame
Nie haha.gif
Cytat(kamil1114 @ 22.10.2009, 19:21:53 ) *
Mam jeszcze kolumnę id_newsa , ale tam wyświetlają się same zera. Domyślam się że trzeba jeszcze jakoś połączyć to , tak żeby do każdego newsa były określone komentarze. Mam nadzieję , że już Was ostatni raz proszę o pomoc w tym systemie komentarzy.

  1. $kom=mysql_query("select * from komentarze where id='$id'");
kamil1114
Wybacz , mi takie błędy ,ale cały czas się uczę php i nie do końca jeszcze umiem.

Czyli to będzie tak:
  1. $kom=mysql_query("select * from komentarze where id_newsa='$id'");


Teraz wszystko działa , dziękuję bardzo wszystkim za pomoc.
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.