공상하는 개발자

[안드로이드/android] 안드로이드 데이터베이스 연동해서 로그인 기능 구현(웹호스팅 사이트 이용) 본문

개발/안드로이드

[안드로이드/android] 안드로이드 데이터베이스 연동해서 로그인 기능 구현(웹호스팅 사이트 이용)

공상과학소설 2019. 7. 22. 09:18
반응형

안녕하세요.

이번에는 제가 타임라인 프로젝트를 구현 중에 있는데 php를 통해서 어떻게

안드로이드와 연동을 시켰는지 보여드리겠습니다.

 

일단 저는 학생이기에 금전적인 여유가 많지 않아서 무료 웹 호스팅 사이트를 찾아보았는데요.

이리저리 구글링을 하다가 000webhosting 이라는 외국 호스팅 사이트를 발견했습니다.

이 사이트는 무료로 php 와 mysql을 지원해줍니다. 물론 트래픽 같은 부분에서 유료보다는 당연히 성능이

떨어지긴 하지만 그래도 혼자서 제작하는 프로젝트에서 쓰기에는 부족함이 없어 보입니다.

 

이 웹호스팅 사이트를 이용해서 간단한 로그인을 구현해보도록 하겠습니다.

 

1
2
3
4
5
6
7
create table user(
id varchar(20),
password varchar(20not null default null,
nickname varchar(10not null unique,
sex char(1not null default 'm',
Api_Token varchar(20default 'ERYON',
primary key(id,Api_Token));

 

일단 user 테이블을 생성해줍니다.

 

 

이처럼 잘 저장된 것을 볼 수 있습니다. 

 

회원가입 페이지

 

로그인 페이지

위처럼 회원가입과 로그인 페이지를 구현해봤습니다. 이제 기능을 구현하겠습니다.

 

먼저 회원가입 기능을 구현해보겠습니다.

 

 

SignupPage.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    private void insertoToDatabase(String Id, String Pw, String Name) {
        class InsertData extends AsyncTask<String, Void, String> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(SignupPage.this, "Please Wait"nulltruetrue);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                if(s.equalsIgnoreCase("회원가입에 성공하셨습니다.")){
                    Intent intent = new Intent(SignupPage.this, LoginActivity.class);
                    startActivity(intent);
                    finish();
                }
                else{
                    AlertDialog.Builder builder=new AlertDialog.Builder(SignupPage.this);
                    builder.setMessage(s)
                            .setNegativeButton("retry",null)
                            .create()
                            .show();
                }
            }
            @Override
            protected String doInBackground(String... params) {
 
                try {
                    String Id = (String) params[0];
                    String Pw = (String) params[1];
                    String Name = (String) params[2];
 
                    String link = "https://eryon.000webhostapp.com/on_post.php";
                            String data = URLEncoder.encode("Id""UTF-8"+ "=" + URLEncoder.encode(Id, "UTF-8");
                    data += "&" + URLEncoder.encode("Pw""UTF-8"+ "=" + URLEncoder.encode(Pw, "UTF-8");
                    data += "&" + URLEncoder.encode("Name""UTF-8"+ "=" + URLEncoder.encode(Name, "UTF-8");
 
                    URL url = new URL(link);
                    URLConnection conn = url.openConnection();
 
                    conn.setDoOutput(true);
                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
 
                    wr.write(data);
                    wr.flush();
 
                    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
 
                    StringBuilder sb = new StringBuilder();
                    String line = null;
 
                    // Read Server Response
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                        break;
                    }
                    return sb.toString();
                } catch (Exception e) {
                    return new String("Exception: " + e.getMessage());
                }
            }
        }
        InsertData task = new InsertData();
        task.execute(Id, Pw, Name);
    }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

on_post.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
error_reporting(E_ALL);
 
ini_set("display_errors"1);
 
$con = mysqli_connect('localhost''id10160302_ghkdua1829''gim1855''id10160302_eryon');
 
mysqli_set_charset($con,"utf8");
 
if (mysqli_connect_errno($con))
 
{
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
 
$userid = $_POST['Id'];
$userpw = $_POST['Pw'];
$nickname=$_POST['Name'];
 
if($userid==null){
  echo "아이디를 입력하시오.";
  return 0;
}
else if($userpw==null){
  echo "비밀번호를 입력하시오.";
  return 0;
}
else if($nickname==null){
  echo "이름을 입력하시오.";
}
else{
$result = mysqli_query($con,"insert into user (id,password,nickname) values ('$userid','$userpw','$nickname')");
}
 
  if($result){
    echo '회원가입에 성공하셨습니다.';
  }
  else{
    echo '동일한 닉네임이 존재합니다.';
  }
 
mysqli_close($con);
 
?>
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

AsyncTask를 이용해서 데이터를 파라미터 값으로 받아서 php 문으로 보내서 php 문에서 데이터를 삽입하는 과정입니다. 제가 id를 primary key로 지정해 놓았기 때문에 만약 같은 아이디가 있다면 sql문이 수행이 되지 않고 '동일한 닉네임이 존재합니다'라는 문구를 내보내게 됩니다.

 

 

그다음으로 로그인 기능 구현입니다.

 

LoginActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Response.Listener<String> responseListener = new Response.Listener<String>() {
 
                @Override
                public void onResponse(String response) {
                    try {
 
                        JSONObject jsonResponse = new JSONObject(response);
 
                        boolean success = jsonResponse.getBoolean("success");
 
 
                        //서버에서 보내준 값이 true이면?
                        if (success) {
 
                            Toast.makeText(getApplicationContext(), "로그인에 성공하셨습니다.", Toast.LENGTH_SHORT).show();
 
 
                            String id = jsonResponse.getString("Id");
                            String nickname = jsonResponse.getString("NickName");
                            
                            //로그인에 성공했으므로 whatthe로 넘어감
                            Intent intent = new Intent(LoginActivity.this, whatthe.class);
                            intent.putExtra("userID", id);
                            intent.putExtra("userName", nickname);
                            intent.putExtra("Api""");
 
                            LoginActivity.this.startActivity(intent);
                            finish();
 
                        } else {//로그인 실패시
 
                            AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
                            builder.setMessage("로그인에 실패하셨습니다.")
                                    .setNegativeButton("retry"null)
                                    .create()
                                    .show();
 
 
                        }
 
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            };
 
            LoginRequest loginRequest = new LoginRequest(idText.getText().toString(), passwordText.getText().toString(), responseListener);
            RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
            queue.add(loginRequest);
       
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

LoginRequest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class LoginRequest extends StringRequest {
 
    //현재 안드로이드앱을 에뮬레이터로 돌리므로 에뮬레이터가 설치된 서버에 있는 아파치 서버에 접근하려면
    //다음과 같이 10.0.2.2:포트번호 로 접근해야합니다 저는 8080 포트를 써서 다음과 같이 했습니다
    final static private String URL = "https://eryon.000webhostapp.com/on_loginReq.php";
    private Map<StringString> parameters;
 
    //생성자
    public LoginRequest(String userID, String userPassword, Response.Listener<String> listener){
        super(Method.POST, URL, listener, null);
 
 
        parameters = new HashMap<>();
        parameters.put("id", userID);
        parameters.put("password", userPassword);
 
        TrustManager[] dummyTrustManager = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
 
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
 
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        } };
 
        try {                                            //https 접근때문에 SSL 인증서가 필요해서 써놓은것.
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, dummyTrustManager, new java.security.SecureRandom());
 
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}
 
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

on_loginReq.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
 
error_reporting(E_ALL);
 
ini_set("display_errors", 1);
 
$con = mysqli_connect('localhost', 'id10160302_ghkdua1829', 'gim1855', 'id10160302_eryon');
 
     $id = $_POST["id"];
     $password = $_POST["password"];
 
     $statement = mysqli_prepare($con, "SELECT * FROM user WHERE id = ? AND password = ?");
     mysqli_stmt_bind_param($statement, "ss", $id, $password);
     mysqli_stmt_execute($statement);
     mysqli_stmt_store_result($statement);
     mysqli_stmt_bind_result($statement, $id, $password, $nickname,$sex,$apitoken );
 
     $response = array();
     $response["success"] = false;
 
     while(mysqli_stmt_fetch($statement)){
      $response["success"] = true;
      $response["Id"] = $id;
      $response["NickName"] = $nickname;
      $response["Sex"] = $sex;
      $response["ApiToken"] = $apitoken;
     }
 
 
 
     echo json_encode($response);
 
?>
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

이걸로 로그인 쿼리를 수행하고 그 로그인 정보를 받아서 메인 액티비티로 보낼 수 있습니다.

반응형
Comments