[안드로이드 프로그래밍] 안드로이드와 mysql 연동시키기. php 와 json 사용

         




안드로이드와 mysql 연동시키는 방법은 상당히 복잡합니다. 왜냐하면, 안드로이드에서 직접 mysql DB에 접속하는 것을 막아놨기 때문입니다. 보안상 막았다고 하는데.... 


안드로이드에서 바로 접속할 수 없어서 웹을 거쳐서 DB에 접속해야 합니다. 이때 웹이란 PHP 나 JSP 같은 웹 프로그래밍언어를 사용합니다. PHP가 간단하고 쉬워서 PHP를 사용하겠습니다.


방법은 "안드로이드(자바) <-> PHP <-> SQL" 입니다.


일단 phpMyAdmin 을 이용해 mysql 에 테이블을 만듭니다. 저는 이미지의 주소 값과 텍스트 두 개가 필요해서 총 3개의 텍스트 필드를 가진 테이블을 만들었습니다. 






데이터베이스의 이름은 appdata 이고 테이블 이름은 urltext 입니다. 데이터베이스에 접속하기 위해서는 꼭 필요하니 기억해 둡시다.


이제 PHP 파일을 봅니다. PHP 파일은 sql 쿼리별로 여러개를 만들어야 합니다. 일단 데이터베이스에 있는 모든 자료를 가져오는 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
 <?
    // 데이터베이스 접속 문자열. (db위치, 유저 이름, 비밀번호)
    $connect=mysql_connect( "MYSQL주소", "아이디", "비밀번호") or  
        die( "SQL server에 연결할 수 없습니다.");
 
    
    mysql_query("SET NAMES UTF8");
   // 데이터베이스 선택
   mysql_select_db("appdata",$connect);
 
   // 세션 시작
   session_start();
 
   // 쿼리문 생성
   $sql = "select * from urltext";
 
   // 쿼리 실행 결과를 $result에 저장
   $result = mysql_query($sql, $connect);
   // 반환된 전체 레코드 수 저장.
   $total_record = mysql_num_rows($result);
 
   // JSONArray 형식으로 만들기 위해서...
   echo "{\"status\":\"OK\",\"num_results\":\"$total_record\",\"results\":[";
 
   // 반환된 각 레코드별로 JSONArray 형식으로 만들기.
   for ($i=0; $i < $total_record; $i++)                    
   {
      // 가져올 레코드로 위치(포인터) 이동  
      mysql_data_seek($result, $i);       
        
      $row = mysql_fetch_array($result);
   echo "{\"imgurl\":$row[imgurl],\"txt1\":\"$row[txt1]\",\"txt2\":\"$row[txt2]\"}";
 
   // 마지막 레코드 이전엔 ,를 붙인다. 그래야 데이터 구분이 되니깐.  
   if($i<$total_record-1){
      echo ",";
   }
    
   }
   // JSONArray의 마지막 닫기
   echo "]}";
?>



위와 같이 PHP 파일은 만들어서 웹 서버에 올립니다. 저는 파일 이름을 appdata.php 라고 정하고 서버에 올렸습니다.


PHP 파일을 보면 15번째 줄에 $sql = "select * from urltext" 가 바로 쿼리입니다. 테이블의 모든 정보를 가져오기 위해 select * 라는 쿼리문을 사용했습니다. 쿼리의 결과를 Json 파일로 만들기 위해 23번째 줄의 코드를 입력합니다. Json 파일의 헤더와 같은 역할입니다. 실질적인 데이터는 for 문을 사용해 테이블에 있는 자료를 레코드단위로 불러옵니다. 완전히 출력된 Json 문장이 어떤 형태인지 좀 있다 확인해 보겠습니다. 



데이터베이스에 접속하는 PHP 문서를 만들었습니다. 이제 안드로이드 상에서 이 PHP 파일을 읽기만 하면 됩니다. PHP 파일 역시 웹상에 있기 때문에 웹에 접속하는 코드를 사용해야 합니다. 즉, 메인 쓰레드에서 실행시키면 실행이 안 된다는 것이지요. 옛날엔 그냥 됬는데 쩝....


