이번에는 안드로이드 앱에서 데이터를 입력하면 그것을 데이터베이스에 저장하는 예제입니다.

CREATE DATABASE `proj_manager` CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `USER`(
userID VARCHAR(20) NOT NULL,
userPassword VARCHAR(20) NOT NULL,
userName VARCHAR(20) NOT NULL,
userAge INT NOT NULL,
PRIMARY KEY(userID))
DEFAULT CHARSET=utf8;

Login.php
<?php

   $con = mysqli_connect('localhost', 'root', 'qwer1234', 'proj_manager');
   if (!$con)
  {
     echo "MySQL 접속 에러 : ";
     echo mysqli_connect_error();
     exit();
  }

   //post방식으로 데이터를 받는다.
    $userID = $_POST["userID"];
    $userPassword = $_POST["userPassword"];
    $userName = $_POST["userName"];
    $userAge = $_POST["userAge"];

    //데이터베이스에 값을 넣는부분
    $statement = mysqli_prepare($con, "INSERT INTO USER VALUES(?, ?, ?, ?)");
    mysqli_stmt_bind_param($statement, "sssi", $userID, $userPassword, $userName, $userAge);
    mysqli_stmt_execute($statement);

    //배열 선언후
    $response = array();
    $response["success"] = true;//success라는 인덱스에 true값을 넣어줌

    echo json_encode($response);//JSON형식으로 출력

  ?>

Register.php

<?php

   $con = mysqli_connect('localhost', 'root', 'qwer1234', 'proj_manager');
   if (!$con)
  {
     echo "MySQL 접속 에러 : ";
     echo mysqli_connect_error();
     exit();
  }

   //post방식으로 데이터를 받는다.
    $userID = $_POST["userID"];
    $userPassword = $_POST["userPassword"];
    $userName = $_POST["userName"];
    $userAge = $_POST["userAge"];

    //데이터베이스에 값을 넣는부분
    $statement = mysqli_prepare($con, "INSERT INTO USER VALUES(?, ?, ?, ?)");
    mysqli_stmt_bind_param($statement, "sssi", $userID, $userPassword, $userName, $userAge);
    mysqli_stmt_execute($statement);

    //배열 선언후
    $response = array();
    $response["success"] = true;//success라는 인덱스에 true값을 넣어줌

    echo json_encode($response);//JSON형식으로 출력

  ?>

안드로이드 소스.

프로젝트2. 액티비티 화면 전환에서 언급은 안해서 여기에 설명합니다.

 현재 앱을 실행 했을때 메인 화면은 LoginActivity 클래스입니다.

아래 AndroidManifest.xml에 보시면 LoginActivity 클래스에 MAIN인텐트 필터가 적용됨을 알 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
    package="com.example.kch.proj_manager_v3">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.example.kch.proj_manager_v3.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.kch.proj_manager_v3.RegisterActivity" />
        <activity android:name="com.example.kch.proj_manager_v3.MainActivity"></activity>
    </application>
</manifest>


LoginActivity.java

package com.example.kch.proj_manager_v3;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        EditText idText = (EditText)findViewById(R.id.idText);
        EditText passwordText = (EditText)findViewById(R.id.passwordText);

        Button loginbtn = (Button)findViewById(R.id.loginbtn);
        TextView registerbtn = (TextView)findViewById(R.id.registerbtn);

        registerbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent registerIntent = new Intent(LoginActivity.this, RegisterActivity.class);
                LoginActivity.this.startActivity(registerIntent);
            }
        });
    }
}

다음 소스를 보기전에 반드시  Volley 라이브러리를 알아야하는데 Volley 라이브러리는 네트워크 라이브러리입니다.

Volley로 네트워크 요청, 수신 하는 방법은 크게 4가지 방법으로 나뉩니다.
1.RequestQueue 생성
2. Request Object 생성
3. 생성된 Object를 RequestQueue로 전달
4. 이후 할당된 Response로 Callback

출처: http://eteris.tistory.com/792 [Eteris's Palace]

