Mengambil Data MySQL ke Android Menggunakan PHP

Akhirnya sampai juga pada tutorial ini setelah beberapa hari saya mesti berkerja keras mencuri waktu luang untuk mengisi artikel website icaksama.com. Semoga ilmu yang saya bagi dapat bermanfaat untuk kalian semua. Dan pada kesempatan ini saya akan menunjukan cara mengambil data mysql ke android. Tutoial ini hanya berkerja untuk android versi 4 ke atas karena dari pihak android mewajibkan pengambilan data harus menggunakan kelas turunan dari AsyncTask. Sedangkan dari beberapa tutorial yang beredar di internet masih menggunakan program untuk versi android 4 ke bawah yang tanpa menggunakan penurunan kelas AsyncTask sehingga saat aplikasi di pakai pada android versi 4 ke atas tidak akan berkerja. Alur sistem dari aplikasi yang akan kita buat nanti adalah sebagai berikut :

Mengambil Data MySQL ke Android Menggunakan PHP

Dari gambar diatas, kenapa Android harus melalui PHP untuk mengambil data dalam database MySQL ? Karena Android tidak bisa mengirimkan permintaan data secara langsung ke database sehingga harus melalui PHP. PHP mengirimkan Query ke database yang kemudian data tersebut diproses dan ditampilkan dalam format JSON. Format JSON inilah yang akan diterima oleh android sebagai data yang di ambil dari database. Mari simak lebih lanjut langkah-langkah cara membuatnya.

Sebelum memulai langkah-langkah dalam tutorial ini, kamu wajib membaca artikel  Cara Membuat ListView Android Modifikasi karena tutorial tersebut berhubungan dengan tutorial ini.

Langkah 1: Membuat Database dan Tabel

Buat database di MySQL dengan nama cruddb dan buat tabel di dalamnya dengan nama selecttb kemudian buat nama field dan tipe datanya sebagai berikut :

Mengambil Data MySQL ke Android Menggunakan PHP

Bagian kdselect dijadikan Primary Key dan Auto Increment.

Langkah 2: Membuat API PHP Sederhana

Membuat file *.php yang akan menjadi perantara dalam pengambilan data. Kita memanfaatkan XAMPP sebagai server yang akan kita gunakan untuk menyimpan file PHP. File php tersebut berada dalam folder htdocs di XAMPP. Buat struktur direktorinya menjadi seperti ini :

Mengambil Data MySQL ke Android Menggunakan PHP

Berikut ini adalah isi dari tiap foldernya :

  • android : getdata.php
  • config : koneksi.php
  • gambar : data1.png dan data2.png

Program getdata.php

Program dibawah ini adalah program yang akan mengambil data dari database MySQL kemudian memprosesnya dalam format JSON lalu di tampilkan dalam browser. Jika kamu panggil file ini dalam URL maka akan terlihat data dalam format JSON. Sebenernya android tidak mengambil data on the fly namun mengambil data yang di tampilkan dalam browser.

<?php
  //Memanggil file koneksi.php
  include_once '../config/koneksi.php';
  //Mengambil data dari tabel selecttb
  $result = mysql_query("SELECT * FROM selecttb");
  //Mengubah data ke array
  $rows = array();
  while ($r = mysql_fetch_assoc($result)) {
    $rows[] = $r;
  }
  //Mengubah format data ke JSON
  $data = "{select:" . json_encode($rows) . "}";
  echo $data;
?>

Program koneksi.php

Program dibawah ini adalah untuk membuka koneksi ke database.

<?php
  //Membuka koneksi
  mysql_connect("localhost", "root", "");
  //Memilih Database
  mysql_select_db("cruddb");
?>

Langkah 3: Membuat Project Android

Buat new Project di eclipse. Membuat Android di Eclipse
Silakan baca tutorial sebelumnya pada kategori android agar lebih paham, Selebihnya kamu harus paham bagaimana menambah program dibawah ini.

Langkah 4: Membuat Class CustomHttpClient.java 

Buat class CustomHttpClient.java lalu isi programnya dibawah ini :

