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

System banowania PHP. Konstrukcja zapytania PHP i SQL.

Object Storage Arubacloud
0 głosów
332 wizyt
pytanie zadane 5 listopada 2018 w PHP przez xxkondzioxx15 Obywatel (1,440 p.)

Witam, tworzę system banowania do gry. Zrobiłem sobie logowanie i rejestracje. Chcę stworzyć prosty system banowania. Zrobiłem sobie w bazie danych tabelę banned. Każdy użytkownik po rejestracji w kolumnie banned otrzymuje wartość 0. Założyłem sobie, że gdy będę chciał zablokować użytkownika to w tejże kolumnie dam wartość 1 i w takim przypadku wyświetli się komunikat podczas logowania, że twoje konto jest zablokowane. Zrobiłem najpier coś takiego:

$check = "SELECT * FROM accounts WHERE banned = 1";
	$result = $conn->query($check);
	if ($result->num_rows > 0) {
			$result = array('status' => 1, 'msg' => "Your account is banned!");
			echo json_encode($result);
				die;
	}

Tylko dopiero dziś zobaczyłem że to nie ma sensu, bo jeśli pojawi się przy jednym użytkowniku 1 to wszyscy użytkownicy są zablokowani. Jak napisać zapytanie sql aby tyczyło się to tylko i wyłącznie jednego użytkownika?

Zrobiłem jeszcze coś takiego:

$check = "SELECT id,login,banned FROM accounts WHERE login LIKE '" . $login . "'";
	$result = $conn->query($check);
	if($result['banned'] != 0)
        {
			$result = array('msg' => "Your account is banned!");
			echo json_encode($result);
				die;
	}

Ale dostaję komunikat: " Cannot use object of type mysqli_result as array". Napisane jest to na PHP 5.2 i pewnie dlatego. Pomoże mi ktoś? Mam jeszcze drugie pytanie. Chciałbym aby w loginie dało się pisać tylko znaki [A-Za-z0-9]. Jak mogę wykonać to w PHP? Zrobiłem coś takiego: (wykonałem to na podstawie sprawdzenia adresu email w którym to jednak działa)

function check_login($login) {
			if (preg_match('[a-zA-Z0-9]', $login)) {
			return true;
			} else {
			return false;
			    }
			}

if (!check_login($login)) {
			$result = array('msg' => "Invalid login!");
			echo json_encode($result);
			die;
			}

Ale to nie działa, bo cały czas dostaję komunikat Invalid login! To samo tyczy się hasła. Chciałbym aby wymagał PHP, aby użytkownik wpisał min. 1 dużą literę i jakiś znak np. @#$%^&. Z góry dziękuję za pomoc.

 

2 odpowiedzi

0 głosów
odpowiedź 5 listopada 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
wybrane 5 listopada 2018 przez xxkondzioxx15
 
Najlepsza
Witam,

Jeśli chodzi o zapytanie, musisz sprawdzić czy wartość 1 jest przypisana do użytkownika, który chce się zalogować. Dopisz więc na końcu zapytania jeszcze AND kolumnaLogin = $login, oczywiście lepiej użyć PDO niż takiej gołej zmiennej.

Wyskakuje Ci błąd z tablicą, ponieważ chcesz użyć tablicy asocjacyjnej na zapytaniu, nie wyniku.
komentarz 5 listopada 2018 przez xxkondzioxx15 Obywatel (1,440 p.)
"Wyskakuje Ci błąd z tablicą, ponieważ chcesz użyć tablicy asocjacyjnej na zapytaniu, nie wyniku. " - dzięki tej informacji rozwiązałem samodzielnie problem. Dziękuję!
0 głosów
odpowiedź 5 listopada 2018 przez smokolisz Mądrala (6,340 p.)

Do kwerendy dopisz warunek określający danego użytkownika np zalogowany użytkownik ma id 23 to dopisz

WHERE banned = 1 AND id = 23

normalnie zamiast 23 będziesz mieć zmienną w której przechowujesz to id

Ja nie tworzyłbym nowej tabeli bo to jest relacja 1:1 i wystarczy w tabelii gracz utworzyć nową kolumne typu bool gdzie każdy użytkownik tam gdzie jest login hasło itp dać 0 == niezbanowany i 1 == zbanowany. Teraz podczas pomyślnego logowania sprawdzałbym wartość tego pola dla danego użytkownika

if($row["banned"]) {

   alert("Zostałeś zbanowany!");

   //kod

}
komentarz 5 listopada 2018 przez xxkondzioxx15 Obywatel (1,440 p.)

Sorry nie mam tabeli banned tylko kolumnę. Po prostu się pomyliłem. Jeśli chodzi o id to jak to mam zrobić?

$id =($_POST['id']);
$check = "SELECT * FROM accounts WHERE banned = 1 AND id=$id";
    $result = $conn->query($check);
    if ($result->num_rows > 0) {
            $result = array('status' => 1, 'msg' => "Your account is banned!");
            echo json_encode($result);
                die;
    }

Tak to ma wyglądać? Jeśli tak to nie działa. Ale jeśli przypiszę to na sztywno to działa.

komentarz 5 listopada 2018 przez smokolisz Mądrala (6,340 p.)

W twoim kodzie sprawdzasz ile wierszy zwraca kwerenda (num_rows) i czy jest ich więcej niż 0.Zamiast tego powinieneś sprawdzić czy w polu banned danego użytkownika widnieje 0 czy 1.

Żeby wiedzieć u którego użytkownika sprawdzić czy jest zbanowany powinieneś podczas sprawdzania poprawności logowania pobrać dane o użytkowniku, czyli

  1. użytkownik podaje login i hasło w formularzu
  2. tworzysz kwerende sprawdzającą, czy użytkownik o danym loginie i haśle istnieje
$login = htmlentities($login, ENT_QUOTES, "UTF-8");
		
if ($rezultat = @$polaczenie->query(
sprintf("SELECT * FROM uzytkownicy WHERE user='%s'",
mysqli_real_escape_string($polaczenie,$login))))

  Teraz sprawdzasz ile rekordów zwróciło zapytanie, jeżeli znaleziono pasujące konto z loginem to teraz sprawdzasz czy hasło się zgadza, jeżeli tak to pobierasz cały rekord z tabeli. W ifie sprawdzasz czy jest zbanowany czy nie

Nie wiem czy jasno to wytłumaczyłem

komentarz 5 listopada 2018 przez xxkondzioxx15 Obywatel (1,440 p.)
Napiszę do ciebie na PW

Podobne pytania

0 głosów
1 odpowiedź 251 wizyt
0 głosów
1 odpowiedź 439 wizyt
pytanie zadane 4 grudnia 2018 w PHP przez genesis12 Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 235 wizyt
pytanie zadane 8 sierpnia 2018 w PHP przez JeyJey Użytkownik (710 p.)

92,555 zapytań

141,402 odpowiedzi

319,552 komentarzy

61,939 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!

...