Potrzebuje zweryfikować czy dany użytkownik istnieje w bazie danych.

Odpowiedz Nowy wątek
2019-05-09 00:55
0

Witam, jestem początkujący, uczę się dopiero podstaw i nie wiem jak zbudować zapytanie do bazy danych czy dane parametry istnieją. Oto co udało mi się napisać ale nie jestem pewny czy poprawnie. Proszę o weryfikacje i podpowiedź w jakim kierunku pójść żeby to zrobić :)


public boolean check_user(String login, String password) {

        String[] columns = {login, password};
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT login,password FROM users_table WHERE login=? AND password=? ",columns);
        if(cursor.getCount()==2)return true;
        else return false;

    }

Pozostało 580 znaków

2019-05-09 09:01
1

Dlaczego zapytanie ma zwracac 2 rekordy dla jednego uzytkownika?

Pozostało 580 znaków

2019-05-09 10:07
1

Też mi się wydaje dziwne, że jest porównanie z wartością 2.
Myślę, że wystarczy zwykły COUNT, np.

SELECT count(*) FROM users_table WHERE login=?

a potem sprawdzenie czy uzyskany wynik jest większy od zera.

Pozostało 580 znaków

2019-05-09 12:30
0
_zbyszek napisał(a):

Też mi się wydaje dziwne, że jest porównanie z wartością 2.
Myślę, że wystarczy zwykły COUNT, np.

SELECT count(*) FROM users_table WHERE login=?

a potem sprawdzenie czy uzyskany wynik jest większy od zera.

a nie większy niż 1 bo chce też sprawdzić czy hasło się zgadza ? na zasadzie true lub false :)

Wtedy nadal większy niż zero. Tylko warunek się zmieni. - Delor 2019-05-09 13:02

Pozostało 580 znaków

2019-05-09 12:40
0

chce też sprawdzić czy hasło się zgadza

Ale to tak nie działa. Skoro w swoim pierwotnie podanym zapytaniu masz WHERE xxx AND yyy to albo dostaniesz 2 ("SELECT login,password"), albo 0 odpowiedzi. Jeśli OBA warunki zostaną spełnione to dostaniesz jakąś odpowiedź, w przeciwnym razie zero. To nie działa tak, że zwróci Ci jeden wynik, jeśli tyko hasło będzie poprawne, jeden wynik jeśli tylko login będzie pasować, albo 2 jeśli oba będą OK. Sprawdzenie polega na tym, że SQL analizuje warunek i albo jest prawdziwy w całości (dostajesz odpowiedź), albo nie - wtedy masz zero.

Tak na marginesie - trzymanie haseł w bazie w postaci tekstowej to raczej słaby pomysł. Powinieneś trzymać je albo zaszyfrowane, albo ich hashe.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 4x, ostatnio: cerrato, 2019-05-09 12:42

Pozostało 580 znaków

2019-05-09 12:52
0
cerrato napisał(a):

chce też sprawdzić czy hasło się zgadza

Ale to tak nie działa. Skoro w swoim pierwotnie podanym zapytaniu masz WHERE xxx AND yyy to albo dostaniesz 2 ("SELECT login,password"), albo 0 odpowiedzi. Jeśli OBA warunki zostaną spełnione to dostaniesz jakąś odpowiedź, w przeciwnym razie zero. To nie działa tak, że zwróci Ci jeden wynik, jeśli tyko hasło będzie poprawne, jeden wynik jeśli tylko login będzie pasować, albo 2 jeśli oba będą OK. Sprawdzenie polega na tym, że SQL analizuje warunek i albo jest prawdziwy w całości (dostajesz odpowiedź), albo nie - wtedy masz zero.

Tak na marginesie - trzymanie haseł w bazie w postaci tekstowej to raczej słaby pomysł. Powinieneś trzymać je albo zaszyfrowane, albo ich hashe.

Ok , rozumiem czyli cos takiego jak poniżej ?

public boolean check_user(String login, String password) {

        String[] columns = {login, password};
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT count(*) FROM users_table WHERE login=? AND password=? ",columns);
        if(cursor.getCount()>0)return true;
        else return false;

    }

Też tak myślę ale chce pierwsze zrobić żeby działało w ten sposób, później będę kombinował żeby były zaszyfrowane :)

Pozostało 580 znaków

2019-05-09 13:16
1

Nie wiem, co zwraca cursor.getCount(), ale wydaje mi się, że ilośc rekordów w wykonanym zapytaniu. Przy zapytanie typu SELECT Count(*) FROM tabela zawsze będziesz miał przynajmniej 1 rekord.

Pozostało 580 znaków

2019-05-09 13:21
0
Marcin.Miga napisał(a):

Nie wiem, co zwraca cursor.getCount(), ale wydaje mi się, że ilośc rekordów w wykonanym zapytaniu. Przy zapytanie typu SELECT Count(*) FROM tabela zawsze będziesz miał przynajmniej 1 rekord.

Racja, teraz zawsze mnie wpuszcza do activity, to w jaki sposób to ugryźć ?

Pozostało 580 znaków

2019-05-09 13:24
1

Dla

SELECT count(*) FROM users_table WHERE login=? AND password=?

cursor.getCount() zwróci zawsze 1.
Sprawdź zwrócony rekord:

cursor.moveToFirst();
if(cursor.getInt(0) > 0){
  ...
};

lub zamień zapytanie na pobierające cokolwiek z tego wiersza:

SELECT login FROM users_table WHERE login=? AND password=?
edytowany 2x, ostatnio: Delor, 2019-05-09 13:25

Pozostało 580 znaków

2019-05-09 13:36
0
Delor napisał(a):

Dla

SELECT count(*) FROM users_table WHERE login=? AND password=?

cursor.getCount() zwróci zawsze 1.
Sprawdź zwrócony rekord:

cursor.moveToFirst();
if(cursor.getInt(0) > 0){
  ...
};

lub zamień zapytanie na pobierające cokolwiek z tego wiersza:

SELECT login FROM users_table WHERE login=? AND password=?

o to chodzi ?

 public boolean check_user(String login, String password) {

        String[] columns = {login, password};
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT count(*) FROM users_table WHERE login=? AND password=? ",columns);
        cursor.moveToFirst();
        if(cursor.getInt(0)>0)return true;
        else return false;

    }

tak też nie działa

Nie musisz cytować całego poprzedniego postu jeżeli odpowiadasz bezpośrednio pod nim. - Delor 2019-05-09 13:53

Pozostało 580 znaków

2019-05-09 13:53
0

Wygląda ok. Zadbałbym jeszcze o wywołanie cursor.close(); i sprawdzanie błędów/zwracanych wartości.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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