마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 <-> php <-> mysql간 통신 질문입니다.

0 추천

개발 입문한지 한달 정도 된 초보 개발자입니다.

구글링을 통해 안드로이드와 mysql 간 연결하는 법은 알아냈는데

막히는 부분이 있어 질문드립니다.

 

public void Debug(String phonenum, String deviceid) {
        class PHP_Debug extends AsyncTask<String, Void, Void> {
            @Override
            protected Void doInBackground(String... params) {
                try {
                    String phonenum = params[0];
                    String device = params[1];
                    URL url = new URL(""); //server URL
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");

                    StringBuffer buffer = new StringBuffer();
                    buffer.append("phonenum").append("=").append(phonenum).append("&");
                    buffer.append("deviceid").append("=").append(device);

                    OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
                    PrintWriter wr = new PrintWriter(osw);
                    wr.write(buffer.toString());
                    wr.flush();
                } catch(Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
        PHP_Debug c = new PHP_Debug();
        c.execute(phonenum, deviceid);
    }
<?php
$con = mysqli_connect('localhost','root','password');
if(!$con) {
die('Could not connect: '.mysql_error());
}

mysqli_select_db($con, 'dbname');
mysqli_query($con, "set session character_set_connection=utf8;");
mysqli_query($con, "set session character_set_results=utf8;");
mysqli_query($con, "set session character_set_client=utf8;");

$phonenum = $_POST['phonenum']; //폰번호
$deviceid = $_POST['deviceid']; //디바이스id
$query = "insert into debug (PhoneNum, DeviceID) values ('".$phonenum."','".$deviceid."')";
mysqli_query($con, $query);
mysqli_close($con);
?>

 

debug 테이블에 전화번호와 디바이스ID를 넣는 코드구요...

어떻게 어떻게 여기까지 구글링을 해서 했는데

액티비티에서 Debug(전화번호, 디바이스ID);를 불러오면 아무 진행이 되지 않습니다.

왜그런걸까요ㅠㅠ

로그캣은 다음과 같습니다.

02-12 11:55:58.811 26738-19556/com.twowords.get2words I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
02-12 11:55:58.811 26738-19556/com.twowords.get2words I/System.out: KnoxVpnUidStorageknoxVpnSupported API value returned is false

 

나래별 (150 포인트) 님이 2016년 2월 12일 질문

1개의 답변

0 추천
 
채택된 답변
        class PHP_Debug extends AsyncTask<String, Void, Void> {
			String phonenum;
			String deviceid;
			public PHP_Debug(String phonenum,String deviceid){
				phonenum = this.phonenum;
				deviceid = this.deviceid;
			}
            @Override
            protected Void doInBackground(String... params) {
                try {
                    String phonenum = params[0];
                    String device = params[1];
                    URL url = new URL(""); //server URL
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
 
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("phonenum").append("=").append(phonenum).append("&");
                    buffer.append("deviceid").append("=").append(device);
 
                    OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
                    PrintWriter wr = new PrintWriter(osw);
                    wr.write(buffer.toString());
                    wr.flush();
                } catch(Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }

		  new PHP_Debug(phonenum,deviceid).execute();
    
    

이렇게한번해보세영

sadeva (21,550 포인트) 님이 2016년 2월 12일 답변
나래별님이 2016년 2월 12일 채택됨
여전히 작동이 되지 않습니다ㅠㅠ
public PHP_Debug(String phonenum,String deviceid){
        phonenum = this.phonenum;
        deviceid = this.deviceid;
    }
이부분에서 this.phonenum, this.deviceid를 제외한 변수에 회색이 뜨면서
Parameter can be converted to a local variable.
The value this.phonenum assigned to 'phonenum' is never used.
이렇게 뜹니다ㅠㅠ
로그캣은 이렇게 뜹니다

02-12 14:54:30.731 14609-14609/com.twowords.get2words D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at com.twowords.get2words.MainActivity$PHP_Debug.doInBackground(MainActivity.java:203)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at com.twowords.get2words.MainActivity$PHP_Debug.doInBackground(MainActivity.java:192)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-12 14:54:30.861 14609-9313/com.twowords.get2words W/System.err:     at java.lang.Thread.run(Thread.java:818)
public void HttpPostData(String phonenum, String deviceid) {
    try {
            //String phonenum = params[0];
            //String device = params[1];
            URL url = new URL(""); //server URL
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
 
            StringBuffer buffer = new StringBuffer();
            buffer.append("phonenum").append("=").append(phonenum).append("&");
            buffer.append("deviceid").append("=").append(device);
 
            OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
            PrintWriter wr = new PrintWriter(osw);
            wr.write(buffer.toString());
            wr.flush();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    HttpPostData(phonenum,deviceid);


php 통신할때 async task 굳이 필요하지않을거같은데 혹시 이렇게한번해보시겠어요??
그래도 되지 않습니다ㅠㅠ POST방식에 문제가 있는건지...
json파싱까지 해야하는데 벌써부터 막히니 너무 답답하네요ㅠㅠ
php와 통신하는 다른 코드는 작동이 잘 되는데 $_POST['변수'] 여기에 변수를 담는것이 정말 어렵네요...
혹시 해당 php주소에 접근하는지는 확인해보셧나여? 아직안해보셨다면
해당 php주소에다가 echo 찍어보고 안드로이드 소스에 bufferreader 추가하셔서 print 찍으면 해당 php주소 echo 값이 로그캣에찍히는데 한번확인해보세여~
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            reader.readLine();
그냥 요 코드 추가하면 되나요?
public static void HttpPostData(String reg_id, String pnum, String type) {
        try {
            URL url = new URL(server_url);
            HttpURLConnection http = (HttpURLConnection) url.openConnection();
            http.setDefaultUseCaches(false);
            http.setDoInput(true);
            http.setDoOutput(true);
            http.setRequestMethod("POST");
            http.setRequestProperty("content-type", "application/x-www-form-urlencoded");
           
            StringBuffer buffer = new StringBuffer();
            buffer.append("reg_id").append("=").append(reg_id).append("&");
            buffer.append("phone_num").append("=").append(pnum).append("&");
            buffer.append("info1").append("=").append(appinfo1).append("&");
            buffer.append("info2").append("=").append(appinfo2).append("&");
            buffer.append("info3").append("=").append(appinfo3).append("&");
            buffer.append("type").append("=").append(type);
           
            OutputStreamWriter outStream = new OutputStreamWriter(http.getOutputStream(), "EUC-KR");
            PrintWriter writer = new PrintWriter(outStream);
            writer.write(buffer.toString());
            writer.flush();
            InputStreamReader tmp = new InputStreamReader(http.getInputStream(), "EUC-KR");
            BufferedReader reader = new BufferedReader(tmp);
            StringBuilder builder = new StringBuilder();
            String str;
            while ((str = reader.readLine()) != null) {
                builder.append(str + "\n");
            }
            HttpPostData_Result = builder.toString();   
        } catch (MalformedURLException e) {
           
        } catch (IOException e) {
           
        }
    }


이게 제가 실제로 쓰는 코드인데 여기서 값만 바꿔서 한번 확인해보세영
HttpPostData_Result = builder.toString();   여기 아래다가
System.out.println("값 뭐가찍히나 :?"+HttpPostData_Result); <--이런식으로 해보세영
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime: FATAL EXCEPTION: main
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime: Process: com.twowords.get2words, PID: 20631
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime: android.os.NetworkOnMainThreadException
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at libcore.io.IoBridge.connect(IoBridge.java:122)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at java.net.Socket.connect(Socket.java:882)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.Connection.connect(Connection.java:1198)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:395)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:298)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:399)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:110)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:221)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.twowords.get2words.MainActivity.PHP_Debug(MainActivity.java:208)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.twowords.get2words.MainActivity$1.onClick(MainActivity.java:63)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.view.View.performClick(View.java:5254)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21179)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:6837)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
02-12 16:05:18.091 20631-20631/com.twowords.get2words E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

