Prosty system komentarzy... problem z odczytaniem danych


(Mlody993) #1

Witam,

kod który wyświetla dane z bazy danych:

<?php

 mysql_connect ("host", "użytkownik", "haslo") or 

 die ("Nie można połączyć się z bazą MySQL"); 

 mysql_select_db ("baza_danych") or 

 die ("Nie można połączyć się z bazą komentarze");


 if ($news='3') {

 $wynik = mysql_query ("SELECT * FROM komentarze WHERE artid=0 order by id desc;"); 

 print"
  • "; while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { print "
  • ".$rekord[3] = stripslashes($rekord[3])." | ".$rekord[4] = stripslashes($rekord[4])."".$rekord[5]."

"; } ?[/code]

Problem w tym jest tylko taki, że pierwszy komentarz jest na dole, a trzeci u góry i w celu czytania komentarzy po kolei musimy czytać od dołu, ja chce żeby było od pierwszego do następnego jak np. na dobrychprogramach czy forach...\

Co należy zmienić w tym kodzie?


(Grzelix) #2

zabardzo się nie wczytywałem w kod ale ...

zamiast desc daj asc

$wynik = mysql_query ("SELECT * FROM komentarze WHERE artid=0 order by id asc;");

to zmieni kolejność zwracanych danych więc powinno odwrócić ci kolejność wyświetlania.


(Mlody993) #3

Wielkie dzięki, pomogło. Kurde robiłem to i tyle czasu doszukiwać się takiej drobnostki ;p

@edit:

Jest jeszcze jeden problem.

Chcę aby wyświetlił się komunikat, jeżeli jakieś pole nie zostanie wypełnione...

Próbuje dodać coś takiego:

if (!empty($_POST['tresc']) && !empty($_POST['autor'])) {

else echo "";[/code]




A tak wygląda skrypt:

\<?php $submit = $\_POST['submit']; $id = $\_GET['id']; if (isset($submit)) { $tytul = $\_POST['tytul']; $autor = $\_POST['autor']; $tresc = $\_POST['tresc']; $polaczenie = @mysql\_connect('host', 'user', 'haslo') or die('Brak połączenia z serwerem MySQL. Błąd: '.mysql\_error()); $db = @mysql\_select\_db('baza', $polaczenie) or die('Nie mogę połączyć się z bazą danych Błąd: '.mysql\_error()); $sql = "insert into komentarze (tytul, autor, tresc, artid, dodany) values ('$tytul', '$autor', '$tresc', '$id', NOW())"; $wynik = mysql\_query($sql, $polaczenie) or die(mysql\_error()); echo "
**<font color="#008000">Komentarz został dodany poprawnie. Odczekaj 5 sekund.</font>**"; header('Refresh: 5'); } else { echo '
| Autor: |
| |
| Treść: |
| |
| |
'; } ?\>
No i nie bardzo mi pasują te linijki w tym skrypcie, wyskakuje błąd. Jak zrobię w ten sposób:
    else if (!empty($_POST['tresc']) && !empty($_POST['autor'])) 

  {

    echo '
| Autor: |
| |
| Treść: |
| |
| |
'; } else echo "<font color="#FF0000">Wypełnij wszystkie pola formularza!</font>"; ?\>

To zaraz po wejściu na stronę wyświetla się czerwony napis "Wypełnij wszystkie pola formularza!". Czyli niby jest okej, ale od razu wyczytuje dane, że nie są wpisane i dlatego ta wiadomość. Może gdyby ustawić jakąś wartość domyślną, która znikałaby po kliknięciu?


(Drobok) #4

Po pierwsze korzystając z && sprawdzasz czy oba pola są puste. Zaraz po odpaleniu skryptu wywala ci twój błąd ponieważ, masz go w kodzie wyświetlanym przed wpisaniem danych. Najprościej byłoby dać go do action ;]


(batmomobil) #5

sprubój tak:

<?php

$id = $_SESSION['id']; if(!empty($_POST['tytul']))

	{																																																																																																																																										


  {

    $tytul = $_POST['tytul'];

    $autor = $_POST['autor'];

    $tresc = $_POST['tresc'];

      }

	else

	{

		$tresc='Brak tresci';

	}

	if(empty($tytul)|| empty($autor) || empty($tresc))

	{

		echo "Musisz wypełnić wszystkie pola";

		exit;

	}					

    $polaczenie = @mysql_connect('host', 'user', 'haslo') or die('Brak połączenia z serwerem MySQL.
Błąd: '.mysql_error()); 

    $db = @mysql_select_db('baza', $polaczenie) or die('Nie mogę połączyć się z bazą danych
Błąd: '.mysql_error()); 

    $sql = "insert into komentarze (tytul, autor, tresc, artid, dodany) values ('$tytul', '$autor', '$tresc', '$id', NOW())";

    $wynik = mysql_query($sql, $polaczenie) or die(mysql_error());

    echo "

Komentarz został dodany poprawnie. Odczekaj 5 sekund."; header('Refresh: 5'); } else { echo '

| Autor: |
| |
| Treść: |
| |
| |

'; } ?> [/code]


(Mlody993) #6

batmomobil , twoje rozwiązanie pomogło.

Jeszcze mam taki problem z ilością komentarzy, a dokładniej chodzi o to, żeby przy linku "Komentarze" wyświetlała się ilość komentarzy w tym "artykule", próbowałem poprzez dodanie '$id', ale wtedy w pierwszym artykule jest 6, drugim 5, w trzecim 4... Po prostu leci w dół według kolejności, a w rzeczywistości tylu nie ma. Nie wiem jakie pole dodać do tabeli z jakimi właściwościami, aby działało to poprawnie. Mniej więcej chodzi o takie zliczenie jak na Dobrychprogramach czy blogach itp.


(mario@) #7

Samo zapytanie masz w swoim pierwszym poście, wystarczy je tylko trochę zmienić http://dev.mysql.com/doc/refman/5.0/en/ ... tion_count (warto by tak zmienione zapytanie dodać do zapytania pobierającego dane artykułu).


(Mlody993) #8

mario@ , dzięki - teraz napisałem to na szybko w minutkę, jak jakiś błąd to mnie popraw, ja po pracy dzisiaj będę się z tym bawił.

SELECT komentarze.id,COUNT(*)

            FROM komentarze,course

            WHERE komentarze.id=course.id

            GROUP BY id;

Nie mam pewności tylko do GROUP BY id. Mniejsza z tym, na razie tylko "wzór". @@ Jeszcze mam taki problem z opcją edycji komentarza. Tu jest kod:

<?php 

 mysql_connect ("host", "user", "haslo") or

 die ("Nie można połączyć się z bazą MySQL");

 mysql_select_db ("baza") or //wybieramy bazę

 die ("Nie można połączyć się z bazą komentarze");


$id = $_GET['id'];


if($news='3') {  


    $wynik = mysql_query("SELECT * FROM komentarze WHERE id='$id'");   



        $rekord = mysql_fetch_array($wynik, MYSQL_NUM);  


        echo '  



        Data dodania:

        value="'.$rekord['dodany'].'" />


        Autor:

        value="'.$rekord['autor'].'" />


        Treść: 

        value="'.$rekord['tresc'].'" />


';  


}  


elseif($a == 'save') {    

    $id = $_POST['id'];  

    $dodany = trim($_POST['dodany']);  

    $autor = trim($_POST['autor']);  

    $tresc = trim($_POST['tresc']);   

    mysql_query("UPDATE komentarze SET dodany='$dodany', autor='$autor',  

    tresc='$tresc' WHERE id='$id'")  

    or die('Błąd zapytania');  

    echo 'Dane zostały zaktualizowane';  

} 

?>

Ten kod nie sprawia problemów lecz nie działa, nie wczytuje rekordów z bazy. Pierwsza wersja kodu:

if($a == 'edit' and !empty($id)) {  


    $wynik = mysql_query("SELECT * FROM komentarze WHERE  

    id='$id'")  

    or die('Błąd zapytania');  


    if(mysql_num_rows($wynik) > 0) {  


        $r = mysql_fetch_assoc($wynik);

To sypało błędami, musiałem usunąć or die('Błąd zapytania');, wtedy błędu nie było i zmienić to if jak widać w pierwszym kodzie, po prostu wpisałem byle co. Nie wiem co jest tu nie tak... Za dużo nad tym siedzę i wszystko mi się miesza, przez to nie mogę błędów poprawić prostych. ;/


(mario@) #9

Akurat poniekąd nie ten przykład przepisałeś :slight_smile: i trochę w nim namieszałeś.

select count(*) from `komentarze` where `artid`='tutaj_podajesz_id_artykulu';

Tak jak wspomniałem powyżej warto to dodać do zapytania wybierającego artykuły(wtedy przy linku "Komentarze" wygodniej będzie dodać ich ilość), jak chcesz to podaj tutaj zapytanie wybierające artykuły z bazy to "wklei" się powyższe do niego. Nie pisz tak

$id = $_GET['id'];

lepiej będzie i bezpieczniej napisać tak

$id = (int)$_GET['id'];

Gdzie jest przypisywana wartość zmiennej $news? Piszesz tak $rekord = mysql_fetch_array($wynik, MYSQL_NUM); a odwołujesz się tak $rekord['dodany'].

$rekord = mysql_fetch_array($wynik, MYSQL_ASSOC);

Dla sprawdzenia zawsze możesz napisać

print_r($rekord);

Wtedy zobaczysz jak się odwoływać do odpowiednich kolumn.

$dodany = trim($_POST['dodany']); 

$autor = trim($_POST['autor']); 

$tresc = trim($_POST['tresc']);

Poczytaj o addslashes(stripslashes), htmlspecialchars, strip_tags.


(Mlody993) #10

No dobra, jest dodane. Teraz z bazy wyczytuje dane, ale nie zapisuje po zmianie.

elseif($a == 'save') {  

    $id = $_POST['id'];  

    $dodany = trim($_POST['dodany']);  

    $autor = trim($_POST['autor']);  

    $tresc = trim($_POST['tresc']);  

    mysql_query("UPDATE komentarze SET dodany='$dodany', autor='$autor',  

    tresc='$tresc' WHERE id='$id'")  

    or die('Błąd zapytania');  

    echo 'Dane zostały zaktualizowane';  

}

Po wysłaniu jednak nie wyświetla się komunikat błędu czy echo "dane zostaly zaktualizowane" tylko po prostu odświeża się strona, a link zamiast edycja.php?a=edit&id=x jest edycja.php, czyli po prostu formularz coś nie przenosi do ?a=save&id=x . Hmm... Mam taki mętlik, że po skończeniu tego daje sobie na razie spokój.


(mario@) #11
elseif($_POST['a'] == 'save') {

Adres wygląda tak ponieważ wysyłasz dane poprzez post a nie get.

echo '

(Mlody993) #12

Sorry, ale mam taki mętlik w głowie, że nie wiem co piszesz, ja nie wiem co robię...

Teraz jest tak:

echo '

elseif($_POST['a'] == 'save') {

$id = $_POST['id'];  

    $dodany = trim($_POST['dodany']);  

    $autor = trim($_POST['autor']);  

    $tresc = trim($_POST['tresc']);

Co znów źle wpisałem? ;x


(mario@) #13

Ale nic nawet się nie wyświetla?

Ten fragment odpowiadający za zapis do bazy danych

zastąp tym

else if($_POST['a'] == 'save') { 

print_r($_POST);

}

Powinny się wyświetlić dane wpisane do formularza, sprawdź czy id się zgadza z tym które powinno być.


(Mlody993) #14

Wchodząc w edycja.php?a=edit&id=1 wyświetla się cały formularz poprawnie, w polach input autor, tresc itp.itd. są dane z bazy, jednak próbowałem a polu autor usunąć tylko jedną literkę, żeby sprawdzić czy zapisze to w bazie, więc usuwam jedną literkę, wciskam ZAPISZ, strona się odświeża i w polach input nadal są dane z bazy danych, po prostu jakby coś nie działało z tym "elseif($a == 'save')".

Nie mam już pojęcia. Mogę wysłać Ci na prywatnej wiadomości cały kod pliku edycja.php i może będzie Ci łatwiej pomóc?

@edit:

Jeżeli według twojego sposobu usuwam mój kod:

elseif($_POST['a'] == 'save') {  

    /* odbieramy zmienne z formularza */  

    $id = $_POST['id'];  

    $dodany = trim($_POST['dodany']);  

    $autor = trim($_POST['autor']);  

    $tresc = trim($_POST['tresc']);  

    /* uaktualniamy tabelę test */  

    mysql_query("UPDATE komentarze SET dodany='$dodany', autor='$autor',  

    tresc='$tresc' WHERE id='$id'")  

    or die('Błąd zapytania');  

    echo 'Dane zostały zaktualizowane';  

}

i wklejam to:

else if($_POST['a'] == 'save') { 

print_r($_POST);

}

to po wciśnięciu ZAPISZ formularz się po prostu wyczyszcza, a link się zeruje do edycja.php ;/

Zaraz posyłam Ci kod edycja.php na prywatnej wiadomości.


(mario@) #15

Czyści się ponieważ w adresie brakuje zmiennej id.

Co to jest zmienna $news?

To

if($news='3') {

powinno wyglądać tak

if($news=='3') {

Dane się aktualizują chodzi o to że wyświetlasz je wcześniej niż aktualizujesz dlatego nic się nie zmieniało

<?php


    $sql = mysql_connect("xx","xx","xx");

	mysql_select_db("komentarze",$sql);


	if($_POST['a'] == 'save') 

	{ 

		/* odbieramy zmienne z formularza */ 

		$id2 = (int)$_POST['id']; 

		$dodany = trim($_POST['dodany']); 

		$autor = trim($_POST['autor']); 

		$tresc = trim($_POST['tresc']); 

		/* uaktualniamy tabelę test */ 

		mysql_query("UPDATE komentarze SET dodany='{$dodany}', autor='{$autor}', tresc='{$tresc}' WHERE id='{$id2}'") or die('Błąd zapytania'); 

		echo 'Dane zostały zaktualizowane'; 

	}



    $id = (int)$_GET['id'];


    $wynik = mysql_query("SELECT * FROM komentarze WHERE id='{$id}'");   

	$rekord = mysql_fetch_array($wynik, MYSQL_ASSOC);



    echo ' 



        Data dodania:

        value="'.$rekord['dodany'].'" />


        Autor:

        value="'.$rekord['autor'].'" />


        Treść:

        value="'.$rekord['tresc'].'" />


'; 


    ?> 


WRÓĆ

[/code]

Oczywiście można by dodać przekierowanie, które wyświetli info ale tak też jest dobrze.

Adres powinien wyglądać tak edycja.php?id=1


(Mlody993) #16

No dobra, ten sposób działa i zmienia dane w bazie. Pozostaje jedno pytanie.

Jest taki kod:

Treść:

        value="'.$rekord['tresc'].'" />

A ja chce zrobić z tej treści większe pole w stylu textarea, żeby było to jak komentarz i wprowadzić ten kod:

value="'.$rekord['tresc'].'" />'.$rekord['tresc'].'

Czy to tak poleci i będzie zmieniać dane tresc w bazie?


(mario@) #17
'.$rekord['tresc'].'

(Mlody993) #18

Tak dobra jest okej, tylko wygląda na to, że jest tu jakiś limit znaków, bo przy dłuższym wpisie obcina mi górę i pokazuje sam dół, przy krótszym wszystko jest wyświetlane. Dać w textarea maxlenght?


(mario@) #19

Pewnie masz źle ustawione w bazie danych. W bazie danych przejdź do tabeli komentarze, następnie zakładka Struktura edytuj pole tresc i przy Typ ustaw Text/MediumText/LongText (jedno z tych).


(Mlody993) #20

Zmieniłem i też nie pokazuje. Ogólnie na stronie wyświetla się cała treść, ale w tym polu textarea ją obcina, jakby było jakieś ograniczenie. ;/