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

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;

    }
1

Dlaczego zapytanie ma zwracac 2 rekordy dla jednego uzytkownika?

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.

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 :)

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.

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 :)

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.

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źć ?

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=?
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

0

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

0

Tylko nie działa hehe...

Tak wyglada dodawanie.

  public void add_user(Users_sqllite_class user) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues users_data = new ContentValues();
        users_data.put("login", user.getLogin());
        users_data.put("password", user.getPassword());

    }

a tak if który nas wpuszcza


 Intent intent;
        Users_DatabaseHelper obj;
        switch(view.getId()) {

            case R.id.Zaloguj:
                EditText login_text = (EditText) findViewById(R.id.login);
                String login = login_text.getText().toString();
                EditText password_text = (EditText) findViewById(R.id.haslo1);
                String password = password_text.getText().toString();
                Users_DatabaseHelper db1=new  Users_DatabaseHelper(this);
                if(db1.check_user(login,password)==true) {
                    intent = new Intent(MainActivity.this, Users_space_a.class);
                    startActivity(intent);
                }

        break;

Może tutaj jakiś błąd jest ?

Chyba ze bym spróbował jeszcze czegos takiego ?

SELECT * FROM User WHERE username=providedUserName AND password=providedPassword LIMIT 1

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