728x90
반응형
💡 PHP를 이용하여 외부 DB와 연결하여 사용하는 방법!
- 안드로이드 애플리케이션은 보안상의 이유로 ‘외부’ 데이터베이스에 바로 접근하지 못하기 때문에 (php+서버)를 중간에 두고 연결하여 사용해야 한다.
💡 -코드 작성-
- 먼저 build.gradle(App)파일에 서버 통신 관련 라이브러리인 implementation 'com.android.volley:volley:1.2.1' 을 추가해줘야 한다.
Activity에서 Response&Request메서드 작성
- Response Listener를 생성하고 onResponse()메서드 @Override한다.
- JSONArray or JSONObject객체로 값을 반환 받아서 사용한다.
- 마지막에는 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파일 작성
- 서버 URL설정 (php파일 연동)
- 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파일 작성
- 서버 DB에 연결 - mysqli_connect()
- ip주소, id, pw, database, 인코딩 설정
- Request파일에서 Map객체에 담아 보낸 값 세팅
- Sql문 작성 및 실행
- mysqli_prepare(), mysqli_stmt_execute()
- 결과 값 받아오기 및 결과 전송
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
반응형
'🌐OS > AOS' 카테고리의 다른 글
[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 |