package icaksama.com.icaksamacrud;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

//class ini digunakan untuk proses client dalam akese ke media internet
public class CustomHttpClient {
 public static final int HTTP_TIMOUT = 30 * 1000;
 private static HttpClient mHttpClient;
 private static HttpClient getHttpClient() {
  if (mHttpClient == null) {
   mHttpClient = new DefaultHttpClient();
   final HttpParams param = mHttpClient.getParams();
   HttpConnectionParams.setConnectionTimeout(param, HTTP_TIMOUT);
   HttpConnectionParams.setSoTimeout(param, HTTP_TIMOUT);
   ConnManagerParams.setTimeout(param, HTTP_TIMOUT);

  }
  return mHttpClient;
 }
 public static String executeHttpPost(String url, ArrayList < NameValuePair > postParameters) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpPost request = new HttpPost(url);
   UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
   request.setEntity(formEntity);
   HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in .readLine()) != null) {
    sb.append(line + NL);
   } in .close();
   String result = sb.toString();
   return result;

  } finally {
   if ( in != null) {
    try { in .close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }

 }
 public static String executeHttpGet(String url) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpGet request = new HttpGet();
   request.setURI(new URI(url));
   HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in .readLine()) != null) {
    sb.append(line + NL);
   } in .close();
   String result = sb.toString();
   return result;
  } finally {
   if ( in != null) {
    try { in .close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
 }

}

Langkah 5: Ubah Program MainActivity.java

Tambahkan program dibawah ini pada MainActivity.java.

package icaksama.com.icaksamacrud;

import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

public class < strong > MainActivity < /strong>extends ListActivity {

//Array untuk menampung data yang di ambil dari MySQL
private String[] kdSelect;
private String[] Nama;
private String[] subNama;
private String[] Gambar;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 //Mengeksekusi kelas GetData untuk mengirim permintaan ke MySQL
 new GetData()
  .execute("http://192.168.56.1/IcaksamaCrud/android/getdata.php");
}

//Method untuk mengeluarkan event saat list di click
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
 Toast.makeText(getBaseContext(), "Terpilih " + Nama[position],
  Toast.LENGTH_LONG).show();
}

//Class GetData yang menuruni kelas AsyncTask untuk melakukan requset data dari internet
private class GetData extends AsyncTask < String, Void, String > {

 // Instansiasi class dialog
 ProgressDialog dialog = new ProgressDialog(MainActivity.this);
 String Content;
 String Error = null;
 // membuat object class JSONObject yang digunakan untuk menangkap data
 // dengan format json
 JSONObject jObject;
 // instansiasi class ArrayList
 ArrayList < NameValuePair > data = new ArrayList < NameValuePair > ();

 @Override
 protected String doInBackground(String...params) {
  try {
   Content = CustomHttpClient.executeHttpPost(
    "http://192.168.56.1/IcaksamaCrud/android/getdata.php",
    data);
  } catch (ClientProtocolException e) {
   Error = e.getMessage();
   cancel(true);
  } catch (IOException e) {
   Error = e.getMessage();
   cancel(true);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return Content;
 }

 @Override
 protected void onPreExecute() {
  super.onPreExecute();
  // menampilkan dialog pada saat proses pengambilan data dari
  // internet
  this.dialog.setMessage("Loading Data..");
  this.dialog.show();
 }

 @Override
 protected void onPostExecute(String result) {
  // menutup dialog saat pengambilan data selesai
  this.dialog.dismiss();
  if (Error != null) {
   Toast.makeText(getBaseContext(), "Error Connection Internet",
    Toast.LENGTH_LONG).show();
  } else {
   try {
    // instansiasi kelas JSONObject
    jObject = new JSONObject(Content);
    // mengubah json dalam bentuk array
    JSONArray menuitemArray = jObject.getJSONArray("select");

    // mendeskripsikan jumlah array yang bisa di tampung
    kdSelect = new String[menuitemArray.length()];
    Nama = new String[menuitemArray.length()];
    subNama = new String[menuitemArray.length()];
    Gambar = new String[menuitemArray.length()];

    // mengisi variable array dengan data yang di ambil dari
    // internet yang telah dibuah menjadi Array
    for (int i = 0; i < menuitemArray.length(); i++) {
     kdSelect[i] = menuitemArray.getJSONObject(i)
      .getString("kdselect").toString();
     Nama[i] = menuitemArray.getJSONObject(i)
      .getString("nama").toString();
     subNama[i] = menuitemArray.getJSONObject(i)
      .getString("subnama").toString();
     Gambar[i] = "http://192.168.56.1/IcaksamaCrud/gambar/" + menuitemArray.getJSONObject(i)
      .getString("gambar").toString();
    }
    // instansiasi class ListAdapter (Buka class ListAdapter)
    ListAdapter adapter = new ListAdapter(getBaseContext(),
     Nama, subNama, Gambar);
    setListAdapter(adapter);
   } catch (JSONException ex) {
    Logger.getLogger(MainActivity.class.getName()).log(
     Level.SEVERE, null, ex);
   }
  }
 }
}

}

