Jumat, 11 November 2011

Script PHP Pengolah Password dengan MD5

Setiap password pengguna aplikasi hendaknya dienkripsi untuk keperluan faktor keamanan. Mengapa password harus dienkripsi? atau apa sih enkripsi itu?
Enkripsi adalah teknik penyandian pesan, yang semula pesan tersebut dapat dibaca dan bermakna, setelah dienkripsi menjadi tidak terbaca dan tidak bermakna.
Apabila password tidak dienkripsi, maka dapat dengan mudah dibaca, dan digunakan oleh orang lain yang tidak berhak untuk masuk ke dalam sistem atau aplikasi.
Dalam pemrograman PHP, tentu kita tidak asing dengan perintah atau function md5(). Fungsi ini sering digunakan para programmer untuk mengenkripsi password sebelum hasil enkripsi tersebut disimpan dalam database sistem, ketika registrasi user baru. Hasil enkripsi md5() berupa suatu string acak dengan panjang 32 karakter (256 bit).
Namun sudah amankah penggunaan md5() ?  Artikel ini akan membahasnya, serta memberikan tips bagaimana cara membuat script PHP yang baik untuk mengolah password.

Biasanya, struktur kode untuk mengenkripsi password dengan md5 dan menyimpannya ke dalam database (pada registrasi user baru) adalah sebagai berikut:
<?php
// input username baru
// input password asli baru ($passAsli)
$passEnkrip = md5($passAsli);
/* procedure simpan data username
dan password hasil md5() yaitu $passEnkrip ke db */
?>
Sedangkan struktur code untuk loginnya adalah
<?php
// input login username
// input login password asli ($passAsli)
// ambil $passEnkrip dari pengecekan username dari dbase 
if (md5($passAsli) == $passEnkrip)
{
 // login sukses
 // procedure jika login sukses
}
else {
 // login gagal
 // procedure jika login gagal
}
?>
Lantas… benar-benar sudah amankah penggunaan md5() dengan struktur kode di atas?

Beberapa periode yang lalu, mungkin penggunaan struktur seperti di atas sudah dirasa aman. Namun saat ini tidak aman lagi, karena sudah banyak tool untuk mendekripsi hasil enkripsi md5(). Salah satu toolnya seperti yang ada di situs http://md5.rednoize.com. Apa akibatnya jika password sudah berhasil didekripsi? tentu website kita sudah tidak menjadi aman.
Lalu apakah md5() tidak bisa digunakan lagi? Kiita tetap menggunakan md5() namun perlu sedikit kreatif. Maksudnya adalah bahwa kita perlu mengkombinasikan penggunaan md5() dengan pengacak, misalnya kita gunakan md5() berulangkali, atau menggabungkan password asli dengan suatu string tertentu lalu dienkripsi.

Berikut ini contoh struktur code untuk menyimpan password terenkripsi menggunakan pengacak :
<?php
// input username baru
// input password baru ($passAsli)
$pengacak = "AJWKXLAJSCLWLW";
$passEnkrip = md5($pengacak . md5($passAsli) . $pengacak );
/* procedure simpan data username
dan password $passEnkrip ke db */
?>
Sedangkan berikut ini adalah struktur untuk loginnya :
<?php
// input login username
// input login password asli ($passAsli)
// ambil $passEnkrip dari pengecekan username dari dbase
$pengacak = "AJWKXLAJSCLWLW";
if (md5($pengacak . md5($passAsli) . $pengacak) == $passEnkrip)
{
 // login sukses
 // procedure jika login sukses
}
else {
 // login gagal
 // procedure jika login gagal
}
?> 
Anda dapat mengubah isi pengacak atau mungkin mengubah format enkripsinya menjadi model lain, misalnya menggabungkan 3 atau lebih md5() dalam enkripsi. Dalam hal ini, hanya kita yang tahu format enkripsi atau pengacaknya. Intinya adalah jangan mengenkripsi password menggunakan md5() secara langsung, karena hal ini rawan untuk dihack pada saat ini.

Mudah-mudahan artikel ini membantu…

Perbedaan Echo atau Print dalam script PHP

Apa perbedaan echo dan print dalam bahasa pemrograman PHP ? Kita seringkali menggunakan echo (atau print) tapi tidak mengetahui apa perbedaannya antara dua syntax tersebut.
Print dapat berlaku seperti sebuah fungsi artinya print memiliki return value berupa boolean jika sukses sedangkan echo tidak. Echo langsung meng-output-kan parameter yang diberikan. Oleh karena itu, kita dapat melakukan
<?php
$a = “Hello”;
$b = ” World”;
echo $a, $b;
?>
tetapi tidak dapat melakukan
print $a, $b;
karena malah akan menghasilkan parse error.

Contoh lain, kita dapat melakukan ini

