• 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.

VPS Starter Arubacloud
0 głosów
411 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ź 276 wizyt
0 głosów
1 odpowiedź 524 wizyt
pytanie zadane 4 grudnia 2018 w PHP przez genesis12 Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 254 wizyt
pytanie zadane 8 sierpnia 2018 w PHP przez JeyJey Użytkownik (710 p.)

92,964 zapytań

141,930 odpowiedzi

321,163 komentarzy

62,298 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...