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

Wstawianie postów na stronie

Object Storage Arubacloud
0 głosów
1,041 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 21 lutego 2018 przez tales Nowicjusz (210 p.)
Dziękuję za odpowiedz, hm  jednak spróbuję sposób z wstawieniem php do innego pliku. Czy wtedy mam używać sesii?   znaczy  session_start() w obu plikach  ?
komentarz 21 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Jeżeli tego potrzebujesz ;)
komentarz 21 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
W takiej formie w jakiej próbujesz ten system stworzyć, nie musisz używać sesji. Wystarczy wysłać dane metodą POST.
komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)
edycja 22 lutego 2018 przez tales

No właśnie nie mogę  ufff  w stronie głównej namodziłem tak :

<!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 action="logika.php" method = "post">
	
		<textarea name = "komentarz" cols="100" rows="5"></textarea>
		<br /><br />
		<input type = "submit" value="Dodaj komentarz" />
		
	<form/>			
	
		<?php 	 		
			if ( isset($_POST['zmienna'] ) )
			{
				$n= $_POST['zmienna'];
				echo "<h2>User, ";					
				echo date('Y-m-d   H:i:s');				
				echo "</h2>";
				echo "<p>$n</p>";
			}	
		?>

</body>
</html>

a w pliku logika.php  tak :  (dodałem pomocniczą zmienną metodą POST , żeby isset mógł zadziałąć )

<?php    
		if (isset($_POST['komentarz'])) 
		{
			$tresc = $_POST['komentarz'];
		
			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
				{
						$polaczenie->query("INSERT INTO tresci VALUES (NULL, '$tresc', now() )");
					
						$polaczenie->close();
				}
			}
			catch(Exception $e)
			{
				echo'<span style="color: red;">Błąd serwera</span>';
				echo 'Info: '.$e;
			}		
			
			$_SESSION['zmienna'] =$tresc;
			
			header('Location: index2.php');
		}
?>

 I nie widzi jakby tej zmiennej przesłanej metodą post. Chyba wiem dlaczego nie widzi, ponieważ w pliku logika.php nie ma formularza w którym mógłbym zapisać action="index.php",  no ale w pliku logika.php nie dam przecież formularza ... więc nie wiem jak tą metodę POST teraz użyć... blush.  A gdy używałem w takim sam sposób sessi to wtedy widziało cały czas komentarz nawet gdy nic nie wciskałem ...

komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)

Na początku zastanów się jak zrobić dodawanie komentarzy. Komentarz dodajesz za pomocą prostego formularza. OK, posiadasz taki, na razie to wystarczy.  W głównym pliku usuń tą sekcje.

<?php            
            if ( isset($_POST['zmienna'] ) )
            {
                $n= $_POST['zmienna'];
                echo "<h2>User, ";                    
                echo date('Y-m-d   H:i:s');             
                echo "</h2>";
                echo "<p>$n</p>";
            }   
?>

Tak btw. coś takiego jak $_POST['zmienna'] nie istnieje.  To co zrobiłeś w drugim pliku

$_SESSION['zmienna'] =$tresc;

Nie jest poprawne, ponieważ nie uruchomiłeś sesji. Musiałbyś dodać session_start() w obu plikach.

<?php

session_start();

//kod


$_SESSION['zmienna'] =$tresc;

Ale to na marginesie, ponieważ nie potrzebnie coś takiego robisz. Źle się do tego zabierasz.


W drugim pliku, brakuje Ci dodatkowo ochrony przed sytuacją gdyby ktoś bezpośrednio wszedł pod adres tego pliku. Jeżeli zmienna post nie jest ustawiona, to odeślij użytkownika. Dodatkowo fajnie by było, gdybyś filtrował dane otrzymywane od użytkownika. Kto wie, może chciałby on zrobić coś niepożądanego w naszej bazie wstrzykując SQL.

Jak już wcześniej wspomniałem, linia 

$_SESSION['zmienna'] =$tresc;

jest do wywalenie.

Pomijając fakt, że tylko ty będziesz mógł dodawać takowe komentarze, to wszystko powinno działać normalnie. Jeżeli chciałbyś zrobić system komentarzy dla wielu  użytkowników, to musiałbyś dodać tabele z użytkownikami i dodać dodatkową kolumnę w komentarzach z ID obcym użytkownika.


