Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nie odczytuje mi komentarzy o id newsa
Forum PHP.pl > Forum > PHP
kemsi
Witam!! Stworzyłem swój taki prosty system newsów na bazie mysql. Gdy próbuje odczytać komentarze do danego newsa to nie wiem czemu, ale nie mogę ich odczytać. Może coś się nie zapisuje, ale już sam nie wiem. oto kody trzech plików(jest jeszcze więcej, ale tylko te będą prawdopodobnie potrzebne):

Odczytywanie newsów:


  1. <? 
  2.  $polancz = mysql_connect(&#092;"localhost\",\"root\",\"krasnal\") or die(); 
  3.  mysql_select_db('news'); 
  4.  
  5.  $odczyt = mysql_query(&#092;"SELECT `id`, `temat`, `tresc`, `nick`, `mail` FROM `news` ORDER BY `id` DES
    C\"); 
  6.  while($wiersz = mysql_fetch_array($odczyt)) { 
  7.  echo &#092;"<table border=1 width=300><tr><td>Temat: \".$wiersz['temat'].\"</td></tr> 
  8.  <tr><td>&#092;".$wiersz['tresc'].\"</td></tr> 
  9.  <tr><td><a href=&#092;"mailto:\".$wiersz['mail'].\"\">\".$wiersz['nick'].\"</a></td></tr> 
  10.  <tr><td><a href=&#092;"komentuj.php?id=\".$wiersz['id'].\"\">Komentarze</a></table><br><br>\"; 
  11.  } 
  12. ?>



Odczytywanie i dodawanie komenatrzy:

  1. <? 
  2. //łączenie z bazą 
  3. $polancz=mysql_connect(&#092;"localhost\",\"root\",\"krasnal\") or die(); 
  4. mysql_select_db('news'); 
  5.  
  6. $odczytaj_kom=mysql_query(&#092;"SELECT `id`,`komentarz`,`nick`,`mail` FROM `komentarze` ORDER BY `id` DESC\"); 
  7. while($a=mysql_fetch_array($odczytaj_kom)){ 
  8. if($id==$a['id']){ 
  9. //odczytywanie komentarzy 
  10. echo &#092;"<table border=1><tr><td>\".$a['komentarz'].\"</td></tr> 
  11. <tr><td>Nick: &#092;".$a['nick'].\"  Mail: \".$a['mail'].\"<br><br>\"; 
  12. } 
  13. } 
  14.  
  15. //formularz dodawania komentarzy 
  16. echo &#092;"<form action=\"kom.php\" method=\"POST\"><table border=\"1\"> 
  17. <tr><td valign=&#092;"top\">Tresc:<textarea cols=\"36\" rows=\"6\" name=\"komentarz\"></textarea></td></tr> 
  18. <tr><td>Nick:<input type=&#092;"text\" name=\"nick\"></td></tr> 
  19. <tr><td>Mail:<input type=&#092;"text\" name=\"mail\"></td></tr> 
  20. <tr><td><input type=&#092;"submit\" value=\"WYŚLIJ\"> <input type=\"reset\" value=\"WYCZYSC\"></table></form>\"; 
  21. ?>


Zapisywanie komentarzy:

  1. <? 
  2. $poloncz=mysql_connect(&#092;"localhost\",\"root\",\"krasnal\") or die(); 
  3. mysql_select_db('news'); 
  4.  
  5. $dodaj=&#092;"INSERT INTO komentarze (id, komentarze, nick, mail) VALUES ('$id','$komentarze','$nick','$mail')\"; 
  6. $query=mysql_query($dodaj); 
  7. ?>



Z góry dzięki za pomoc.
Darti
a może tak? :
  1. <?php
  2.  
  3. $odczytaj_kom=mysql_query(&#092;"SELECT `id`,`komentarz`,`nick`,`mail` FROM `komentarze` WHERE id=\".$_GET['id'].\"\"); 
  4.   while($a=mysql_fetch_array($odczytaj_kom)){ 
  5.  
  6.   echo &#092;"<table border=1><tr><td>\".$a['komentarz'].\"</td></tr> 
  7.   <tr><td>Nick: &#092;".$a['nick'].\"   Mail:  \".$a['mail'].\"<br><br>\"; 
  8.   
  9.   } 
  10.  
  11. ?>
a z dodawaniem spróbuj tak:
  1. <?php
  2. $poloncz=mysql_connect(&#092;"localhost\",\"root\",\"krasnal\") or die(); 
  3. mysql_select_db('news'); 
  4.  
  5. $dodaj=&#092;"INSERT INTO komentarze (id, komentarze, nick, mail) VALUES ('\".$_POST['id'].\"','\".$_POST['komentarze'].\"','\".$_POST['nick'].\"','\".$_POST['mail'].\"')\"; 
  6. $query=mysql_query($dodaj);
  7. ?>
kemsi
Niestety to nic nie dało. A na dodatek pokazywały się błędy z nie poprawnym kodem. Ma ktoś jeszcze jakiśpomysł?
tiraeth
Proponuję napisać od nowa... i najlepiej z taką strukturą bazy:
  1. CREATE TABLE `news` (
  2. `newsid` INT NOT NULL AUTO_INCREMENT ,
  3. `news_title` VARCHAR( 100 ) DEFAULT 'Brak tematu' NOT NULL ,
  4. `news_body` TEXT NOT NULL ,
  5. `news_user` VARCHAR( 20 ) DEFAULT 'Anonymous' NOT NULL ,
  6. `news_date` INT( 10 ) NOT NULL ,
  7. PRIMARY KEY ( `newsid` )
  8. );
  9.  
  10. CREATE TABLE `news_comments` (
  11. `commentid` INT NOT NULL AUTO_INCREMENT ,
  12. `comment_newsid` INT( 4 ) NOT NULL ,
  13. `comment_body` VARCHAR( 255 ) NOT NULL ,
  14. `comment_nick` VARCHAR( 20 ) DEFAULT 'Anonymous' NOT NULL ,
  15. `comment_date` INT( 10 ) NOT NULL ,
  16. `comment_ip` VARCHAR( 50 ) DEFAULT '127.0.0.1' NOT NULL ,
  17. `comment_host` VARCHAR( 255 ) DEFAULT 'localhost' NOT NULL ,
  18. PRIMARY KEY ( `commentid` )
  19. );

Tak będzie łatwiej... pamiętaj, że *_date to stempel czasu (funkcja time();)
rogrog
@Tiraeth: no oczywiście projekt bazy na pewno bardziej elegancki od tego co ma kemsi, tylko dlaczego używasz INTów do reprezentowania daty zamiast wbudowanych typów SQLa?? To wprowadza wg mnie tylko zamieszanie w bazie, utrudnia korzystanie z bazy i uniemożliwia używanie SQLowych uławień w korzystaniu z dat - nie widze zalet.
Darti
Cytat(kemsi @ 2005-03-10 17:13:42)
Niestety to nic nie dało. A na dodatek pokazywały się błędy z nie poprawnym kodem. Ma ktoś jeszcze jakiśpomysł?

ok poprawilem - brakowało "
kemsi
Dzięki Tiraeth za nową strukture, ale mam pytanie jak w systemie newsów stworzonym na twojej sktrukturze odczytam komentarze do danego newsa? Bo w bazach danych już jakośtego nie rozumiem.
tiraeth
  1. SELECT *
  2. FROM news_comments WHERE comment_newsid=$_GET['nid']

gdzie $_GET['nid'] to numer newsa...
kemsi
Oto moje pytania co do twojej struktury:
1. comment_newsid=$_GET['nid'] - skąd wziąłeś to $_GET['nid'], bo z tego co kojarze to takie coś powinno być w tabeli w news_comments.
2.Czy jak dodaje numer komentarza do tabeli news_comments to zawsze taki sam numer newsa do tej tabeli muszę dodawać i potem używać tego co podałeś w poprzednim poście?
Ociu
1. comments.php?newsid=1
Jak chcesz zobaczyć komentarze to robisz coś takiego (a właściwie link do ich zobaczenia)
  1. <?php
  2. # tu wczesniejszy kod
  3. print &#092;"<a href=comments.php?newsid=\".$a['id'].\">\";
  4. ?>

2. Tak

edit:
zapomniałem dodać: jeśli zrobisz tak jak ja napisałem wtedy dajesz $_GET['newsid']; (tak dla informacji...)
pozdrawiam
SongoQ
Panowie jak mozna dopuscic do takiej rzeczy:
  1. <?php
  2.  
  3. $odczytaj_kom=mysql_query(&#092;"SELECT `id`,`komentarz`,`nick`,`mail` FROM `komentarze` ORDER BY `id` DESC\"); 
  4. while($a=mysql_fetch_array($odczytaj_kom)){ 
  5. if($id==$a['id']){ 
  6. //odczytywanie komentarzy 
  7. echo &#092;"<table border=1><tr><td>\".$a['komentarz'].\"</td></tr> 
  8. <tr><td>Nick: &#092;".$a['nick'].\"  Mail: \".$a['mail'].\"<br><br>\"; 
  9. } 
  10. }
  11.  
  12. ?>


Kto Cie uczyl baz danych. Nie zrozum mnie zle, jest tabelka ktora ma 50 milionow komentarzy i zwracasz je posortowane i spawdzasz w kodzie i wyswietlasz ten komentarz i tak czas wykonania takiego zapytania bedzie bardzo dlugi, jesli nie wierzysz to sprawdz i sie przekonaj, nastepnie jesli serwer php i bazy danych jest na osobnych maszynach, a nawet jesli sa to inne lacza to ja dziekuje za uzywanie takiego oprogramowania. Jesli był bym uzytkownikiem to by mnie "szlak" trafił ze sie tak długo ładuje, a jesli był bym adminem to bym Ci odrazu wyciachał baze i konto ftp. Takie rzczy nie mogą być dopuszczone.

Polecam najpierw poczytanie o bazach danych a nastepnie pisanie aplikacji.
Ociu
SongoQ: Szczerze mówiąc, nie zauważyłem tego.
IHMO: Zrobienie dobrego kodu SQL to 3/5 mniej roboty...
  1. <?php
  2. $id = $_GET['news_id'];
  3. $odczytaj_kom = mysql_query(&#092;"SELECT `id`,`komentarz`,`nick`,`mail` FROM `komentarze` WHERE `news_id` = '\".$id.\"' ORDER BY `id` DESC\"); 
  4. ?>

pozdrawiam
SongoQ
Przegladajac to forum widac ze czesc ludzi prezentuje wysoki poziom, maja dobre pomysly, doswiadczenie ale jest tez inna czesc uzytkownikow co tak naprawde zanim zaczna cos pisac w php i sql powinni poczytac o bazach danych.

Przy duzych projektach klient np zazada przetestowania dla duzej ilosci danych i co wtedy: "przepraszam ale to dziala dla 10 rekordów" questionmark.gif?

Na pewno ponownie nie skorzysta z waszych usług.
kemsi
SongoQ-trochę nie rozumiem o co ci chodzi z tym, że "przepraszam ale to dziala dla 10 rekordów". Wogóle jakośnie nie zrorumiałem tych twoich postów.

" jest tabelka ktora ma 50 milionow komentarzy i zwracasz je posortowane i spawdzasz w kodzie i wyswietlasz ten komentarz i tak czas wykonania takiego zapytania bedzie bardzo dlugi" - to jak mam to inaczej zrobić? Jak mozesz to wytłumacz to w jakiś prostszy sposób.
Z góry dzięki za odp.
Ociu
Jemu chodzi o to, że twój kod będzie działał wolno... gdyż pętla będzie 'pętlić się' tyle razy ile masz rekordów w bazie, a w niej dopiero sprawdzi czy "1 = 1". Lepiej zrobić to za pomocą SQL, ponieważ baza odrzuci te rekordy, które się nie równają czemuś tam. Różnica pomiędzy tym jest niewielka dla małej ilości wierszy... np. 10, ale gdy masz 5 000 rekordów i 15 jest z nich poprawnych ? wtedy kicha.. Twój skrypt będzie sprawdział 5 000 rekordów, a gdy dasz SQL, to on sam wykluczy i pętla będzie wyświetlać tylko 15 razy... różnica niewielka ?
Skorzystaj z mojego kodu.. ( smile.gif )

pozdrawiam
SongoQ
@Ociu dzieki za wytlumaczenie @kemsi.

Jak juz @Ociu pisal rozwiazanie masz powyzej.
Bazy danych sa stworzone po to zeby wyciagac takie rokordy ktore nas interesuja, w Twoim przypadku komentarze do newsa i nie ma potrzeby wyciagac reszty. Tak sie stosuje jesli masz dane w plikach.
kemsi
Dobra juzprawie wszystko rozumiem tylko przy wyświetlaniu tego idnewsa i id komentarza do newsa pojawił mi siętaki błąd:
Kod
Parse error: syntax error, unexpected T_VARIABLE in e:\usr\krasnal\www\php\skrypty\mysql\news\komentuj.php on line 7


A oto kod tego mojego pliku:

  1. <?
  2. //łączenie z bazą
  3. $polancz=mysql_connect(&#092;"localhost\",\"root\",\"krasnal\") or die();
  4. mysql_select_db('news_comments');
  5.  
  6. $id=$_GET['comment_news_id']
  7. $odczytaj_kom=mysql_query(&#092;"SELECT `commentid`,`comment_newsid`,`comment_body`,`comment_nick` FROM `new
    s
  8. comments` WHERE commentid='\".$_GET.\"' ORDER BY `commentid` DESC\");
  9. while($a=mysql_fetch_array($odczytaj_kom)){
  10. //odczytywanie komentarzy
  11. echo \"<table border=1><tr><td>\".$a['comment_body'].\"</td></tr>
  12. <tr><td>Nick: \".$a['comment_nick'].\"<br><br>\";
  13. }
  14.  
  15. //formularz dodawania komentarzy
  16. echo \"<form action=\"kom.php\" method=\"POST\"><table border=\"1\">
  17. <tr><td valign=\"top\">Tresc:<textarea cols=\"36\" rows=\"6\" name=\"comment_body\"></textarea></td></tr>
  18. <tr><td>Nick:<input type=\"text\" name=\"comment_nick\"></td></tr>
  19. <tr><td><input type=\"submit\" value=\"WYŚLIJ\"> <input type=\"reset\" value=\"WYCZYSC\"></table></form>\";
  20. ?>


Z góry dzięki za odp.
Darti
bo nie masz średnika w linii 6 na końcu (lub na początku 7)
rolleyes.gif
SongoQ
  1. <?php
  2. $odczytaj_kom=mysql_query(&#092;"SELECT `commentid`,`comment_newsid`,`comment_body`,`comment_nick` FROM `new
    s
  3. comments` WHERE commentid='\".$_GET.\"' ORDER BY `commentid` DESC\");
  4. ?>


$_GET - cos Ci tam brakuje => $_GET['comment_news_id'] albo $id
kemsi
Dzięki wielkie. To pomogło w tym problemie, ale teraz jest błąd taki:
Kod
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in e:\usr\krasnal\www\php\skrypty\mysql\news\komentuj.php on line 8
linia 8 to jest umnie z pętlą while.
soldat
Podejrzewam, że podajesz nie ten argument do funkcji mysql_fetch_array co trzeba (musi to być wartość zwrócona przez funkcję mysql_query).
Jezeli tak nie jest, spróbuj przed pętlą while dodać coś takiego :
  1. echo mysql_error();

i napisz, co się wydarzyło

Pozdrawiam
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.