아무튼, 또 귀찮게 asynctask를 사용합니다. 두 세 번 사용해보니 이젠 쉽게 사용할 수 있게 되었습니다.


다음은 PHP에서 Json파일이 잘 만들어지는지 확인해보기 위한 코드입니다.


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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.example.downloadimg;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    
    ImageView imView;
    TextView txtView;
    String imgUrl = "http://서버주소/appimg/";
    Bitmap bmImg;
    //back task;
    phpDown task;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        task = new phpDown();    
        txtView = (TextView)findViewById(R.id.txtView);
        
        //imView = (ImageView) findViewById(R.id.imageView1);
        
        task.execute("http://서버주소/appdata.php");
        
        
    }
    
    
    private class back extends AsyncTask<String, Integer,Bitmap>{
        
 
 
        @Override
        protected Bitmap doInBackground(String... urls) {
            // TODO Auto-generated method stub
            try{
                URL myFileUrl = new URL(urls[0]);
                HttpURLConnection conn = (HttpURLConnection)myFileUrl.openConnection();
                conn.setDoInput(true);
                conn.connect();
                //String json = DownloadHtml("http://서버주소/appdata.php");
                InputStream is = conn.getInputStream();
                
                bmImg = BitmapFactory.decodeStream(is);
                
                
            }catch(IOException e){
                e.printStackTrace();
            }
            return bmImg;
        }
        
        protected void onPostExecute(Bitmap img){
            imView.setImageBitmap(bmImg);
        }
        
    }
private class phpDown extends AsyncTask<String, Integer,String>{
        
 
 
        @Override
        protected String doInBackground(String... urls) {
            StringBuilder jsonHtml = new StringBuilder();
            try{
                      // 연결 url 설정
                      URL url = new URL(urls[0]);
                      // 커넥션 객체 생성
                      HttpURLConnection conn = (HttpURLConnection)url.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"));
                            for(;;){
                                // 웹상에 보여지는 텍스트를 라인단위로 읽어 저장.  
                                String line = br.readLine();
                                if(line == null) break;
                                // 저장된 텍스트 라인을 jsonHtml에 붙여넣음
                                jsonHtml.append(line + "\n");
                             }
                          br.close();
                       }
                        conn.disconnect();
                     }
                   } catch(Exception ex){
                      ex.printStackTrace();
                   }
                   return jsonHtml.toString();
            
        }
        
        protected void onPostExecute(String str){
            txtView.setText(str);
        }
        
    }
    
        
    
}



지난 시간에 했던 서버에서 이미지를 불러오는 코드와 같이했더니 코드가 깁니다. 주석으로 처리한 부분은 삭제해도 됩니다. 


phpDown 이라는 AsyncTask 를 이용해 웹에 있는 php 파일을 읽습니다. php 파일을 읽고 나면 결과로 스트링을 반환하는데 이것이 Json 형식의 문서입니다. 바로 텍스트뷰에 띄워보면 다음과 같이 출력됩니다.







이것이 Json 형식입니다. 원래는 한 칸 띄기가 들어가서 보기 좋게 쓰는게 정석인데... 어차피 사용자에게 보일 문서가 아니기에 그냥 다 붙여서 써도 상관없습니다. 형식만 맞는다면 상관없어요~


이제 남은 건 DB에서 Json 형식으로 뽑아온 자료를 안드로이드에서 사용할 수 있도록 변수에 집어넣는 것 입니다.


일단 스트링 형식의 데이터를 3개 저장할 수 있는 객체를 만듭니다.


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
package com.example.downloadimg;
 
 
public class ListItem {
 
    private String[] mData;
    
    public ListItem(String[] data ){
        
    
        mData = data;
    }
    
    public ListItem(String imgurl, String txt1, String txt2){
        
        mData = new String[3];
        mData[0] = imgurl;
        mData[1] = txt1;
        mData[2] = txt2;
        
    }
    
    public String[] getData(){
        return mData;
    }
    
    public String getData(int index){
        return mData[index];
    }
    
    public void setData(String[] data){
        mData = data;
    }
    
 
    
}
 