Teraz wyświetlanie komentarzy. Aby to zrobić, musisz zrobić osobne zapytanie SQL pobierające komentarze z bazy, a następnie wypisać je przy pomocy pętli. Komentarze pobrane zostaną do tablicy, więc najłatwiej będzie wypisać je przy pomocy pętli foeach() ewentualnie while()

 

komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)

o kurcze, nie zauważyłem ale tą linię 

$_SESSION['zmienna'] =$tresc;

  przypadkiem wstawiłem (gdy sprawdzałem działanie razem z session_strart() w obu plikach ())

zamiast tej linii mam tą linię:

$_POST['zmienna'] =$tresc;

 tylko się pomyliłem

komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
$_POST['zmienna'] =$tresc;

Ta linia też nie przejdzie. Zastanów się nad tym co napisałem ;)

komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Nie da się w ten sposób utworzyć zmiennej POST. Ona jest zapisana w nagłówku HTTP.
komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)

hmm zrozumiałem tak, iż powinienem użyć do wyświetlania komentarza,  polecenia sql. I zrobiłem cos takiego, przy pomocy pętli  i wyświetla mi ładnie :)  no i zrobiłem zabezpieczenie bezpośredniego wejscia na stronę logika.php  smiley. Czy o to chodziło : 

	<?php 	 		
	
		if(!isset($_POST['komentarz']))
			header('Location: index2.php');
		else
		{	
			$tresc = $_POST['komentarz'];
				
			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
				{
						$polaczenie->query("INSERT INTO tresci VALUES (NULL, '$tresc', now() )")
						or die('Błąd zapytania');
						
						$wynik = $polaczenie->query("SELECT tresc, czas FROM tresci where id>0 ORDER BY czas DESC" ) 
						or die('Błąd zapytania'); 

						$ile= $wynik->num_rows;
						
						if($ile > 0) 
						{ 	
							while($wiersz = $wynik->fetch_assoc() ) 
								echo "<p>".$wiersz['tresc']."  |  ".$wiersz['czas']." |</p>";  
						}
				}
				
				$polaczenie->close();
			}
			catch(Exception $e)
			{
				echo'<span style="color: red;">Błąd serwera</span>';
				echo 'Info: '.$e;
			}		
		}	
	
	?>

Jeśli mniej więcej tak :)  to teraz  pytanie, jak zrobić żeby te komentarze wyświetlały się pod moim formularzem w pliku index.php (z którego usunąłem plik php tak jak mi poradziłeś) ?

komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)

Po

header('Location: index2.php');

daj exit(); w przeciwnym wypadku interpreter będzie leciał dalej ;)

Zamiast

$ile= $wynik->num_rows;
                     
                   
if($ile > 0)                    
{   
        while($wiersz = $wynik->fetch_assoc() ) 
        echo "<p>".$wiersz['tresc']."  |  ".$wiersz['czas']." |</p>";      
}

Wystarczy

while($wiersz = $wynik->fetch_assoc() ) {
    echo "<p>".$wiersz['tresc']."  |  ".$wiersz['czas']." |</p>";
}
              

Ale znowu mankamenty.

Komentarze są wybierane i wyświetlane dopiero po dodaniu jakiegokolwiek komentarza. O czy zresztą sam napisałeś. Zrób sobie kolejny plik, w którym będziesz wybierał rekordy z bazy. Plik np załącz includem do głównego pliku i gotowe.

komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)

a tak jaśniej ? blush Czy chodzi o to, że np: tworze sobie plik   komentarz.php i do niego dodaje funkcję wybierającą (którą usuwam z pliku logika.php): 

$wynik = $polaczenie->query("SELECT tresc, czas FROM tresci where id>0 ORDER BY czas DESC" ) 
or die('Błąd zapytania'); 

while($wiersz = $wynik->fetch_assoc() ) 
    echo "<p>".$wiersz['tresc']."  |  ".$wiersz['czas']." |</p>";  

?(no i jeszcze raz połączenie z bazą w tym pliku  chyba ?)

a potem w index.php  mam zrobić 

<?php include"komentarz.php"; ?>

??   smiley

 

 

 

komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Tak, jeszcze raz robisz połączenie. I w ten sposób includujesz. Może wydawać sie to trochę zagmatwane, ale kombinuj tak, aby to działało, wyglądało ładnie (przejrzyście) i było jak najbardziej zoptymalizowane. Myślę, że na początek nauki Ci to wystarczy. Jeżeli będziesz zgłębiać tajniki optymalizacji kodu i projektowania witryn, w pewnym momencie napotkasz takie pojęcia jak wzorce projektowe. Szczególnie wzorzec MVC. Możesz o nim poczytać i z czasem jak się przerzucisz na framework, to zrozumiesz jego piękno. Ale jest to kwestia bardziej zaawansowana. Musisz znać przynajmniej podstawy programowania obiektowego aby to zrozumieć, a do tego dochodzą przestrzenie nazw. Ale jeżeli to przeczytałeś, to nie zniechęcaj się ogromem wiedzy i idź na przód ;) Dodałem to jako ciekawostkę na przyszłość i żeby mnie nie zjedli bardziej doświadczeni czytelnicy ;)
komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)
no właśnie coś słyszałem o freemworkach i tym mvc ale narazie chce zrozumieć takie podstawy....   hm a obojętne czy w moim przypadku użyję include , include_once  , reuqire , require_once ?
komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Jeżeli czegoś nie wiesz, to szukaj w google. Jak tam nie znajdziesz, to dopiero wtedy zadawaj pytania. Generalnie chodzi o to, że możesz użyć tego samego include kilka razy, a w przypadku include_once tylko raz w danym pliku. Tak samo ma się z require-ami, tylko w razie gdy nie znajdą pliku, wyrzucą błąd krytyczny. Include jedynie wyrzuci ostrzeżenie.
komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)

No wiem, nie powinienem tutaj. Hmmm działa smiley  i do tego komentarze nie są ulotne czyli  zapisuje mi je na stałe !!!  (a miałem pytać jak zrobić żeby po wyjściu ze strony pamiętało komentarze :) )   Dziękuję, wreszcie zrobiłem coś beckendowego !!!  smiley

To teraz takie pytania,  drobniejsze , bo ciekawy jestem i wiem , że są błędy. Pierwszy to wstzykiwanie SQL, spróbuje to zrobić zaraz. Ale kolejna rzecz to 

1)  Czy w dobrych miejscach  zamykam połączenie z bazą  ? 

2) Czy w pliku logika.php po:     header(Location: index.php)        napisać exit ();?? (pytam ponieważ nie napisałem tego gdyż, poniżej jest  zamykanie połączenia z bazą).

3) W jaki sposób zabezpieczyć  plik komentarz.php przed bezpośrednim dostaniem się do niego przez url ??? (Tu chyba muszę użyć  SESSION ?? czy POST jakoś ???)

index.php:

<body>

	<form action="wynik.php" method = "post">
	
		<textarea name = "komentarz" cols="100" rows="5"></textarea>
		<br /><br />
		<input type = "submit" value="Dodaj komentarz" />
		
	<form/>			
	
	<?php
		include "komentarz.php";
	?>
	
</body>

 

logika.php:

	<?php 	 		
	
		if(!isset($_POST['komentarz']))
		{
			header('Location: index.php');
			exit();
		}	
		else
		{	
			$tresc = $_POST['komentarz'];
				
			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
				{
						$polaczenie->query("INSERT INTO tresci VALUES (NULL, '$tresc', now() )")
						or die('Błąd zapytania');
						
                        header('Location: index.php');
				}
				
				$polaczenie->close();
			}
			catch(Exception $e)
			{
				echo'<span style="color: red;">Błąd serwera</span>';
				echo 'Info: '.$e;
			}		
		}	
	
	?>

 

komentarz.php:  

	<?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
				{		
						$wynik = $polaczenie->query("SELECT tresc, czas FROM tresci where id>0 ORDER BY czas DESC" ) 
						or die('Błąd zapytania'); 

						while($wiersz = $wynik->fetch_assoc() ) 
							echo "<p>".$wiersz['tresc']."  |  ".$wiersz['czas']." |</p>";  			
				}
				
				$polaczenie->close();
			}
			catch(Exception $e)
			{
				echo'<span style="color: red;">Błąd serwera</span>';
				echo 'Info: '.$e;
			}		
	?>

 

i 4) pytanie  może wydać się głupie ale... , w ogóle nie łączyłem tutaj plików logika.php i komentarz.php , więc dziwie się jak one się rozumieją  to znaczy nie użyłem żadnych if(isset(....)) a one ze sobą ładnie współgrają (jeśli jest głupie to nie odpowiadaj nawet na nie :) )