저는 조금 순서를 바꿔서 했습니다. 소스단에 주석를 달아놨으니 참고바랍니다.

  1. RequestObject 를 생성(RegisterRequest클래스 선언)
  2. RequestQueue 생성
  3. RequestObject를  RequestQueue로 전달
  4. 할당된 Response로 Callback 처리


RegisterActivity.java

package com.example.kch.proj_manager_v3;

import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

public class RegisterActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        final EditText idText = (EditText)findViewById(R.id.idText);
        final EditText passwordText = (EditText)findViewById(R.id.passwordText);
        final EditText nameText = (EditText)findViewById(R.id.nameText);
        final EditText ageText = (EditText)findViewById(R.id.ageText);

        Button regbtn = (Button)findViewById(R.id.registerbtn);

        regbtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                String userID = idText.getText().toString();
                String userPassword = passwordText.getText().toString();
                String userName = nameText.getText().toString();
                int userAge = Integer.parseInt(ageText.getText().toString());


                //4. 콜백 처리부분(volley 사용을 위한 ResponseListener 구현 부분)
                Response.Listener<String> responseListener = new Response.Listener<String>(){

                    //서버로부터 여기서 데이터를 받음
                    @Override
                    public void onResponse(String response) {
                        try {
                            //서버로부터 받는 데이터는 JSON타입의 객체이다.
                            JSONObject jsonResponse = new JSONObject(response);
                            //그중 Key값이 "success"인 것을 가져온다.
                            boolean success = jsonResponse.getBoolean("success");

                            //회원 가입 성공시 success값이 true임
                            if(success){

                                Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();

                                //알림상자를 만들어서 보여줌
                                AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
                                builder.setMessage("register success!!")
                                .setPositiveButton("ok", null)
                                .create()
                                .show();

                                //그리고 첫화면으로 돌아감
                                Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                                RegisterActivity.this.startActivity(intent);

                            }
                            //회원 가입 실패시 success값이 false임
                            else{
                                Toast.makeText(getApplicationContext(), "fail", Toast.LENGTH_SHORT).show();

                                //알림상자를 만들어서 보여줌
                                AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
                                builder.setMessage("register fail!!")
                                        .setNegativeButton("ok", null)
                                        .create()
                                        .show();

                            }

                        }catch(JSONException e){
                            e.printStackTrace();
                        }

                    }
                };//responseListener 끝

                //volley 사용법
                //1. RequestObject를 생성한다. 이때 서버로부터 데이터를 받을 responseListener를 반드시 넘겨준다.
                RegisterRequest registerRequest = new RegisterRequest(userID, userPassword, userName, userAge, responseListener);
                //2. RequestQueue를 생성한다.
                RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this);
                //3. RequestQueue에 RequestObject를 넘겨준다.
                queue.add(registerRequest);

            }
        });

    }
}


RegisterRequest.java

package com.example.kch.proj_manager_v3;

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

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


public class RegisterRequest extends StringRequest {

    //현재 안드로이드앱을 에뮬레이터로 돌리므로 에뮬레이터가 설치된 서버에 있는 아파치 서버에 접근하려면
    //다음과 같이 10.0.2.2:포트번호 로 접근해야합니다 저는 8080 포트를 써서 다음과 같이 했습니다
    final static private String URL = "http://10.0.2.2:8080/Register.php";
    private Map<String, String> parameters;

    //생성자
    public RegisterRequest(String userID, String userPassword, String userName, int userAge, Response.Listener<String> listener){
        super(Method.POST, URL, listener, null);
        parameters = new HashMap<>();
        parameters.put("userID", userID);
        parameters.put("userPassword", userPassword);
        parameters.put("userName", userName);
        parameters.put("userAge", userAge+"");

    }

    //추후 사용을 위한 부분
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return parameters;
    }
}


activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.kch.proj_manager_v3.com.example.kch.proj_manager_v3.LoginActivity">

    <EditText
        android:id="@+id/idText"
        android:layout_width="308dp"
        android:layout_height="45dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="ID"
        android:inputType="textPersonName"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="-8dp" />

    <EditText
        android:id="@+id/passwordText"
        android:layout_width="310dp"
        android:layout_height="54dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="password"
        android:inputType="textPassword"
        app:layout_constraintHorizontal_bias="0.503"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/idText"
        tools:layout_editor_absoluteX="-10dp" />

    <Button
        android:id="@+id/loginbtn"
        android:layout_width="218dp"
        android:layout_height="65dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:text="login"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/passwordText"
        tools:layout_editor_absoluteX="18dp" />

    <TextView
        android:id="@+id/registerbtn"
        android:layout_width="wrap_content"
        android:layout_height="17dp"
        android:layout_marginTop="8dp"
        android:text="register"
        android:textAppearance="@style/TextAppearance.AppCompat.Button"
        app:layout_constraintTop_toBottomOf="@+id/loginbtn"
        android:layout_marginLeft="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginRight="8dp"
        app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>


activity_register.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.kch.proj_manager_v3.com.example.kch.proj_manager_v3.RegisterActivity">

    <EditText
        android:id="@+id/idText"
        android:layout_width="342dp"
        android:layout_height="41dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="id"
        android:inputType="textPersonName"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/passwordText"
        android:layout_width="346dp"
        android:layout_height="44dp"
        android:ems="10"
        android:inputType="textPassword"
        android:layout_marginLeft="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginRight="8dp"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="10dp"
        app:layout_constraintTop_toBottomOf="@+id/idText" />

    <EditText
        android:id="@+id/nameText"
        android:layout_width="346dp"
        android:layout_height="41dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="12dp"
        android:ems="10"
        android:hint="name"
        android:inputType="textPersonName"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/passwordText" />

    <EditText
        android:id="@+id/ageText"
        android:layout_width="340dp"
        android:layout_height="44dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:hint="age"
        android:inputType="textPersonName"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/nameText" />

    <Button
        android:id="@+id/registerbtn"
        android:layout_width="248dp"
        android:layout_height="47dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:text="register"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ageText" />
</android.support.constraint.ConstraintLayout>




실행 화면

  1. 먼저 첫 화면에서 REGISTER를 클릭합니다.



  1. 새로 등록할 ID, PW, Name, Age 값을 넣고 REGISTER 버튼을 눌러줍니다.



  1. 그 후 데이터베이스에 접속하여 확인해보면 다음과 같이 데이터가 제대로 들어갔음을 알 수 있습니다. 









블로그 이미지

가카리

프로그래밍, 취업 및 직장생활, 주식 부동산 재테크 전문 블로그

