(Мой родной язык не английский. Возможно, в этом вопросе есть неправильная грамматика.)
Когда я пытаюсь войти в свое приложение, это приложение всегда возвращает УСПЕХ, даже если я ввел неправильный пароль.
Сначала я создал таблицу БД (PERSON). Во-вторых, я создал метод (chkpPw), проверяющий PW. В-третьих, я использую этот метод двумя способами.
это то, что я хочу результат. 1. пустой ID или пустой PW => Пожалуйста, введите ваш ID или PW. 2. Неправильный идентификатор, неверный пароль или правильный пароль => Ваш идентификатор не существует. 3. Правильный идентификатор, неправильный пароль => Пожалуйста, проверьте свой пароль. 4. Правильный ID, правильный PW => Успех
Но теперь мое приложение вернуло их. 1. пустой ID или пустой PW => Пожалуйста, введите ваш ID или PW. 2. Неправильный идентификатор, неверный пароль или правильный пароль => Ваш идентификатор не существует. 3. Правильный идентификатор, неверный пароль => успех 4. Правильный ID, правильный PW => Успех
Мой SQL-запрос находит идентификатор, который существует в БД, не учитывая pw, даже если pw существует или нет....T_T....
это данные таблицы PERSON:
personID | pId | pPw
1 | apple111 | 11111111
2 | banana222 | 22222222
3 | peache333 | 33333333
public class DBHelper extends SQLiteOpenHelper {
private static final String KEY_NAME = "pId";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
super(context, "tryangleDB", null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String personSql = "CREATE TABLE PERSON (" +
"personID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"pId TEXT NOT NULL, " +
"pPw TEXT NOT NULL, " +
"pName TEXT NOT NULL, " +
"pBirth TEXT NOT NULL, " +
"pEmail TEXT NOT NULL, " +
"pPhone TEXT NOT NULL, " +
"pProfile BLOB, " +
"cDate TEXT, " +
"dDate TEXT)";
db.execSQL(personSql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion == DATABASE_VERSION) {
db.execSQL("DROP TABLE IF EXISTS PERSON");
onCreate(db);
}
}
// check same id exists when user registers
public boolean chkpId (String pId){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("Select * from person where pId=?", new String[]{pId});
if (cursor.getCount()==0) {
return true;
}
else {
return false;
}
}
// when user tries to login, check pw with id
// ★Please help this part.
public boolean chkpPw (String pPw, String pId){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("Select ? from person where pId= ?", new String[]{pPw, pId});
if (cursor.getCount()>0) {
return true;
}
else {
return false;
}
}
// // this is what I tried.
// public boolean chkpPw(String pPw, String pId) {
// SQLiteDatabase db = this.getReadableDatabase();
// String[] columns = {pPw, };
// String[] parms = {pId };
//
// Cursor cursor = db.query(" PERSON ", columns, "pId = ?", parms, null, null, null);
// try {
// if (cursor.getCount() > 0) {
// return true;
// // 트루라는 자체가 일치하는 id를 찾았다는 것
// } else {
// return false;
// }
// } catch (Exception e) {
// e.printStackTrace();
// return false;
// } finally {
//
// }
// }
}
// skip upper part
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pPw = etPw.getText().toString();
pId = etId.getText().toString();
// boolean chkpId = db.chkpId(pId);
boolean chkpPw = db.chkpPw(pPw, pId);
// 1
if (pId.equals("") || pPw.equals("")) {
Toast.makeText(getApplicationContext(),"Please enter your ID or PW.",Toast.LENGTH_SHORT).show();
}
else{
try{//★ I think this part has some problems.
if (chkpPw) {
Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_SHORT).show();
}
else if (!chkpPw) {
Toast.makeText(getApplicationContext(),"failed",Toast.LENGTH_SHORT).show();
}
// ★ these are what I tried
// if (chkpPw==false) {
// save();
// Intent intent = new Intent(LoginActivity.this, MainActivity.class);
// startActivity(intent);
// }
// if (chkpId==false&&(chkpPw==true||chkpPw==false)) {
// Toast.makeText(getApplicationContext(),"not exist ID",Toast.LENGTH_SHORT).show();
// }
//
// if (chkpId==true&&chkpPw==false) {
// Toast.makeText(getApplicationContext(),"wrong PW",Toast.LENGTH_SHORT).show();
// }
// if (chkpPw==true) {
// Toast.makeText(getApplicationContext(),"not matched PW to this ID",Toast.LENGTH_SHORT).show();
// }
// if (chkpId==false && chkpPw==false) {
// save();
// Intent intent = new Intent(LoginActivity.this, MainActivity.class);
// startActivity(intent);
// }
// else if (chkpId==false && chkpPw==true) {
// Toast.makeText(getApplicationContext(),"not matched to PW",Toast.LENGTH_SHORT).show();
// }
// else if (chkpId==true && chkpPw==true) {
// Toast.makeText(getApplicationContext(),"Please register.",Toast.LENGTH_SHORT).show();
// }
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(LoginActivity.this, "something wrong", Toast.LENGTH_SHORT).show();
} finally {
// save();
}
}
}
});




Вы проверяете, существуют ли идентификатор и пароль отдельно. Более подходящим подходом было бы сначала проверить, существует ли идентификатор, а затем существуют ли идентификатор и пароль обе. Вы, вероятно, захотите сделать что-то в следующем духе.
public boolean chkpPw (String pPw, String pId){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("Select * from person where pPw=? and pId=?", new String[]{pPw, pId});
if (cursor.getCount()>0) {
return true;
}
else {
return false;
}
}
Круто, проголосуйте, если это помогло, и отметьте ответ как правильный, если он сработал. Ваше здоровье.
Измените запрос в методе chkpPw на
db.rawQuery("SELECT 1 FROM `person` WHERE `pPw`=? AND `pId`=?", new String[]{pPw, pId});
Идеальный ответ!!! Ключевым моментом было ГДЕ pPw=? И pId=?.... Я просто пытался найти правильный pid. Большое спасибо: Д
Я думаю, что ваш метод db chkpPw неверен. Что вы делаете: выберите пароль, когда этот пользователь существует. Как вы могли заметить, этот запрос вернет хотя бы одну строку, если существует только id, поэтому вы возвращаете true, и метод говорит, что вы правы.
Хорошо, теперь давайте пройдемся по ответу.
Для проверки правильности пользователя и пароля вы можете попробовать, в соответствии с вашим кодом, это:
выберите * из вашей_таблицы, где id=? а пароль=?
Спасибо!! Я вообще не думал, что SQL неверен. Но ключевым моментом было ГДЕ pPw=? И pID=?.
Спасибо. Ключевым моментом было ГДЕ pPw=? И pID=?. Я просто пытался найти правильный pid. Это знали все, кроме меня. хахаха