안드로이드 앱에서 입력한 키워드를 웹서버에서 실행되는 PHP를 이용하여 MySQL 데이터베이스 서버에 질의하는 예제입니다.

질의 결과는 JSON 형식으로 가져와서 화면에 보여줍니다.



현재 예제에선 키워드를 2개 사용하고 있습니다. 3개 이상 필요한 경우 노란색 코드를 참고하여 추가하세요.

activity_main.xml, MainActivity.java, query.php  파일을 수정하면 됩니다.




1. 웹기반 테스트


2. Android 앱에서 테스트


3. 코드 설명


4. 관련 포스팅




마지막 업데이트 2019. 4. 25




다음 포스팅에 연결된 포스팅입니다.



Android PHP MySQL 예제 - 데이터베이스에서 데이터를 JSON 형식으로 가져오기

http://webnautes.tistory.com/829   





1. 웹기반 테스트

Android 앱에서 진행하기 전에 웹기반으로 먼저 테스트를 진행합니다.

PC에 설치된 웹서버 및 데이터베이스 서버 접속하는데 문제 없는지,  PHP 코드에서 테이블 접근시 문제 없는지 등을 확인해보기 위해서입니다.




1. 앞에서 진행했던 포스팅의 결과로 현재 db 데이터베이스의 Person 테이블에 다음 데이터가 저장되어 있는 상태입니다.


Android PHP MySQL 예제 - 데이터베이스에 데이터 입력하기

http://webnautes.tistory.com/828


웹브라우저에서 http://localhost/insert.php 에 접속하여 추가로 데이터를 더 집어 넣었습니다.





2. 다음 코드를 query.php 파일의 내용으로  복사해줍니다.

 

윈도우라면 C:\wamp64\www\ 경로에 query.php 파일을 생성합니다.

우분투라면 /var/www/html/ 경로에 query.php 파일을 생성합니다.

 

dbcon.php 파일은 이전 포스팅에 있는 것을 그대로 사용합니다.

 

<?php  
error_reporting(E_ALL);
ini_set('display_errors',1);

include('dbcon.php');



//POST 값을 읽어온다.
$country=isset($_POST['country']) ? $_POST['country'] : '';
$name = isset($_POST['name']) ? $_POST['name'] : '';
$android = strpos($_SERVER['HTTP_USER_AGENT'], "Android");


if ($country != "" ){

   $sql="select * from person where country='$country' and name='$name'";
   $stmt = $con->prepare($sql);
   $stmt->execute();

   if ($stmt->rowCount() == 0){

       echo "'";
       echo $country,", ",$name;
       echo "'은 찾을 수 없습니다.";
   }
else{

   $data = array();

       while($row=$stmt->fetch(PDO::FETCH_ASSOC)){

        extract($row);

           array_push($data,
               array('id'=>$row["id"],
               'name'=>$row["name"],
               'country'=>$row["country"]
           ));
       }


       if (!$android) {
           echo "<pre>";
           print_r($data);
           echo '</pre>';
       }else
       {
           header('Content-Type: application/json; charset=utf8');
           $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
           echo $json;
       }
   }
}
else {
   echo "검색할 나라를 입력하세요 ";
}

?>



<?php

$android = strpos($_SERVER['HTTP_USER_AGENT'], "Android");

if (!$android){
?>

<html>
  <body>
  
     <form action="<?php $_PHP_SELF ?>" method="POST">
        나라: <input type = "text" name = "country" />
        이름: <input type = "text" name = "name" />
        <input type = "submit" />
     </form>
  
  </body>
</html>
<?php
}

  
?>

 

 

 

3. PC의 웹브라우저에서 http://localhost/query.php 주소로 접속하면 다음과 같은 화면이 보이게 됩니다.

 

 

 

이미 데이터베이스의 테이블에 저장되어 있는 나라인 조선, 홍길동을 입력하고 제출을 클릭하면 JSON 포맷으로 결과를 보여줍니다.

 

 

 

없는 데이터를 검색한 경우입니다.

 

 

 

부분 문자열 검색은 구현안되어 있어서 일부만 입력하면 없다고 결과가 나옵니다.

 

 

 

4. 안드로이드 폰의 웹브라우저에서도 확인해봅니다.

주의할 점은 PC와 안드로이드가 같은 공유기에서 아이피를 할당받았거나 PC가 고정 아이피여야 테스트가 가능합니다.

 

본 포스팅에서는 안드로이드 폰의 핫스팟을 노트북에서 사용하도록 해서 테스트를 진행했습니다.