댓글을 달아 주세요

  • 2018.01.16 17:16  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • BlogIcon 가카리 2018.01.16 17:21 신고  댓글주소  수정/삭제

      100% PHP에서 데이터를 못받아와서

      JSONObject jsonResponse = new JSONObject(response);

      boolean success = jsonResponse.getBoolean("success";);

      여기서 에러나는겁니다.
      PHP 파일을 아파치서버의 최상의 경로에 둔게 맞나요?

      먼저 피씨에서 크롬을 열고

      http://localhost:포트번호/Register.php

      가 들어가지는지 부터 확인해보세요

    • 2018.01.16 17:49  댓글주소  수정/삭제

      포트번호를 몰라서 http://localhost/Register.php로 들어가보니까 success떠서 들어가지는거 같아요! 아닌가요?..ㅠㅠ php파일은 C:\xampp\htdocs 경로에 두었습니다! ㅠㅠㅠㅠ......

    • BlogIcon 가카리 2018.01.16 17:55 신고  댓글주소  수정/삭제

      먼저 에뮬레이터에서 JSONException이 난게 맞나요?

      그다음 아파치 포트번호를 정확히 알아야합니다.

      그리고 mysql 데이터베이스로 제대로 접속되는지 확인해야되구요.

      저같은 경우 아파치 포트번호가 8080이라서

      "http://10.0.2.2:8080/Register.php";
      으로 했구요

      참고로 10.0.2.2는 안드로이드 에뮬레이터로 돌려서 이런식의 아이피를 둔겁니다.

    • 2018.01.16 19:21  댓글주소  수정/삭제

      비밀댓글입니다

    • 개발자 2018.10.18 01:02  댓글주소  수정/삭제

      $response["success"] = true;
      $response["userID"] = $userID;
      $response["userPassword"] = $userPassword;
      $response["userName"] = $userName;
      $response["userAge"] = $userAge;
      로 고쳐야 되던데... 아닌가요?

    • BlogIcon 가카리 2018.10.18 11:09 신고  댓글주소  수정/삭제

      바꾸셔서되시면 잘되는거죠 php버전별로 차이가 있다고봅니다

  • BlogIcon 가카리 2018.01.16 19:27 신고  댓글주소  수정/삭제  댓글쓰기

    에뮬레이터에서 컴터의 아파치로 접속하려면 10.0.2.2로 접속해야되서요 스마트폰이면 스마트폰을 집의 공유기에 와이파이로 접속하고 피씨도 같은 공유기를 쓴뒤 아이피주소를 피씨의 아이피로 소스를 수정해야할것같네요.

    • b 2018.01.16 19:34  댓글주소  수정/삭제

      url부분 말씀하시는 건가요?? 그부분에는 지금 피씨가 접속중인 와이파이의 아이피주소를 적는것이 아닌가요?ㅠㅠ.. 저는 http://10.0.2.2:8080/Register.php를 쳐보면 아무것도 안나오네요..

  • BlogIcon 가카리 2018.01.16 19:58 신고  댓글주소  수정/삭제  댓글쓰기

       final static private String URL ="http://10.0.2.2:8080/Register.php"
    이부분이구요
    1. 개발 피씨에 아파치가 설치되있다면 피씨의 아이피주소는 곧 아파치서버의 아이피입니다.
    2. 피씨가 유선으로 공유기에 연결되었다면 ipconfig 명령어로 유선아이피 주소를 확인하면되요 보통 iptime의 경우 192.168.xxx.xxx일꺼에요
    3. 그다음 공유기의 와이파이에 스마트폰이 접속하면 스마트폰의 아이피도 192.168.xxx.xxx가 되므로 같은 아이피대역에 있게 됩니다.
    4. 같은 대역이므로 스마트폰에서 서버의 기본페이지가 접속되는지 확인합니다.
    http://서버아이피주소:포트번호
    포트번호는 보통 80 또는 8080일겁니다.
    5. 스마트폰에서 서버 기본페이지가 정상적으로 출력되면 이제 소스의 URL 부분을 서버아이피주소:포트번호로 바꾸고 앱을 스마트폰에 올려서 확인하면됩니다.

  • BlogIcon 가카리 2018.01.16 20:20 신고  댓글주소  수정/삭제  댓글쓰기

    저도 동일위치구요. 전 비트나미를 썼습니다. 먼저 PHP를 이용해서 디비접속후 데이터를 가져와서 출력하는 예제부터 해보세요 스마트폰으로도 그 예제가 잘 되야합니다.

    지금 디비 접속아니면 아파치접속 둘중에 하나가 문제입니다

  • BlogIcon 가카리 2018.01.16 20:48 신고  댓글주소  수정/삭제  댓글쓰기

    예제는 없네요 찾는데 얼마 안걸릴거에요

  • BlogIcon 가카리 2018.01.16 22:20 신고  댓글주소  수정/삭제  댓글쓰기

    mysql 접속방법은 찾아보시면되구요.. 전 맥을써서요 터미널 열고 mysql 실행파일 경로에서 ./mysql -u root -p 치면 패스워드입력하라고 뜨면 비번넣고 엔터
    그다음 use proj_manager 로 데이터베이스 선택
    그다음 select * from user 로 확인한 결과입니다 윈도우도 이와 비슷할겁니다. 콘솔창여는 법만 다를뿐

  • BlogIcon 가카리 2018.01.16 22:27 신고  댓글주소  수정/삭제  댓글쓰기

    phpmyadmin으로 쓰셔도되요 sql로 하는 방법도있고 그냥 디비명 클릭해서 봐도 상관없어요

  • bene33 2019.11.24 22:14  댓글주소  수정/삭제  댓글쓰기

    안드로이드에서 php로 값을 보내줄 때 arraylist 값은 어떻게 보내고 받아야 할까요??...

  • BlogIcon 영화 다시보기 2020.08.12 14:58  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다~~