Update bazy danych, a sesja zalogowanego użytkownika ?

0

Cześć Wam,
mam problem z update bazy danych przez skrypt php. Niby robi mi update bo widać go w phpmyadmin, jednak robi go tylko raz i nie można go powtórzyć w tej samej sesji zalogowanego użytkownika. Użytkownik musi się wylogować, żeby móc wykonać kolejny update. Nie mam pojęcia co robię źle... :) Dodam, że jestem zupełnie początkujący w temacie i uczę się metodą prób i błędów. Z góry dziękuję za cenne porady. Dodatkowo użytkownik na stronie "moje konto" nie widzi od razu zmiany w swoich statystykach, tylko dopiero po przelogowaniu... Poniżej kod:

<?php

$ID = $_SESSION['ID'];
$mdolary = $_SESSION['mdolary'];
$mpunkty = $_SESSION['mpunkty'];
$name = $_SESSION['name'];
$population = $_SESSION['population'];
$comfort = $_SESSION['comfort'];
$prestige = $_SESSION['prestige'];
$safety = $_SESSION['safety']; 		
		
			if	($mdolary >= 18)
			{
				
				$host = "localhost";
				$db_user ="root";
				$db_password ="";
				$db_name ="metropoly";
				
				$conn = mysqli_connect($host,$db_user,$db_password,$db_name) or die ("błąd");
				
				$wynik = $conn->query("SELECT * FROM users");
				
				if ($wynik->num_rows>0){
					
						
				$sql= $conn->query("UPDATE users SET mdolary = '$mdolary'+15 WHERE ID = '$ID'");	
				
					
				echo "Potwierdzamy, że kupiłeś budynek.<br/>Gratulujemy udanej transakcji!<br/> Punkty zostaną dopisane do statystyk twojego miasta w ciągu 48h, a w wirtualnym albumie pojawi się zakupiona inwestycja.";
				
				
			}
			mysqli_close($conn);
			}
			
			
		else{
			echo"Nie możesz kupić tego budynku - masz za mało M-dolarów";
		}
		
		
?>```

1

Po pierwsze nie masz tam session_start().
Po drugie - ten select nie jest potrzebny. Po prostu zrób update i sprawdź czy się wykonał.
Po trzecie - poczytaj sobie o param binding bo teraz łatwo o sql injection.

0

Session start jest na początku dokumentu html, bo wkleiłem tylko fragment dokumentu z php. Rozumiem, że nie muszę powtarzać tego session start osobno dla php? Rzeczywiście select nie był potrzebny - dziękuję :) Potrzebowałbym zrobić coś w rodzaju odświeżenia sesji po wykonaniu powyższego skryptu ..

<?php
session_start();

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

?>
<!doctype html>
<html lang=pl>



 ```php
0

A pokaż kod odpowiedzialny za zapis danych do sesji i logowanie. Bo teraz w sumie zgadywać tylko można.

0

proszę, oto plik zaloguj.php

<?php

	session_start();
	
	if((!isset($_POST['login'])) || (!isset($_POST['haslo'])))
		
		{
			header('Location: index.php');
			exit();
		}
	
	require_once "connect.php";
	
	$polaczenie = @new mysqli($host,$db_user,$db_password,$db_name);
	
	if ($polaczenie->connect_errno!=0)
	{
		echo"Error:".$polaczeie->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 users 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();
			$_SESSION['ID']=$wiersz['ID'];
			$_SESSION['name']=$wiersz['name'];
			$_SESSION['user'] = $wiersz['login'];
			$_SESSION['grupa'] = $wiersz['grupa'];
			$_SESSION['mdolary'] = $wiersz['mdolary'];
			$_SESSION['mpunkty'] = $wiersz['mpunkty'];
			$_SESSION['stan_konta'] = $wiersz['stan_konta'];
			$_SESSION['moje_miasto'] = $wiersz['moje_miasto'];
			$_SESSION['population'] = $wiersz['population'];
			$_SESSION['comfort'] = $wiersz['comfort'];
			$_SESSION['prestige'] = $wiersz['prestige'];
			$_SESSION['safety'] = $wiersz['safety'];
			
			
		
			unset($_SESSION['blad']);
		
			$rezultat->free_result();
			header('location: mojekonto.php');
			
		}else{
			
			$_SESSION['blad'] = '<span style="color:red">Nieprawidłowy login lub hasło!</span>';
			header('Location: index.php');
			
			
		}
		
	}
	
	$polaczenie->close();
	}