Jika dilihat pada program di atas, terdapat IP 192.168.56.1. IP tersebut adalah kata lain dari localhost. IP tersebut terbentuk karena emulator yang saya gunakan menggunakan virtual box jadi harus ada ip penghubung ke komputer asli untuk mengakses localhost atau 127.0.0.1. Sedangkan IP untuk emulator bawaan dari android adalah 10.0.2.2. Jadi sesuaikan penggunaan IP tersebut sesuai emulatornya. Intinya IP tersebut terhubung ke komputer asli yang memilik server local XAMPP. IP tersebut dapat diganti menggunakan nama domain jika file php sudah di upload ke internet. Intinya adalah URL berikut menuju ke file getdata.php.

Ada beberapa kasus saat emulator virtual box mencoba mengkses ke komputer asli menggunakan IP dan ternyata aksesnya ditolak. Kasus ini disebabkan oleh firewall yang masih aktif, jadi jika akses IP terblok atau gagal silahkan matikan firewallnya. Bagaimana cara mengecek IP yang terblok ? Silahkan kamu masuk ke browser emulator lalu masukan IP tersebut. Jika IP tersebut tidak merespon maka cek kembali IPnya mungkin ada salah penulisan jika tidak berarti firewall yang membuat IP tidak merespon.

Ada beberapa kelas tambahan lagi seperti CustomHttpClient.java untuk meminta permintaan ke internet dengan atau tanpa parameter, DownloadImageTask.java untuk menampilkan gambar dari internet pada Android, ListAdapter.java untuk memodifikasi ListView.

Kelas diatas bisa berjalan biarpun tanpa menggunakan layout karena telah menuruni kelas ListActivity.
Demikian tutorial kali ini semoga bermanfaat! 🙂
Download Projectnya disini

Ayo! Segera daftarkan email kamu untuk berlangganan!

Comments (39)

pagi…mas icaksama…..video untuk tutorial “Mengambil Data MySQL ke Android Menggunakan PHP” sudah dibuat belum mas icaksama ….trimss

Terima kasih mas alimkeren. Saya terkesan kamu selalu mengikuti situs icaksama.com 🙂
Sebenarnya saya masih terfokus pada pemrograman java. Karena hampir semua tutorial yang saya berikan nanti berdasar pada pemrograman java. Saya takut kalo saya langsung masuk ke tutorial yang bukan dasar banyak terjadi kebingungan. tapi karena mas alim meminta. akan saya berikan tutorial videonya secepatnya 🙂

siap mas icaksama trims banyak….

mas mau nanya, apakah bisa misalkan data pada mysql bertambah terus nanti muncul notifikasi pada aplikasi?
mohon tutorialnya mas.
terimakasih. 🙂

bisa 🙂 dalam beberapa hari saya akan share 🙂

terimakasih mas :).
sangat ditunggu tutorialnya 🙂

Silahkan subscribe untuk mendapatkan kumpulan link sample projek dari saya 🙂

mas sudah dibikin belum ? 😀 saya nyari gak ada hehe