ifconfig 명령을 사용하여 노트북의 IP를 확인합니다. 여기에서는 192.168.43.52입니다.

 

 

크롬의 경우에는 데스크톱 버전으로 보기를 체크해줘야 텍스트 박스가 제대로 보입니다.

 

 

 

검색할 키워드를 입력하고 제출을 터치하면





PC와 동일한 결과를 얻을 수 있습니다.

문제가 있는 경우 PC와 스마트폰이 같은 네트워크(같은 공유기)를 사용하고 있는지 체크해보세요.





2. Android 앱에서 테스트

1.  이제 웹서버의 PHP 파일에 접근하는 안드로이드 앱을 작성합니다.

안드로이드 스튜디오에서 새로운  Empty 프로젝트를 생성합니다.




2. AndroidManifest.xml 매니페스트 파일의  manifest 태그 하위 항목으로 인터넷 접근 허용 퍼미션을 추가합니다.



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.tistory.webnautes.phpquerytest">

   <uses-permission android:name="android.permission.INTERNET" />
   
   <application




3. activity_main.xml 레이아웃 파일을 다음 내용으로 변경합니다.



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">

   <TextView
       android:id="@+id/textView_main_label"
       android:layout_width="match_parent"
       android:layout_height="40dp"
       android:text="검색할 나라와 이름을 입력해주세요 . " />

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="50dp"
       android:orientation="horizontal">

       <EditText
           android:id="@+id/editText_main_searchKeyword1"
           android:layout_width="0dp"
           android:layout_weight="0.35"
           android:hint="나라"
           android:layout_height="match_parent" />

       <EditText
           android:id="@+id/editText_main_searchKeyword2"
           android:layout_width="0dp"
           android:layout_weight="0.35"
           android:hint="이름"
           android:layout_height="match_parent" />

       <Button
           android:id="@+id/button_main_search"
           android:layout_width="0dp"
           android:layout_weight="0.3"
           android:layout_height="match_parent"
           android:text="Search" />
   </LinearLayout>

   <ListView
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="0.4"
       android:id="@+id/listView_main_list"/>

   <TextView
       android:id="@+id/textView_main_result"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="0.4" />
</LinearLayout>





4. item_list.xml  레이아웃 파일을 추가로 생성하여 아래 내용으로 바꿉니다.



ListView의 한 줄을 여러 개의 열로 표현하기 위해 필요한 레이아웃입니다.

세 개의 TextVew에 각각의 크기를 지정해주었습니다.




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_margin="15dp"
  android:padding="10dp">


  <TextView
      android:id="@+id/textView_list_id"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:layout_margin="5dp"
      android:padding="5dp" />


  <TextView
      android:id="@+id/textView_list_name"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="4"
      android:layout_margin="5dp"
      android:padding="5dp" />


  <TextView
      android:id="@+id/textView_list_address"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="5"
      android:layout_margin="5dp"
      android:padding="5dp" />

</LinearLayout>





5. MainActivity.java 자바 파일을 아래 내용으로 바꿉니다.



코드에서 다음 라인은 접속할 서버 IP로 변경해야 합니다.


String serverURL = "http://서버IP/query.php";



import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;

import java.io.InputStream;
import java.io.InputStreamReader;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


public class MainActivity extends AppCompatActivity {

   private static String TAG = "phpquerytest";

   private static final String TAG_JSON="webnautes";
   private static final String TAG_ID = "id";
   private static final String TAG_NAME = "name";
   private static final String TAG_ADDRESS ="country";

   private TextView mTextViewResult;
   ArrayList<HashMap<String, String>> mArrayList;
   ListView mListViewList;
   EditText mEditTextSearchKeyword1, mEditTextSearchKeyword2;
   String mJsonString;


   @Override
   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       mTextViewResult = (TextView)findViewById(R.id.textView_main_result);
       mListViewList = (ListView) findViewById(R.id.listView_main_list);
       mEditTextSearchKeyword1 = (EditText) findViewById(R.id.editText_main_searchKeyword1);
       mEditTextSearchKeyword2 = (EditText) findViewById(R.id.editText_main_searchKeyword2);


       Button button_search = (Button) findViewById(R.id.button_main_search);
       button_search.setOnClickListener(new View.OnClickListener() {
           public void onClick(View v) {

               mArrayList.clear();


               GetData task = new GetData();
               task.execute( mEditTextSearchKeyword1.getText().toString(), mEditTextSearchKeyword2.getText().toString());
           }
       });