그리고 이 객체를 ArrayList로 만들어서 Json에 있는 데이터를 하나씩 넣어주면 끗.


일줄 알았는데 생각보다 복잡하네요... 끙끙대다가 겨우 완성했습니다.


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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package com.example.downloadimg;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    
    ImageView imView;
    TextView txtView;
    String imgUrl = "http://dnllab.incheon.ac.kr/appimg/";
    Bitmap bmImg;
    //back task;
    phpDown task;
    ArrayList<ListItem> listItem= new ArrayList<ListItem>();
    ListItem Item;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        task = new phpDown();    
        txtView = (TextView)findViewById(R.id.txtView);
        
        //imView = (ImageView) findViewById(R.id.imageView1);
        
        task.execute("http://dnllab.incheon.ac.kr/appdata1.php");
        
        
        
        
        
    }
    
    
    private class back extends AsyncTask<String, Integer,Bitmap>{
        
 
 
        @Override
        protected Bitmap doInBackground(String... urls) {
            // TODO Auto-generated method stub
            try{
                URL myFileUrl = new URL(urls[0]);
                HttpURLConnection conn = (HttpURLConnection)myFileUrl.openConnection();
                conn.setDoInput(true);
                conn.connect();
                //String json = DownloadHtml("http://117.16.243.116/appdata.php");
                InputStream is = conn.getInputStream();
                
                bmImg = BitmapFactory.decodeStream(is);
                
                
            }catch(IOException e){
                e.printStackTrace();
            }
            return bmImg;
        }
        
        protected void onPostExecute(Bitmap img){
            imView.setImageBitmap(bmImg);
        }
        
    }
private class phpDown extends AsyncTask<String, Integer,String>{
        
 
 
        @Override
        protected String doInBackground(String... urls) {
            StringBuilder jsonHtml = new StringBuilder();
            try{
                      // 연결 url 설정
                      URL url = new URL(urls[0]);
                      // 커넥션 객체 생성
                      HttpURLConnection conn = (HttpURLConnection)url.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"));
                            for(;;){
                                // 웹상에 보여지는 텍스트를 라인단위로 읽어 저장.  
                                String line = br.readLine();
                                if(line == null) break;
                                // 저장된 텍스트 라인을 jsonHtml에 붙여넣음
                                jsonHtml.append(line + "\n");
                             }
                          br.close();
                       }
                        conn.disconnect();
                     }
                   } catch(Exception ex){
                      ex.printStackTrace();
                   }
                   return jsonHtml.toString();
            
        }
        
        protected void onPostExecute(String str){
        
            String imgurl;
            String txt1;
            String txt2;
            try{
                
                JSONObject root = new JSONObject(str);
                JSONArray ja = root.getJSONArray("results");
                for(int i=0; i<ja.length(); i++){
                    JSONObject jo = ja.getJSONObject(i);
                    imgurl = jo.getString("imgurl");
                    txt1 = jo.getString("txt1");
                    txt2 = jo.getString("txt2");
                    listItem.add(new ListItem(imgurl,txt1,txt2));
                }
            }catch(JSONException e){
                e.printStackTrace();
            }
            txtView.setText("urlimg :"+listItem.get(0).getData(0)+"\ntxt1:"+ listItem.get(0).getData(1)+"\ntxt2:"+listItem.get(0).getData(2));
        }
        
        
    }
    
        
    
}
 
 
 



118번째 줄부터 보시면 됩니다.


아까 그냥 보여줬던 String을 이번에는 JSONObject 라는 객체에 넣습니다.



 JSONObject root = new JSONObject(str);

 JSONArray ja = root.getJSONArray("results");




위 두 줄의 코드가 핵심입니다. Json 문서를 JSONObject 객체로 받은 뒤, JSONArray 를 선언합니다. 이때 JSONObject 에서 JSONArray 를 get 해오는데, results라는 것은 제 Json 문서의 결과 값 리스트입니다. 위를 보시면 제 Json 문서는 이런 식 입니다.




{

        "status": "OK",

"num_results": “3”,

"results": [ {자료1}, {자료2}, {자료3}... ]

}

 


