본문 바로가기
📱Web & Mobile/AndroidStudio

[AndroidStudio] PHP 외부 DB연결

by inbeom 2023. 8. 20.
728x90

 💡 PHP를 이용하여 외부 DB와 연결하여 사용하는 방법!

  • 안드로이드 애플리케이션은 보안상의 이유로 ‘외부’ 데이터베이스에 바로 접근하지 못하기 때문에 (php+서버)를 중간에 두고 연결하여 사용해야 한다.

 

💡 -코드 작성-

  • 먼저 build.gradle(App)파일에 서버 통신 관련 라이브러리인 implementation 'com.android.volley:volley:1.2.1' 을 추가해줘야 한다.

Activity에서 Response&Request메서드 작성

  1. Response Listener를 생성하고 onResponse()메서드 @Override한다.
  2. JSONArray or JSONObject객체로 값을 반환 받아서 사용한다.
  3. 마지막에는 RequestActivity객체에 전달할 값을 담아 생성하고 RequestQueue객체에 담는다.

Code

private void rank(String category, ViewGroup rootView) {

    // 내 랭킹을 나타낼 TextView정의
    tvMyPoint = rootView.findViewById(R.id.tvMyPoint);
    tvMyRank = rootView.findViewById(R.id.tvMyRank);

    // 현재 로그인된 아이디
    pref = getActivity().getSharedPreferences("pref", Activity.MODE_PRIVATE);
    editor = pref.edit();
    rememberID = pref.getString("UserID", "_");

    // 어댑터 초기화
    arrayList = new ArrayList<>();
    mainAdapter = new RankListAdapter(arrayList);
    recyclerView.setAdapter(mainAdapter);

    Response.Listener<String> responseListener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONArray jsonArray = new JSONArray(response);   // 결과 값을 리턴받음.
                JSONObject jsonObject;

                for(int i=0;i<jsonArray.length();i++){
                    jsonObject = (JSONObject) jsonArray.opt(i);
                    String id = jsonObject.getString("UserId");
                    int point = jsonObject.getInt("point");

                    if(rememberID.equals(id)){
                        tvMyPoint.setText(point+"");
                        tvMyRank.setText((i+1)+"");
                    }

                    RankListData mainData = new RankListData((i+1)+"", R.drawable.user, id, point+"");
                    arrayList.add(mainData);
                }

                // 불러오기 전에 데이터(아이템) 초기화 해줘야 중첩 안됨.
                mainAdapter.notifyDataSetChanged();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };
    RankRequest rankRequest = new RankRequest(category, responseListener);
    RequestQueue queue = Volley.newRequestQueue(getActivity());
    queue.add(rankRequest);
}

액티비티에서 - 리퀘스트.java - php파일까지 설명

 

서버로 요청할 Request파일 작성

  1. 서버 URL설정 (php파일 연동)
  2. Request클래스의 생성자 생성
  • 호출할 때 받아올 매개변수 지정
  • super()에 전송방식(POST), listener, errorListener지정
  • Map타입 객체에 서버로 전송할 값 담기

code

package kr.co.company.healthapplication.request;

import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;

import java.util.HashMap;
import java.util.Map;

// Rank값 서버로 전송 (2023-01-10 인범 수정)
public class RankRequest extends StringRequest {
    final static private StringURL= "<http://miraclestep.ivyro.net/Rank.php>"; // 서버 URL 설정 (PHP 파일 연동.)
    private Map<string, string=""> map;

    public RankRequest(String category, Response.Listener listener) {
        // post방식으로 listener를 서버에 전송.
        super(Method.POST,URL, listener, null);

          map = new HashMap<>();
          map.put("category", category);

          Log.d("정보", category);
    }
    @Override
    protected Map<string, string=""> getParams() throws AuthFailureError {
        return map;
    }
}
</string,></string,>

 

서버에 등록할 php파일 작성

  1. 서버 DB에 연결 - mysqli_connect()
  • ip주소, id, pw, database, 인코딩 설정
  1. Request파일에서 Map객체에 담아 보낸 값 세팅
  2. Sql문 작성 및 실행
  • mysqli_prepare(), mysqli_stmt_execute()
  1. 결과 값 받아오기 및 결과 전송

code

<?php
    /*
      Rank.php : 랭크를 처리하는 php (POST 형식으로 MySQL로부터 데이터를 받아옴.)
      con : mysql 연결을 시도하는 변수.
      "$변수" 로 변수 선언
    */

/* (1) 서버 DB에 연결.*/
    $con = mysqli_connect("localhost", "miraclestep", "비밀번호??????", "miraclestep"); // mysql 연결, IP, 사용자명, 비밀번호, 데이터베이스
    mysqli_query($con, 'SET NAMES utf8'); // 인코딩을 utf-8로 세팅. (한글 전송이 가능해짐.)

/* (2) 앱에서 선택한 카테고리를 가져옴. */
    //$cate = isset($_GET["category"]) ? $_GET["category"] : "TotalUserStep";

/* (3) 현재 DB에 저장된 사용자들의 id와 카테고리의 값을 검색함. */
    $statement = mysqli_prepare($con, "SELECT UserID, ".$_POST['category']." FROM Rank ORDER BY ".$_POST['category']." DESC");
//     mysqli_stmt_bind_param($statement, 1, $_POST['category']);
//     mysqli_stmt_bind_param($statement, 2, $_POST['category']);
    mysqli_stmt_execute($statement);

// /* (4) DB안에 해당 카테고리가 일치하는 Rank정보 가져오기 정보 가져오기. */
    mysqli_stmt_store_result($statement);
         mysqli_stmt_bind_result($statement, $UserId, $UserPoint);

       $revs = array();

     $allrevs = array();
    $response["success"] =false;

    while(mysqli_stmt_fetch($statement)) {

        $revs["success"] =true;
        $revs["UserId"] = $UserId;
        $revs["point"] = $UserPoint;
        $allrevs[] = $revs;
    }

/* (5) 로그인 실행 결과 전송. */
echo json_encode($allrevs);
?>
728x90

'📱Web & Mobile > AndroidStudio' 카테고리의 다른 글

[AndroidStudio] 외부 API호출 (chatbot)  (0) 2023.08.20
[AndroidStudio] TMap API  (0) 2023.08.20
[AndroidStudio] SQLite  (0) 2023.08.20
[AndroidStudio] RecyclerView  (0) 2023.08.20
[AndroidStudio] Fragment  (0) 2023.08.20