Di lihat dari sifat aplikasi tersebut di atas maka kita akan membutuhkan beberapa halaman atau
'activity atau class, antara lain:
Halaman Login
Halaman Registrasi
Halaman JSON
Halaman JSON
Kita tambahkan halaman JSON (Javascript Object Notation)
JSON adalah language independent artinya ia di mengerti oleh hampir semua bahasa programan
sehingga ia sangat cocok menjadi jembatan antara bahasa program yang berbeda. JSON-lah
yang akan bertanggung jawab agar aplikasi-nya dinamik dan responsive, misalnya memberi
peringatan kepada pengguna jikalau mereka masukan password dan username yang salah dll
Silahkan baca tentang json di http://en.wikipedia.org/wiki/JSON
Halaman Login
Halaman login akan ada tempat untuk isi username, password. dan dua buah tombol satunya
tombol Login dan yang lain-nya adalah tombol Registrasi.
Ketika tekan tombol login tanpa password maka aplikasi memberikan peringatan kepada
pengguna agar mengisi password dan usernamenya. Demikian juga ketika tekan tombol
Registrasi tanpa username dan password.
Halaman Baca Komentar
User yang login dengan benar langsung di antar ke halaman Baca Komentar dan pada bagian
bawah halaman komentar ada tombol Tambah Komentar agar pengguna bisa ikut berkomentar.
Aplikasi akan menolak untuk submit komentar yang kosong dengan memberikan warning.
Halaman-halaman tersebut (terkecuali JSON) akan di bangun di dua sisi. Di sisi klien akan di
bangun menggunakan java(android) dan di sisi server akan di bangun menggunakan PHP.
(alasan-nya karena PHP teman baik dengan MYSQL).
Server
Android dan Eclipse
Server
Jikalau sudah ada server bayaran, silahkan atur Mysql database-nya disana. Tapi kalau tak bisa
bayar server, saya rekomendasikan untuk download server yang free dari internet untuk di
pasang di komputer sendiri. Di internet bergentayangan server seperti WAMP ada juga XAMPP.
Silahkan pilih menurut selera masing2. Walaupun sudah ada server bayaran, namun untuk
develop ada baiknya install server di komputer sendiri agar semua server side code bisa di coba
tanpa harus selalu konek ke internet.
Saya akan membicarakan tentang server pada kesempatan lain... semoga
password_nya varchar(120),
)
Berikut adalah isi dari login_nya.php yang harus di simpan di server sebagai server side code
<?php
//Vik Sintus Projects
//pasang halaman konfigurasi_nya.php agar
//bisa konek
require("/konfigurasi_nya.php");
if (!empty($_POST)) {
if (empty($_POST['username_nya']) || empty($_POST['password_nya'])) {
// kalau 'username' dan 'password' kosong
// JSON menjawab agar pengguna tahu apa yg terjadi
$jawaban_nya["berhasil"] = 0;
$jawaban_nya["tampilkan_pesan"] = "Masukan NamaUser dan
PasswordNya!.";
//
//
//
//
yah!";
}
//bikin satu variable utk priksa kebenaran login dan
//di inisialisasikan dengan false.
$validasi_identitas = false;
//tarik semua parameter pada 'query' di atas dengan
//metode fetch()
$row = $statement_nya->fetch();
if ($row) {
//kalau passwordnya di encrypt, maka di lakukan di sini tapi
//saya bukan ahli encrypt, silahkan baca2 tentang encrypt,
//disini saya hanya berkepentingan utk
//menjalankan script ini sejajar dengan java (android) sehingga
//saya hanya membandingkan password yg di input dan
//password yg ada di database
if ($_POST['password_nya'] === $row['password_nya']) {
$login_nya_ok = true;
}
}
// kalau login-nya berhasil, orangnya
// kalau tidak, tampilkan pesan gagal
if ($login_nya_ok) {
$jawaban_nya["berhasil"] = 1;
$jawaban_nya["tampilkan_pesan"] =
die(json_encode($jawaban_nya));
} else {
$jawaban_nya["berhasil"] = 0;
$jawaban_nya["tampilkan_pesan"] =
die(json_encode($jawaban_nya));
}
"LoginNya Gagal!";
}
else {
?>
<h1>Login</h1>
<form action="login_nya.php" method="post">
Username:<br />
<input type="text" name="username" placeholder="username" />
<br /><br />
Password:<br />
<input type="password" name="password" placeholder="password"
value="" />
<br /><br />
<input type="submit" value="Login" />
</form>
<a href="registrasi.php">Register</a>
<?php
}
?>
Saya sisipkan penjelasan dalam kode di atas, silahkan telusuri... mereka yang jago PHP pasti
tidak asing dengan kode di atas
Di baris pertama ia minta 'require("/konfigurasi_nya.php");' maka berikut adalah isi dari
konfigurasi_nya.php
<?php
// Vik Sintus Projects
// 4 variable berikut harus cocok dengan yang ada di database
$username = "root";
$password = "";
$host = "localhost";
$dbname = "tampung_komentar";
//
//
//
//
pakai utf8 agar databasenya bisa muat banyak jenis karakter seperti
huruf dan agka
silahkan baca2 tentang utf8 di
http://en.wikipedia.org/wiki/UTF-8
$pakai_utf8 = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
//
//
//
//
//
//
//
//
bagi mereka yang pintar PHP tentunya tak asing dengan try/catch
Metode tersebut di pakai utk menangkap kesalahan pada kode yg
bersifat object oriented,
pertama di eksekusi dalam 'try' dan kalau memukan kesalahan maka akan
berhenti eksekusi dan melompat ke 'catch' dengan sebuah pesan agar
pengguna tak garuk2 kepala
Silahkan baca2 tentang exceptions di
http://us2.php.net/manual/en/language.exceptions.php
try
{
// statement dalam wilayah 'try' ini membukan koneksi ke datbase menggunakan
// PDO library
// PDO di design utk menyediakan flexible interface antara PHP dengan
// banyak jenis database servers.
// silahkan baca2 tentang PDO di
// http://us2.php.net/manual/en/class.pdo.php
$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8",
$username, $password, $pakai_utf8);
}
catch(PDOException $eksepsinya)
{
// jika ada kesalahan saat buka koneksi ke database maka
// akan terperangkap disini dan berhenti eksekusi dan
// menunjukan pesan (apanya yg salah)
// Kalau utk produksi mungkin tak perlu output $eksepsinya->getMessage().
// agar tak mudah di mainkan oleh orang nakal.
die("Koneksi ke database Gagal: " . $eksepsinya->getMessage());
}
// berikut adalah konfigurasi PDO mengeluarkan exception ketika
// menemukan kesalahan dalam kode, agar bisa di pakai utk
// try/catch
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// berikut adalah konfigurasi PDO utk melihat barisan data(rows) di
// dalam database menggunakan 'associative array'
matikan_magic_quotes_nya($_POST);
matikan_magic_quotes_nya($_GET);
matikan_magic_quotes_nya($_COOKIE);
?>
Halaman untuk login dari sisi server sudah selesai, berikut adalah halaman login dari sisi klien
yaitu dari aplikasi android dengan nama ClassUtkLogIn.java
package com.vik_sintus.projects.koneksiandroidmysql;
import java.util.ArrayList;
import java.util.List;
import
import
import
import
org.apache.http.NameValuePair;
org.apache.http.message.BasicNameValuePair;
org.json.JSONException;
org.json.JSONObject;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.app.ProgressDialog;
android.content.Intent;
android.content.SharedPreferences;
android.content.SharedPreferences.Editor;
android.os.AsyncTask;
android.os.Bundle;
android.preference.PreferenceManager;
android.util.Log;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
android.widget.EditText;
android.widget.Toast;
biasanya localhost :
tapi untuk testing, lebih baik pakai alamat IP
kalau tak tahu IP-nya di windows silahkan buka
command prompt lalu ketik ipconfig
lihat IPv4 Address
kalau di mac ketik ifconfig dan cari ip dengan en0 atau en1
private static final String LINK_UNTUK_LOGIN =
"http://xxx.xxx.x.x.xxx/folderNya/login_nya.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tampilan_login);
// utk kotak input yg perlu di di isi pengguna
isiNamaUser = (EditText) findViewById(R.id.username);
isiPassword = (EditText) findViewById(R.id.password);
// utk tombol
tombolLogin = (Button) findViewById(R.id.login);
tombolRegistrasi = (Button) findViewById(R.id.register);
// agar tombol bisa di klik
tombolLogin.setOnClickListener(this);
tombolRegistrasi.setOnClickListener(this);
}
@Override
public void onClick(View apaYgDiKlik) {
switch (apaYgDiKlik.getId()) {
case R.id.login:
new MencobaLogin().execute();
break;
case R.id.register:
Intent i = new Intent(this, ClassRegistrasi.class);
startActivity(i);
break;
default:
break;
}
}
class MencobaLogin extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBarNya = new ProgressDialog(ClassUtkLogIn.this);
progressBarNya.setMessage("Mencoba login...");
progressBarNya.setIndeterminate(false);
progressBarNya.setCancelable(true);
progressBarNya.show();
}
@Override
protected String doInBackground(String... args) {
// jika sukses
int jikaSukses;
String namaUser = isiNamaUser.getText().toString();
String password = isiPassword.getText().toString();
try {
// menyusun parameternya (disini parameternya
// cuma 2 (username dan password))
List<NameValuePair> namaDanPassword = new ArrayList<NameValuePair>();
namaDanPassword.add(new BasicNameValuePair("username_nya", namaUser));
namaDanPassword.add(new BasicNameValuePair("password_nya", password));
Log.d("requestNya!", "dimulai");
// utk melengkapi proses login, maka
// perlu membuatHttpRequst ke server
JSONObject jsonObjectNya =
classJsonParser.membuatHttpRequest(LINK_UNTUK_LOGIN, "POST",
namaDanPassword);
// priksa log jawaban dari JSON
Log.d("Coba login", jsonObjectNya.toString());
// apa kata JSON tentang TAG_SUKSES
jikaSukses = jsonObjectNya.getInt(TAG_SUKSES);
if (jikaSukses == 1) {
Log.d("Login_nya Sukses!", jsonObjectNya.toString());
// simpan data yg di masukan pengguna
SharedPreferences sharedPrefNya = PreferenceManager
.getDefaultSharedPreferences(ClassUtkLogIn.this);
Editor editorNya = sharedPrefNya.edit();
editorNya.putString("username_nya", namaUser);
editorNya.commit();
Intent intentNya = new Intent(ClassUtkLogIn.this,
ClassBacaKomentar.class);
finish();
startActivity(intentNya);
return jsonObjectNya.getString(TAG_PESAN);
} else {
Log.d("Login_nya Gagal!", jsonObjectNya.getString(TAG_PESAN));
return jsonObjectNya.getString(TAG_PESAN);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String urlFileNya) {
// kalau sudah selesai di gunakan, matikanlah
// progressbar_nya dengan metode dismiss();
progressBarNya.dismiss();
if (urlFileNya != null) {
Toast.makeText(ClassUtkLogIn.this, urlFileNya, Toast.LENGTH_LONG).show();
}
}
}
Dalam kode java di atas di minta tampang atau user interface(UI) dari halaman login di
setContentView(R.layout.tampilan_login);
Berikut adalah isi dari tampilan_login.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/login"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/login"
android:layout_marginBottom="25dp"
android:text="Registrasi" />
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/register"
android:layout_alignLeft="@+id/password"
android:layout_alignRight="@+id/password"
android:text="Login" />
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/login"
android:layout_centerHorizontal="true"
android:ems="10"
android:inputType="textPassword" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="17dp"
android:gravity="center"
android:text="Belajar Android PHP Mysql"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<ImageView
android:contentDescription="Lodokn One Cicingn Pe'ang"
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true"
android:src="@drawable/lodok" />
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/password"
android:layout_alignLeft="@+id/password"
android:layout_marginLeft="22dp"
android:text="PasswordNya" />
<EditText
android:inputType="text"
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/TextView01"
android:layout_centerHorizontal="true"
android:ems="10" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/TextView01"
android:layout_centerVertical="true"
android:text="NamaUserNya" />
</RelativeLayout>
Halaman Login
Ketika user berhasil login maka bawalah dia ke halaman komentar agar bisa baca komentar,
jadi... tujuan pembuatan halaman Login ini bukan saja untuk Login tapi juga memiliki
kemampuan untuk mengantar user ke halaman lain. Didalam bahasa program java dan atau
android hal itu di lakukan dengan class Intent. Perhatikan kode pada ClassUtkLogIn.java dan
lihat
Intent intentNya = new Intent(ClassUtkLogIn.this, ClassBacaKomentar.class);
finish();
startActivity(intentNya);
intentNya apa? Kode di antas menunjukan bahwa intentNya adalah untuk buka halaman Login
dan juga buka halaman Baca Komentar ... Dengan demikian kini saatnya kita membuat class
untuk baca komentar yang saya beri nama ClassBacaKomentar.java.
ClassBacaKomentar.java
package com.vik_sintus.projects.koneksiandroidmysql;
/*
* Vik Sintus Projects
*
* Segala kelebihan dan kekurangan di luar tanggung jawab pembuat.
* Di larang memakai kode ini untuk kepentingan komersial tanpa ijin.
* Silahkan di pakai untuk kepentingan belajar.
* vik.sintus@gmail.com
*
* Unless required by applicable law or agreed to in writing, this software
* is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*
*/
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import
import
import
import
import
import
import
import
import
import
import
import
import
org.json.JSONException;
org.json.JSONObject;
android.app.ListActivity;
android.app.ProgressDialog;
android.content.Intent;
android.os.AsyncTask;
android.os.Bundle;
android.view.View;
android.widget.AdapterView;
android.widget.AdapterView.OnItemClickListener;
android.widget.ListAdapter;
android.widget.ListView;
android.widget.SimpleAdapter;
biasanya localhost :
tapi untuk testing, lebih baik pakai alamat IP
kalau tak tahu IP-nya di windows silahkan buka
command prompt lalu ketik ipconfig
lihat IPv4 Address
kalau di mac ketik ifconfig dan cari ip dengan en0 atau en1
private static final String LINK_SEMUA_KOMENTAR =
"http://xxx.xxx.x.x.xxx/folderNya/baca_komentar.php";
setContentView(R.layout.baca_komentar);
@Override
protected void onResume() {
super.onResume();
// pasang(loading) semua komentar melalui AsyncTask
new TampilSemuaKomentar().execute();
}
//pada class BacaKomentar ini juga akan ada intent baru utk
//membuka halaman(activity) baru yaitu activity utk classTambahKomentar
//maka di buat metode 'tambahKomentar' berikut ini yg akan di
//panggil dari xml dengan metode onclick... lihat di 'baca_komentar.xml'
public void tambahKomentar(View v) {
Intent intentNya = new Intent(ClassBacaKomentar.this,
ClassTambahKomentar.class);
startActivity(intentNya);
}
/**
* ambil posting terbaru dari server dengan
* meng-update JSON-nya.
*/
public void jsonDataNyaDiUpdate() {
//buatkan arraylist utk menampung semua JSON data dan
//kita akan menggunakan beberapa 'key value pairs' ber
//dasarkan nama JSON element yang kita tanam di
//halaman php yg identitasnya telah di sebutkan
//pada beberapa TAG di atas
susunanKomentar = new ArrayList<HashMap<String, String>>();
// hidupkan JSONParser-nya
ClassJSONParser jsonParserNya = new ClassJSONParser();
// masukan url untuk komentar-nya, sehingga
// JSONObject memuntahkan isi komentar yang ada
JSONObject jsonObjectNya =
jsonParserNya.ambilJsonDariUrl(LINK_SEMUA_KOMENTAR);
// ketika parsing sesuatu lewat JSON , ada baiknya
// di pasang 'try catch exceptions' utk menanggkap hal2 yang
// tak terduga(error) :
try {
semuaKomentar = jsonObjectNya.getJSONArray(TAG_SEMUA_KOMENTAR);
// terus looping ke semua komentar yang telah ada sesuai
// dengan apa yang di dapatkan oleh JSONObject
for (int i = 0; i < semuaKomentar.length(); i++) {
JSONObject komentarNya = semuaKomentar.getJSONObject(i);
// ambil isi dari masing2 tag
String username_nya = komentarNya.getString(TAG_USERNAME);
String judul_komentar = komentarNya.getString(TAG_JUDUL_KOMENTAR);
String isi_komentar = komentarNya.getString(TAG_ISI_KOMENTAR);
@Override
protected Boolean doInBackground(Void... arg0) {
jsonDataNyaDiUpdate();
return null;
}
@Override
protected void onPostExecute(Boolean tampilkanHasilNya) {
super.onPostExecute(tampilkanHasilNya);
//setelah tampil hasilnya matikan progress barnya
//dengan metode dismiss();
progressBarNya.dismiss();
updateListViewNya();
}
}
}
IntentNya apa? atau tujuan bentuknya halaman ini untuk apa?...tentunya untuk buka
classBacaKomentar itu sendiri dan juga buka ClassTambahKomentar. Tetapi... sebelum saya tulis
ClassTambahKomentar ada baiknya saya tulis dahulu tampang design dari ClassBacaKomentar
tersebut di atas dengan nama baca_komentar.xml yang di dalam kode java nampak sebagai
berikut
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// tampilan yg di pakai disini adalah baca_komentar.xml
setContentView(R.layout.baca_komentar);
}
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@drawable/baret_hijau"
android:orientation="horizontal" >
<TextView
style="@style/huruf_hitam"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/baca_komentar_judul"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/baret_hijau_bawah"
android:layout_below="@+id/baret_hijau_atas"
android:background="#fff"
android:divider="@android:color/transparent"
android:scrollbars="none" />
<LinearLayout
android:id="@+id/baret_hijau_bawah"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="@drawable/baret_hijau"
android:orientation="horizontal"
android:weightSum="2" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<Button
android:id="@+id/tombol_kirim"
style="@style/huruf_putih"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@drawable/tombol_kirim"
android:onClick="tambahKomentar"
android:text="@string/tombol_kirim" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
Berikut adalah tampilan halaman baca komentar dan saya sudah masukan dua orang anggota
untuk di gunakan sebagai contoh ... tuh telah registrasi bernama Tirok Ndibol dan Kristina
Molas. Keduanya telah meninggalkan pesan seperti terlihat pada gambar Baca Komentar berikut:
Baca Komentar
Silahkan mempelajari android UI design dengan membandingkan kode xml dan gambar di atas.
Mungkin ada beberapa object yang redundant, tapi saya malas membersihkan-nya. Tapi yang
jelas redundancy tersebut tidak akan mengurangi proses kerja aplikasi
Kedua kode yang telah saya tulis di atas adalah untuk sisi klien yaitu di buat di project android...
berikut adalah kode PHPnya untuk sisi server yang saya beri nama baca_komentar.php. Antara
sisi server dan sisi klien, keduanya harus saling bercermin yah
<?php
//Vik Sintus Projects
//di sini juga perlu konfigurasi_nya.php agar
//bisa konek ke server
require("/konfigurasi_nya.php");
//agar bisa lihat semua komentar maka
//Select * ( pilih semua) FROM tempat_komentar
$query = "Select * FROM tempat_komentar";
//query-nya di eksekusi
try {
$apa_yang_di_query = array();
$statement_nya
= $db->prepare($query);
$result = $statement_nya->execute($apa_yang_di_query);
}
/>{"komentar_id":"2","username_nya":"kristinaMolas","judul_komentar":"cobab di
tah",<br />"isi_komentar":"oe... lawa, aku hi Kristina e... nia ngaok lawa"}]}
Kalau mau paham benar akan pekerjaan JSON maka perhatikan secara saksama antara lain kode
php, hasil olahan JSON dan hasil olahan manusia. Hasil olahan manusia tentunya nampak lebih
cantik seperti terlihat pada gambar 'Baca Komentar' ... semua itu kita patut berterima kasih
kepada ClassBacaKomentar.java dan pasangan cantiknya si baca_komentar.xml dan juga
sebuah ClassJSONParser.java yang akan segera saya tulis.
Halaman baca komentar sudah selesai, Tapi di ClassUtkLogIn.java juga ada tombol Registrasi
yang mengarahkan ke Halaman Registarasi ... maka untuk itu mari kita buatkan class untuk
halaman Registrasi yang saya beri nama ClassRegistrasi.java
Berikut adalah isi dari ClassRegistrasi.java
package com.vik_sintus.projects.koneksiandroidmysql;
/*
* Vik Sintus Projects
*
* Segala kelebihan dan kekurangan di luar tanggung jawab pembuat.
* Di larang memakai kode ini untuk kepentingan komersial tanpa ijin.
* Silahkan di pakai untuk kepentingan belajar.
* vik.sintus@gmail.com
*
* Unless required by applicable law or agreed to in writing, this software
* is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class ClassRegistrasi extends Activity implements OnClickListener {
private EditText kotakUser, kotakPassword;
private Button tombolRegistrasi;
// utk progress bar
private ProgressDialog progressBarNya;
// panggil ClassJsonParser ke sisni
ClassJSONParser classJSONParserNya = new ClassJSONParser();
//lokasi registrasi.php
progressBarNya.show();
@Override
protected String doInBackground(String... args) {
// priksa TAG_BERHASIL
int berhasil;
String usernameNya = kotakUser.getText().toString();
String passwordNya = kotakPassword.getText().toString();
try {
// Cocokan parameternya yah 'username ke username dan
// password ke password
List<NameValuePair> parameterNya = new
ArrayList<NameValuePair>();
parameterNya.add(new BasicNameValuePair("username_nya",
usernameNya));
parameterNya.add(new BasicNameValuePair("password_nya",
passwordNya));
Log.d("Request ke server!", "dimulai");
// kirim data dari user ke script di server
JSONObject jsonObjectNya =
classJSONParserNya.membuatHttpRequest(
LINK_UTK_REGISTRASI, "POST", parameterNya);
// json response-nya
Log.d("Coba Login", jsonObjectNya.toString());
// json berhasil
berhasil = jsonObjectNya.getInt(TAG_BERHASIL);
if (berhasil == 1) {
Log.d("Proses Registrasi berhasil!",
jsonObjectNya.toString());
finish();
return jsonObjectNya.getString(TAG_PESAN);
}else{
Log.d("Registrasi_nya Gagal!",
jsonObjectNya.getString(TAG_PESAN));
return jsonObjectNya.getString(TAG_PESAN);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* kalau sudah selesai tugas background_nya matikan
* progressbar_nya
* **/
protected void onPostExecute(String url_registrasi_nya) {
// matikan progressBar-nya setelah selesai di gunakan
progressBarNya.dismiss();
if (url_registrasi_nya != null){
Toast.makeText(ClassRegistrasi.this, url_registrasi_nya,
Toast.LENGTH_LONG).show();
}
}
}
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="Android PHP Mysql"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/TextView01"
android:layout_centerHorizontal="true"
android:ems="10"
android:inputType="textPassword" />
<Button
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/password"
android:layout_below="@+id/password"
android:text="Register" />
</RelativeLayout>
Berikut adalah tampang dari halaman Registrasi setelah tekan tombol Registrasi
Registrasi
Dan berikut adalah kode untuk sisi server dengan nama registrasi.php
<?php
/* Vik Sintus Projects
agar bisa register... konek dulu yah
untuk konek kita perlu sertakan halaman konfigurasi koneksi
*/
require("/konfigurasi_nya.php");
//kalau data tak kosong... lanjut bro..
if (!empty($_POST)) {
//tapi kalau datanya kosong ketika tekan tombol 'Register' maka
//halaman harus berhenti eksekusi dengan menggunakan metode die(); dan
//berikan peringatan kepada pengguna agar
//di isi username dan password_nya
//Menggunakan metode die(); adalah tidak cukup, maka kita perlu
//meninggalkan pesan kepada pengguna..apa yang terjadi? berikan jawaban_nya
//Untuk mempertebal pertahanan keamanan nanti kita juga akan melakukan
//validasi dari front_end di ClassRegistrasi.java
if (empty($_POST['username_nya']) || empty($_POST['password_nya'])) {
//berikut adalah data yang di buat untuk di
//pakai oleh JSON untuk memberikan penjelasan kepada
//pengguna apa yang sedang terjadi agar dia tidak melongo
$jawaban_nya["sukses"] = 0;
$jawaban_nya["pesan"] = "Mohon di isi NamaUser dan PasswordNya.";
//matikan halaman registrasi dan kirim pesan balik ke
//aplikasi android melalui JSON
die(json_encode($jawaban_nya));
}
//priksa database apakah sudah ada username dengan nama yang sama
//itu sebabnya saya pakai :username hanya sebagai variabel kosong
//yang akan berubah saat eksekusi query-nya
//cara ini cukup bagus untuk menangkal sql injection dari orang jahil
$query
= " SELECT 1 FROM anggota WHERE username_nya = :username";
//di update untuk melihat siapa pengguna sebenarnya
$yang_di_query = array(
':username' => $_POST['username_nya']
);
//jalankan query-nya
try {
// bikin statement apa yang mau di query ke database.
$statement_nya
= $db->prepare($query);
$result = $statement_nya->execute($yang_di_query);
}
catch (PDOException $ex) {
//jadi developer yg baik yah, jelaskan kepada user apa yg terjadi:
$jawaban_nya["sukses"] = 0;
$jawaban_nya["pesan"] = "Databasenya salah. Di coba lagi yah!";
die(json_encode($jawaban_nya));
}
// ambil semua data yang telah tercatat di database sehingga
// aplikasi bisa lihat apakah nama tsb sudah ada atau belum dan
// kalau nama sudah ada maka berhenti eksekusi dengan membunuh
}
//
//
//
//
$jawaban_nya["sukses"] = 1;
$jawaban_nya["pesan"] = "Maaf, nama tersebut suda ada di pakai";
die(json_encode($jawaban_nya));
tapi kalau nama usernya ok maka aplikasi masih terus hidup dan
di lanjutkan dengan masukan data yang di input oleh user
maka perlu membuat query baru pakai cara berikut yah biar
cukup susah buat orang nakal untuk buat sql injection
die(json_encode($jawaban_nya));
}
$jawaban_nya["sukses"] = 1;
$jawaban_nya["pesan"] = "Registrasi Berhasil!";
echo json_encode($jawaban_nya);
//mau bawa kemana usernya? terserah anda sebagai developer.
//header("Location: login_nya.php");
//die("Redirecting ke halaman login_nya.php");
//tapi disini saya hanya bilang bahwa registrasinya berhasil
//dan kalau mau baca komentar silahkan login lah kawan
} else {
?>
<h1>Register</h1>
<form action="registrasi.php" method="post">
UsernameNya:<br />
<input type="text" name="username" value="" />
<br /><br />
PasswordNya:<br />
<input type="password" name="password" value="" />
<br /><br />
?>
Perhatikan kode di ClassBacaKomentar.java di tutorial bagian 2. Disana saya telah tulis sebuah
metode untuk membuka class baru bernama tambahKomentar(); yang nampak sebagai berikut
public void tambahKomentar(View v) {
Intent intentNya = new Intent(ClassBacaKomentar.this,
ClassTambahKomentar.class);
startActivity(intentNya);
}
Itu berarti bahwa dari dalam ClassBacaKomentar ada ClassTambahKomentar, dan oleh
karena ClassTambahKomentar tersimpan di sebuah tombol di dalam ClassBacaKomentar
maka metode tambahKomentar(); di panggil dari UI(user interface) dalam hal ini metode-nya
di panggil dari dalam baca_komentar.xml melalui metode android:onClick
Perhatikan kode berikut yang saya ambil dari dalam baca_komentar.xml. Perlu di ingat bahwa
baca_komentar.xml adalah UI-nya ClassBacaKomentar
<button
android:background="@drawable/tombol_kirim"
android:id="@+id/tombol_kirim"
android:layout_gravity="right"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onclick="tambahKomentar"
android:text="@string/tombol_kirim" />
Sangat jelas terlihat bahwa sepotong kode xml di atas adalah membicarakan tombol Kirim
Komentar yang letaknya pada bagian bawah halaman Baca Komentar, sangat jelas bukan?
Mau lihat lagi bentuknya? nihhh
Ok ketika tekan tombol Kirim Komentar tentunya yang di triger adalah halaman Tambah
Komentar, Oleh karena itu mari kita bangun sebuah class yang bekerja untuk itu. Kita sebut saja
nama class-nya ClassTambahKomentar.java Berikut adalah isinya
package com.vik_sintus.projects.koneksiandroidmysql;
/**
* Copyright Vik Sintus Projects
*
* Segala kelebihan dan kekurangan di luar tanggung jawab pembuat.
* Di larang memakai kode ini untuk kepentingan komersial tanpa ijin.
* Silahkan di pakai untuk kepentingan belajar.
* vik.sintus@gmail.com
* http://belajar-android-indonesia.blogspot.com
* Unless required by applicable law or agreed to in writing, this software
* is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*
*/
import java.util.ArrayList;
import java.util.List;
import
import
import
import
org.apache.http.NameValuePair;
org.apache.http.message.BasicNameValuePair;
org.json.JSONException;
org.json.JSONObject;
import
import
import
import
import
import
android.app.Activity;
android.app.ProgressDialog;
android.content.SharedPreferences;
android.os.AsyncTask;
android.os.Bundle;
android.preference.PreferenceManager;
import
import
import
import
import
import
android.util.Log;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
android.widget.EditText;
android.widget.Toast;
biasanya localhost :
tapi untuk testing, lebih baik pakai alamat IP
kalau tak tahu IP-nya di windows silahkan buka
command prompt lalu ketik ipconfig
lihat IPv4 Address
kalau di mac ketik ifconfig dan cari ip dengan en0 atau en1
private static final String LINK_TAMBAH_KOMENTAR =
"http://xxx.xxx.x.x.xxx/folderNya/tambah_komentar.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tambah_komentar);
isiJudul = (EditText)findViewById(R.id.judulKomentar);
isiKomentar = (EditText)findViewById(R.id.isiKomentar);
kirimKomentar = (Button)findViewById(R.id.kirimKomentar);
kirimKomentar.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new TambahKomentar().execute();
}
class TambahKomentar extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBarNya = new ProgressDialog(ClassTambahKomentar.this);
progressBarNya.setMessage("Sedang kirim Komentarnya...");
progressBarNya.setIndeterminate(false);
progressBarNya.setCancelable(true);
progressBarNya.show();
}
@Override
protected String doInBackground(String... args) {
// priksa jika proses tambah komentar berhasil
// lihat TAG_BERHASIL
int komentar_sukses;
String judulKomentar = isiJudul.getText().toString();
String komentar = isiKomentar.getText().toString();
//ini harus di ubah
SharedPreferences sharedPrefNya =
PreferenceManager.getDefaultSharedPreferences(ClassTambahKomentar.this);
String userNameNya = sharedPrefNya.getString("username_nya",
"anon");
try {
// menyusun parameter-nya
List<NameValuePair> parameterNya = new
ArrayList<NameValuePair>();
parameterNya.add(new BasicNameValuePair("username_nya",
userNameNya));
parameterNya.add(new BasicNameValuePair("judul_komentar",
judulKomentar));
parameterNya.add(new BasicNameValuePair("isi_komentar",
komentar));
Log.d("me-request!", "dimulai");
//kirim data dari user ke halaman php script
JSONObject jsonObjectNya = jsonParserNya.membuatHttpRequest(
LINK_TAMBAH_KOMENTAR, "POST", parameterNya);
// jawaban dari JSON
Log.d("mencoba kirim komentar", jsonObjectNya.toString());
// Bagian JSON jika komentarnya berhasil/tidak terkirim
komentar_sukses = jsonObjectNya.getInt(TAG_BERHASIL);
if (komentar_sukses == 1) {
Log.d("Komentar_nya telah di masukan!",
jsonObjectNya.toString());
finish();
return jsonObjectNya.getString(TAG_PESAN);
}else{
Log.d("Kirim komentar_nya Gagal!",
jsonObjectNya.getString(TAG_PESAN));
return jsonObjectNya.getString(TAG_PESAN);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String url_link_nya) {
// matikan progressBarnya dengan metode dismiss();
progressBarNya.dismiss();
if (url_link_nya != null){
Toast.makeText(ClassTambahKomentar.this, url_link_nya,
Toast.LENGTH_LONG).show();
}
}
}
}
android:ems="10"
/>
<EditText
android:id="@+id/judulKomentar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:ems="10" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/imageView1"
android:text="isi Judul" />
<Button
android:id="@+id/kirimKomentar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:text="Kirim Komentar" />
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/judulKomentar"
android:layout_marginTop="14dp"
android:text="isi Komentar" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="Koneksi Android MYSQL"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
</RelativeLayout>
Berikut adalah tampang dari halaman Tambah Komentar pada layar HP anda
Bandingkan kode XML-nya dengan tampangnya, disana dengan jelas terlihat bahwa UI android
tidak sesulit yang di bayangkan.
Kode untuk halaman Tambah Komentar bagian klien sudah selesai...
Berikut adalah kode untuk halaman Tambah Komentar bagian server yang saya beri nama
tambah_komentar.php
<?php
/**
* Copyright Vik Sintus Projects
*
* Segala kelebihan dan kekurangan di luar tanggung jawab pembuat.
* Di larang memakai kode ini untuk kepentingan komersial tanpa ijin.
* Silahkan di pakai untuk kepentingan belajar.
* vik.sintus@gmail.com
* http://belajar-android-indonesia.blogspot.com
* Unless required by applicable law or agreed to in writing, this software
* is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*
*/
//perlu data dari konfigurasi_nya.php untuk bisa koneksi
require("/konfigurasi_nya.php");
if (!empty($_POST)) {
if (empty($_POST['judul_komentar']) || empty($_POST['isi_komentar'])) {
// data yang di pakai oleh JSON untuk respond ke android
$jawaban_dari_server["sukses"] = 0;
$jawaban_dari_server["pesan"] = "Mohon di isi Judul dan komentarNya.";
?>
Kode untuk halaman Tambah Komentar sudah selesai.... berikutnya akan saya bangun sebuah
class JSON(JavaScript Object Notation) yang akan di siarkan ke semua halaman agar aplikasinya
menjadi responsive.
Di halaman ini kita akan membuat sebuah class JSON yang akan di pakai oleh class-class lainnya agar sebuah aplikasi bisa dinamik dan responsive. Kalau perhatikan isi dari class-class di
tutorial bagian1, 2 dan 3 ...disana JSON_nya telah di deklarasi dan telah terpakai dengan nama
ClassJSONParser.java. Saya sengaja menamakan-nya demikian karena ia memang bekerja untuk
'parsing' data antar klien dan server.
Berikut adalah isi dari ClassJSONParser.java
package com.vik_sintus.projects.koneksiandroidmysql;
/** Vik Sintus Projects */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import
import
import
import
import
import
import
import
import
import
import
org.apache.http.HttpEntity;
org.apache.http.HttpResponse;
org.apache.http.NameValuePair;
org.apache.http.client.ClientProtocolException;
org.apache.http.client.entity.UrlEncodedFormEntity;
org.apache.http.client.methods.HttpGet;
org.apache.http.client.methods.HttpPost;
org.apache.http.client.utils.URLEncodedUtils;
org.apache.http.impl.client.DefaultHttpClient;
org.json.JSONException;
org.json.JSONObject;
import android.util.Log;
public class ClassJSONParser {
static InputStream inputStreamNya = null;
static JSONObject JSONObjectNya = null;
static String jsonStringNya = "";
// berikut adalah constructor-nya
public ClassJSONParser() {
}
//ambil json object melalui url script_nya maksudnya
//object yang dari php yang ada di server
public JSONObject ambilJsonDariUrl(final String urlNya) {
// object dari Json di ambil melalui http request
try {
// kirim data bolak-balik pakai 'post' yah biar agak aman.
DefaultHttpClient httpClientNya = new DefaultHttpClient();
HttpPost httpPostNya = new HttpPost(urlNya);
// begitu juga dengan jawaban dari server pakai metode POST
HttpResponse httpResponseNya = httpClientNya.execute(httpPostNya);
// mengambil data yang dapat di response oleh server.
HttpEntity httpEntityNya = httpResponseNya.getEntity();
// buka sebuah inputStream ke data yang ada.
inputStreamNya = httpEntityNya.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
// buat sebuah BufferedReader untuk di parse melalui inputStream.
BufferedReader bufferedReaderNya = new BufferedReader(new
InputStreamReader(
inputStreamNya, "iso-8859-1"), 8);
// deklarasikan sebuah string utk membantu proses parsing-nya.
StringBuilder stringBuilderNya = new StringBuilder();
// deklarasi sebuah string utk menyimpan
// data JSON object dalam bentuk string.
String barisanStringNya = null;
// susun string-nya sampai null(habis). baris demi baris
while ((barisanStringNya = bufferedReaderNya.readLine()) != null)
stringBuilderNya.append(barisanStringNya + "\n");
}
// coba parsing string-nya menjadi JSON object
try {
JSONObjectNya = new JSONObject(jsonStringNya);
} catch (JSONException e) {
Log.e("JSON ParserNya", "Salah proses datanya " + e.toString());
}
return JSONObjectNya;
}
}
Saya telah menyisipkan banyak komentar di dalam kode di atas.... silahkan di coba di bangun di
android dan di kembangkan menjadi aplikasi besar
Kalau ingin coba menjalankan aplikasi ini di HP atau di emulator ...Berikut adalah beberapa file
pelengkap aplikasi ini. Ada satu file xml yang tidak ada class pasangan-nya seperti
ClassBacaKomentar.java berpasangan dengan baca_komentar.xml.
File yang yang tak punya pasangan itu bernama komentar_tunggal.xml yang harus di
tempatkan bersama file xml yang lain-nya di dalam folder 'layout' di android. Dia bekerja untuk
mengatur tampilan dari setiap satu komentar. Berikut adalah isi dari file komentar_tunggal.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#f0f0f0"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/garis_pinggir_komentar"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/kotakKomentar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/latar_belakang_komentar"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/lodokn_one" />
<LinearLayout
android:id="@+id/kotakKomentar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:orientation="vertical"
android:padding="5dp" >
<TextView
android:id="@+id/judul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:paddingBottom="2dip"
android:paddingLeft="5dp"
android:paddingTop="6dip"
android:textColor="#333"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/komentar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:paddingLeft="8dp"
android:textColor="#888" >
</TextView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="5dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:paddingLeft="5dp"
android:text="Nama: "
android:textColor="#5d5d5d"
android:textStyle="bold" >
</TextView>
<TextView
android:id="@+id/usernameNya"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:textColor="#acacac"
android:textStyle="bold" >
</TextView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
Perhatikan file komentar_tunggal.xml diatas ia minta dua buah file untuk di masuk-kan ke
dalam folder 'drawable' . Kedua file tsb antara lain:
garis_pinggir_komentar.xml yang isinya nampak sebagai berikut:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"><shape>
<solid android:color="#cccccc" />
</shape></item>
<item><shape>
<gradient android:angle="270"
android:endColor="#ccc"
android:startColor="#fff" />
<corners android:radius="2dp" />
</shape></item>
</selector>
android:icon="@drawable/ic_launcher"
android:label="@string/nama_aplikasi"
android:theme="@style/AppTheme" >
<activity
android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassUtkLogIn"
android:label="@string/nama_aplikasi" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassRegistrasi"
android:label="@string/nama_aplikasi" >
</activity>
<activity
android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassTambahKomentar"
android:label="@string/nama_aplikasi" >
</activity>
<activity
android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassBacaKomentar"
android:label="@string/nama_aplikasi" >
</activity>
</application>
</manifest>