($var) ?print 'true':print 'false';
dan tidak dapat melakukan ini
($var) ?echo 'true':echo 'false';
melainkan harus
echo ($var) ? 'true' : 'false';
Dan, echo lebih cepat 20% dari print
Namun echo tidak mempunyai varian. Maksudnya echo hanya menampilkan string, jika kita menginputkan varibel berupa array atau object, echo hanya menampilkan keterangan bahwa variabel tersebut adalah array, atau object. Lain halnya dengan print, print memiliki varian print_r() yang mampu memecah array dan menampilkan key-key (disebut juga indeks array) dan value dari array tersebut. Begitupula jika print_r() kita beri variabel input berupa Object. Selain print_r(), print memiliki varian printf($format, $string) untuk menampilkan string dengan format tertentu yang kita definisikan.

Kamis, 10 November 2011

Buat Backlink, pakai www atau tidak ?

Saat Anda mempublikasikan sebuah website, ketahuilah bahwa secara otomatis Anda memiliki 2 alamat sekaligus, yaitu : http://nama-website.com dan http://www.nama-website.com.
Yang satu dengan memakai www dan yang satu tidak. Keduanya memang memiliki konten web yang sama tetapi akan menghasilkan tinjauan Search Engine yang berbeda dari segi backlink.
Coba cek backlink situs Anda dengan menggunakan Backlinkwatch. Maka jumlah backlink website Anda berbeda antara memakai www dengan tidak memakai www.
Lalu, saya memakai yang mana dan apa resikonya ? Saya sebagai jasa website pun pernah mengalami kebingungan seperti Anda, berikut hasil yang telah saya pelajari dan praktikkan mengenai aturan membuat backlink dan kode 301 redirect pada file htaccess.
Prinsip yang harus Anda pegang mulai sekarang : Tidak ada keharusan secara mutlak, Anda memakai yang mana, yang penting konsisten.
Sebagai referensi bacaan, Anda dapat melihat pada http://forum.imfreakz.com/archive/index.php/t-10.html dan http://www.webmasterworld.com/apache/3223535.htm
  • Langkah pertama, Anda harus membuat file .htaccess, berikut ini : .file htaccess dengan Notepad, simpan terlebih dahulu dengan nama htaccess.txt
  • Rename htaccess.txt menjadi .htaccess. Jika tidak bisa, coba baca mengubah nama file htaccess.txt menjadi .htaccess pada localhost .
  • Jika Anda menetapkan dari mula memakai www, maka untuk backlink pakailah juga www. Daftarkan di Google webmaster, sitemap, website lain, dsb dengan memakai www. Jangan lupa untuk menambahkan kode 301 redirect pada file .htaccess, berikut ini : (Misal http://metadesain.com langsung mengarah ke http://www.metadesain.com )
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^metadesain.com [NC]
RewriteRule ^(.*)$ http://www.metadesain.com/$1 [L,R=301] 

Sebaliknya juga demikian, jika merasa lebih nyaman tanpa www, tambahkan kode 301 redirect berikut di file .htaccess, sebagai berikut: (Misal http://www.metadesain.com langsung mengarah ke http://metadesain.com)
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.metadesain.com [NC]
RewriteRule (.*) http://metadesain.com/$1 [L,R=301] 
  • Setelah ambil keputusan, Anda memilih yang mana, maka tetapkan pilihan anda seterusnya untuk pendaftaran Google webmaster, backlink dan lainnya. Selamat mencoba!!
Di sini saya share bahwa Dulu Kesalahan fatal saya ,saya tidak konsisten dari awal dalam pendaftaran google webmaster dan backlink-backlinknya. Pada backlink-backlink yang saya buat, ada yang dengan memakai www, dan ada yang tidak. Selain itu, mengganti-ganti alamat url dalam pendaftaran di Google webmaster bisa berakibat buruk.
Ini yang terjadi saat saya cek:
http://metadesain.com--> backlink > 250
http://www.metadesain.com --> backlink < 30
Kemudian di tengah- tengah tahun, saya coba coba pakai kode redirect untuk mengubah dari http://metadesain.com ke http://www.metadesain.com, namun saya lupa kalau di webmaster google dan yahoo serta di backlink2 yang lain, saya sebagai jasa website mendaftarkan dengan tidak pakai www. Akibatnya seperti yang dikatakan di sebuah forum, page rank saya turun saat Google mengindeks ulang. Ingat ! Fungsi Redirect adalah mengabaikan url yang lama, dan mengarahkan url lama Anda kepada url yang baru.
Jadi jika kita sudah men-set up htaccess seperti di atas, diharapkan Google akan mengerti url mana yg harus diperhatikan dari situs kita. Karena setiap link masuk seperti contoh kasus di atas akan di redirect secara permanen ke halaman yang kita inginkan, menggunakan www ataupun non www. Ingat !! Pada dasarnya, seberapa banyak backlink yang mengarah ke alamat situs yang anda inginkan dan seberapa besar kualitas backlink Anda itu akan mempengaruhi pagerank situs Anda.
Ini ada contoh kasus di forum:
" Jadi inget kasus beberapa hari lalu. Ada seseorang bertanya kenapa saya sudah mati-matian link building, bayar jasa sana-sini, tapi site gak naek-naek. Usut punya usut ternyata tidak ada sinkron alias koordinasi antara jasa pembuat website dengan jasa optimasi SE. Situs (ber engine wordpress) disetting menggunakan www. sedang link building diarahkan ke domain tanpa www. Lah piye, yang banyak backlink yang tanpa www, sedangkan yang terindex yang memakai www.

Dalam kasus ini dilema. Mereset hasil index yang jelas berpotensi terkena dampak duplicate content atau link building ulang. maknyos kerja maning ...

Untuk menghindari hal tersebut terjadi, konsep awal harus benar-benar matang. Konsistensi, mau pake www atau gak sejak awal! "


Membuat Script PHP untuk Hapus Data dengan Multi Selection

Pernahkah Anda membuat script untuk menghapus data dengan konsep multi selection? Untuk menghapus sebuah data sih.. saya kira mudah untuk membuatnya.

Tapi… bagaimana bila data yang akan dihapus lebih dari satu sekaligus? Rumit gak ya membuat scriptnya? Hmm… nggak rumit kok, cuman sedikit memusingkan saja he.. he.. he :-) nggak ding, becanda… mudah-mudahan artikel yang saya sajikan ini tidak membuat Anda pusing.
OK… konsep menghapus data dengan multi selection ini biasanya menggunakan bantuan komponen checkbox. Mengapa checkbox? ya.. karena komponen checkbox memungkinkan kita bisa memilih pilihan lebih dari satu.

Data yang akan dihapus terlebih dahulu dipilih dengan memberi tanda check pada checkbox yang ada di depan setiap data. Perhatikan contoh tampilan berikut ini:
Photobucket
Nah… kita akan membuat script PHP untuk menghapus data dengan konsep multi selection seperti gambaran di atas.
Untuk studi kasus yang diambil, lagi-lagi kita mengambil kasus tentang data mahasiswa :-) Huh… mentang-mentang yang buat artikel ini seorang dosen kali ya :-)
Misalkan kita punya tabel dan data sbb:

