Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]System dodawania komentarzy, nie zapisuje informacji podanych przez php
swagger
post 28.05.2012, 01:29:51
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.05.2012

Ostrzeżenie: (0%)
-----


Hej,

jestem wackiem w tym temacie. Dopiero zaczynam.

Otóż, stworzyłem system newsów. Przetestowałem, ładnie działa. Do tego stworzyłem system dodawania newsów. Również fajnie działa. Pomyślałem, że fajnie by było mieć dodatkowo komentarze pod nimi. Żeby nie było tak pusto. No a więc wziąłem się za to. Pisałem to jakiś czas, ale w końcu napisałem. Skrypt wyświetlania działa znakomicie. Gorzej jednak z dodawaniem. Za cholerę nie umiem rozkminić co jest źle. Problem jest w tym, że nie wypełnia wszystkich pól w bazie. Wypełnia treść komentarza, dodaje nowe ID komentarza tak samo jak i datę. Nie dodaje jednak tych rzeczy które są podane przez php(tj. nick autora oraz ID newsa).

Mój plik news.php:
  1. <?php
  2. include('gora.php');
  3. $user = $_SESSION['zalogowany'];
  4. echo "<div class=\"title\"><img src='./images/icons/newspaper_48.png' width='28' height='28' /><b> Aktualności systemowe</b></div><div class=\"title_linia\"></div><br>";
  5. $newsy = mysql_fetch_array(mysql_query("select * from news where id='$id'"));
  6. {
  7.  
  8. $tekst .= '<b><div class="news_title">' . $newsy['tytul'] . '</div><a href="profil.php?user=' . $newsy['autor'] . '"><div style="float: left;" class="news_autor">' . $newsy['autor'] . '</div></a></b><div style="float: left;" class="news_info"> - ' . $newsy['data'] . '</div><br>' . $newsy['tresc'] . '<br/><div class=\"title_linia\"></div><br>';
  9. }
  10. echo $tekst;
  11. echo "<div class=\"news_info\">(X komntarzy)</div><div class=\"title_linia\"></div><br>";
  12. include('komentarz.php');
  13. include('dol.php');
  14. ?>
  15.  


komentarz.php:
  1. <head>
  2. <meta http-equiv="Content-type" content="text/html; charset=iso-8859-2" />
  3. <script language="javascript" type="text/javascript" src="tiny_mce/tiny_mce.js"></script>
  4. <script language="javascript" type="text/javascript">
  5.  
  6. tinyMCE.init({
  7.  
  8. mode : "textareas",
  9. theme : "advanced",
  10.  
  11. convert_fonts_to_spans : true,
  12.  
  13. valid_elements : "blockquote,strong,cite,abbr,acronym"
  14. });
  15. </script></head>
  16. <table><td width='1%' style='padding-left:50px'>
  17. <center><form action="dodaj_koment.php" method=explode>
  18. <input type="hidden" name="id_news" value="<?$id?>">
  19. <textarea name="tresc_koment" rows="3" cols="1"></textarea>
  20. <input type="hidden" name="autor" value="<?$_SESSION['zalogowany']?>">
  21. <input type="submit" value="Dodaj"></form></center><br><br><?echo "<div class=\"title_linia\"></div><br>";
  22. $komentarze = mysql_query("select * from komentarze where id_news='$id' order by id");
  23. while($rekord = mysql_fetch_array($komentarze))
  24. {
  25. $autor = $rekord[4];
  26. $dane = mysql_fetch_assoc(mysql_query("select admin, imie, nazwisko from users where user='$autor' "));
  27. {
  28. $koment .="<a href='profil.php?user=" . $rekord[4] . "'><div style='float: left;' class='news_autor'>" . $dane['imie'] . " '<b>" .$rekord[4] . "'</b> " . $dane['nazwisko'] . "</div></a><div style='float:left;' class='news_info'> - " . $rekord[3] . "</div><div style='float:right;' class='news_info'>#" . $rekord[0] . "</div><br>" . $rekord[2] . "<br><div class=\"title_linia\"></div><br>";
  29. }
  30. }
  31. echo $koment;
  32. ?><br><br></td></td></table>


dodaj_koment.php:
  1. <?
  2. include('gora.php');
  3. $query = mysql_query("insert into komentarze values('', '$id_news', '$tresc_koment', now(), '$autor' )");
  4. echo "Udało się!";
  5. include('dol.php');
  6. ?>