       mArrayList = new ArrayList<>();


   }


   private class GetData extends AsyncTask<String, Void, String>{

       ProgressDialog progressDialog;
       String errorString = null;

       @Override
       protected void onPreExecute() {
           super.onPreExecute();

           progressDialog = ProgressDialog.show(MainActivity.this,
                   "Please Wait", null, true, true);
       }


       @Override
       protected void onPostExecute(String result) {
           super.onPostExecute(result);

           progressDialog.dismiss();
           mTextViewResult.setText(result);
           Log.d(TAG, "response - " + result);

           if (result == null){

               mTextViewResult.setText(errorString);
           }
           else {

               mJsonString = result;
               showResult();
           }
       }


       @Override
       protected String doInBackground(String... params) {

           String searchKeyword1 = params[0];
           String searchKeyword2 = params[1];

           String serverURL = "http://서버IP/query.php";
           String postParameters = "country=" + searchKeyword1 + "&name=" + searchKeyword2;


           try {

               URL url = new URL(serverURL);
               HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();


               httpURLConnection.setReadTimeout(5000);
               httpURLConnection.setConnectTimeout(5000);
               httpURLConnection.setRequestMethod("POST");
               httpURLConnection.setDoInput(true);
               httpURLConnection.connect();


               OutputStream outputStream = httpURLConnection.getOutputStream();
               outputStream.write(postParameters.getBytes("UTF-8"));
               outputStream.flush();
               outputStream.close();


               int responseStatusCode = httpURLConnection.getResponseCode();
               Log.d(TAG, "response code - " + responseStatusCode);

               InputStream inputStream;
               if(responseStatusCode == HttpURLConnection.HTTP_OK) {
                   inputStream = httpURLConnection.getInputStream();
               }
               else{
                   inputStream = httpURLConnection.getErrorStream();
               }


               InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
               BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

               StringBuilder sb = new StringBuilder();
               String line;

               while((line = bufferedReader.readLine()) != null){
                   sb.append(line);
               }


               bufferedReader.close();


               return sb.toString().trim();


           } catch (Exception e) {

               Log.d(TAG, "InsertData: Error ", e);
               errorString = e.toString();

               return null;
           }

       }
   }


   private void showResult(){
       try {
           JSONObject jsonObject = new JSONObject(mJsonString);
           JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);

           for(int i=0;i<jsonArray.length();i++){

               JSONObject item = jsonArray.getJSONObject(i);

               String id = item.getString(TAG_ID);
               String name = item.getString(TAG_NAME);
               String address = item.getString(TAG_ADDRESS);

               HashMap<String,String> hashMap = new HashMap<>();

               hashMap.put(TAG_ID, id);
               hashMap.put(TAG_NAME, name);
               hashMap.put(TAG_ADDRESS, address);

               mArrayList.add(hashMap);
           }

           ListAdapter adapter = new SimpleAdapter(
                   MainActivity.this, mArrayList, R.layout.item_list,
                   new String[]{TAG_ID,TAG_NAME, TAG_ADDRESS},
                   new int[]{R.id.textView_list_id, R.id.textView_list_name, R.id.textView_list_address}
           );

           mListViewList.setAdapter(adapter);

       } catch (JSONException e) {

           Log.d(TAG, "showResult : ", e);
       }

   }

}




6.  실행결과 입니다. 검색할 나라와 이름을 입력하고 SEARCH 버튼을 클릭하면 PHP 코드를 이용하여 데이터베이스 서버에 질의하고 결과를 가져옵니다.





중앙의 리스트뷰에는 검색 결과를 파싱하여 보여주며, 하단의 텍스트뷰에서는 JSON 데이터를 보여줍니다.





검색 결과가 없는 경우에는 PHP에서 보내준 에러메시지를 보여줍니다.



일정 시간 내에 서버로 접속이 안되는 경우 시간 초과 예외로 처리하고 있습니다.

java.net.SocketTimeoutException: failed to connect 메시지를 보여줍니다.



..


..


3. 코드 설명

검색어가 하나인 경우를 예로 들어 설명하고 있습니다.



(자바 코드) 버튼을 클릭하면 검색창에 있는 내용을 아규먼트로하여 GetData AsyncTask를 실행합니다.


button_search.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {

mArrayList.clear();


GetData task = new GetData();
task.execute( mEditTextSearchKeyword.getText().toString());
}
});