1.CREATE TABLE mhs (2.nim varchar(10),3.namamhs varchar(30),4.PRIMARY KEY (nim)5.)

1.INSERT INTO mhs VALUES ('M0197001', 'ROSIHAN ARI YUANA');2.INSERT INTO mhs VALUES ('M0197002', 'DWI AMALIA FITRIANI');3.INSERT INTO mhs VALUES ('M0197003', 'FAZA FAUZAN KH.');4.INSERT INTO mhs VALUES ('M0197004', 'NADA HASANAH');5.INSERT INTO mhs VALUES ('M0197005', 'MUH. AHSANI TAQWIM');
Langkah pertama dalam membuat script penghapusan data ini, terlebih dahulu kita siapkan script untuk menampilkan semua datanya. Untuk setiap data nantinya kita letakkan sebuah checkbox di depannya yang digunakan untuk memilih data mana saja yang akan dihapus.
data.php

01.<html>02.<head>03.<title>Hapus data mahasiswa</title>04.</head>05.<body>06.<h1>Hapus Data Mahasiswa</h1>07.<?php08. 09.// koneksi mysql10. 11.mysql_connect("dbhost", "dbuser", "dbpass");12.mysql_select_db("dbname");13. 14.// query SQL untuk menampilkan semua data15. 16.$query = "SELECT * FROM mhs";17.$hasil = mysql_query($query);18. 19.// membuat form penghapusan data20. 21.echo "<form name='myform' method='post' action='".$_SERVER['PHP_SELF']."?action=del'>";22.echo "<table border='1'>";23.echo "<tr><td></td><td><b>NIM</b></td><td><b>Nama Mahasiswa</b></td></tr>";24.$i = 0;25.while($data = mysql_fetch_array($hasil))26.{27.echo "<tr><td><input type='checkbox' name='nim".$i."' value='".$data['nim']."' /></td><td>".$data['nim']."</td><td>".$data['namamhs']."</td></tr>";28.$i++;29.}30.echo "</table>";31.echo "<input type='hidden' name='n' value='".$i."' />";32.echo "<p><input type='submit' value='Hapus' name='submit'> <input type='reset' value='Batal' name='reset'></p>";33.echo "</form>";34.?>35. 36.</body>37.</html>
Perhatikan script di atas! Form nantinya akan diarahkan ke script itu sendiri (menggunakan $_SERVER['PHP_SELF']) namun dengan parameter ‘?action=del’. Anda boleh arahkan pemrosesan formnya ke script lain. It’s up to you.
Selain itu perhatikan pula bahwa untuk setiap komponen checkbox diberikan name yang berbeda. Di sini diberikan name berbentuk ‘nim0′, ‘nim1′, ‘nim2′, … dst (perhatikan bagian name=’nim”.$i.”‘).
Kemudian, terdapat pula komponen hidden value (name=’n') yang bernilai sama dengan jumlah data total atau dalam hal ini adalah $i. Komponen ini nantinya akan sangat penting ketika memproses form terutama pada saat membaca komponen checkbox yang dipilih.
Selanjutnya untuk pemanis, misalkan kita ingin membuat fasilitas SELECT ALL untuk memilih semua data sekaligus. OK Bagaimana caranya? Ya.. kita gunakan Javascript. Oya… jangan lupa berikan sebuah checkbox tambahan untuk memberikan fasilitas ini. Begitu checkbox ini dipilih, maka semua checkbox yang ada di depan data akan terpilih. Untuk hal ini, kita berikan event onclick() pada checkbox tsb. Mmm… sebaiknya checkbox ini diletakkan di dalam header tabel saja ya.
data.php

01.<html>02.<head>03.<title>Hapus data mahasiswa</title>04.<script type="text/javascript">05. 06.function pilihan()07.{08.// membaca jumlah komponen dalam form bernama 'myform'09.var jumKomponen = document.myform.length;10. 11.// jika checkbox 'Pilih Semua' dipilih12.if (document.myform[0].checked == true)13.{14.// semua checkbox pada data akan terpilih15.for (i=1; i<=jumKomponen; i++)16.{17.if (document.myform[i].type == "checkbox") document.myform[i].checked = true;18.}19.}20.// jika checkbox 'Pilih Semua' tidak dipilih21.else if (document.myform[0].checked == false)22.{23.// semua checkbox pada data tidak dipilih24.for (i=1; i<=jumKomponen; i++)25.{26.if (document.myform[i].type == "checkbox") document.myform[i].checked = false;27.}28.}29.}30. 31.</script>32.</head>33.<body>34.<h1>Hapus Data Mahasiswa</h1>35.<?php36. 37.// koneksi mysql38. 39.mysql_connect("dbhost", "dbuser", "dbpass");40.mysql_select_db("dbname");41. 42.// query SQL untuk menampilkan semua data43. 44.$query = "SELECT * FROM mhs";45.$hasil = mysql_query($query);46. 47.// membuat form penghapusan data48. 49.echo "<form name='myform' method='post' action='".$_SERVER['PHP_SELF']."?action=del'>";50.echo "<table border='1'>";51.echo "<tr><td><input type='checkbox' name='pilih' onclick='pilihan()' /> Pilih semua</td><td><b>NIM</b></td><td><b>Nama Mahasiswa</b></td></tr>";52.$i = 0;53.while($data = mysql_fetch_array($hasil))54.{55.echo "<tr><td><input type='checkbox' name='nim".$i."' value='".$data['nim']."' /></td><td>".$data['nim']."</td><td>".$data['namamhs']."</td></tr>";56.$i++;57.}58.echo "</table>";59.echo "<input type='hidden' name='n' value='".$i."' />";60.echo "<p><input type='submit' value='Hapus' name='submit'> <input type='reset' value='Batal' name='reset'></p>";61.echo "</form>";62.?>63. 64.</body>65.</html>
Nah… selanjutnya, kita bisa membuat bagian untuk memproses formnya atau membuat script untuk proses penghapusan datanya.
Trus… bagaimana konsep membaca data mana saja yang akan dihapus sesuai pilihan checkboxnya? Untuk membaca data mana yang akan dihapus, kita gunakan bantuan looping. Berapa jumlah loopingnya? Jumlah loopingnya sesuai jumlah komponen checkboxnya. Nah… di sinilah pentingnya penggunaan komponen hidden value <input type=’hidden’ name=’n’ value=’”.$i.”‘ /> Dalam contoh ini nilai n=5.
Selanjutnya isi dalam loopingnya bagaimana? ya… kita cek saja apakah komponen checkbox dengan name=’nim0′ dipilih tidak? jika ya, maka baca NIM mahasiswa terkait dengan komponen tersebut, lalu jalankan query SQL untuk menghapus data mahasiswanya. Trus… komponen checkbox dengan name=’nim1′ dicek apakah dipilih atau tidak. Jika ya, maka baca NIM mahasiswa terkait dengan komponen tersebut, lalu hapus dengan query SQL. Proses ini diulang sebanyak 5 kali untuk kasus di atas, yaitu mulai dari komponen checkbox dengan name=’nim0′ sampai dengan name=’nim4′.
Lantas yang menjadi masalah adalah, bagaimana cara kita mendeteksi bahwa komponen checkbox dengan name tertentu itu dipilih atau tidak? caranya adalah kita gunakan statement IF seperti di bawah ini

1.if (isset($_POST['nim'.$i]))2.{3....4.}
dengan $i = 0, 1, …, n-1.
Jika suatu komponen checkbox itu dipilih, maka perintah isset($_POST['nim'.$i]) akan menghasilkan nilai TRUE. Sedangkan FALSE jika tidak dipilih.
Dengan demikian, script untuk menghapus data dengan multi selection ini adalah sbb:
data.php
01.<html>02.<head>03.<title>Hapus data mahasiswa</title>04.<script type="text/javascript">05. 06.function pilihan()07.{08.// membaca jumlah komponen dalam form bernama 'myform'09.var jumKomponen = document.myform.length;10. 11.// jika checkbox 'Pilih Semua' dipilih12.if (document.myform[0].checked == true)13.{14.// semua checkbox pada data akan terpilih15.for (i=1; i<=jumKomponen; i++)16.{17.if (document.myform[i].type == "checkbox") document.myform[i].checked = true;18.}19.}20.// jika checkbox 'Pilih Semua' tidak dipilih21.else if (document.myform[0].checked == false)22.{23.// semua checkbox pada data tidak dipilih24.for (i=1; i<=jumKomponen; i++)25.{26.if (document.myform[i].type == "checkbox") document.myform[i].checked = false;27.}28.}29.}30. 31.</script>32.</head>33.<body>34.<h1>Hapus Data Mahasiswa</h1>35.<?php36. 37.// koneksi mysql38. 39.mysql_connect("dbhost", "dbuser", "dbpass");40.mysql_select_db("dbname");41. 42.// bagian script untuk menghapus data43. 44.if ($_GET['action'] == "del")45.{46.// membaca nilai n dari hidden value47.$n = $_POST['n'];48. 49.for ($i=0; $i<=$n-1; $i++)50.{51.if (isset($_POST['nim'.$i]))52.{53.$nim = $_POST['nim'.$i];54.$query = "DELETE FROM mhs WHERE nim = '$nim'";55.mysql_query($query);56.}57.}58.}59. 60.// query SQL untuk menampilkan semua data61. 62.$query = "SELECT * FROM mhs";63.$hasil = mysql_query($query);64. 65.// membuat form penghapusan data66. 67.echo "<form name='myform' method='post' action='".$_SERVER['PHP_SELF']."?action=del'>";68.echo "<table border='1'>";69.echo "<tr><td><input type='checkbox' name='pilih' onclick='pilihan()' /> Pilih semua</td><td><b>NIM</b></td><td><b>Nama Mahasiswa</b></td></tr>";70.$i = 0;71.while($data = mysql_fetch_array($hasil))72.{73.echo "<tr><td><input type='checkbox' name='nim".$i."' value='".$data['nim']."' /></td><td>".$data['nim']."</td><td>".$data['namamhs']."</td></tr>";74.$i++;75.}76.echo "</table>";77.echo "<input type='hidden' name='n' value='".$i."' />";78.echo "<p><input type='submit' value='Hapus' name='submit'> <input type='reset' value='Batal' name='reset'></p>";79.echo "</form>";80. 81.?>82. 83.</body>84.</html>

Selamat mencoba... 

Cara Membuat Form Dinamis Untuk Submit Data dengan PHP

Dalam artikel ini, saya akan mencoba memaparkan teknik lain dalam membuat form dinamis yang mirip seperti di atas namun tanpa menentukan jumlah datanya dahulu, melainkan dengan mengklik suatu tombol atau link maka secara otomatis komponen input akan bertambah sendiri. Setiap kali kita mau menambah data baru, tinggal klik link tersebut tanpa merefresh halaman sehingga data yang telah diinputkan sebelumnya tidak hilang.

Perhatikan ilustrasi dari teknik tersebut di bawah ini
Membuat form dinamis
Gambar di atas adalah tampilan mula-mula form yang terdiri dari sebuah komponen input. Kita bisa mengisi data pertama pada komponen input tersebut. Apabila kita ingin menambah data baru, maka tinggal diklik saja link ‘Tambah’ nya dan jreng… munculah komponen input berikutnya di bawah nya, tanpa merefresh halaman dan data pertamanya tidak hilang. Perhatikan gambar di bawah ini
Membuat form dinamis
Apabila mau menambah data berikutnya lagi, klik ‘Tambah’ lagi dan munculah komponen input ketiga.
Membuat form dinamis
Begitu seterusnya…
OK.. dah paham skenarionya ya? sekarang bagaimana cara membuatnya?
Untuk membuat form dinamis seperti di atas, kita akan menggunakan Javascript. Adapun konsepnya adalah, kita akan gunakan innerHTML untuk menyisipkan tag HTML ke dalam sebuah bagian tag HTML yang lain. Perhatikan konsep di bawah ini.
Andaikan mula-mula kita punya tag HTML untuk form seperti di bawah ini

1.<form method="post" action="...">2.Masukkan Data <input type="text" name="data[]">3. 4.<div id="input0">5.</div>6. 7.</form>
Perhatikan bagian

1.<div id="input0">2.</div>
bagian tersebut, adalah bagian tag HTML yang nantinya akan kita tempatkan komponen input berikutnya. Sehingga apabila kita sisipkan lagi komponen input di dalam bagian ber-id ‘input0′, struktur tag HTML nya menjadi

01.<form method="post" action="...">02.Masukkan Data <input type="text" name="data[]">03. 04.<div id="input0">05.Masukkan Data <input type="text" name="data[]">06. 07.<div id="input1">08.</div>09.</div>10. 11.</form>
Apabila disipkan lagi komponen berikutnya di id ‘input1′, maka strukturnya menjadi

01.<form method="post" action="...">02.Masukkan Data <input type="text" name="data[]">03. 04.<div id="input0">05.Masukkan Data <input type="text" name="data[]">06. 07.<div id="input1">08.Masukkan Data <input type="text" name="data[]">09. 10.<div id="input2">11.</div>12.</div>13.</div>14. 15.</form>
Begitu seterusnya… itulah konsep dalam membuat form dinamis seperti di atas. Setiap kali kita sisipkan komponen input baru, kita sisipkan pula bagian atau tempat untuk meletakkan komponen input berikutnya dengan id yang berbeda.
Di sini, id komponen dibuat berbeda supaya kita bisa menentukan lokasi atau bagian yang tepat dimana ingin disisipkan tag HTML yang baru.
Trus.. bagaimana perintah Javascript untuk menyisipkan tag HTML ke dalam sebuah bagian ber-id tertentu? Seperti yang telah saya singgung sebelumnya, yaitu menggunakan innerHTML. Adapun sintaksnya sbb:

1.document.getElementById("namaID").innerHTML = "...";
Sebagai contoh, misalkan kita ingin menyisipkan tag HTML <p>Test</p> ke dalam komponen ber-id ‘contoh’ maka perintahnya

1.document.getElementById("contoh").innerHTML = "<p>Test</p>";
Nah.. konsepnya sudah kita dapatkan, sekarang saatnya action membuat script nya. Ini dia scriptnya

01.<html>02.<head>03.<script language="JavaScript" type="text/JavaScript">04.counter = 0;05.function action()06.{07.counterNext = counter + 1;08.document.getElementById("input"+counter).innerHTML = "<p>Masukkan Data <input type='text' name='data[]'></p><div id=\"input"+counterNext+"\"></div>";09.counter++;10.}11.</script>12.</head>13. 14.<body>15.<h1>Form Dinamis</h1>16. 17.<form method="post" action="submit.php">18.<p>Masukkan Data <input type='text' name='data[]'></p>19. 20.<div id="input0">21.</div>22. 23.<p><a href="javascript:action();">Tambah</a></p>24.<p><input type="submit" name="submit" value="Submit"><input type="reset" name="reset" value="Reset"></p>25.</form>26. 27.</body>28.</html>
Keterangan:
Untuk membuat nama id komponen yang berubah-ubah: input0, input1, input2, .. dst kita menggunakan increment counter++ dengan nilai awal counternya adalah 0.
Script di atas sudah dicoba dijalankan di browser Firefox 3 dan IE 6, dan.. hasilnya sukses.
Mudah bukan membuatnya?? nah.. dalam kesempatan lain saya akan menjelaskan cara membaca data yang diinputkan melalui form dinamis di atas pada script PHP. Tunggu ya…

Sumber : http://blog.rosihanari.net

Selasa, 08 November 2011

Script PHP untuk Transaksi Unik Otomatis Berdasarkan Tanggal

Dalam artikel kali ini saya akan mencoba menjelaskan cara pembuatan kode transaksi unik yang digenerate secara otomatis berdasarkan tanggal. Biasanya kode transaksi unik berdasarkan tanggal ini digunakan pada transaksi pembayaran atau pembelian barang, misalnya ’201009010001′ dimana 4 digit terdepan menunjukkan tahun transaksi, digit 5 dan 6 menunjukkan bulan transaksi, digit 7-8 menunjukkan tanggal transaksi, sedangkan digit sisanya menunjukkan urutan transaksi yang terjadi pada tanggal tersebut.
Pada prinsipnya, cara membuatnya hampir sama dengan artikel yang pernah saya bahas sebelumnya tentang Generator Unik Incremental Otomatis, namun yang membedakannya di sini hanyalah pada proses penggunaan tanggalnya untuk mengkonstruksi nomor transaksi.

Dalam pembahasan ini, kasus yang kita pilih adalah tentang proses pembayaran (entah pembayaran apa), yang jelas pada proses pembayaran tersebut mula-mula operator diminta memasukkan ID member yang akan membayar. Proses berikutnya adalah memunculkan data identitas member berdasarkan ID member yang dimasukkan tadi dan muncul form isian jumlah uang yang dibayar. Setelah jumlah uang diisi pada form, proses berikutnya adalah memunculkan konfirmasi pembayaran yang didalamnya muncul ID transaksi pembayaran yang menggunakan tanggal transaksi.
Berdasarkan skenario di atas, kita buat dahulu tabel member yang berisi data-data identitas member. Data ini nanti akan diload sewaktu proses pembayaran.
1.CREATE TABLE `member` (
2.`idMember` varchar(10),
3.`nama` varchar(30),
4.`alamat` varchar(50),
5.PRIMARY KEY  (`idMember`)
6.);
dan berikut ini contoh datanya
1.INSERT INTO `member` VALUES ('100001', 'MR. A', 'SOLO');
2.INSERT INTO `member` VALUES ('100002', 'MR. B', 'SOLO');
3.INSERT INTO `member` VALUES ('100003', 'MR. C', 'SEMARANG');
4.INSERT INTO `member` VALUES ('100004', 'MR. D', 'YOGYAKARTA');
Selanjutnya kita buat satu buah tabel lagi untuk menyimpan data transaksi pembayaran. Kita buat tabel yang simpel saja sebagai contoh misalnya
1.CREATE TABLE `transaksi` (
2.`idTransaksi` varchar(12),
3.`idMember` varchar(10),
4.`jumlah` int(11),
5.PRIMARY KEY  (`idTransaksi`)
6.)
di mana field ‘idTransaksi’ untuk menyimpan data ID transaksi, ‘idMember’ terkait dengan ID dari member yang membayar, dan ‘jumlah’ menunjukkan jumlah uang yang dibayar. Karena ‘idTransaksi’ adalah kode unik maka kita set field tsb sebagai primary key.
OK, tabel database yang diperlukan sudah siap, selanjutnya kita buat scriptnya mulai dari form pembayarannya.
bayar.html
01.<html>
02.<head>
03.<title>Transaksi Pembayaran</title>
04.</head>
05.<body>
06.<h1>Transaksi Pembayaran</h1>
07.<p><a href="bayar.htm">Form Bayar</a></p>
08.<hr>
09.<form method="post" action="proses.php">
10.ID Member </td><td><input type="text" name="id"> <input type="submit" name="submit" value="Submit">
11.</form>
12.</body>
13.</html>
Tampilan dari form di atas adalah sbb:
Transaksi Pembayaran
Script berikutnya yang kita buat adalah proses.php. Script ini nanti akan mencari data member berdasarkan ID member yang dimasukkan dari form bayar.html. Jika data member yang dicari ada maka akan memunculkan data member, dan jika tidak maka akan memunculkan konfirmasi data member tidak ditemukan.
Oya, sebelumnya kita butuh script untuk koneksi databasenya dulu ya
koneksi.php
01.<?php
02.// nama host
03.$dbhost = '...';
04.// nama user
05.$dbuser = '...';
06.// password user
07.$dbpass = '...';
08.// nama database
09.$dbname = '...';
10. 
11.mysql_connect($dbhost, $dbuser, $dbpass);
12.mysql_select_db($dbname);
13.?>
Nah sekarang baru script proses.php nya
proses.php
01.<?php
02.// koneksi ke database
03.include 'koneksi.php';
04.?>
05. 
06.<html>
07.<head>
08.<title>Transaksi Pembayaran</title>
09.</head>
10.<body>
11.<h1>Transaksi Pembayaran</h1>
12.<p><a href="bayar.htm">Form Bayar</a></p>
13.<hr>
14.<?php
15.// baca ID member dari form bayar.html
16.$id = $_POST['id'];
17.// lakukan query pencarian data member berdasarkan ID
18.$query = "SELECT * FROM member WHERE idMember = '$id'";
19.$hasil = mysql_query($query);
20.if (mysql_num_rows($hasil)>0)
21.{
22.// jika ditemukan datanya maka tampilkan
23.$data  = mysql_fetch_array($hasil);
24.?>
25.<form method="post" action="proses2.php">
26.<table>
27.<tr><td>ID</td><td>:</td><td><?php echo $id; ?></td></tr>
28.<tr><td>Nama</td><td>:</td><td><?php echo $data['nama']; ?></td></tr>
29.<tr><td>Alamat</td><td>:</td><td><?php echo $data['alamat']; ?></td></tr>
30.<tr><td>Jumlah Bayar</td><td>:</td><td>Rp. <input type="text" name="jumlah"></td></tr>
31.</table>
32.<input type="hidden" name="id" value="<?php echo $id?>">
33.<input type="submit" name="submit" value="Submit">
34.</form>
35.<?php
36.}
37.// jika tidak maka tampilkan peringatan
38.else echo "Nomor ID tidak ditemukan";
39.?>
40.</body>
41.</html>
Tampilan dari script proses.php adalah seperti di bawah ini
Transaksi Pembayaran
OK… script proses.php sudah dibuat, selanjutnya kita buat script proses2.php. Di dalam script ini, akan dilakukan proses penyimpanan data transaksi pembayaran dari member. Sebelum proses penyimpanan data transaksi, terlebih dahulu akan digenerate ID transaksinya secara otomatis. Bagaimana idenya? Idenya adalah pertama baca tanggal hari ini (current date) dalam format YYYYMMDD, gunakan function date('Ymd'). Anda tidak harus menggunakan format YYYYMMDD tapi bisa format DDMMYYYY atau MMDDYYYY.
Setelah itu gunakan query untuk mencari nomor transaksi terakhir yang berawalan tanggal hari ini. Yang menjadi pertanyaan adalah bagaimana cara mencari nomor transaksi terahir? ya… gunakan saja function MAX() pada query nya
1.SELECT MAX(idTransaksi) FROM transaksi WHERE idTransaksi LIKE 'tanggalharini%'
Query di atas digunakan untuk mencari nomor transaksi terakhir yang berawalan tanggal hari ini.
Setelah idTransaksi terakhir diperoleh, selanjutnya kita baca nomor urut dari idTransaksi terakhir tersebut. Karena nomor urut adalah substring yang terletak dalam string nomor transaksi, maka kita gunakan function substr() untuk membacanya. Nomor urut ini terletak pada digit ke 9 s/d 12. Nah… nomor urut ini nanti selanjutnya kita tambah 1 untuk nomor urut transaksi berikutnya. Ilustrasinya begini, misalkan nomor urut dari id transaksi terakhir adalah 0001 maka nomor urut id transaksi berikutnya adalah 0002. Gunakan function sprintf('%04s', nomorurut) untuk menyatakan nomor urut dalam 4 digit string. Misalkan nomor urutnya adalah 12, maka dengan function tersebut akan dihasilkan ’0012′. Kemudian nomor urut ini kita gabung kembali dengan tanggal hari ini untuk membentuk nomor transaksi yang baru.
Nomor transaksi yang baru sudah digenerate, barulah proses penyimpanan data transaksinya ke dalam tabel transaksi.
OK… berikut ini isi script proses2.php nya
proses2.php
01.<?php
02.// koneksi ke database
03.include 'koneksi.php';
04. 
05.// baca current date
06.$today = date("Ymd");
07.?>
08. 
09.<html>
10.<head>
11.<title>Transaksi Pembayaran</title>
12.</head>
13.<body>
14.<h1>Transaksi Pembayaran</h1>
15.<p><a href="bayar.htm">Form Bayar</a></p>
16.<hr>
17.<?php
18. 
19.// baca id member dari form proses.php
20.$id = $_POST['id'];
21. 
22.// baca jumlah pembayaran dari form proses.php
23.$jumlah = $_POST['jumlah'];
24. 
25.// cari id transaksi terakhir yang berawalan tanggal hari ini
26.$query = "SELECT max(idTransaksi) AS last FROM transaksi WHERE idTransaksi LIKE '$today%'";
27.$hasil = mysql_query($query);
28.$data  = mysql_fetch_array($hasil);
29.$lastNoTransaksi = $data['last'];
30. 
31.// baca nomor urut transaksi dari id transaksi terakhir
32.$lastNoUrut = substr($lastNoTransaksi, 8, 4);
33. 
34.// nomor urut ditambah 1
35.$nextNoUrut = $lastNoUrut + 1;
36. 
37.// membuat format nomor transaksi berikutnya
38.$nextNoTransaksi = $today.sprintf('%04s', $nextNoUrut);
39. 
40.// proses simpan data transaksi dengan nomor transaksi yang baru
41.$query = "INSERT INTO transaksi (idTransaksi, idMember, jumlah)
42.VALUES ('$nextNoTransaksi', '$id', '$jumlah')";
43.$hasil = mysql_query($query);
44.if ($hasil)
45.{
46.// jika proses simpan transaksi sukses, maka tampilkan nomor transaksi dan data pembayaran
47.$query2 = "SELECT * FROM member WHERE idMember = '$id'";
48.$hasil2 = mysql_query($query2);
49.$data2  = mysql_fetch_array($hasil2);
50.?>
51. 
52.<p>Transaksi Pembayaran Sukses</p>
53.<table>
54.<tr><td>ID Transaksi</td><td>:</td><td><?php echo $nextNoTransaksi; ?></td></tr>
55.<tr><td>ID Member</td><td>:</td><td><?php echo $id; ?></td></tr>
56.<tr><td>Nama</td><td>:</td><td><?php echo $data2['nama']; ?></td></tr>
57.<tr><td>Alamat</td><td>:</td><td><?php echo $data2['alamat']; ?></td></tr>
58.<tr><td>Jumlah Bayar</td><td>:</td><td>Rp. <?php echo $jumlah; ?></td></tr>
59.</table>
60. 
61.<?php
62.}
63.else echo "Transaksi Gagal";
64.?>  
65. 
66.</body>
67.</html>
Tampilan dari script proses2.php adalah seperti di bawah ini
Transaksi Pembayaran
Mudah bukan membuatnya? selamat mencoba dan bereksperimen ya…