안드로이드 php 로 mysql json 파싱 하기

by 조쉬 posted Aug 28, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

오늘은 친구한테 너무좋은 자료를 받아서 기억시켜놓기 위해 포스팅한다. 

 

똑똑한 친구네... 더 분발하며 분석해야 겠다. 

 

많이 삽질 펐지만 ,, 다른 사람들은 안그러길 바라며,,, 꼼꼼히 적어 놓아야겠다. 

 

일단 무엇보다도 안드로이드에서는 mysql로 직접적인 쿼리를 가져오는 것은 불가능하다.

 

그래서 안드로이드>>php>>mysql 이런형식으로 불러야한다. 

 

그럼 코드를 분석해보도록하자. 

 

 

DBManager.java

package com.example.navermap;

import java.io.BufferedReader;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class DBmanager {

 String result = "";
 //쿼리문을 등록한다. 
 ArrayList<NameValuePair> nameValuePairs;

 public DBmanager(){
  //the year data to send
  nameValuePairs = new ArrayList<NameValuePair>();

 }
 public JSONArray requestQuery(String sql){

  InputStream is = null;
  //쿼리를 가져와서 php로 연결할 준비를 한다. 
  nameValuePairs.add(new BasicNameValuePair("sql",sql));

  //http post
  try{ 
   //client 로 일단 연결하도록하자. 
   HttpClient httpclient = new DefaultHttpClient();
   //자신의 도메인과 php파일을 연결해주도록한다.
   //디버깅 과정은 httpost에서 php로  옮겨가면된다. 
   HttpPost httppost = new HttpPost("도메인/getter.php");
   //입력한 쿼리문을 인코딩한다. 
   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
   //실행과 동시에 리턴값을 받아낸다. 
   HttpResponse response = httpclient.execute(httppost);
   //결과가 잘 왔는지 확인한다. 
   HttpEntity entity = response.getEntity(); 
   is = entity.getContent();
  }catch(Exception e){
   Log.e("log_tag", "Error in http connection "+e.toString());
  }

  Log.e("log_tag", "result: "+result);
  
  //convert response to string
  try{
   //여기서는 포맷때문에 고생을많이했는데,
   //표준인 utf-8로 설정한다. 두번째 매개변수는 버퍼크기인듯 하다. 
   BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
   StringBuilder sb = new StringBuilder();
   String line = null;
   
   while ((line = reader.readLine()) != null) {
    Log.e("log_tag", "line: "+line);
    sb.append(line + "\n");
   }
   is.close();
   result=sb.toString();
   Log.e("log_tag", "result: "+result);
   
  }catch(Exception e){
   Log.e("log_tag", "Error converting result "+e.toString());
  }

  //parse json data
  try{
   if(result.equals("1\n")) Log.e("DBERROR", "connection error");
   if(result.equals("2\n")) Log.e("DBERROR", "db selection error");
   if(result.equals("3\n")) Log.e("DBERROR", "request error");
   if(result.equals("4\n")) Log.e("DBERROR", "sql query error");

   else {
    //주석을 제거할경우 가져온 값 스트링으로 표시한다. 
    JSONArray jArray = new JSONArray(result);
    /* for(int i=0;i<jArray.length();i++){
     JSONObject json_data = jArray.getJSONObject(i);
     Log.i("log_tag","id: "+json_data.getInt("id"));
    }*/
    return jArray;
   }
  }catch(JSONException e){
   Log.e("log_tag", "Error parsing data "+e.toString());
  }
  return null;
 }

 public boolean sendQuery(String sql){

  InputStream is = null;
  //이번에도 쿼리를 저장하고 ,
  nameValuePairs.add(new BasicNameValuePair("sql",sql));

  //http post
  try{ 
   //이번에도 경우도 위와 같다. 
   HttpClient httpclient = new DefaultHttpClient();
   //이줄뒤에 php문으로 분석하면된다. 
   HttpPost httppost = new HttpPost("도메인/setter.php");
   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8"));
   HttpResponse response = httpclient.execute(httppost);
   HttpEntity entity = response.getEntity();
   is = entity.getContent();
  }catch(Exception e){
   Log.e("log_tag", "Error in http connection "+e.toString());
  }
  
  //convert response to string
  try{
   BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
   StringBuilder sb = new StringBuilder();
   String line = null;
   while ((line = reader.readLine()) != null) {
    sb.append(line + "\n");
   }
   is.close();
   result=sb.toString();

  }catch(Exception e){
   Log.e("log_tag", "Error converting result "+e.toString());
  }
  
  
  if(result.equals("1\n")) Log.e("DBERROR", "connection error");
  if(result.equals("2\n")) Log.e("DBERROR", "db selection error");
  if(result.equals("3\n")) Log.e("DBERROR", "request error");
  if(result.equals("4\n")) Log.e("DBERROR", "sql query error");
  if(result.equals("5\n")){
   Log.i("DB", "query success");
   
   return true;
  }
  
  return false;
 }
}
 

 

 

 

다음으로 php를 살펴보자

 

php문은 그냥막저장하면안되고, 포맷에 주의하도록하자

utf-8형식으로 저장하였다. 

 

setter.php

 


<?php
$conn = mysql_connect('도메인','아디','비번');
if(!$conn){
echo "1";
exit();
}
if(!mysql_select_db('디비명')){
echo "2";
exit();
}
$sql = $_REQUEST['sql'];
//이부분이 쿼리를 요청하는는단계이다. 
//아까 자바에서 보면, nameValuePair이부분에서 받은 sql쿼리가 이부분에서 받게된다.
$sql=stripslashes($sql);
//이것은 /등의 특수문자를 제거해 주는것이다. 
$q=mysql_query($sql) or die("3");
if(!$q) die("4");
echo "5";
mysql_close();
?>


 

<?php
$conn = mysql_connect('디비명','아디','비번');

if(!$conn){
echo "1";
exit();
}

if(!mysql_select_db('디비명',$conn)){
echo "2";
exit();
}
//위와같다. 이부분은 아까한 안드로이드에서 받아온 쿼리를 처리한다.
$sql = $_REQUEST['sql'];

$sql=stripslashes($sql);
$q=mysql_query($sql,$conn) or die ("3");
if(!$q) die("4");
$arr = array();
//결과값을 저장하기위한것이다. 첫번쨰는 행으로 
while($row = mysql_fetch_assoc($q)) {
 foreach($row as &$v) { 
//이부분은 열 부분이다. 
//포맷문제가 생기면 해결하기위해 iconv를 사용한다. euc-kr을 utf-8로 설정한다. 
  //$v = iconv("euc-kr", "utf-8", $v);  // encode each value.
 }
   //해당 어레이에 각각해당 열을 arr형태로 저장한다. 
    $arr[] = $row;
}
//그것을 json으로 뿌리고,안드로이드에서는 가져간다. 
echo json_encode($arr);
mysql_close();
?>