• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wstawianie postów na stronie

VPS Starter Arubacloud
0 głosów
1,014 wizyt
pytanie zadane 21 lutego 2018 w PHP przez tales Nowicjusz (210 p.)

Dobry wieczór. Mam pewien problem, a to mój pierwszy post na forum więc proszę o wyrozumiałość jeśli będzie bardzo źle napisany  wink.   

Jestem w trakcie robienia strony w której będzie zawarte dodawanie postów. Wiem, że musi być to związane z bazami danych oraz PHP. (PHP uczę się od niedawna).  Po kilku "goglowaniach" udało mi się napisać połączenie z bazą.

Moje problemy to : 

1)    Gdy dodaję jakiś komentarz,  zostaje on dodany  po wciśnięciu przycisku "Dodaj komentarz"  (ok :)), ale gdy odświeżam stronę (f5) to wtedy  do bazy danych dodaje się ostatni komentarz, chociaż nawet nie klika przycisku "Dodaj komentarz", dlaczego ??? (próbowałem używać  unset($tresc) , ale to nic nie dało  ).  

2) Gdy dodaję komentarz  to kolejny komentarz zastępuje mi ostatnio dodany , a chciałbym żeby pojawił się pod  powyżej starszego komentarza.  

(Kod  jest prowizoryczny tylko na potrzeby łatwiejszego zrozumienia przeze mnie jak  ten mechanizm działa smiley, w phpMyadmin  tabela nazywa się tresci  i zawiera:  id/ tresc/ date postu) 

(serwerem jest localhost (xampp))

<!DOCTYPE html>
<html lang="pl">

<head>

	<meta charset="utf-8">
	<title>Forum</title>
	<meta name="description" content="Forum">
	<meta name="keywords" content="forum">
	
	<meta http-equiv="X-Ua-Compatible" content="IE=edge,chrome=1">
	
</head>

<body>

	<form method = "post">
	
		<textarea name = "komentarz" cols="100" rows="5"></textarea>
		<br /><br />
		<input type = "submit" value="Dodaj komentarz" />
		
	<form/>			
	
	<?php    
	
			require_once "connect.php";
			mysqli_report(MYSQLI_REPORT_STRICT);
		
			try
			{
				$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
				if($polaczenie->connect_errno!=0)
				{
					throw new Exception(mysqli_connect_errno());
				}
				else
				{
					if (isset($_POST['komentarz'])) 
					{
						$tresc = $_POST['komentarz'];
				
						$polaczenie->query("INSERT INTO tresci VALUES (NULL, '$tresc', now() )");

							echo "<h2>User, ";					
							echo date('Y-m-d   H:i:s');				
							echo "</h2>";
							echo "<p>$tresc</p>";

						$polaczenie->close();
					
					}
				}
			}
			catch(Exception $e)
			{
				echo'<span style="color: red;">Błąd serwera</span>';
				echo 'Info: '.$e;
			}
			
?>
		
</body>
</html>

a tutaj jest plik który łączy z bazą danych: 

	$host = "localhost";
	$db_user = "root";
	$db_password ="";
	$db_name = "forum";

 

 

komentarz 21 lutego 2018 przez Mariusz08 Maniak (62,300 p.)
Mamy XXI wiek, rok 2018. Ktoś jeszcze używa mysqli_*? Myślałem, że nie. Widocznie się myliłem. :/
komentarz 21 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Gdzie widzisz mysqli_* ?

2 odpowiedzi

+1 głos
odpowiedź 21 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
wybrane 6 maja 2018 przez tales
 
Najlepsza

1. Oddziel logikę strony od widoku. Dzieje się tak, ponieważ każdorazowo po pierwszym wysłaniu formularza zmienna $_POST['komentarz'] jest ustawiana. A zatem warunek if (isset($_POST['komentarz'])) zostaje spełniony. Czemu tak się dzieje ? Ponieważ w nagłówku HTTP zostaje zapisana ta informacja. Jeżeli logikę zrobisz w innym pliku, a następnie zrobisz redirecta header('Location: 'blablabla.php'') to wszystko zadziała.

