이번에는 로그인 및 메인화면을 구현하는 예제입니다.

저번 소스에서 Login.php이 잘못되었네요.

다음 파일이 제대로 된 소스입니다.

Login.php

<?php
    $con = mysqli_connect('localhost', 'root', 'qwer1234', 'proj_manager');

     $userID = $_POST["userID"];
     $userPassword = $_POST["userPassword"];

     $statement = mysqli_prepare($con, "SELECT * FROM USER WHERE userID = ? AND userPassword = ?");
     mysqli_stmt_bind_param($statement, "ss", $userID, $userPassword);
     mysqli_stmt_execute($statement);
     mysqli_stmt_store_result($statement);
     mysqli_stmt_bind_result($statement, $userID, $userPassword, $userName, $userAge);

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

     while(mysqli_stmt_fetch($statement)){
      $response["success"] = true;
      $response["userID"] = $userID;
      $response["userPassword"] = $userPassword;
      $response["userName"] = $userName;
      $response["userAge"] = $userAge;
     }

     echo json_encode($response);
?>

LoginRequest.java

package com.example.kch.proj_manager_v4;

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 LoginRequest extends StringRequest {

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

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

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


LoginActivity.java

package com.example.kch.proj_manager_v4;

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.TextView;
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 LoginActivity extends AppCompatActivity {

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

        //강의에서 final을 추가시켜줌
        final EditText idText = (EditText)findViewById(R.id.idText);
        final EditText passwordText = (EditText)findViewById(R.id.passwordText);
        final Button loginbtn = (Button)findViewById(R.id.loginbtn);
        final 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);
            }
        });

        loginbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String userID = idText.getText().toString();
                final String userPassword = passwordText.getText().toString();


                //4. 콜백 처리부분(volley 사용을 위한 ResponseListener 구현 부분)
                Response.Listener<String> responseListener = new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try{
                            JSONObject jsonResponse = new JSONObject(response);
                            boolean success = jsonResponse.getBoolean("success");

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

                            //서버에서 보내준 값이 true이면?
                            if(success){

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

                                String userID = jsonResponse.getString("userID");
                                String userPassword = jsonResponse.getString("userPassword");

                                //로그인에 성공했으므로 MainActivity로 넘어감
                                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                intent.putExtra("userID", userID);
                                intent.putExtra("userPassword", userPassword);
                                LoginActivity.this.startActivity(intent);

                            }else{//로그인 실패시
                                AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
                                builder.setMessage("Login failed")
                                        .setNegativeButton("retry", null)
                                        .create()
                                        .show();


                            }

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

                LoginRequest loginRequest = new LoginRequest(userID, userPassword, responseListener);
                RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
                queue.add(loginRequest);
            }
        });

    }
}




실행 화면

다음과 같이 등록한 아이디와 패스워드를 입력하고 Login 버튼을 누르면


다음과 같이 로그인에 성공하게 되고 메인화면으로 가게됩니다.



블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

댓글을 달아 주세요

  • woori 2018.05.13 23:06 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 게시물 보면서 열심히 따라 하고 있습니다ㅎ
    제가 위 소스와 동일하게 작성하고 internet 퍼미션도 주고 volley 라이브러리도 추가했는데
    저는 로그인 버튼을 클릭해도 아무 동작도 일어나지가 않아요 ㅠㅠ 혹시 뭔갈 더 추가해야 하나요?ㅠ

    • BlogIcon 가카리 2018.05.13 23:27 신고  댓글주소  수정/삭제

      먼저 확인해야될 것은 본인의 아파치 서버의 포트번호가 8080이 맞는지 확인하셔야합니다.

      저는 "http://10.0.2.2:8080/Login.php"; 다음과 같이 한 이유가 제 아파치 서버의 포트번호가 8080으로 맞춰나서 위와 같이 쓴겁니다.

      보통 그냥 아무생각없이 아파치를 설치하면 80포트로 설치될겁니다.

  • woori 2018.05.13 23:47 신고  댓글주소  수정/삭제  댓글쓰기

    제가 xampp를 사용하고 있느데요 여기서 포트 번호를 확인해 보니까 80과 443 두개가 나와서 http://10.0.2.2:80/login.php로 작성했는데도
    반응이 없더라구요 ㅠㅠ
    혹시 반응이 없는 이유가
    애뮬레이터를 돌렸을 때 ADB rejected shell command (getprop): closed 이런 오류가 나서 그럴 가능성도 있을까요?

    • BlogIcon 가카리 2018.05.13 23:53 신고  댓글주소  수정/삭제

      당연히 login.php 에서 아래부분에

      $con = mysqli_connect('localhost', 'root', 'qwer1234', 'proj_manager');

      qwer1234를 본인의 mysql 비밀번호

      proj_manager는 본인의 디비명을 넣었겠죠?

      그리고 mysql 도 3306포트를 사용하고 계시겠죠?


      그럼 먼저 hello.php를 다음과 같이 만들고

      <?php phpinfo(); ?>

      http://localhost:80/hello.php 로 접속해서 화면이 잘뜨는지 확인해보세요..

      화면이 잘뜨면 php쪽은 이상이 없으니 안드로이드쪽에 문제가 있는겁니다.

  • 1234 2018.05.15 02:42 신고  댓글주소  수정/삭제  댓글쓰기

    Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in (경로) 라고뜨는데 혹시 무슨오류일까요?