sy ditunggu juga nih utk notifikasinya…pakai GCM bukan ya?

gmn mas ttg tutorialnya?
sip mas 🙂

Sedang saya buatkan videonya 🙂

siap terimakasih mas icaksama 🙂

mas gmn ttg tutorialnya ? hehehe

Mas..
Mantap penjelasan nya .
mau tanya nih, klo mau buat CRUD langsung d android ny gmna ya ?
biar bisa tambah, edit, lihat, dan hapus datanya ,.
misalkan sistem informasi akademik gtu ,.
mohon bantuan nya donk .
makasih .
responn pleasee
🙂

Soal nya saya buat tambah, edit, hapus data nya masih manual dari mysql, blom ngerti klo lngsng d buat ke android. bantu donkk masss ..

Gan request dunk. Jika diklik salah satu artikel akan terbuka?
terimkash

kalo yg ditampilkan di android cm data yg ditentukan gmn gan “select from selecttb where kdselect like ‘kriteria'” trs di aplikasi mobilenya ad textbox utk memasukkan kriteria. bantuannya gan..

terimakasih mas atas informasinya.

saya ada sedikit kendala.

“org.apache.http.client.HttpClient is deprecated”

dan ada juga beberapa yang seperti itu.
jadi HttpClient digaris semua.
ada solusi?

deprecated kurang lebih artinya program sudah tidak digunakan pada versi android yang terbaru atau penggunaannya telah diganti dengan class lain. Kalau HttpClient is deprecated berarti penggunaan class tersebut telah diganti dgn class lain. coba cek d website reminya android.

makasih utk mas icaksama artikelnya sgt membantu

terima kasih kembali 🙂
Sebentar lagi website icaksama.com akan aktif kembali dengan tutorial yang lebih menarik dan bantuan tim yang lebih banyak.

gan punya saya kok error di
import import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

cara ngatasinya gimana ya gan?

erornya di bagian import ? ato di bagian dalam kelas ?

gan kalau menambahkan even ketika data di klik berpindah ke activity yang lain.. Kemudian di activity tersebut ada data sesuai dengan yang di klik.. Mkash gan..

pake onitemselectlistener, nanti ane share artikelnya yaa

Tolong Mas icak ane butuh banget tutornya.. Buat tugas Akhir mas..

Kalau boleh Minta source codenya mas.. Buat tugas akhir…

Tinggal download aja disini gan Download Project

Gan gimana kalau datanya di klik berpindah ke activity yg lain. nah hbis itu di activity tersebut terdapat data sesuai dengan data yang di klik…

gan kalau menambahkan even ketika data di klik berpindah ke activity yang lain.. Kemudian di activity tersebut ada data sesuai dengan yang di klik.. Mkash gan..

Mas kalau menambahkan even onklik trus berpindah ke activity yang lain bagaimana yah??

bisa. nanti saya share artikelnya

Tolong Mas icak ane butuh banget tutornya.. Buat tugas Akhir mas..

nas project sampean saya running kok loading terus ya,, padahal file database sudah saya kondidikan

biasanya karena ip masih salah. klo dari emulator androVM pake ip 192.168.56.1 tp klo dari emulator bawaan eclipse pake ip 10.0.2.2.

mas saya mau tanya kalo kita membuat program android berbasis web service dengan mengambil database dari web tersebut bagaimana caranya ya? jadi kita ga perlu bikin database sendiri. makasih

Biarpun kita ambil data dari database website lain tapi konsepnya masih sama seperti ambil data dari database website kita sendiri.
biasanya website lain sudah menyediakan fitur web service dengan menyediakan link khusus untuk mengambil data berformat JSON atau XML. Nah dari sini tinggal kita proses di dalam aplikasi yang kita buat.

maaf mau nanya.. ini projekny gk bisa buat andoid studio??

bisa kok. tinggal di pindah aja source programnya.
memang kalau untuk android studio yang selalu up to date ada program yang deprecated dan kita harus menambahkan useLibrary ‘org.apache.http.legacy’ di bagian gradle.

Leave a comment