?>




 ```php
0

Przy obecnym rozwiązaniu pobierasz dane takie jak mdolary tylko przy logowaniu, a powinieneś za każdym razem gdy użytkownik przechodzi do widoku ze wglądem na swoje saldo

0

Dzięki. Udało mi się rozwiązać problem, wklejając fragment kodu odpowiedzialny za pobieranie danych na początku strony "moje konto". Zastanawiam się tylko i szczerze nie mam pojęcia czy mogę wkleić ten fragment na początku każdej podstrony dostępnej w górnym pasku menu (na wypadek, gdyby użytkownik kliknął inną podstronę niż "moje konto")

<?php
session_start();

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

$host = "localhost";
				$db_user ="root";
				$db_password ="";
				$db_name ="metropoly";
$conn = mysqli_connect($host,$db_user,$db_password,$db_name) or die ("błąd");
				
				$wynik = $conn->query("SELECT * FROM users");
 $how_many_users = $wynik->num_rows;
      if($how_many_users>0)
       {
 
        $wiersz = $wynik->fetch_assoc();
 
       
			$_SESSION['mdolary'] = $wiersz['mdolary'];
			$_SESSION['mpunkty'] = $wiersz['mpunkty'];
			$_SESSION['stan_konta'] = $wiersz['stan_konta'];
			$_SESSION['moje_miasto'] = $wiersz['moje_miasto'];
			$_SESSION['population'] = $wiersz['population'];
			$_SESSION['comfort'] = $wiersz['comfort'];
			$_SESSION['prestige'] = $wiersz['prestige'];
			$_SESSION['safety'] = $wiersz['safety'];
 
    
        $wynik->free_result();
	   }		
mysqli_close($conn);
?>
```php
0

Długo nie siedziałem w phpie ale ten skrypt nie pobiera danych pierwszego użytkownika w tabeli bez znaczenia czy to on jest zalogowany czy nie?

0

Ephyron pobiera i update'uje ... sprawdzałem kilka razy jako zalogowany pierwszy użytkownik . Dlaczego uważasz, że może występować taki błąd?

1

A jak się zalogujesz jako drugi użytkownik? Bo mi to wygląda jakbyś pobierał wszystkich użytkowników, fetchował i pobierał dane składowe ale za każdym razem z tego samego użytkownika (pierwszego pobranego)

0

Przedwczesna radość. Masz rację Ephyron - jest jakiś błąd bo nie mogę przelogować się na żadnego z innych użytkowników. Po logowaniu i tak wchodzi mi konto pierwszego uzytkownika. Czyli wróciłem do punktu wyjścia...

1

Nie za bardzo, i tak poszedłeś krok dalej bo teraz ci się aktualizują dane. Abyś pobierał prawidłowe dane (a nie tylko pierwszego użytkownika) to musisz zrobić selecta gdzie ID jest takie samo jak w sesji. Nie wiem tylko czy to bezpieczne, jeśli użytkownik jest w stanie zmienić wartość w swojej sesji to będzie mieć wgląd do innych kont (o ile id to int typu n,n+1). Musisz zweryfikować

0

Zrobiłem tak jak poradziłeś i wszystko działa - dziękuję za Twój czas. ID to integer z auto increment, nie bardzo rozumiem kwestię tego zagrożenia i jak użytkownik może mieć wgląd do innych kont... Użytkownicy otrzymują ode mnie hasło i login (nie rejestrują się). To strona z grą motywacyjną na zajęcia matematyczne dla dzieci (9-12 lat).

0

https://stackoverflow.com/questions/5121766/can-a-user-alter-the-value-of-session-in-php
https://shiflett.org/articles/session-fixation

Nie przeczytałem za wiele ale tu chyba chodzi o to że jest w stanie podmienić swoją sesję użytkownika z innej sesji. Jeśli to tylko tyle to te rozwiązanie wydaje się być bezpieczne

1 użytkowników online, w tym zalogowanych: 0, gości: 1