(자바 코드) 검색한 나라이름(searchKeyword)을 POST 방식 HTTP 통신의 아규먼트로 하여 서버에 있는 PHP 파일을 실행합니다.


String serverURL = "http://서버IP/query.php";
String postParameters = "country=" + searchKeyword;

. . . . . . . . . . . . .

outputStream.write(postParameters.getBytes("UTF-8"));


(PHP 코드) POST 방식으로 전달받은 값을 사용하여 SELECT문을 실행합니다.


if ($country != "" ){

   $sql="select * from person where country='$country'";
   $stmt = $con->prepare($sql);
   $stmt->execute();

(PHP 코드) 질의 결과 데이터가 없으면 에러를 출력하고 데이터를 얻으면 배열을 생성합니다.


   if ($stmt->rowCount() == 0){

       echo "'";
       echo $country;
       echo "'은 찾을 수 없습니다.";
   }
else{

   $data = array();

       while($row=$stmt->fetch(PDO::FETCH_ASSOC)){

        extract($row);

           array_push($data,
               array('id'=>$row["id"],
               'name'=>$row["name"],
               'country'=>$row["country"]
           ));
       }



(PHP 코드) 안드로이드에 전달하기 위해 JSON 포맷으로 변경 후 에코합니다.

if (!$android) {
echo "<pre>";
print_r($data);
echo '</pre>';
}else
{
header('Content-Type: application/json; charset=utf8');
$json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
echo $json;
}




(자바코드) StringBuilder를 사용하여 PHP가 에코한 문자열을 저장하고 스트링으로 변환하여 리턴합니다.


InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

StringBuilder sb = new StringBuilder();
String line;

while((line = bufferedReader.readLine()) != null){
sb.append(line);
}

bufferedReader.close();

return sb.toString().trim();




(자바 코드) 에러가 있는 경우 에러메시지를 보여주고 아니면 JSON을 파싱하여 화면에 보여주는 showResult 메소드를 호출합니다.


     @Override
protected void onPostExecute(String result) {
super.onPostExecute(result);

progressDialog.dismiss();
mTextViewResult.setText(result);
Log.d(TAG, "response - " + result);

if (result == null){

mTextViewResult.setText(errorString);
}
else {

mJsonString = result;
showResult();
}
}



(자바 코드)  안드로이드 앱에서 받은 JSON 포맷의 데이터입니다.

간단한 규칙이 있는데 중괄호 {} 는 JSONObject  대괄호 [] JSONArray입니다.


{
   "webnautes": [
       {
           "id": "1",
           "name": "홍길동",
           "country": "조선"
       },
       {
           "id": "2",
           "name": "잔다르크",
           "country": "프랑스"
       }
   ]
}


         


(자바 코드)  첫번째 괄호는 중괄호 {} 이므로 JSONObject입니다.


JSONObject jsonObject = new JSONObject(mJsonString);



(자바 코드)  jsonObject에서 TAG_JSON 키를 갖는 JSONArray를 가져옵니다.


JSONArray jsonArray = jsonObject.getJSONArray(TAG_JSON);


(자바 코드) 이제 다음같은 구조를 jsonArray가 갖고 있게 됩니다.

[
       {
           "id": "1",
           "name": "홍길동",
           "country": "조선"
       },
       {
           "id": "2",
           "name": "잔다르크",
           "country": "프랑스"
       }
   ]



(자바 코드)  JsonArray에는 JSONObject가 데이터 갯수만큼 포함되어 있습니다.

인덱스를 사용하여 JsonArray에서 JSONObject를 하나씩 가져옵니다.

for(int i=0;i<jsonArray.length();i++){
JSONObject item = jsonArray.getJSONObject(i);


(자바 코드)  JSONObject에서 키 id, name, country의 값을 가져옵니다.


String id = item.getString(TAG_ID);
String name = item.getString(TAG_NAME);
String country = item.getString(TAG_COUNTRY);


(자바 코드) 데이터를 새로 생성한 PersonalData 클래스의 멤버변수에 입력하고 ArrayList에 추가합니다.

PersonalData personalData = new PersonalData();

personalData.setMember_id(id);
personalData.setMember_name(name);
personalData.setMember_country(country);

mArrayList.add(personalData);



(자바코드) SimpleAdapter를 사용하여 화면에 파싱된 데이터를 보여줍니다.


           ListAdapter adapter = new SimpleAdapter(
                   MainActivity.this, mArrayList, R.layout.item_list,
                   new String[]{TAG_ID,TAG_NAME, TAG_COUNTRY},
                   new int[]{R.id.textView_list_id, R.id.textView_list_name, R.id.textView_list_address}
           );

           mListViewList.setAdapter(adapter);


4. 관련 포스팅


Android PHP MySQL 예제 - 데이터베이스에 데이터 입력하기

http://webnautes.tistory.com/828


Android PHP MySQL 예제 - 데이터베이스에서 데이터를 JSON 형식으로 가져오기

http://webnautes.tistory.com/829


Android PHP MySQL 예제  - 데이터베이스에 데이터 저장 및 JSON 형식으로 가져오는 예제 프로젝트

http://webnautes.tistory.com/1189  






포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.


여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 후원을 부탁드립니다. 감사합니다 : )
후 원 하 기


페이스북 페이지 : www.facebook.com/webnautes/

유튜브 채널 : youtube.com/user/webnautes


감사합니다 : )



  1. 이민영 2017.08.22 16:04

    query.php 파일을 그대로 입력했는데, localhost에서 띄우면

    $row["id"], 'name'=>$row["name"], 'address'=>$row["address"] )); } $android = strpos($_SERVER['HTTP_USER_AGENT'], "Android"); if (!$android) { echo "";
    print_r($data); echo ''; }else { header('Content-Type: application/json; charset=utf8'); $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE); echo $json; } } mysqli_free_result($result); } else{ echo "SQL문 처리중 에러 발생 : "; echo mysqli_error($link); } } else { echo "검색할 나라를 입력하세요 "; } mysqli_close($link); ?>
    나라 이름:
    제출

    이렇게 뜹니다.ㅠㅠ 나라이름에 조선을 입력하고 제출을 하면 접근할 수 없다고 뜹니다. 인코딩 드롭다운 이런게 떠서 인코딩을 ANSI이 아니고 유니코드로 변경시켰었는데 그게 문제가 되는걸까요..ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2017.08.22 16:20 신고

      웹서버의 php 관련 설정이 잘못되서 php 소스코드가 보이는듯합이다.

      웹서버 및 php 설치를 다시 해보세요

  2. 질문 2017.09.01 18:30

    textview 만 띄우고 싶으면 어떻게 해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2017.09.04 16:25 신고

      레이아웃에서 원하는 부분만 남기고 삭제하면.. 코드에서 에러나는 부분들이 생깁니다.

      에러난 코드부분들만 제거하면 될듯하네요
      (정확히는 해당 레이아웃을 사용하는 코드들을 찾아서 제거해줘야합니다..)

  3. 답변 부탁드립니다!!!! 2018.02.21 10:00

    안녕하세요 블로그 포스팅 정말 잘 참고하고 있습니다!
    sql 질의 결과를 저렇게 리스트뷰에 나타내는 코드 잘 참고했는데, 리스트뷰에 체크박스라던지.. 어떠한 장치를 두어 그 행을 선택했을 때
    그 행의 이름값을 가져오고 싶은데 어떻게 해야할지 도무지 모르겠어서.. 도움을 요청해봅니다..!
    답변 기다리겠습니다. 감사합니다

  4. 질문 있습니다! 2018.05.20 22:35

    이 예제로 예를 들어서, 만약에 홍길동이라는 사람의 나라를 알고 싶으면 어떻게 해야하나요?
    홍길동을 입력하면 textView에 나라가 출력되게 하려면 showResult() 이부분을 어떤식으로 고쳐야 하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2018.05.21 02:13 신고

      간단히 수정하려면 PHP코드에서 SQL문만 다음처럼 바꾸면 됩니다.

         $sql="select * from Person where name='$country'";

  5. 오익준 2018.05.21 11:21

    조선을 입력했을 때 나오는 홍길동이라는 데이터를 다른 곳에 사용하려면 어떻게 해야하나요?
    질의 결과에서 데이터를 가져와서 다른 함수에서 쓰고 싶은데, 예를 들어서 저 홍길동이라는 데이터를 TextView에 넣어서 얻어올까 생각해봤는데 그 부분이 AsyncTask에 구현이 되어있어서 가져오기가 마땅치가 않아서요.... showResult()에서 어떻게 하면 가져올 수도 있을것 같은데 잘 모르겠습니다ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2018.05.21 12:01 신고

      아래 링크를 참고하세요.
      인터페이스를 사용해야 한다고 합니다.

      https://stackoverflow.com/a/14129332

      하지만 결과 얻을때까지 UI를 사용안해도 된다면 링크에 있는 get()을 사용하는 방법을 해도 됩니다.

  6. leelim 2018.08.14 14:38

    배우는데 도움이 굉장히 많이 되고있습니다.
    좋은 글 감사합니다

  7. 답변부탁드립니다 2018.12.27 20:48

    초기화면에서 리스트뷰에 db내용 전체를 뿌려주고 후에 검색을 하게 하려면 php문을 손봐야 할거같은데 어떻게 손봐야할까요??

    $sql="select * from person where country='$country'"; 이걸 $sql="select * from person"; 이런식으로 바꿔버리면 검색이 되지않을거고 답변 부탁드릴게요 ㅜㅜ

  8. shinjm 2019.01.21 13:43

    감사합니다 잘 보고 배우고 있습니다.

    근데 listview에만 데이터가 안나오는데
    어느 부분을 확인해야할까요?
    xmlns:app="http://schemas.android.com/apk/res-auto"
    이부분이 회색처리가 되네요..
    에러메시지는 따로 나오지않는데...
    궁금하네요 ㅎㅎ
    --------------
    해결했네요 ㅎㅎ address가 아닌 country로 받아야하네요 ㅎㅎ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.01.21 13:52 신고

      우선 다음 코드 이후로 데이터가 제대로 파싱되었는지 확인하세요

      String id = item.getString(TAG_ID);
      String name = item.getString(TAG_NAME);
      String address = item.getString(TAG_ADDRESS);


  9. 답변부탁드려요 2019.01.26 22:53

    최근에 많은 도움이 되는 정보라서 잘보고 있습니다.
    다름이 아니라 여러개의 edittext문을 가져와서
    select * from person where name='$name' and country ='$country' 이런식으로 해보려고 하는데
    task.excute()에 "","","" 식으로 넣으면 첫번째 파라미터에 한번에 들어가더라고요.
    한파라미터에 하나씩 넣으려면 어떻게 해야할까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.01.27 13:42 신고



      AsyncTask를 실행시 다음처럼 3개의 아규먼트를 입력했다면

      GetData task = new GetData();
      task.execute("string1", "string2", "string3");



      doInBackground에서 다음처럼 3개의 파라미터를 가져올 수 있습니다.

      @Override
      protected String doInBackground(String... params) {

      String searchKeyword1 = params[0];
      String searchKeyword2 = params[1];
      String searchKeyword3 = params[2];

    • 해결하셨나요?? 2019.04.24 23:47

      저도 인자 3개 해줄려고 하는데
      String postParameters = "location=" + "경기도" ;
      String postParameters1 = "category=" + "retail" ;
      String postParameters2 ="Fsale=" + "2000";
      String postParameters3 ="Lsale=" + "3000";
      이렇게 하는게 맞나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.04.25 13:01 신고

      제가 답을 엉뚱하게 했었군요..;;;

      인자 2개를 사용하도록 코드를 수정했는데 해당 부분들을 노란색으로 표시해두었습니다.

      참고하여 인자를 하나 더 추가해보세요.

  10. KK 2019.05.01 16:27

    항상 좋은 예저 올려주셔서 감사합니다ㅠㅠ
    저번 포스트까지 보고 mysql이랑 안드로이드 연동은 잘 됐는데
    이번 포스트 따라서 php파일을 작성하면
    웹에서 html이 안뜨고
    그냥 php에 작성 된 그대로 뜨네요ㅠㅠ
    여기서 문제가 없어야 안드로이드 연동해도 문제가 안 나올거 같은데 왜이럴까요....

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.01 17:03 신고

      PHP코드가 보이는 것은 웹서버 문제일 가능성이 높습니다.

      웹서버를 확인하세요..

      정안되면 웹서버를 재설치하는게 빠를 수도 있습니다.

    • KK 2019.05.01 17:13

      전 포스트에서 만든 php파일은 문제없이 보이는데 서버문제일까요??

      html구현만 안되는 줄 알았더니
      안드로이드로 돌리면
      textVIew에 db가 그냥 출력이 되네욥...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.01 17:17 신고

      PC에서 php 코드 실행시 코드 내용이 보인다면 서버 문제입니다.

    • KK 2019.05.01 17:23

      웹서버라는 것이 wamp 말씀하시는거죠??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.01 17:29 신고

      네 맞습니다. 다음 포스트의 13번을 참고하여 현재 사용중인 PHP가 5.6대인지도 확인해보세요.

      https://webnautes.tistory.com/1206

  11. Q 2019.05.06 13:08

    안녕하세요
    굉장히 도움이 많이 되는 글이네요
    항상 블로그 잘 보고 있습니다!
    그런데 지금 php 작성 후 웹에서는 JSON으로 파싱이 잘 되서 보이는데
    안드로이드에서 실행 시키면 TextView에만 결과가 뜨고 ListView는 보이질 않습니다.
    org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject
    라는 오류가 뜨네요..
    어떻게해야할까요ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.06 18:51 신고

      다음 줄에서 에러가 나는 가 보군요.
      JSONObject jsonObject = new JSONObject(mJsonString);


      로그캣에 mJsonString의 값을 출력해서 댓글로 남겨주세요.

      포스트와 DB 구조가 다르면 안드로이드 코드의 JSON 파싱 코드도 수정해야 합니다.

    • Q 2019.05.06 20:09

      제가 dokdo라고 검색어를 넣었을 때,
      JSONObject jsonObject = new JSONObject(mJsonString);
      코드 앞에 Log를 출력하면 원하는 JSON데이터가 출력이 됩니다.
      { "result": [ { "name": "dokdo", "brand": "라운드랩", "cat": "기초" } ]}
      하지만 뒤에 넣으면 LOG출력이 안되는 거 봐서는 JSONObject jsonObject = new JSONObject(mJsonString);부터 오류가 나는게 맞나봅니다ㅠ
      php안의 array도 제 db에 맞게 바꾸긴 했어요ㅠ웹에서는 원하는대로 결과가 잘 나옵니다...
      파싱 코드자체에도 문제가 없는거 같은데

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.06 20:16 신고

      다음 코드를 실행하기 전에 mJsonString를 출력한 결과를 올려줘보세요.

      JSONObject jsonObject = new JSONObject(mJsonString);

    • Q 2019.05.06 20:29

      { "result": [ { "name": "dokdo", "brand": "라운드랩", "cat": "기초" } ]}

      이렇게 나옵니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.06 20:54 신고

      다음 코드에 있는 webnautes를 result로 바꾸어 보세요.

      private static final String TAG_JSON="webnautes";


      나머지 부분은 기존 코드와 동일하게 3개의 스트링으로 받으므로.. 소스 코드 수정없이 동작할 듯합니다.

    • Q 2019.05.06 21:00

      수정 후에도 여전히 같은 문제가 발생하네요...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.06 21:30 신고

      나머지 태그도 JSON에 있는 키 이름으로 변경했나요?

    • Q 2019.05.06 21:37

      TAG부분 말씀하시는 거라면 더 바꿨습니당.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.06 22:18 신고

      혹시 php에 다음 코드가 들어있나요?

      header('Content-Type: application/json; charset=utf8');
      $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
      echo $json;


      그리고 아래 코드에서 mJsonString 문자열에 JSON 데이터외에 다른 문자열이 포함된건 아닌지 체크해보세요.

      JSONObject jsonObject = new JSONObject(mJsonString);

    • Q 2019.05.06 23:43

      php 파일에 코드 들어가 있구용

      Log.w("왤까",mJsonString)
      하면
      2019-05-06 22:25:43.404 13558-13558/com.example.myapplication W/왤까: { "result": [ { "name": "dokdo", "brand": "라운드랩", "cat": "기초" } ]}
      이렇게 나옵니다...ㅠㅠ
      정말 저도 답답하네요ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.06 23:55 신고

      JSON 데이터가 포스트 글처럼 여러 줄이 아니라 한줄로 나오나요?

      웹에서 테스트할때도 한줄로 나온다면.. PHP코드를 다시 검토해보세요.

    • Q 2019.05.07 00:07

      웹에서는
      Array
      (
      [0] => Array
      (
      [name] => 트릭세라 클렌징 젤
      [brand] => 아벤느
      [cat] => 클렌징
      )

      [1] => Array
      (
      [name] => 아벤느 오 떼르말150ml
      [brand] => 아벤느
      [cat] => 기초
      )

      )
      이런 식으로 출력 됩니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.07 00:27 신고

      문제될만한 곳이 안보이는데 이상하군요..

      혹시 인코딩을 utf-8에서 다른것으로 수정했나요?

    • Q 2019.05.07 00:36

      아니욥...
      php파일이랑 자바 코드에 UTF-8인코딩 부분 다 그대로입니다....

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.07 00:54 신고

      php 코드를 어떻게 작성했나요?

    • 2019.05.07 01:04

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.07 01:27 신고

      php코드는 문제가 없네요.. 안드로이드 코드에서 문제가 있는듯합니다.

    • 2019.05.07 01:31

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.07 01:42 신고

      문제 없습니다...
      어디서 잘못된 건지.. 알 수 없군요..



    • Q 2019.05.07 01:57

      하...미치겠네요...
      진짜 왜 안되는 걸까요ㅠㅠㅠㅠㅠ
      아무튼 감사합니다....
      벌써 이틀째인데 왜 안 되는 건지 더 생각해 봐야겠네요...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.07 01:59 신고

      우선 포스팅 코드대로 해서 동작하는지 확인 후.. 수정을 해보세요.

    • Q 2019.05.07 02:45

      여전히 해결이 안되네요...
      원인 파악이 안되니...ㅠㅠㅠ
      그래도 감사합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.07 06:50 신고

      언급한 에러메시지 외에 다른 메시지는 안보이네요

  12. ggg 2019.05.25 19:23

    안녕하세요 항상 많은 도움이 되고있습니다. localhost에서 먼저 확인하려고 하는데 검색하는 화면이 나오고 검색을 하면 아무것도 안뜹니다. 오류나 이런 메세지도안떠요..ㅠㅠ

  13. ㅎㅎㅎ 2019.05.26 17:31

    안드로이드 앱에서 결과 확인을 하려는데 textview에서는 결과값이 잘 나옵니다 하지만 listview에서는 아무 화면도 나오지않아요.. 소스코드도 바꾸지 않았습니다...
    해결방법 아시면 알려주세요ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.26 18:28 신고

      showResult의 다음 코드에서 id, name, address에 값이 들어오는지 출력해보세요.

      String id = item.getString(TAG_ID);
      String name = item.getString(TAG_NAME);
      String address = item.getString(TAG_ADDRESS);

    • 2019.05.28 17:48

      비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.28 18:12 신고

      아래처럼 해보세요..

      Log.d( "@@@", name)

    • ㅎㅎㅎ 2019.05.31 13:15

      2019-05-31 13:12:29.671 13316-13316/com.example.googlegoogle D/googlegoogle: response - { "root": [ { "name": "면 미원리 433-13", "bunho": "043-201-2845" }, { "name": "미원면 미원리 518-1", "bunho": "043-201-2845" } ]}
      로그캣에 이렇게 결과는 잘 나오는데 그 다음에 org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject 이렇게 뜨네요ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.31 14:48 신고

      우선 에러난 코드 위치를 찾아보세요.

    • ㅎㅎㅎ 2019.05.31 15:18

      코드 상 에러난곳은 없습니다..ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.31 15:49 신고

      출력한 문자열이 다음과 같은 구조에서 벗어난 점이 있나 살펴보세요.
      {
      "webnautes": [
      {
      "id": "1",
      "name": "홍길동",
      "country": "조선"
      },
      {
      "id": "2",
      "name": "잔다르크",
      "country": "프랑스"
      }
      ]
      }


      에러난 부분은 아래 위치 같습니다.


      (자바 코드) 첫번째 괄호는 중괄호 {} 이므로 JSONObject입니다.

      JSONObject jsonObject = new JSONObject(mJsonString);

    • ㅎㅎㅎ 2019.05.31 17:26

      앱 textview에 뜨는 구조는 말씀하신 거랑 똑같아요ㅜㅜ 자바코드 첫번째에도 JSONObject jsonObject = new JSONObject(mJsonString);입니다..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.05.31 18:08 신고

      php 코드에서 아래 부분이 실행되나요?

      header('Content-Type: application/json; charset=utf8');
      $json = json_encode(array("webnautes"=>$data), JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
      echo $json;

  14. 정지웅 2019.06.04 23:03

    데이터 삽입 을 올려주신 예제 보고 잘했는데
    반대로 데이터 삭제는 php 의 쿼리문을 수정하고해도 잘안되어서 어떻게 해야되는지 궁금합니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.06.05 08:16 신고

      삭제도 삽입과 거의 똑같은 방식입니다.

      PHP파일에서 SQL 문만 수정하면 됩니다.

    • 정지웅 2019.06.05 15:31

      php 에서는 정상 작동하는데
      안드로이드에 넣었을때는 삭제가 적용이안되는데 어떤문제일까요 ..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes webnautes 2019.06.05 15:35 신고

      코드에서 postParameters만 제거하면 동작할듯 보이는데.

      혹시 앱이나 로그캣에 관련 메시지 안보이나요?

+ Recent posts