자료들의 리스트를 "results" 라고 정의했습니다. 그래서 저는 "results" 라고 적었습니다. 사용자가 정의할 수 있기 때문에 Json 문서를 잘 보시고 입력해야 합니다.



아래의 for문은 간단합니다. Json 에서 해당 자료의 데이터를 뽑아오는 것인데 저는 "imgurl", "txt1", "txt2" 라는 값이 있기 때문에 3가지 스트링값을 받아왔습니다. 그리고 아까 만든 ListItem 객체로 만들어서 ListItem ArrayList 에 추가합니다. 


잘 추가가 되었는지 하나만 출력해보기 위해 txtView.setText 메소드를 사용해 출력해 보았습니다.





짜잔. 잘 나왔습니다. 


이것으로 안드로이드 - PHP - mysql 연동을 마칩니다.

댓글(115)

  • 이전 댓글 더보기
  • stranger
    2016.06.06 11:04

    앗, 휴일인데 빠른 답변 감사드립니다!

    그러면 본문의 이코드를 활용해서 이미지뷰를 불러온다고 생각했는데, 그게 아닌건가요?

    private class back extends AsyncTask<String, Integer,Bitmap>{
    @Override
    protected Bitmap doInBackground(String... urls) {

    // TODO Auto-generated method stub

    try{

    URL myFileUrl = new URL(urls[0]);
    HttpURLConnection conn = (HttpURLConnection)myFileUrl.openConnection();
    conn.setDoInput(true);
    conn.connect();
    //String json = DownloadHtml("http://viper1310.dothome.co.kr/Noname2.php";);
    InputStream is = conn.getInputStream();
    bmImg = BitmapFactory.decodeStream(is);

    }catch(IOException e){
    e.printStackTrace();
    }
    return bmImg;
    }

    protected void onPostExecute(Bitmap img){
    imView.setImageBitmap(bmImg);
    }

    }

    이게 본문에 제시된 코드인데, 이미지뷰를 가지고 작성이 되있길래 요너석을 건드려야 된다고 생각했거든요

    • 2016.06.06 11:16 신고

      엇 그러고보니 여기가 맛네요 ㅋㅋ 안드로이드에서 서버에서 이미지 불러올때 왜인지 모르게 쓰레드를 꼭 사용하게 되있어서 이렇게 만들었엇네요~ 잘 넣으신거 같은데 안되시나요?

  • stranger
    2016.06.06 11:29

    이런 경우를 줘도 못먹는다고 해야될까요? ㅠㅠ
    저 코드만 있지 어떻게 써야되는지 모르겠어서요.

    좀 예전 얘기로 돌아가서
    처음에 db에다가 imgurl속성에 img1, img2, img3 .... 요렇게 이름넣어주고
    안드로이드에 값을 받아왔을때 확인해보면 저는 초-님 처럼 이미지 url전체(http://~~~)가 뜨지 않고,
    정말 속성값인 img1, img2, img3 요렇게만 받아오더라구요

    그래서 imgurl = (jo.getString("imgurl";)); -> imgurl = (imgUrl+jo.getString("imgurl";)); 와 같이 imgUrl이라는 변수에 제 경로 http://~~를 넣어줘서 어거지로 url전체를 imgurl에 받아오게끔 했거든요

    그다음에 이제 이미지를 불러오는 걸 시도하고 싶은데
    저 코드가 있어도 어떻게 건드려야 되는지.
    쓰레드에 대한 개념이 없다보니 그래서 질문드리게 되었네요 ㅠㅠ

    • 2016.06.06 11:45 신고

      아하 그럼 저 back을 고대로 가져가신다음에 back task;로 하고 task.excute(imgurl) 하시면 될거같아요~

    • 2016.06.06 11:48 신고

      imgurl을 만약 위에처럼 asynk에서 가져오는거면 url을 받아오고나서 back asynk를 excute 하셔야 되영~ 아마 asynk 안에서 asynk를 한번더 excute 하는형식이 될꺼에요~

  • stranger
    2016.06.06 16:21

    뭐가 문젠지 잘안되는데, 좀더 공부가 필요할듯하네요 ㅠㅠ 에고고..
    답변 감사합니다

    • 2016.06.06 17:05 신고

      넵~ 좀더 공부해보시고 모르시면 물어보세용~

  • stranger
    2016.06.06 19:59

    아 드디어 이미지 하나 불러오는데 성공했습니다! ㅠㅠ

    back task2;
    ...

    task2.execute(listItem.get(0).getData(0));

    위코드로 했구요,
    다만 이미지를 여러개를 불러오고 싶은데

    back asynk 코드를 보면

    ...

    return bmImg;
    }

    protected void onPostExecute(Bitmap img){
    imView.setImageBitmap(bmImg);
    }

    요렇게 리턴받아온 bmImg값을 imView에다가만 삽입하기때문에
    여러개의 이미지를 못받아 오는데 어떻게 처리해줘야 될까요?

    • 2016.06.06 20:12 신고

      task2 가 이미지 url하나를 이용해 이미지 뷰에 넣는거기 때문에 task2를 이미지 url별로 한번씩 실행하면 댑니다. 다만 이미지 뷰가 매번 달라야대기 때문에 task2안에서 이미지뷰를 새로 만들고 이미지를 설정하고 만든 이미지 뷰를 화면에 보여주게 하는 코드가 필요해요~

  • 요호호호~요호호호~
    2016.06.27 17:02

    좋은글 잘보면서 공부 잘하고갑니다~!
    혹시라도 웹브라우저에서 값이 성공적으로 출력됐는데
    어플리케이션에서는 텍스트뷰에 출력이 안된다면
    작은 실수이지만 혹시 매니페스트에서 인터넷 사용을 허가하는 퍼미션 썼는지 보세요ㅎ
    잘되네요 아직 아래껀 안해봤지만

  • 2016.08.04 02:02

    비밀댓글입니다

  • 2016.08.14 18:06 신고

    매니페스트에 인터넷퍼미션 추가하셔야 되용~

  • boolks
    2016.09.22 23:26

    안드로이드를 공부하면서 데이터베이스를 활용한 어플을 만들고싶은데
    json까지는 성공했는데 안드로이드로 파싱하는게 너무 힘드네요...
    구글링 다 해봐도 여기만큼 코드가 잘 나온 곳이 없어서 부탁드려봅니다

    제가 서버를 xampp control panel을 이용해서 아파치와 mysql을 켜둡니다
    여기서 xampp의 htdocs 폴더에 appdata.php를 넣어두고 실행시키면 localhost/appdata.php로 페이지가 열리는데
    문제는 처음에 task.execute 서버주소를 적어 넣을 때 http://localhost/appdata.php로 적어넣으니 어플리케이션에서 아무것도 출력이 안되네요ㅜㅜ localhost 부분을 127.0.0.1 혹은 제 아이피로 바꿔도 백지로 출력됩니다..
    혹시 서버구축을 따로 해야되는건지..
    또한 저도 다른 분들과 마찬가지로
    txtView.setText 부분에서 오류가 나는데 php파일은 구문오류가 이상없는 듯 합니다
    제가 db에 id, 성, 이름, 나이 총 4가지 텍스트필드를 설정해두었는데
    listItem이나 기타 다른부분 전부 맞게 변경했다고 생각하는데 도저히 오류를 고칠 수가 없네요...어디가 잘못된건지 잘 모르겠습니다ㅜㅜ
    setText의 오류는
    Do not concatenate text displayed with setText 라고 나오네요..

    • 2016.09.23 06:52 신고

      인터넷 퍼미션 주셧나여? 익스플로러에서 주소창에 직접 주소 입력해보시고 되는지 확인좀 ㅎㅎ 가상머신에서 테스트하는거면 가상머신에서 로컬이 돌아가지는지.. 테스트 단말기면 로컬 안대융

    • boolks
      2016.09.23 14:52

      빠른 댓글 감사합니다ㅜㅜ
      익스플로러 상에서 주소 직접 입력해도 잘 나오구 테스트는 제 핸드폰으로 직접하고 있습니다..근데 핸드폰 어플상에서 화면 출력이 안되서ㅜㅜ혹시 작성자님은 따로 사용하시는 서버가 있으신가용??

    • 2016.09.23 14:57 신고

      넵 로컬에올리면 해당 컴퓨터에서만 됩니다. 따로 서버에서 하셔야지 핸드폰으로 되욤 ㅎㅎ

    • boolks
      2016.09.23 16:22

      아 역시...너무 초짜티가 나네요ㅋㅋㅋ송구스럽지만 혹시 추천해주실 만한 웹서버 구축 방법이 있나요??

    • 2016.09.23 16:25 신고

      서버는 이미 구성하셨을꺼에요 컴퓨터가 집 컴퓨터인가요? 그럼 아이피 치고 들어가면 되는데.. 공유기가 물려있거나 학교라면 사설 ip이기 때문에 ip치고 들어가도 안됩니다 ㅎㅎ 일단 서버 설치한 컴퓨터 네트워크 상태가 어떤지 알려주세요

    • boolks
      2016.09.24 19:34

      아ㅋㅋㅋ서버는 잘 이해했습니다 너무 감사드립니다!!
      한가지만 더 부탁드리자면 제가 테이블을 만들 때 id와 age라는 int형 테이블을 만들었는데 php 혹은 java 파일에서 고쳐야 하는건가요? mdata를 string이 아닌 int로 따로 받아야 하거나...
      이것 때문에 어플리케이션이 실행도중 중지되는건지ㅜㅜphp파일을 아무리 만지고 역슬래쉬 및 따옴표를 정확히 고쳐봐도 완성된 코드로 실행한 어플리케이션이 실행도중 꺼지네요..
      txtView.setText(이하생략) 부분에서 오류가 계속되는 것 같습니다...

    • 2016.09.24 20:00 신고

      아녀 아마 데이터 받아오는 부분때문은 아닐것같아요. 오류나는 로그를 복사해서 올려주시겟어요?

    • 2016.09.26 21:45

      비밀댓글입니다

    • 2016.09.26 22:04 신고

      흠 소스폴더를 통째로 메일로 보내주세요~ tkdlek11112@nate.com 입니다

    • 2016.09.30 00:08

      비밀댓글입니다

  • 도와주세요..
    2016.11.17 23:00

    프로젝트를 진행하다 연동하는법이 필요해서 검색하게되서 알게된 블로그입니다.
    정말 많은 도움이 된거같습니다.
    그런데 한가지 문제점이 있네요. php는 제아이피.appdata로 정상 출력이 됩니다.
    그런데 이상하게도 계속 스튜디오에서 실행하면 txtView.setText에서 오류가뜨네요ㅜㅜ
    task.execute도 아이피/appdata로해주었는데도 계속 실행시키면 앱자체가 강제종료되버리네요..

    • 2016.11.17 23:04 신고

      프로젝트를 압축하셔서 보내줘 보세용~ 멜주소는 우측 상단에 있습니다~

  • 궁금합니다.,
    2016.11.21 22:08

    주유소 정보 어플 이랑 충전소 정보 어플을 만드려고 하는데요

    mysql 데이터는 카페24에 올라가 있어 웹에서도 작동하는걸 하나 만들어놓고 테스트중인데요

    혹시 어플로 만들어서

    카페24에 업로드한 DB데이터를 가져와서 앱에서 실행시키면

    느리거나 하지 않을까요?

    어떤문제가 있을까요?

    해보기전이라 궁금해서 질문드립니다..

  • json이 안돼요 ㅠㅠ
    2016.11.26 19:09

    <?php
    $connect=mysqli_connect( "127.0.0.1", "root", "******";) or
    die( "SQL server에 연결할 수 없습니다.";);
    mysqli_query("SET NAMES 'UTF8'";);
    mysqli_select_db("db",$connect);


    session_start();
    $sql = "select * from GPS";


    $result = mysqli_query($sql, $connect);

    $total_record = mysqli_num_rows($result);

    echo "{\"status\":\"OK\",\"num_results\":\"$total_record\",\"results\":[";

    for ($i=0; $i < $total_record; $i++)
    {

    mysqli_data_seek($result, $i);

    $row = mysqli_fetch_array($result);
    echo "{\"Latitude\":\" $row[Latitude] \",\" Longitude \":\" $row[Longitude] \"}";


    if($i<$total_record-1){
    echo ",";
    }

    }
    echo "]}";
    ?>

    php 파일은 작성해서 웹상에서 되긴합니다 근데 위에 내용을 웹상에서 돌리면 {"status":"OK","num_results":"","results":[]} 만 뜨고 제 데이터베이스에있는 Latitude Longitude 필드에 있는 값들만 못읽어 오더라고요... 그리고 안드로이드 실행하면 앱중지되버립니다.. 자바코드는 위에있는거에서 저한테 맞게 고쳐서 이상없이 돌아가는거 확인은했습니다.

    이런 코드는 웹상에 잘뜹니다 물론 이코드도 안드로이드에서 돌아가지는 않습니다..
    foreach($connection->query('SELECT * FROM GPS') as $row)
    {

    echo json_encode($row['Latitude']);
    echo json_encode($row['Longitude']);

    }

    어디를 고쳐야될까요 ..

    • 2016.11.26 20:24 신고

      일단 웹상에서 데이터가 좌표값이 안보이는거보니 디비에 연결이 제대로 안되잇는것 같네요 셀렉트가 안먹구 있는거자나요? 안드로이드에서 안대는건 로그를 좀 바야댈것같습니다 ㅎ

    • json이 안돼요 ㅠㅠ
      2016.11.26 21:34

      11-26 21:31:13.038 18601-18601/org.androidtown.location E/AndroidRuntime: FATAL EXCEPTION: main
      Process: org.androidtown.location, PID: 18601
      java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
      at java.util.ArrayList.get(ArrayList.java:308)
      at org.androidtown.location.ParentActivity$phpDown.onPostExecute(ParentActivity.java:125)
      at org.androidtown.location.ParentActivity$phpDown.onPostExecute(ParentActivity.java:62)
      at android.os.AsyncTask.finish(AsyncTask.java:651)
      at android.os.AsyncTask.access$500(AsyncTask.java:180)
      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:158)
      at android.app.ActivityThread.main(ActivityThread.java:7229)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

      json 불러오려고 할때 이런 에러가 나오네요,, 웹상에서 php파일만 돌렷을때는
      {"status":"OK","results":[{"37.000000"},{"127.000000"}]} 이렇게 형식맞게 뜨는데 왜이럴까요?..
      php파일은 json형식만 맞추면 될거같아서 위에있는거랑은 조금다르지만 결과는 똑같이 나오게 했습니다

    • 2016.11.26 21:37 신고

      json에 데이터에 변수명이 안들어가나여? "latitude":"120000"."longitude":"2332" 이런식이어야대는데

    • json이 안돼요 ㅠㅠ
      2016.11.26 21:55

      아 답변주신 형식으로 다시 바꿔보니까 앱에서 실행됩니다 ㅎㅎ
      그리고 코드보면서 궁금한게 생겻는데요

      제가이제 gps정보를 수집하면서 데이터베이스에 데이터가 많이쌓이게 되면서 row 갯수가 수백개는 될거에요 그때 첫번째 레코드부터 마지막레코드까지 순서대로 배열로 쭉 받으려면 어떻게 해야 될까요??
      get(0).getData(0) 여기 숫자를 바꾸니까 오류가생겨가지고요..

    • 2016.11.27 00:38 신고

      블로그대로 코딩했으면 배열로 받을텐데용 ㅎㅎ 하나씩 읽어서 리스트에 add하는 형태라.. 안드로이드쪽도 다르게코딩하셧욤

    • json이 안돼요 ㅠㅠ
      2016.11.27 00:59

      php문 제가 좀 틀리게 썻엇더라고요 ㅎㅎ
      고치니까 배열로 받아지고있어요
      감사합니다~~

  • 질문!!
    2016.12.03 14:38

    안드로이드 엄청 초보입니다.ㅠㅠ
    http://서버주소/appimg/
    http://서버주소/appdata.php 이 두개 어떤걸 의미하고 차이가 뭔지 알 수 있을까요??

    • 2016.12.03 15:09 신고

      음 appimg의 경우 서버에 이미지가 위치하는 폴더 경로를 의미하구요 아래꺼 .php는 서버에 php언어로 만든 소스 위치를 의미합니다~

  • 질문!!
    2016.12.03 15:30

    제가 로그인하는 화면을 만들려고 하는데요
    task.execute("http://서버주소/appdata.php";);이부분에 서버 주소 넣으면되나요?
    서버는 제가 만들게 아니라 주소만 받았습니다.
    http://서버주소/userlogin/login.php이런식인데 이걸 그대로 넣어야하나요?

  • 사설ip질문!!
    2016.12.06 00:50

    안녕하세요~
    제가 공유기에 물려있는 랜선을 쓰고 있는데...
    테스트를 제 에뮬레이터가 아닌 제 폰에서 하고 싶습니다

    사설 ip의 경우는 ip주소로 접근이 안된다고 답변하신것을 읽었는데,
    그럼 어떻게 접근해야 하나요?ㅠㅠ

    • 2016.12.06 01:08 신고

      iptime공유기면 아이피를 고정으로 할당하는 기능이 있습니다~! 검색해보셔욤~!

  • noob
    2017.02.27 23:24

    맨 위 php파일(appdata.php)에
    echo "{\"imgurl\":$row[imgurl],\"txt1\":\"$row[txt1]\",\"txt2\":\"$row[txt2]\"}";
    이 부분을

    echo "{\"imgurl\":\"$row[imgurl]\",\"txt1\":\"$row[txt1]\",\"txt2\":\"$row[txt2]\"}";
    이렇게 수정해줘야 하지 않나요??

    \":$row[imgurl],\" -> \":\"$row[imgurl]\",\"

  • 안녕하세요
    2017.03.21 02:16

    <?php

    function unistr_to_xnstr($str){
    return preg_replace('/\\\u([a-z0-9]{4})/i', "&#x\\1;", $str);
    }

    $con=mysqli_connect("서버","계정","패스워드","DB네임";);

    if (mysqli_connect_errno($con))
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }


    mysqli_set_charset($con,"utf8";);


    $res = mysqli_query($con,"select * from test";);

    $result = array();

    while($row = mysqli_fetch_array($res)){
    array_push($result,
    array('number'=>$row[0],'name'=>$row[1],'phonumber'=>$row[2]
    ));
    }


    $json = json_encode(array("result"=>$result));
    echo $json;


    mysqli_close($con);

    ?>


    다른 PHP로 작성해서 2번째 스트링형식 3개를 출력하는 소스를 옴겨서 실행해봤는데요.
    첫번쨰 row값은 출력이 되는데. 2번쨰부터는 출력이 안되네요.
    같은 array인데 무슨 문제인가요....


  • ddd
    2017.06.06 00:39

    자꾸 die( "SQL server에 연결할 수 없습니다.";); 이 결과가 뜨는데 문제가 무엇일까요 ㅠㅠㅠ

  • ㄻㄹ
    2017.06.06 00:50

    {"status":"OK","num_results":"","results":[]}

    이것만 출력되고 나머지 데이터베이스 테이블에 있는 데이터는 출력되지 않네요....
    ㅜㅜ

  • 데이비드리
    2018.06.14 17:13

    글쓰신지 시간이 많이 지났는데, 지금도 마찬가지로 android에서 mysql 직접 연결은 안되나요?
    왕초보 개발자라..

  • 2019.05.29 08:54

    txtView = (TextView)findViewById(R.id.txtView);에서 빨간줄이 txtView에 그어지고
    Cannot resolve symbol 'txtView'라는 오류가 뜹니다
    자동 import로 설정 바꾼 이후에도 (이클립스의 ctrl shift o 와 같이) 계속 오류가 안사라지네요 리빌드 해도 혹시 해결법 알고 계신가요?

    • 2019.05.29 09:04 신고

      R파일쪽에 레이아웃 이름관리하는곳이 꼬인것 같네요 txtview라는 아이디 가진놈 지우고 다른 아이디로 뷰 다시만들어서 해보세요~

Designed by JB FACTORY