본문 바로가기
Study/Android

android에서 mysql 데이터 가져오기

by Answer Choi 2015. 11. 18.
반응형


안드로이드 소스코드


PHP 소스코드(0510)



안드로이드로 서버랑 통신해서 로그인하는 프로그램을 만들려면 sql을 사용해야 합니다.


하지만 안드로이드에서는 sql에 직접적으로 접근을 할 수는 없습니다.ㅠ


php나 jsp같은 웹언어를 이용해야 합니다.


먼저 아래와 같이 로그인 페이지를 만들었습니다.



그리고 ID와 비밀번호를 입력해서 로그인 버튼을 누르면 ID와 PW를 서버를 통해 확인해야 합니다.

전체적인 구조를 보시면 아래와 같습니다.


android에서는 http로 php를 요청하면 php에서 db을 읽어와 json으로 값을 전달해 줍니다.

먼저 가져올 table구조를 보겠습니다.


사용자정보(User_Info)테이블에 보시면 ID와 PW, Name등 정보들이 저장되어 있습니다.

일단 암호화에 대해서는 생각을 하지 않겠습니다;;

그리고 여기서 ID를 통해 PW와 Name만 가져와 보겠습니다.


admin이라는 ID를 검색해서 PW, Name을 가져왔습니다.


이제 이 코드를 APM(Apache,Php,Mysql)이 설치된 pc에 php파일로 만들어 줘야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
    $host='server address';//insert as yours
    $uname='mysql id';
    $pwd='mysql pw';
    $db="database name";
 
    $con = mysql_connect($host,$uname,$pwd) or die("connection failed");
    mysql_select_db($db,$con) or die("db selection failed");
     
    $id=$_GET['id'];
    
    
    $r=mysql_query("select PW,Name from User_Info where ID='$id'",$con);
 
    $row=mysql_fetch_array($r);
     
    print(json_encode($row));
    mysql_close($con);
?>
cs

Line 2~5 : mysql이 설치된 pc의 주소, mysql id, pw, 그리고 db 이름을 넣어줍니다.

Line 7 : mysql에 접속을 시도합니다.

Line 8 : database를 선택합니다. 만약 database 명이 잘못되었다면 접속을 끊습니다.

Line 10 : 이건 나중에 나올텐데, android에서 id를 get방식으로 보내는데 get방식으로 id를 가져옵니다.

Line 13 : id를 기준으로 Pw와 name값을 읽어옵니다.

Line 15 : 읽어온 값을 row라는 변수에 넣어줍니다.

Line 17 : row변수를 json으로 인코딩해서 print해줍니다.

Line 18 : mysql 접속을 끊습니다.

만들어진 php파일을 pc에 저장하고 경로와 파일이름을 잘 메모해 둡니다.

이제 안드로이드에서는 http를 통해 json으로 가져와 비밀번호를 비교하면 됩니다.

먼저 인터넷을 이용해야 하므로 thread를 사용해야 합니다.

1
2
3
4
5
6
public loginMysql(String id,String pw,String url){
    mHandler=new Handler();
    userId=id;
    userPw=pw;
    this.url=url+"?id="+userId;
}
cs


thread를 실행할때 id와 pw, php의 url을 넘겨줬습니다.


그리고 url에는 id값을 get방식으로 넘기기 위해 id값을 추가했습니다.


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
@Override
public void run() {
    super.run();
    if(active){
        StringBuilder jsonHtml = new StringBuilder();
        try {
            URL phpUrl = new URL(url);
             HttpURLConnection conn = (HttpURLConnection)phpUrl.openConnection();
             if ( conn != null ) {
                conn.setConnectTimeout(10000);
                conn.setUseCaches(false);
                if ( conn.getResponseCode() == HttpURLConnection.HTTP_OK ) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                    while ( true ) {
                        String line = br.readLine();
                        if ( line == null )
                            break;
                        jsonHtml.append(line + "\n");
                    }
                    br.close();
                }
                conn.disconnect();
            }
        } catch ( Exception e ) {
            e.printStackTrace();
        }
        show(jsonHtml.toString());
    }
}
cs


이부분이 통신을 하는 부분입니다.


Line 5 : 읽어올 데이터를 저장할 stringbuilder를 하나 만들어 줍니다.


Line 7 : php의 주소와 id가 저장된 URL을 만들어 줍니다.


Line 8 : HTTP로 연결을 시작합니다.


Line 9~23 : 연결이 성공적으로 되면 이부분으로 들어오게 됩니다.


Line 12~21 : 응답코드가 OK가 뜨면 들어오게 됩니다.


Line 13~19 : php를 통해 mysql에서 읽어온 데이터를 라인단위로 저장을 합니다.


Line 22 : 연결을 끊습니다.


Line 27 : 읽어온 데이터를 처리하기 위해 show라는 함수로 보냅니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void show(final String result){
   mHandler.post(new Runnable(){
      
       @Override
       public void run() {
           try {
               JSONObject jObject = new JSONObject(result);
 
               String getpw =jObject.get("PW").toString();
               String getname=jObject.get("Name").toString();
 
               Login.result_login(getpw, userPw, getname);
           } catch (JSONException e) {
              e.printStackTrace();
               Login.result_login("false""false""false");
           }
       }
   });
}
cs


읽어 온 데이터를 처리하는 함수 입니다.


Line 7 :json형태로 받았기 때문에 JSON오브젝트를 생성하여 읽어온 값을 넣어줍니다.


Line 9~10 : JSON에서 pw와 name 필드의 값을 각각 저장해 줍니다.


Line 12 : 값을 비교해서 처리하기위해 Login activity로 전달해 줍니다.


Line 15 : 만약 db에 잘못된 id를 요청했을경우 이부분으로 빠지게 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static public void result_login(String result,String pw,String name){
    loginMysql.active=false;
    if(result.equals("false"))
         Toast.makeText(mContext,"사용자 ID가 없습니다.",Toast.LENGTH_SHORT).show();
    else{
        if(pw.equals(result)) {
            userId.setText("");
            userPw.setText("");
 
            Toast.makeText(mContext, name + "님 로그인 되었습니다.", Toast.LENGTH_SHORT).show();
            Intent intent=new Intent(mContext,Main.class);
            intent.putExtra("name",name);
            mContext.startActivity(intent);
 
        }else
            Toast.makeText(mContext,"PW가 틀렸습니다.",Toast.LENGTH_SHORT).show();
    }
}
cs


Login activity입니다.


Line 3~4 : 위에서 id가 없었을때 id가 없다고 띄워주게 됩니다.


Line 5~16 : db에서 가져온 pw와 사용자가 입력한 pw를 비교합니다.


Line 6~13 : pw가 일치하면 main activity로 이동합니다.


Line 15~16 : pw가 일치하지 않으면 toast를 띄워줍니다.





추가(2017.03.17)


안드로이드용 소스코드와 PHP용 소스코드가 새롭게 업데이트 되었습니다.


제일 위 링크를 통해 다운로드 하세요^^

반응형

인기글