繁体   English   中英

如何在Android中使用多种类型的用户创建登录(MySQL)

[英]How to create login (MySQL) with multiple types of user in Android

我想使用多种类型的用户创建登录活动。 此登录与 MySQL 连接。 多项选择是“审阅者”和“非审阅者”。 现在我使用 Spinner 和我从 string.xml 调用的值。 在“用户”表中,有一些列,例如“用户名”、“密码”和“用户类型”。 例如,用户'peter'是一个“审阅者”,如果他使用的用户名、密码和用户类型正确,他就可以登录。 我怎么解决这个问题? 下面是我的代码。

//登录活动公共类MainActivity扩展AppCompatActivity{

private static final String KEY_USERNAME = "username";

private static final String LOGIN_URL = "http://lienawan.xyz/login.php";

private SharedPreferences.Editor loginPrefsEditor;

private EditText etEmail;
private EditText etPassword;
private CheckBox chkMe;
ArrayAdapter<CharSequence> adapter;

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE); //will hide the title
    Objects.requireNonNull(getSupportActionBar()).hide(); // hide the title ba
    setContentView(R.layout.activity_main);

    etEmail = findViewById(R.id.etEmail);
    etPassword = findViewById(R.id.etPassword);
    chkMe = findViewById(R.id.chkMe);
    SharedPreferences loginPreferences = getSharedPreferences("loginPrefs", MODE_PRIVATE);
    loginPrefsEditor = loginPreferences.edit();
    boolean saveLogin = loginPreferences.getBoolean("saveLogin", false);
    if (saveLogin) {
        etEmail.setText(loginPreferences.getString("username", ""));
        etPassword.setText(loginPreferences.getString("password", ""));
        chkMe.setChecked(true);
    }
    Spinner spCategory = findViewById(R.id.spCategory);
    adapter = ArrayAdapter.createFromResource(this,R.array.usertype,android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spCategory.setAdapter(adapter);
    spCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    Button btnLogin = findViewById(R.id.btnLogin);
    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            login();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(etEmail.getWindowToken(), 0);

            String username = etEmail.getText().toString();
            String password = etPassword.getText().toString();

            if (chkMe.isChecked()) {
                loginPrefsEditor.putBoolean("saveLogin", true);
                loginPrefsEditor.putString("username", username);
                loginPrefsEditor.putString("password", password);
                loginPrefsEditor.apply();
            } else {
                loginPrefsEditor.clear();
                loginPrefsEditor.commit();
            }
        }
    });
}

@Override
public void onBackPressed() {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Exit");
    builder.setMessage("Do you want to exit?");
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            finish();

        }
    });
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.cancel();
        }
    });
    builder.show();
}

private void login() {

    String username = etEmail.getText().toString().trim();
    String password = etPassword.getText().toString().trim();
    userLogin(username, password);
}

private void userLogin(final String username, final String password){
    class UserLoginClass extends AsyncTask<String,Void,String> {
        private ProgressDialog loading;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(MainActivity.this,"Login... Please Wait",null,true,true);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();
            if(s.equalsIgnoreCase("success")){
                Intent intent = new Intent(MainActivity.this,DashboardApp.class);
                intent.putExtra(KEY_USERNAME,username);
                startActivity(intent);
            }else{
                Toast.makeText(MainActivity.this,s, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        protected String doInBackground(String... params) {
            HashMap<String,String> data = new HashMap<>();
            data.put("username",params[0]);
            data.put("password",params[1]);

            Connection ruc = new Connection();
            String result = ruc.sendPostRequest(LOGIN_URL,data);
            return result;
        }
    }
    UserLoginClass ulc = new UserLoginClass();
    ulc.execute(username, password);
}

}

<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
    $username = $_POST['username'];
    $password = $_POST['password'];
    $approver = $_POST['approver'];

    require_once('dbConnect.php');

    $sql = "select * from user where username='$username' and password='$password'";

    $check = mysqli_fetch_array(mysqli_query($con,$sql));

    if(isset($check)){
        echo "success";
    }else{
        echo "Invalid Username or Password";
    }

}else{
    echo "error try again";

要从微调器中获取选定的值,您可以在onItemSelected编写以下代码:

 String item;//declare globally out of your all method
@Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // On selecting a spinner item
        item = parent.getItemAtPosition(position).toString();

        // Showing selected spinner item
        Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
    }

现在,检查item和其他值是否not null ,如下所示:

    private void login() {

        String username = etEmail.getText().toString().trim();
        String password = etPassword.getText().toString().trim();
        //checking if fields are not null 
       if (username.isEmpty() || password.isEmpty() || item.isEmpty()) {
       Toast.makeText(getActivity().getApplicationContext(), "Please enter name or pass or select one type!", Toast.LENGTH_SHORT).show();
        return;
        }else{
          userLogin(username, password,item);//passing value to volley
     }
   }

并在您的齐射请求中更改如下:

    private void userLogin(final String username, final String password,final String item){
...
 @Override
        protected String doInBackground(String... params) {
            HashMap<String,String> data = new HashMap<>();
            data.put("username",params[0]);
            data.put("password",params[1]);
            data.put("approver",params[2]);//adding item value
            ..
        }
    }
}

在您的 php 端,只需将您的query更改为:

 $sql = "select * from user where username='$username' and password='$password' and usertype='$approver'";

希望这对你有帮助!

注意:也从未使用纯文本密码并尝试使用准备好的语句它是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM