Minggu, Februari 24, 2013

Membuat Login Form di Android dengan PHP MySQL

http://rapidpurple.com/purpleblog/wp-content/uploads/2011/11/php_mysql_logo.png

Salam Developer, kali ini kita akan melanjutkan postingan sebelumnya mengenai koneksi Android dengan PHP MySQL. Untuk lebih jelasnya akan kita implementasikan pada program yang dibuat dibawah ini. Jika ingin membuka postingan sebelumnya klik link berikut

Untuk persiapan, tool tool yang kita butuhkan adalah

1. Apache Web Server dan mySQL bisa pake XAMPP download disini –> XAMPP

2. Eclipse dan Android SDK –> versi yang saya gunakan disini ada 2.3.3 Ginggerbeard

3. Notepad++ atau Dreamweaver terserah mau pake yang mana untuk edit file PHP

4. Kopi/Susu + roti bakar Open-mouthed smile --> Wajib nih meski cuman singkat tutorialnya Smile

Bagian 1 Buat Project baru pada Android

Seperti sebelumnya copykan file class JSONParser yang ada di postingan sebelumnya ke project ini. Setelah itu buat class baru bernama UserFunction.java. Nantinya class ini akan menghandle fungsi fungsi JSON dan HTTP-POST yang akan kita lakukan.(ingat class dan package yang saya gunakan dalam project ini adalah default dari komputer saya. jadi ketika anda melakukan copas cek sesuai dengan konfigurasi milik anda)

UserFunction.java

package com.eepis.android;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

public class UserFunctions {
   
    private JSONParser jsonParser;
   
    private static String loginURL = "http://10.0.2.2/tes/";
   
    private static String login_tag = "login";
    private static String register_tag = "register";
   
    // constructor
    public UserFunctions(){
        jsonParser = new JSONParser();
    }
   
    public JSONObject loginUser(String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", login_tag));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
        JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);

        return json;
    }
   
    /**
     * function make Login Request
     * @param name
     * @param email
     * @param password
     * */
    public JSONObject registerUser(String name, String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", register_tag));
        params.add(new BasicNameValuePair("name", name));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
       
        // getting JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
        // return json
        return json;
    }
}

LoginFormActivity.java

package com.eepis.android;

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class LoginFormActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    //Deklarasi variabel view object
    TextView     error;
    Button        login,register;
    EditText    user,pwd;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //Registrasi view id
        error=(TextView)findViewById(R.id.txt1);
        login=(Button)findViewById(R.id.btn1);
        login.setOnClickListener(this);
        register=(Button)findViewById(R.id.btn2);
        register.setOnClickListener(this);
        user=(EditText)findViewById(R.id.edit1);
        pwd=(EditText)findViewById(R.id.edit2);
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.btn1:
            //Memanggil fungsi login di class userfunction
            UserFunctions userFunction = new UserFunctions();
            JSONObject json = userFunction.loginUser(user.getText().toString(), pwd.getText().toString());
            try {
                if (json.getString("success") != null) {
                    error.setText("");
                    String res = json.getString("success");
                    if(Integer.parseInt(res) == 1){
                        Intent login = new Intent(LoginFormActivity.this,MemberActivity.class);
                       startActivity(login);
                       MemberActivity.session=user.getText().toString();
                    }else{
                        error.setText("username/password anda salah");
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            break;
        case R.id.btn2:
            //Memanggil fungsi register di class userfunction
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle("Registrasi");
            alert.setMessage("Masukkan Data Anda");
           
            // Set an EditText view to get user input
            LinearLayout lay=new LinearLayout(this);
            lay.setOrientation(LinearLayout.VERTICAL);
            final EditText name = new EditText(this);
            name.setHint("Nama");
            final EditText email = new EditText(this);
            email.setHint("Email");
            final EditText password = new EditText(this);
            password.setHint("Password");
            lay.addView(name);
            lay.addView(email);
            lay.addView(password);
            alert.setView(lay);
            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    String nama = name.getText().toString();
                    String mail = email.getText().toString();
                    String pass = password.getText().toString();   
                    UserFunctions userFunction = new UserFunctions();
                    JSONObject json = userFunction.registerUser(nama, mail, pass);
                    try {
                         if (json.getString("success") != null) {
                             String res = json.getString("success");
                             if(Integer.parseInt(res) == 1){
                                 Toast.makeText(LoginFormActivity.this, "Registrasi Berhasll", 1).show();
                             }else{
                                 Toast.makeText(LoginFormActivity.this, "Registrasi Gagal", 1).show();
                             }
                         }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
           
                }
            });
            alert.show();
            break;
        default:
            break;
        }
    }
}

MemberActivity.java

package com.eepis.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MemberActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    Button        logout;
    static String session="";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.member);
       logout=(Button)findViewById(R.id.btn1);
       logout.setOnClickListener(this);
    }
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        this.session="";
        this.finish();
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.eepis.android"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".LoginFormActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:label="@string/app_name"
            android:name=".MemberActivity" >
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

Bagian 2 Buat API yang menghandle request dari Android

Pada server side kita membuat API yang menangkap Http-Post yang kita kirim via android dan mengembalikannya ke kita dalam bentuk JSON

SQL file

<form action="index.php" method="post">
   <p>tag: <input type="text" name="tag" /></p>
   <p>name: <input type="text" name="name" /></p>
   <p>email: <input type="text" name="email" /></p>
   <p>password: <input type="text" name="password" /></p>
   <input type="submit" name="submit" value="Submit" />
</form>

index.php

<?php

/**
File ini untuk menghandle API Request
hasilnya di encoda dalam bentuk JSON
  /**
* check for POST request
*/
if (isset($_POST['tag']) && $_POST['tag'] != '') {
    // Tag
    $tag = $_POST['tag'];

    // Database Handler
    require_once 'include/DB_Functions.php';
    $db = new DB_Functions();

    // Response--> data yang akan dikembalikan
    $response = array("tag" => $tag, "success" => 0);
   
    // Cek tipe tag
    if ($tag == 'login') {
        // Tangkap data yang dikirim dari android
        $email = $_POST['email'];
        $password = $_POST['password'];

        // Cek user
        $user = $db->getUserByEmailAndPassword($email, $password);
        if ($user != false) {
            // User ditemukan
            $response["success"] = 1;
            echo json_encode($response);
        } else {
            // User tidak ditemukan
            $response["success"] = 0;
            echo json_encode($response);
        }
    }
    else if ($tag == 'register') {
        // Tangkap data yang dikirim dari android
        $name = $_POST['name'];
        $email = $_POST['email'];
        $password = $_POST['password'];

        // cek user sudah ada atau belum
        if ($db->isUserExisted($email)) {
            // User sudah ada
            $response["success"] = 0;
            $response["error_msg"] = "User sudah ada";
            echo json_encode($response);
        } else {
            // Simpan user baru
            $user = $db->storeUser($name, $email, $password);
            if ($user) {
                // Registrasi Berhasil
                $response["success"] = 1;
                echo json_encode($response);
            } else {
                // Registrasi Gagal
                $response["success"] = 1;
                echo json_encode($response);
            }
        }
    }
   
    else {
        echo "Invalid Request";
    }
} else {
    echo "Access Denied";
}
?>

config.php

<?php

/**
* Database config variables
*/
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASSWORD", "");
define("DB_DATABASE", "tes");
?>

DB_Connect.php

<?php
class DB_Connect {

    // constructor
    function __construct() {
    }

    // destructor
    function __destruct() {
        // $this->close();
    }

    // Connecting to database
    public function connect() {
        require_once 'include/config.php';
        // connecting to mysql
        $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
        // selecting database
        mysql_select_db(DB_DATABASE);

        // return database handler
        return $con;
    }

    // Closing database connection
    public function close() {
        mysql_close();
    }

}

?>

DB_Function.php

<?php

class DB_Functions {

    private $db;
    // constructor
    function __construct() {
        require_once 'DB_Connect.php';
        // Koneksi ke database
        $this->db = new DB_Connect();
        $this->db->connect();
    }

    // destructor
    function __destruct() {
       
    }
   
    public function storeUser($name, $email, $password) {
        $uuid = uniqid('', true);
        $hash = $this->hashSSHA($password);
        $encrypted_password = $hash["encrypted"]; // Enkripsi password
        $salt = $hash["salt"]; // salt
        $result = mysql_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
        // Cek registrasi berhasil
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Cek user di database
     */
    public function getUserByEmailAndPassword($email, $password) {
        $result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {
            $result = mysql_fetch_array($result);
            $salt = $result['salt'];
            $encrypted_password = $result['encrypted_password'];
            $hash = $this->checkhashSSHA($salt, $password);
            // Cek kesamaan password
            if ($encrypted_password == $hash) {
                // Identifikasi berhasil
                return true;
            }
        } else {
            // User tidak ditemukan
            return false;
        }
    }

    /**
     * Cek user exist atau tidak
     */
    public function isUserExisted($email) {
        $result = mysql_query("SELECT * from users WHERE email = '$email'");
        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {
            // user existed
            return true;
        } else {
            // user not existed
            return false;
        }
    }
        /**
    Enkripsi password
     */
    public function hashSSHA($password) {

        $salt = sha1(rand());
        $salt = substr($salt, 0, 10);
        $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
        $hash = array("salt" => $salt, "encrypted" => $encrypted);
        return $hash;
    }


    public function checkhashSSHA($salt, $password) {

        $hash = base64_encode(sha1($password . $salt, true) . $salt);

        return $hash;
    }
}
?>

Bagian 3 Hasil running aplikasi

File JSON yang dikirim ke android berbentuk

// Jika berhasil
{"tag":"login","success":1}
// Jika gagal
{"tag":"login","success":0}
// Jika user exist
{"tag":"register","success":0,"error_msg":"User sudah ada"}

Hasil tampilan pada aplikasi

image  image   image

Demikianlah tutorial kali ini semoga bisa bermanfaat buat kawan kawan sekalian. Untuk source projectnya bisa di download di alamat berikut

DOWNLOAD

Tutorial selanjutnya akan membahas tentang menghandle data array dalam format JSON dengan Android. So Keep Update ya Open-mouthed smile

jika ada pertanyaan silahkan saja email saya di bagibagi23@gmail.com

14 komentar:

  1. Thanks atas tutorialnya n sangat membantu.....

    BalasHapus
  2. gan kalo pendaftaran menggunakan multiselect gmn tuh????
    bisa ga gan,,,???
    plese,,, Happy bloging.. :D

    BalasHapus
  3. gan, ini cara akses file2 yg dibagian ke 2 bagaimana? mhn penjelasanny gan, maturnuwun..

    BalasHapus
  4. gan cara, membuat session di android gmn? biar ketahuan yang login itu user siapa

    BalasHapus
  5. gan, gmana caranya supaya nama si usernya juga muncul di halaman welcomenya, bisa bantu gk?
    kalo bisa kirimin packagenya ke email ini sofwanhabibi93@yahoo.com

    BalasHapus
  6. maaf gan,, ini file UserFunction.java erorr banyak banget,, mohon pencerahanya

    BalasHapus
  7. terimakasih tutorialnya :)

    BalasHapus
  8. gan bisa buat api menggunakan jsp gak bukan php, terimakasih.

    BalasHapus
  9. gan mau tanya dong kok pas mau register ga bisa ya force close gitu.. itu kenapa ya??

    BalasHapus
  10. gan, yang diletakkan di htdocs nya folder yg mana ya? folder server side atau folder include,, terus kalu folder include,, file index.php dan send php nya diletakkan dimana gan? trims

    BalasHapus
  11. ane ada tutorial cara login dan register di eclipse, tapi beda versi ada video + source codenya ,,, silahkan cek gan ,,,

    http://www.materi-it.com/2015/03/cara-login-dan-register-android-eclipse.html

    BalasHapus
  12. Halo kak, terimakasih artikelnya... ini sangat membantu saya dalam menyelesaikan tugas kuliah saya. oh ya kak, perkenalkan nama saya Nurhamimah dan jangan lupa kunjungi website kampus saya ISB Atma Luhur

    BalasHapus
  13. Komentar ini telah dihapus oleh pengarang.

    BalasHapus