728x90

안드로이드에서 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 상에서 복사하여 붙여넣기하면 테이블이 만들어진다.

첨부파일 받아서 수정해서 사용해도 된다.


android_mysql_php.sql


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 를 추가로 보고 틀려진 부분을 확인하여 코드를 약간 수정하면 된다.

블로그 이미지

Link2Me

,