안드로이드에서 MySQL DB 에 직접 접속이 불가능하다.
웹을 통해서 DB 접속을 해야 하므로 PHP 를 통한 MySQL 접속을 한다.
1. MySQL DB 테이블 생성
CREATE TABLE IF NOT EXISTS `Person` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`mobile` varchar(16) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Person` (`uid`, `name`, `mobile`) VALUES
(1, '홍길동', '010-6123-0000'),
(2, '장정은', '010-0123-0001'),
(3, '김홍길', '010-0123-0002'),
(4, '최신형', '010-0123-0003'),
(5, '민들레', '010-0123-0004'),
(6, '김아정', '010-0123-0005'),
(7, '이순신', '010-0123-0006'),
(8, '이정민', '010-9999-8887');
위 테이블 구조를 phpMyAdmin 상에서 복사하여 붙여넣기하면 테이블이 만들어진다.
첨부파일 받아서 수정해서 사용해도 된다.
MySQL DB 생성 방법을 모르면 http://link2me.tistory.com/431 참조
phpMyAdmin 사용법을 알고 싶다면 http://link2me.tistory.com/797 참조
※ 개인 PC에 설치해서 테스트 하는 경우에는 public IP 주소가 아니므로 스마트폰에서 인식을 못할 수 있음.
2. PHP 코드 작성
코드를 모듈화 해두면 코드가 간결해진다.
==== dbconnect.php ====
<?php
$db['host'] = "localhost";
$db['name'] = "address";
$db['user'] = "root";
$db['pass'] = "autoset";
$db['port'] = "3306";
$dbconn = isConnectDb($db);
function isConnectDb($db) {
$conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']);
mysqli_set_charset($conn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit;
} else {
return $conn;
}
}
?>
==== get_json.php =====
<?php
@extract($_POST); // POST 전송으로 전달받은 값 처리
if(!(isset($idx) && !empty($idx))) { // 안드로이드에서 넘어온 변수 체크
echo 0;
exit;
}
require_once $_SERVER['DOCUMENT_ROOT'].'/dbconnect.php';
$sql = "select uid, name, mobile from Person ";
$R = array(); // 결과 담을 변수 생성
$result = mysqli_query($dbconn,$sql);
while($row = mysqli_fetch_object($result)) {
array_push($R, $row); // 이 부분을 풀어서 처리하는 코드는 http://link2me.tistory.com/1275 참조
}
echo json_encode(array("result"=>$R));
?>
실행결과 Web 화면
PHP 초보자는 아래 작성된 내용은 안봐도 된다. 이런 방법도 있다는 걸 알고자 한다면 읽어도 좋다.
좀 더 세분화한 함수를 만들어서 연동 처리하는 방법도 가능하다.
==== get_xml.php =====
<?php
include_once $_SERVER['DOCUMENT_ROOT'].'/_var/db.info.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/_app/phpclass/dbClass.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/_app/phpclass/xmlClass.php';
$conn = new MySQLDbClass(); // DB 함수
$dbconn = $conn->isConnectDb($db);
$result = mysql_query('select uid,name,mobile from Person');
// 1. XML 데이터 생성방법
$c = new xmlcreateClass();
$c->XML2View($result); // 화면출력
?>
class xmlcreateClass {
// XML 데이터를 모니터 화면으로 출력
// $c->XML2View($result); // XML 데이터 화면 출력
function XML2View($result) {
header('Content-type: text/xml');
echo $this->exportAsXML($result);
}
// MySQL DB 자료를 column 개수, 게시물 총개수 만큼 자동으로 XML로 만들기
function exportAsXML($result){
$xml ='<?xml version="1.0" encoding="UTF-8" ?>'."\n";
$xml.='<ListInfo>'."\n";
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$xml.="<items>"."\n";
// 여기에 테이블에 필요한 칼럼을 적어준다.
// 능력이 되면 자동으로 칼럼을 생성처리하면 된다.
$xml.="</items>"."\n";
}
$xml.='</ListInfo>';
return $xml;
}
}
3. PHP 코드에 사용된 함수 설명
KIMSQ RB의 코드를 Class 화하여 필요한 코드를 추가하거나 수정해서 사용함.
==== db.info.php ======
<?php
$db['host'] = "localhost";
$db['name'] = "DB명"; // root
$db['user'] = "db_user"; // DB 접속권한을 가진 User명
$db['pass'] = "db_password";
$db['port'] = "3306";
?>
==== dbClass.php =====
<?php
class MySQLDbClass {
function isConnectDb($db)
{
$conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']);
mysqli_set_charset($conn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit;
} else {
return $conn;
}
}
// DB Query result 함수
function getDbresult($table,$where,$column) {
global $db;
$result = mysqli_query($db,'select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''));
return $result;
}
//SQL필터링
function getSqlFilter($sql)
{
return $sql;
}
}//end dbClass
?>
더 많은 코드는 KIMSQ RB 함수를 참조하여 응용해도 되고 Class 화하여 사용해도 된다.
MySQLi 를 사용하는 서버인 경우에는 코드를 수정할 부분이 있다.
$flddata ="uid, name, mobile"; // 화면에 출력할 칼럼 발췌
$where ='';
$result = $db->getDbresult('Person',$where,$flddata);
위 부분은 코드를 직관적으로 이해할 수 있도록 칼럼부분과 조건부분을 별도로 구분하여 처리했다.
테이블에 있는 모든 칼럼을 다 표시하는 * 보다는 출력하고픈 칼럼만 발췌하는 것이 속도면에서도 좋다.
만약 LIMIT 을 걸어서 테스트하고 싶다면 함수를 수정 보완하거나 그냥 간단하게
$result = mysql_query('select uid,name,mobile from Person LIMIT 3');
로 변경해서 테스트 해보면 된다.
함수로 만들어서 사용한다면
function JSONEncode($result,$varname){
$R = array(); // 결과 담을 변수 생성
while($row = mysqli_fetch_object($result)) {
$R[] = $row;
}
return json_encode(array($varname=>$R));
}
<?php
include_once $_SERVER['DOCUMENT_ROOT'].'/db.info.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/dbClass.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/jsonClass.php';
$conn = new MySQLDbClass(); // DB 함수
$dbconn = $conn->isConnectDb($db);
// 화면에 출력할 칼럼 발췌
$result = mysqli_query($db, 'select uid,name,mobile from Person LIMIT 3');
$c = new jsonClass();
echo $c->JSONEncode($result,'result');
?>
JSON_Encode 형태로 만들어서 출력(echo)하면 안드로이드에서 PHP 출력화면 데이터를 인식하여 스마트폰 화면에서 볼 수 있다.
https://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/ 를 참조해도 도움된다.
eclipse Android Code 부분은 다음 게시글 http://link2me.tistory.com/1020 을 참조하면 된다.
Android Studio Code 부분은 http://link2me.tistory.com/1230 를 추가로 보고 틀려진 부분을 확인하여 코드를 약간 수정하면 된다.
'안드로이드 > Android Data 통신' 카테고리의 다른 글
안드로이드 PHP 연동(자동로그인, 등록단말 검사, 네트워크 상태 검사) (4) | 2016.06.27 |
---|---|
안드로이드와 PHP 로그인 연동처리 (자동로그인, 네트워크 상태 체크 포함) (4) | 2016.06.25 |
안드로이드 AsyncTask (0) | 2016.06.21 |
[Eclipse]안드로이드 MySQL DB 연동 (안드로이드 앱 Part) - XML 방식 (0) | 2016.06.14 |
[Eclipse]안드로이드 MySQL DB 연동 (안드로이드 앱 Part : ListView) - JSON 방식 (0) | 2016.06.08 |