오늘은 친구한테 너무좋은 자료를 받아서 기억시켜놓기 위해 포스팅한다.
똑똑한 친구네... 더 분발하며 분석해야 겠다.
많이 삽질 펐지만 ,, 다른 사람들은 안그러길 바라며,,, 꼼꼼히 적어 놓아야겠다.
일단 무엇보다도 안드로이드에서는 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(); ?>[출처] 안드로이드 php 로 mysql json 파싱 하기.|작성자 열정남