komentarz 22 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)

1. Interpreter php automatycznie zamknie połączenie jeśli przerobi cały plik. Ale taki jeden plik może zawierać kilka includów, dlatego, jeżeli wiesz, że będziesz go załączał gdzie indziej to zamknij połączenie zaraz po wykonaniu wszystkich czynności na bazie danych. Wybrane przez Ciebie miejsce jest ok.

2. Tak, napisz exit(). Jeżeli tego nie zrobisz interpreter będzie przetwarzał kod dalej. Oczywiście na stronie wszystko jest w ifie który nie jest spełniony. Dlatego wielkiego szumu nie będzie jeżeli nie napiszesz. Ale gdyby pod ifem był kod, to niepotrzebnie by był przetwarzany.

Do tego jakby na dole znalazł się jakiś inny header np

header('Location: blablabla.php');

To wtedy nagłówek zostanie nadpisany. I zamiast wysłać nas do index.php, wyśle nas do blabla.php

3. Nie musisz go zabezpieczać. Nikt w nim nic nie zrobi, poza odświeżaniem. A to samo może robić na stronie głównej.

4. Nie za bardzo rozumiem. Zbudowałeś mała interakcyjną aplikacje. pliki komentarz.php i logika.php zajmują się innymi rzeczami ;)

komentarz 22 lutego 2018 przez tales Nowicjusz (210 p.)

Dziękuję za obszerną odpowiedz na każde pytanie, pytam tak, żeby wiedzieć na przyszłość i ,żeby strona była dobra... zaraz biorę się za ochrone przed wstrzykiwanie sql. Ale mam jeszce pytanie smiley:

1) Czy jeśli chciałbym zrobić logowanie , i aby przy komentarzu wyswietlało siękto dodał post to tworzę tabelę uzytkownicy  o primery key id , i w  tabeli tresci dodaję kolumnę uzytkownik i tam wrzucam id użytkownika ?

2) Napisałeś mi wcześniej,  że lepiej będzie gdy zamiast now() użyję automatycznego dodawania daty, czyli jakiejś komendy  sql tak ? czy to się ustawia ręcznie w phpmy admin ?

 

 

 

komentarz 23 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)

1. Dokładnie tak.

2. Zakładam, że ta kolumna jest typu DATETIME. Z poziomu phpmyadmin możesz to zrobić za pomocą edycji/tworzenia struktury tabeli. Przy danej kolumnie wybierasz "Ustawienia domyślne" i dajesz CURRENT_TIMESTAMP. Można to zrobić oczywiście zrobić z poziomu konsoli tj. polecenia SQL wykorzystując ALERT TABLE lub przy tworzeniu tabeli dodać odpowiednie wpisy. Ale jak wcześniej mówiłem, czas będzie wtedy uzależniony od położenia serwera. Dlatego date do bazy najlepiej wsadzić w ten sposób.

$date = new \DateTime('now');

//INSERT INTO tabela('tytul', 'tresc', 'data_wpisu') VALUES('blabla', 'blabla', $date)

 

komentarz 27 lutego 2018 przez tales Nowicjusz (210 p.)

A więc czytałem o wstrzykiwaniu sql , i dowiedziałem się o encjach:) no  i  zabezpieczyłem blush. Znaczy zrobiłem logowanie i je zabezpieczyłem,  no i jeszcze użyłem tych encji do zabezpieczenia dodawnia komentarzy.

1) Chciałbym zapytać czy są dobrze użyte. 

2)  Zastosowałem encje przy logowaniu...,  a poradziłeś mi (jeszcze przed moim pomysłem na logowanie) , aby zastosować encje w miejscu treści komentarza no i tak zrobiłem..., hmm czy nie są one tam nadarmo ?? (tzn.  grozi coś stronie jeśli pole na wpisanie komentarza nie jest chronione za pomocą encji ? smiley )    

 

Troszke pozmieniałem nazwy plików od ostatniego razu (aby lepiej mi się kojarzyły :) )

logowanie.php :

<!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 action="zaloguj.php" method = "post">
	
		Login: 	<input type="text" name = "login" />
		<br /><br />
		Hasło: <input type="password" name = "haslo" />
		<br /><br />
		<input type = "submit" value="zaloguj" />
		
	<form/>			
	

</body>
</html>

 

 zaloguj.php:

<?php

	session_start();
	
	if ((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
	{
		header('Location: logowanie.php');
		exit();
	}

	require_once "connect.php";
	
	$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
	
	if($polaczenie->connect_errno!=0)
	{
		echo "Error: ".$polaczenie->connect_errno;
	}
	else
	{
		$login = $_POST['login'];
		$haslo = $_POST['haslo'];
		
		$login= htmlentities($login, ENT_QUOTES, "UTF-8");
		$haslo= htmlentities($haslo, ENT_QUOTES, "UTF-8");

		if($rezultat =  @$polaczenie->query( 
		sprintf("SELECT * FROM uzytkownicy WHERE login='%s' AND haslo='%s'",mysqli_real_escape_string($polaczenie, $login), mysqli_real_escape_string($polaczenie, $haslo))))
		{
			$ilu_userow = $rezultat->num_rows;
			
			if($ilu_userow>0)
			{
				$_SESSION['zalogowany'] = true;
				
				$wiersz = $rezultat->fetch_assoc();   // wyjmuje wszystkei kolumny z wiersza
				$_SESSION['id'] = $wiersz['id'];
				$_SESSION['login'] = $wiersz['login'];

				$rezultat->free_result();  // CZYSZCZENIE REZULTATÓW WYJETYCH Z BAZY
				header('Location: index.php');
			}		
			else
			{
				$_SESSION['blad'] = '<span style="color: red;">Nieprawidlowy login lub hasło</span>';
				header('Location: logowanie.php');
			}
		}	
		
		$polaczenie->close();
	}

?>

 

index.php:

<?php

	session_start();

	if (!isset($_SESSION['zalogowany']))   
	{
		header('Location: logowanie.php');
		exit();
	}


?>

<!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 action="dodaj_baza.php" method = "post">
	
		<textarea name = "komentarz" cols="100" rows="5"></textarea>
		<br /><br />
		<input type = "submit" value="Dodaj komentarz" />
		
	</form>			
	
	<?php
		include "dodaj_strona.php";
	?>
	
	<br />
	
	<form action="wyloguj.php"> 
		<input type = "submit" value="wyloguj" />
	</form>
	
</body>
</html>

 

dodaj_baza.php:

<?php
	session_start();

	if (!isset($_SESSION['zalogowany']))   
	{
		header('Location: logowanie.php');
		exit();
	}

?>

<!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 action="dodaj_baza.php" method = "post">
	
		<textarea name = "komentarz" cols="100" rows="5"></textarea>
		<br /><br />
		<input type = "submit" value="Dodaj komentarz" />
		
	</form>			
	
	<?php
		include "dodaj_strona.php";
	?>
	
	<br />
	
	<form action="wyloguj.php"> 
		<input type = "submit" value="wyloguj" />
	</form>
	
</body>
</html>

 

dodaj_strona.php:

	<?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
				{		
						$wynik = $polaczenie->query("SELECT tresci.tresc, tresci.czas, uzytkownicy.id, uzytkownicy.login FROM tresci, uzytkownicy WHERE uzytkownicy.id = tresci.id_uzytkownika  AND tresci.id > 0  ORDER BY czas DESC" ) 
						or die('Błąd zapytania'); 

						while($wiersz = $wynik->fetch_assoc() ) 
							echo "<p>".$wiersz['tresc']."  |  ".$wiersz['czas']." |  ".$wiersz['login']." | </p>";  			
				}
				
				$polaczenie->close();
			}
			catch(Exception $e)
			{
				echo'<span style="color: red;">Błąd serwera</span>';
				echo 'Info: '.$e;
			}		
	?>

 

Baza danych :

tabela: UZYTKOWNICY      | id | login | haslo| email |               id = primery key

tabela: TRESCI  | id | tresc | czas | id_uzytkownika | login_uzytkownika |     id = primery key

 

3) Użyłem jak widać sessi ponieważ już w takiej sytuacji chyba trzeba przy logowaniu ??? smiley 

 

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ź 179 wizyt
pytanie zadane 9 grudnia 2016 w Systemy CMS przez bugs55 Obywatel (1,090 p.)
0 głosów
1 odpowiedź 207 wizyt
pytanie zadane 20 sierpnia 2020 w PHP przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 138 wizyt
pytanie zadane 3 czerwca 2019 w PHP przez Kacperhehe Bywalec (2,930 p.)

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...