2. Żeby wyświetlić kolejne komentarze, musisz je wyjąć z bazy. To co robisz, to jedynie wypisanie poprzednio podanych danych.

Dodatkowo nie potrzebnie łączysz się z bazą, skoro tego nie potrzebujesz. Nie każdy przecież zostawi komentarz. Zamiast now() w insercie, możesz ustawić automatyczne dodawanie daty serwera. Chociaż jest to zależne od położenia serwera. Gdybyś post pisał w Polsce, a serwery były w Anglii, to czas by się różnił o godzinę. Dlatego lepiej użyć klasy DateTime lub funkcji date.

 

Jeżeli koniecznie chcesz zrobić coś na tej samej stronie, w ifie możesz użyć

header('Location: ' . basename($_SERVER['PHP_SELF']));

 

komentarz 28 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Wygląda to już przyzwoicie ;) W pliku zaloguj php, w przypadku sprawdzania zmiennych POST, polecam używać funkcji empty(), zamiast isset(). Jeżeli wyślesz pusty formularz, to zmienna POST będzie ustawiona z wartością NULL, przez co if przejdzie. Możesz się wystrzegać używania @ i zastępuj ją blokami try(). Kiedy kod będzie większy, trudniej Ci będzie znaleźć błąd bo po prostu go zamaskujesz. Zabezpieczenia przed wstrzykiwaniem są ok. Użycie sesji, również uzasadnione.
komentarz 28 lutego 2018 przez tales Nowicjusz (210 p.)
Dziękuję :)    .. ( wiem że encje  są potrzebne w polu wpisywania loginu i hasła )   ALE CZY zastosowanie encji  w polu  w którym wpisuję  treść posta  jest potrzebne ???
komentarz 28 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Tak, użytkownik nie ma prawa robić nawet najmniejszej ingerencji w naszego SQL.
komentarz 28 lutego 2018 przez tales Nowicjusz (210 p.)

Dziękuję smiley, myślałem że w komentarzu już nic raczej nie może zrobić , a jednak ... Dlatego tak pytam :)  Jeszcze  spróbuję zrobić możliwość usuwania przez użytkownika komentarza oraz jego edycję 

komentarz 6 maja 2018 przez tales Nowicjusz (210 p.)
Dzień dobry, dużo mi pomogłeś bardzo ale chciałbym zrobić coś jeszcze jednego ;) aczkolwiek,  chcę aby te komentarze które dodają użytkownicy, były  TEMATAMI , w który to temat można wejść i tam pisac dopiero komentarze. Czyli chodzi mi o to : "jak wcisnąć TEMAT (czyli dotychczasowy komentarz) aby przeniósł mnie na stronę gdzie będzie można pisać dopiero komentarze związane z tym tematem" ??  Czyli ten dotychczasowy komentarz mam wziąć w   <a  href=""></a>   jeśli tak to co pisać w href aby za każdym razem jakby tworzyło nową podstronę (znaczy każda podstrona do innego TEMATU powinna być chyba ??) , piszę wstępnie , nie wiem czy dobrze myślę, może w inny sposób robi siętakie rzeczy ???   :)
0 głosów
odpowiedź 21 lutego 2018 przez Jedras Maniak (54,860 p.)
2. id w bazie ma ustawione AUTO_INCREMENT i jest kluczem głównym ?
komentarz 21 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Zaraz pod insertem wypisuje dane. Dane nie są z bazy. Więc raczej tu mu zastępuje, a w bazie jest ok.
komentarz 21 lutego 2018 przez tales Nowicjusz (210 p.)

@Jedras,   tak ustawiłem AUTO_INCREMENT i klucz główny  dla id.  TO błąd? 

Podobne pytania

0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 9 grudnia 2016 w Systemy CMS przez bugs55 Obywatel (1,090 p.)
0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 20 sierpnia 2020 w PHP przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 3 czerwca 2019 w PHP przez Kacperhehe Bywalec (2,930 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...