Baza:
  1. CREATE TABLE `komentarze` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_news` varchar(11) NOT NULL,
  4. `tresc` text NOT NULL,
  5. `data` datetime NOT NULL,
  6. `autor` varchar(16) NOT NULL,
  7. PRIMARY KEY (`id`),
  8. KEY `id` (`id`),
  9. KEY `data` (`data`)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=18 ;


Bardzo bym prosił o pomoc.

Z góry dzięki. ;)

Ten post edytował swagger 28.05.2012, 01:55:29
Go to the top of the page
+Quote Post
lobopol
post 28.05.2012, 05:09:29
Post #2





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

Ostrzeżenie: (0%)
-----


1. Co to za typ
  1. form action="dodaj_koment.php" method=explode

Jak już to
  1. form action="dodaj_koment.php" method="post"

3. Nie
  1. <input type="hidden" name="id_news" value="<?$id?>"

a
  1. <input type="hidden" name="id_news" value="<?php echo $id?>"

2. Nie
  1. $query = mysql_query("insert into komentarze values('', '$id_news', '$tresc_koment', now(), '$autor' )");

a
  1. if(isset($_POST[tresc_koment])) { //więcej sprawdzania czy zmienne są zrób nie będę robił wszystkiego za ciebie
  2. $id_news = (int)$_POST['id_news'];
  3. $tresc_comment = mysql_real_escape_string((string)$_POST['tresc_koment']);
  4. $autor= mysql_real_escape_string((string)$_POST['autor']);
  5.  
  6. $query = mysql_query("insert into komentarze values('', $id_news, '$tresc_koment', now(), '$autor' )");
  7.  
  8. }
  9.  


Jak nie zadziała to wyświetl sobie przed tym zapytaniem
  1. echo "insert into komentarze values('', $id_news, '$tresc_koment', now(), '$autor' )";



--------------------
Go to the top of the page
+Quote Post
kpt_lucek
post 28.05.2012, 06:36:04
Post #3





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


i jeszcze dla pewności zamień kolejność session_start() z includem na początku pliku.


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
swagger
post 28.05.2012, 08:30:42
Post #4





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.05.2012

Ostrzeżenie: (0%)
-----


1. Tutaj eksperymentowałem, początkowo miałem post. Wyczytałem to gdzieś na google. Po prostu wysłałem wam zedytowaną kopię.
Co do reszty, dzięki. Działa.

A macie może pomysł jak poradzić sobie z id komentarza? Tzn. aby w każdym newsie id komentarzy zaczynało się od #1. Domyślam się, że trzeba dorobić kolejną tabelkę(czy jak to tam się zwie) w bazie, ale na tym stoję. Nie mam nawet pomysłu jak to obliczyć.
Go to the top of the page
+Quote Post
droslaw
post 28.05.2012, 09:17:35
Post #5





Grupa: Zarejestrowani
Postów: 98
Pomógł: 33
Dołączył: 10.05.2011
Skąd: Krak

Ostrzeżenie: (0%)
-----


Jeśli chcesz to zrobić za pomocą SQL'a:
  1. SELECT @kom_num:=@kom_num+1 'numer', k.* FROM komentarze k, (SELECT @kom_num:=0) n WHERE id_news = '$news';

To zapytanie zwróci komentarze razem z kolumną, w której będzie numer określający kolejność komentarza pod newsem.
Wartości w kolumnie numer zawsze będą rosnące, niezależnie od tego jak sortujesz komentarze. Nie ważne czy sortujesz po dacie dodania rosnąco czy majejąco, najwyższy komentarz będzie mieć numer 1.
Trochę inaczej będzie to wyglądać jeśli, będziesz chcieć stronicować komentarze, wtedy początkowa wartość @kom_num będzie zależeć od offsetu.

Można to też zrobić w PHP. W pętli w której wyświetlasz komentarze, dodajesz tylko (numenr iteracji)+1 w odpowiednie miejsce.
Go to the top of the page
+Quote Post
swagger
post 29.05.2012, 01:19:25
Post #6





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.05.2012

Ostrzeżenie: (0%)
-----


Mam jeszcze jeden dylemat z tym skryptem. Mam plik który wyświetla 3 ostatnie newsy na jednej stronie.
  1. <?php
  2. $newsy = mysql_query("select * from news order by data desc limit 0,3");
  3. while($rekord = mysql_fetch_assoc($newsy)){
  4. echo '<b><div class="news_title">' . $rekord['tytul'] . '</div><a href="profil.php?user=' . $rekord['autor'] . '"><div style="float: left;" class="news_autor"> ' . $rekord['autor'] . '</div></a></b><div style="float: left;" class="news_info"> - ' . $rekord['data'] . '</div><br>' . $rekord['skrot'] . '<br><a href="news.php?id=' . $rekord['id'] . '">więcej...</a><div class=\"title_linia\"></div><div class="title_linia"></div><br>';
  5. }
  6. ?>

Skrypt działa jak najlepiej. Problem jednak jest taki, że chciałbym dodać do każdego z w/w newsów również 3 ostatnie komentarze(skrypt w poście #1). Kombinowałem, kombinowałem i kombinowałem. Aż wstyd mi się przyznać, ale siedziałem przy tym łącznie więcej niż 3h. Robiłem to na różne sposoby. To raz wyszło na to, że albo pokazuje wszystkie komentarze na raz, albo wszystkie pod ostatnim newsem, albo wcale nie wykrywa id z bazy i wyświetla pusty szablon, albo po prostu error, że źle użyta zmienna itp, itd.

I moje pytanie brzmi:
czy mógłby mi ktoś z w/w skryptów skleić skrypt wyświetlający 3 ostatnie newsy z 3 ostatnimi komentarzami pod każdym? Ja wiem, że powinienem sam na to wpaść, a wy mnie powinniście mnie maksymalnie nakierować jak to zrobić. Jednak nauka jakiegokolwiek z języków programistycznych u mnie działa jedynie studiując gotowy kod, po czym przepisując go po swojemu(próbowałem nauki i z książek i z tutoriali, nic), a spędziłem przy próbie sklejenia tego dosyć skoro czasu(więc myślę, że zasłużyłem), z marnym efektem.

Z góry dzięki.

Ten post edytował swagger 29.05.2012, 01:23:27
Go to the top of the page
+Quote Post
IProSoft
post 29.05.2012, 08:52:59
Post #7





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Nakieruję trochę:
  1. <?php
  2. $newsy = mysql_query("select * from news order by data desc limit 0,3");
  3. while($rekord = mysql_fetch_assoc($newsy)){
  4. echo '<b><div class="news_title">' . $rekord['tytul'] . '</div><a href="profil.php?user=' . $rekord['autor'] . '"><div style="float: left;" class="news_autor"> ' . $rekord['autor'] . '</div></a></b><div style="float: left;" class="news_info"> - ' . $rekord['data'] . '</div><br>' . $rekord['skrot'] . '<br><a href="news.php?id=' . $rekord['id'] . '">więcej...</a><div class=\"title_linia\"></div><div class="title_linia"></div><br>';
  5. $komenty = mysql_query("SELECT * from komentarze WHERE id_news = '" . $rekord['id'] . "' ORDER BY data DESC LIMIT 3");
  6. while($row = mysql_fetch_assoc($komenty)){
  7. //tutaj w zmiennej $row masz komentarz
  8. }
  9. }
  10. ?>


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
swagger
post 29.05.2012, 12:54:34
Post #8





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.05.2012

Ostrzeżenie: (0%)
-----


Dzięki za pomoc. Niestety. Próbowałem wcześniej w taki sposób to rozwiązać. Wywala błąd:
Cytat
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in E:\WebServ\httpd\wb\status.php on line 12


Mój kod:
  1. <?
  2. include('gora.php');
  3. $user = $_GET['user'];
  4. $dane = mysql_fetch_assoc(mysql_query("select imie, nazwisko from users where user='$user'"));
  5. echo "<div class='title'><img src='./images/icons/user_status.png' height='28' width='28' /><b> Statusy użytkownika " .$user."</b></div><div class='title_linia'></div><br>";
  6. $status1 = mysql_query("select * from status where autor='$user'");
  7. while($status = mysql_fetch_assoc($status1))
  8. {
  9. echo "<a href='profil.php?user=" .$status['autor']. "'><div style='float: left;' class='news_autor'>" . $dane['imie']. " <b>" . $status['autor'] . "</b> " . $dane['nazwisko'] . "</div></a><div style='float: left;' class='news_info'>&nbsp;zmienił(a) swój status na:</div><br>" . $status['tresc'] ."<br><br><div class='news_info'>".$status['data']."</div><div class='title_linia'></div><br>";
  10. $status_id = $status['id'];
  11. $koment = mysql_query("select * from status_komentarze where id_status_kom='$status_id' order by data desc limit 3");
  12. while($komenty = mysql_fetch_assoc($koment))
  13. {
  14. echo "<a href='profil.php?user=" . $komenty['autor_kom'] . "'><div style='float: left;' class='news_autor'>" . $dane['imie'] . "'<b>" .$komenty['autor_kom'] . "'</b> " .$dane['nazwisko'] . "</div></a><div style='float: left;' class='news_info'>#</div><br>" .$komenty['tresc_kom'] . "<br><div class='title_linia'></div><br>";
  15. }
  16. }
  17. include('dol.php');
  18. ?>



A tabela w bazie wygląda tak:
  1. CREATE TABLE `status_komentarze` (
  2. `id_kom` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_status_kom` varchar(11) NOT NULL,
  4. `tresc_kom` text NOT NULL,
  5. `data_kom` datetime NOT NULL,
  6. `autor_kom` varchar(16) NOT NULL,
  7. PRIMARY KEY (`id_kom`),
  8. KEY `id` (`id_kom`),
  9. KEY `data` (`data_kom`)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=25 ;
Go to the top of the page
+Quote Post
IProSoft
post 29.05.2012, 12:58:10
Post #9





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Po
$koment = mysql_query("select * from status_komentarze where id_status_kom='$status_id' order by data desc limit 3");
daj
echo mysql_error();
i napisz co wyskoczyło.

Wcześniej pisałeś o tabeli komentarze teraz pobierasz z status_komentarze??


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
swagger
post 29.05.2012, 13:03:52
Post #10





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.05.2012

Ostrzeżenie: (0%)
-----


Tak, pisałem o komentarze. Tego samego skryptu używam do 2 stron. To jest ten sam kod, ze zmienioną zmienną.

Co do błędu... Ojć. Przecież. Zamiast "data_kom" wpisałem "data" przy przepisywaniu. Mój błąd. Dzięki, działa. wink.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2025 - 03:57