OutputStreamWriter 쪽에서 자꾸 에러가 납니다ㅠㅠ
(MainActivity.java:208) 이건 OutputStreamWriter 쪽 코드고
(MainActivity.java:63) 이건 메소드 집어넣은 줄입니다.
public void PHP_Debug(String phonenum, String deviceid) {
        try {
            URL url = new URL("serverurl");
            HttpURLConnection http = (HttpURLConnection) url.openConnection();
            http.setDefaultUseCaches(false);
            http.setDoInput(true);
            http.setDoOutput(true);
            http.setRequestMethod("POST");
            http.setRequestProperty("content-type", "application/x-www-form-urlencoded");

            StringBuffer buffer = new StringBuffer();
            buffer.append("phonenum").append("=").append(phonenum).append("&");
            buffer.append("deviceid").append("=").append(deviceid);

            OutputStreamWriter osw = new OutputStreamWriter(http.getOutputStream());
            PrintWriter writer = new PrintWriter(osw);
            writer.write(buffer.toString());
            writer.flush();

            InputStreamReader tmp = new InputStreamReader(http.getInputStream());
            BufferedReader reader = new BufferedReader(tmp);
            StringBuilder builder = new StringBuilder();
            String str;
            while ((str = reader.readLine()) != null) {
                builder.append(str + "\n");
            }
            String HttpPostData_Result = builder.toString();
            System.out.println("값 뭐가 찍히나? : " + HttpPostData_Result);
        } catch (MalformedURLException e) {

        } catch (IOException e) {

        }
    }



PHP_Debug(phoneNum, deviceID);
oncreate문에다가

        if (android.os.Build.VERSION.SDK_INT > 9) { //oncreate 에서 바로 쓰레드돌릴려고 임시방편으로 넣어둔소스

            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

            StrictMode.setThreadPolicy(policy);

        }
       

이거추가해주세요 생각해보니 async task 가 필요하긴하네요 ㅠ 메인스레드 쓸수있게하는 임시방편소스라 해당 소스 oncreate문에다가 넣으면 아마 실행되실겁니다.
오오 드디어 됐습니다!!
오랫동안 정말 감사합니다ㅠㅠ 복받으실거에요ㅠㅠㅠ
ㅎㅎ 되셨다니 다행이네여~~~ 주말잘보내세영
...