Jurusan Matematika
Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Negeri Malang
2019
Daftar Isi
DAFTAR ISI .................................................................................................................................................. II
1. PENDAHULUAN....................................................................................................................................... 1
1.1. SISTEM KOMUNIKASI ANTARA CLIENT DENGAN SERVER........................................................................................ 1
1.2. HTML SEBAGAI ”BAHASA” PENYUSUN HALAMAN WEB ....................................................................................... 2
1.3. CLIENT-SIDE SCRIPTING DAN SERVER-SIDE SCRIPTING .......................................................................................... 3
2. PENGENALAN PHP .................................................................................................................................. 5
2.1. APAKAH PHP ITU?...................................................................................................................................... 5
2.2. STRUKTUR SKRIP PHP.................................................................................................................................. 6
2.3. VARIABEL .................................................................................................................................................. 8
2.4. TIPE DATA ................................................................................................................................................. 9
2.5. TYPECASTING DAN JUGGLING ......................................................................................................................... 9
2.6. KONSTANTA ............................................................................................................................................. 11
2.7. OPERATOR............................................................................................................................................... 11
2.8. MENAMPILKAN TEKS KE BROWSER ................................................................................................................ 14
3. LOGIKA PEMROGRAMAN ...................................................................................................................... 17
3.1. PEMILIHAN KONDISI................................................................................................................................... 17
3.2. PERULANGAN (ITERASI).............................................................................................................................. 20
3.3. PERULANGAN RANGKAP ............................................................................................................................. 22
3.4. BREAK-CONTINUE ...................................................................................................................................... 23
3.5. PRAKTIKUM ............................................................................................................................................. 23
CATATAN ....................................................................................................................................................... 26
4. FORM.................................................................................................................................................... 28
4.1. FORM ..................................................................................................................................................... 28
4.2. KOMPONEN ............................................................................................................................................. 29
4.3. MENGGABUNGKAN DUA FILE....................................................................................................................... 38
5. ARRAY................................................................................................................................................... 40
5.1. KEY DAN VALUE ........................................................................................................................................ 40
5.2. DEKLARASI ARRAY ..................................................................................................................................... 40
5.3. PENELUSURAN ARRAY ................................................................................................................................ 43
5.4. OPERATOR ARRAY ..................................................................................................................................... 46
5.5. FUNCTION PADA ARRAY .............................................................................................................................. 46
5.5. MENAMPILKAN ISI ARRAY ........................................................................................................................... 49
5.6. KOMPONEN HTML YANG MEMANFAATKAN ARRAY ......................................................................................... 49
6. BOOTSTRAP .......................................................................................................................................... 54
6.1. PERSYARATAN .......................................................................................................................................... 54
6.2. STRUKTUR HALAMAN BOOTSTRAP ................................................................................................................ 55
6.3. FORM DENGAN BOOTSTRAP ........................................................................................................................ 58
7. JQUERY ................................................................................................................................................. 64
7.1. KOMUNIKASI SINKRON-ASINKRON ................................................................................................................ 64
7.2. JQUERY .................................................................................................................................................. 66
7.3. AJAX DENGAN JQUERY ............................................................................................................................... 69
7.4. KOTAK DIALOG DENGAN BOOTSTRAP ............................................................................................................. 72
7.5. KOTAK DIALOG DENGAN BOOTBOX ............................................................................................................... 74
7.6. DATEPICKER ............................................................................................................................................. 75
8. AKSES BASIS DATA ................................................................................................................................ 78
8.1. PEMBUATAN APLIKASI BASIS DATA ................................................................................................................ 79
Teknologi Internet telah berkembang pesat, tidak sulit saat ini terhubung ke Internet,
misalnya melalui fasilitas hotspot, wireless modem, handphone, fixed line, dan sebagainya.
Khusus dalam web (salah satu layanan dalam Internet), keberadaannya juga sangat beragam,
baik jenis kegunaannya (misalnya sebagai webmail, mailing list, chat, e-commerce, e-learning,
hiburan, search engine, social network) maupun teknologi yang digunakan untuk
mengantarkan informasi ke penggunanya.
Dalam mekanisme ini, pengguna memasukkan suatu alamat halaman yang akan diakses
(alamat dikenal juga dengan URL: Uniform Resource Locator). Oleh web browser, request
(permintaan) pengguna akan diterjemahkan menjadi suatu HTTP request dan dikirimkan ke
web server (secara teknis hal ini melibatkan DNS server untuk menentukan alamat server
yang tepat). Oleh web server, request dari browser akan diproses, apakah server harus
mengirimkan suatu file statis tertentu (bisa berupa file HTML, pdf, image, video, file lainnya),
atau mengeksekusi file yang berisi skrip, atau mengakses basis data, atau tidak melakukan
sesuatu. Hasil proses ini akan dikirimkan ke browser sebagai suatu response (balasan).
Browser menentukan apa yang harus dilakukan. Bila yang dikirimkan adalah suatu halaman
web (dalam bentuk dokumen HTML) atau format lain yang didukung browser (misakan pdf)
maka browser akan memuat dan menampilkannya kepada pengguna. Bila yang dikirimkan
adalah file dengan format tidak bisa dibuka di browser, maka browser akan memberitahukan
kepada pengguna untuk menyimpannya (melalui proses download).
Mekanisme request-response ini akan berlangsung terus menerus setiap kali browser
Salah satu bahasa pada sisi server adalah PHP. PHP adalah server-side script yang
paling populer di dunia, menurut W3Techs (http://w3techs.com) per Desember 2017 PHP
digunakan oleh 83.1% situs web di seluruh dunia. PHP memiliki kelebihan antara lain (1)
merupakan proyek open source sehingga bisa didapat dan digunakan secara gratis, (2)
banyak library / widget /extension yang dikembangkan oleh berbagai komunitas pengembang,
(3) tersedia dan bisa digunakan pada berbagai platform sistem operasi (Unix/Linux, Windows,
MacOS, dan OS/2), (4) mudah digunakan, (5) mendukung banyak sistem basis data, serta (6)
script PHP diklaim bisa dieksekusi lebih cepat.
2.2.1. Delimiter
Untuk membedakan kode PHP dengan tag HTML atau kode lain, maka kode PHP diapit
oleh pembatas (delimiter), contohnya sebagai berikut:
<?php
// tuliskan kode PHP di sini
?>
Satu file PHP bisa berisi beberapa pasang delimiter yang terpisah. Cara ini bermanfaat
bila file berisi campuran kode PHP dan tag HTML. Contoh campuran antara kode PHP dan
HTML dalam satu file adalah sebagai berikut:
<html>
<head>
<title> Menampilkan tanggal</title>
</head>
<body>
<?php
$tgl = date("j m Y");
echo "Tanggal: ".$tgl;
?>
</body>
</html>
Bila halaman yang tampil di browser dilihat kodenya oleh pengguna, maka yang didapat
adalah kode berikut:
<html>
<head>
<title>Menampilkan tanggal</title>
</head>
<body>
Tanggal: 8 08 2011
</body>
</html>
Tampak bahwa apa yang didapat oleh pengguna hanyalah kode HTML saja. Ingat, skrip PHP
hanya berlaku di server. Hasil eksekusinyalah yang diberikan ke pengguna/klien.
Tag HTML dituliskan di luar tag PHP. Bila dituliskan di dalamnya maka akan dianggap
error karena tag HTML bukanlah sintaks PHP. Tag HTML bisa dituliskan di dalam tag PHP
tetapi harus dinyatakan sebagai teks yang ditampilkan oleh pernyataan echo. Contoh berikut
menunjukkan kode yang berbeda untuk menampilkan tanggal dalam cetak tebal, ada yang
ditulis di dalam tag PHP, ada yang ditulis di luar tag PHP. Keduanya memberi hasil yang sama.
<?php
echo "<b>Tanggal: ".date("j m Y")."</b>"; // <b> sebagai teks
?>
<b>Tanggal:
<?php
echo date("j m Y");
?>
Aturan ini secara umum juga ditemui di bahasa pemrograman lain, kecuali sifat case-
sensitive yang hanya ada di beberapa bahasa saja.
2.3. Variabel
Variabel adalah suatu tempat di memori yang dialokasikan sebagai wadah untuk
menyimpan data yang dibutuhkan program dan nilainya dapat berubah-ubah sepanjang
jalannya program. Variabel dalam PHP selalu diawali dengan ‘$’. Karena variabel adalah
termasuk pengenal, maka penamaan variabel dalam PHP bersifat case-sensitive, misalnya
membedakan variabel $Umur dengan $umur. Tipe data suatu variabel tidak perlu
dideklarasikan secara khusus, karena akan dilakukan secara otomatis oleh PHP dengan
melihat nilai yang tersimpan di dalamnya.
Assignment dilakukan dengan menggunakan operator '=', misalnya:
<?php
Juggling adalah kemampuan PHP untuk melakukan konversi antar tipe secara otomatis.
PHP akan melihat nilai variabel itu, operator yang digunakan, lalu mengkonversikannya
menjadi tipe yang sesuai. Nilai yang dihasilkan menyesuaikan dengan aturan yang ada di
typecasting. Contoh:
<?php
$total = 100; // integer
$X = "5"; // string
$total = $total + $X; // $total = 105
// sebagai integer karena + adalah operator numerik
2.6. Konstanta
Konstanta adalah nilai yang tetap selama program dijalankan dan tidak diperbolehkan
diubah. Menyatakan suatu konstanta adalah dengan menggunakan pernyataan define.
Berikut ini X sebagai konstanta akan didefinisikan bernilai 10. Pengubahan X menyebabkan
kesalahan. Perhatikan bahwa konstanta tidak perlu menggunakan $.
<?php
define("X", 10); // membuat konstanta X bernilai 10
echo (X*5); // penggunaan konstanta dalam suatu pernyataan
?>
2.7. Operator
Operator digunakan untuk memanipulasi data. Ada beberapa macam operator,
disesuaikan dengan tipe datanya.
$Y = 100;
echo $X++;
// X ditampilkan lalu diincrement,
// nilai yg ditampilkan: 100, nilai di X sekarang 101
?>
2.7.3. Operator string
Hanya ada satu operator untuk string yaitu ‘.’ (titik) yang digunakan untuk
menggabungkan dua buah string (concatenate). Contoh:
<?php
$namadepan = 'Dean';
$namabelakang = 'Thomas';
$namalengkap = $namadepan . " " . $namabelakang;
echo "Nama anda: ".$namalengkap;
?>
Perhatikan, bila tanda titik ada di luar tanda petik, maka dianggap sebagai operator,
sedangkan bila di dalam dianggap sebagai bagian dari teks dan ditampilkan apa adanya.
<?php
echo "<b>Jurusan Matematika\nUniversitas Negeri Malang</b>";
echo "\tMoto:\"The Learning University\"";
?>
Penggunaan ”\"” dan ”\'” adalah untuk menampilkan karakter petik tunggal atau ganda,
karena bila tidak diberi tanda backslash maka akan dianggap sebagai pembatas teks yang
akan ditampilkan, dan mungkin menyebabkan error. Perhatikan contoh berikut ini:
<?php
// tidak error krn pembatasnya petik ganda
echo "Assalamu'alaikum";
// parse error krn pembatasnya petik tunggal
echo 'Assalamu'alaikum';
3.1.1. switch-case
Pernyataan ini juga digunakan untuk mengeksekusi satu dari beberapa blok pernyataan,
tergantung dari nilai ekspresi yang diuji. Pernyataan switch-case dapat dikatakan sebagai
penyederhanaan bentuk dari if-else jika terdapat banyak alternatif kondisi. Bentuk umum
pernyataan switch-case adalah sebagai berikut:
switch (variabel)
{ case nilai_1:
{ tindakan_1; break; }
case nilai_2:
{ tindakan_2; break; }
...
case nilai_n:
{ tindakan_n; break; }
default:
{ tindakan_default; }
}
Contoh:
<?php
switch ($status)
{ case "A":
{ $Bonus = 0.1 * $Gaji;
break; }
case "B":
{ $Bonus = 0.15 * $Gaji;
break; }
case "C":
{ $Bonus = 0.2 * $Gaji;
break; }
default:
{ $Bonus = 0;
3.2.1. while
Pernyataan ini digunakan untuk mengulang-ulang suatu blok pernyataan selama kondisi
yang disebutkan pada klausa while masih terpenuhi (selama bernilai TRUE). Pengulangan
eksekusi pernyataan ini bisa dipastikan banyaknya, bisa pula tidak (kasus perulangan tak
pasti). Bentuk umum pernyataan while adalah sebagai berikut:
while (kondisi)
{ pernyataan; }
Contoh berikut menunjukkan penggunaan while untuk melakukan perhitungan faktorial.
<?php
$n = 5;
$f = 1;
$b = 1;
while ($b <= $n)
{ $f *= $b; // $f = $f * $b
$b++;
}
echo "$n! = $f";
?>
Pada kasus tersebut kita bisa ketahui bahwa akan terjadi perulangan sebanyak $n kali
karena counter $b diawali dari 1 dan memiliki selisih (kenaikan nilai) sebanyak 1. While
sebenarnya lebih sesuai digunakan untuk kasus perulangan yang tidak bisa dipastikan berapa
kali berulang. Contoh kasusnya adalah untuk mencari FPB dengan algoritma Euclid.
<?php
$m = 9;
$n = 7;
while ($n != 0)
{ $r = $m % $n;
$m = $n;
$n = $r;
}
echo "FPB = $m";
?>
Kondisi yang disebutkan di klausa while bisa berupa satu kondisi atau gabungan
beberapa kondisi yang dihubungkan dengan operator relasional. Pastikan bahwa di dalam
perulangan itu kondisi yang disebutkan di while bisa menjadi false sehingga perulangan
berhenti. Perubahan menuju berhentinya kondisi itu dicantumkan di blok perintah yang
diulang (pada contoh di atas ada proses increment sehingga $b yang awalnya 1 pada
akhirnya akan melampaui $n sehingga kondisinya menjadi false dan perulangan berhenti).
3.2.3. for
Pada dua pernyataan sebelumnya, perulangan dilakukan selama kondisi tertentu masih
terpenuhi. Bergantung kasusnya, mungkin tidak diketahui berapa kali perulangan dilakukan.
Untuk perulangan pasti, lebih sesuai bila digunakan pernyataan for, dengan sintaks:
for (nilai_awal_counter; kondisi_perulangan; update_counter)
{ pernyataan;
}
Pada pernyataan for, ditentukan kondisi awal perulangan, kondisi agar perulangan
terus berlangsung, serta bagaimana pernyataan untuk menuju berhentinya perulangan.
Perulangan dikendalikan oleh counter. Nilai awal counter diperiksa sekali saja pada awal
iterasi. Pada setiap iterasi, dilihat apakah kondisi perulangan tetap terpenuhi. Eksekusi
pernyataan dilakukan selama kondisi perulangan terpenuhi. Penggantian nilai counter
dilakukan pada akhir iterasi, demikian seterusnya sampai perulangan berakhir (kondisi
3.4. break-continue
Keduanya bukan perintah pengulangan, tetapi untuk menghentikan perulangan atau
melanjutkan perulangan. Bila ditemukan break, maka perulangan dihentikan dan sisa
perintah di bawah break diabaikan. Sedangkan bila ditemukan continue maka sisa perintah
di bawah continue diabaikan tetapi perulangan dilanjutkan lagi untuk nilai selanjutnya.
<?php
for ($i = 1; $i <= 10; $i++)
{ if ($i == 7)
{ break; }
if ($i == 5)
{ continue; }
echo $i;
}
?>
Pada contoh tersebut, perulangan dilakukan mulai dari $i bernilai 1 dan selama $i
kurang dari atau sama dengan 10. Untuk setiap perulangan, program menampilkan nilai $i.
Yang ditampilkan oleh script itu adalah deretan bilangan 1, 2, 3, 4, 6. Pada saat $i bernilai 5
echo tidak dikerjakan karena melompat ke perulangan berikutnya ($i menjadi bernilai 6), dan
pada saat $i bernilai 7 perulangan diakhiri.
3.5. Praktikum
A. Penggunaan if
Kasus pertama adalah melakukan seleksi kelulusan. Setiap mahasiswa mengikuti 3 ujian
sehingga ada 3 skor ujian. Bila ada ujian yang tidak diikuti, maka skor ujiannya adalah 0 dan
pasti mendapat nilai E (tanpa mempertimbangkan skor ujian lainnya). Bila skornya lengkap,
maka dihitung rata-rata skornya dan ditentukan kelulusan dan nilai akhirnya. Ada
kemungkinan dia lulus dengan mendapat nilai A (rata-rata 85 sampai 100), B (rata-rata 70
sampai 84,9), C (rata-rata 50 sampai 69,9) dan kemungkinan tidak lulus dengan mendapat
nilai D (rata-rata di bawah 50).
1. Tuliskan kode berikut dalam editor PHP anda, lalu simpan filenya di dalam folder yang
anda buat, misal dengan nama skorlulus.php.
3. Amati apakah program sudah benar ataukah ada pesan kesalahan yang ditampilkan. Bila
ditemukan kesalahan penulisan, maka jenis kesalahannya ditampilkan dan nomor baris
pernyataan yang salah juga ditunjukkan. Umumnya kesalahan yang sering terjadi adalah
tanda petik atau tanda kurung yang tidak seimbang/tidak lengkap, kurang tanda titik
koma di akhir pernyataan, penulisan nama yang tidak konsisten, ada tambahan spasi di
nama variabel, dan nama variabel tidak diawali $. Kadang nomor baris yang ditunjukkan
bukanlah sumber kesalahannya sebenarnya, bisa jadi pernyataan/baris sebelumnya yang
salah sehingga berdampak pada pernyataan selanjutnya. Kadang juga kesalahan yang
sama menghasilkan pesan yang berbeda, tergantung pernyataan berikutnya yang ada.
Perbaikilah kesalahannya pada baris yang disebutkan, dan panggil kembali filenya dengan
cara seperti langkah 2. Lakukan ini sampai tidak ada kesalahan, dan program memberikan
hasil yang benar.
4. Coba ubah nilai variabel $skor1 atau $skor2 atau $skor3 secara langsung dalam script
B. Penggunaan for
Kasus kedua adalah menampilkan semua faktor dari suatu bilangan bulat positif dan
jumlah semua faktor tersebut. Faktor positif adalah semua bilangan bulat positif yang habis
membagi bilangan bulat positif lainnya. Untuk mengetahui apakah suatu bilangan habis
membagi bilangan lainnya maka gunakan fungsi sisa bagi (modulus), yang dalam PHP
menggunakan operator ‘%’. Bila sisa baginya 0 maka itulah faktornya. Di sini kita harus
memeriksa apakah setiap bilangan dari 1 sampai N (bilangan yang akan diketahui faktornya)
habis membagi N atau tidak. Penelusuran ini menggunakan perulangan for, dengan nilai awal
variabel perulangan adalah 1, kondisi perulangan adalah selama variabelnya <= N, dan
perubahan nilai variabelnya adalah +1.
1. Buat file baru, lalu tuliskan kode berikut:
Catatan
Berikut ini akan ditunjukkan perbedaan tampilan pesan kesalahan karena masalah yang
sama. Misal kode pada praktikum A tentang if diberi nomor baris sebagai berikut:
1 <?php
2 $skor1 = 70;
3 $skor2 = 55;
4 $skor3 = 0;
5 $ratarata = ($skor1 + $skor2 + $skor3) / 3;
6 if (($skor1 == 0) || ($skor2 == 0) || ($skor3 == 0))
7 { echo "Anda tidak lulus, nilai: E, skor: $ratarata ";
8 }
Semua contoh di bab 3 belum menggunakan input, nilai awal masih ditentukan secara
manual. Program dibuat untuk mengolah nilai input menjadi output. Pada aplikasi berbasis
web, input dilakukan dengan menggunakan form dan komponen. Informasi yang diisikan oleh
client selanjutnya dikirimkan ke server dan diolah lebih lanjut. Selain untuk input, form juga
bisa menjadi sarana untuk output suatu informasi.
4.1. Form
Form adalah wadah dari sejumlah komponen untuk interaksi antara klien dengan
aplikasi. Pada aplikasi berbasis web, form terletak dalam suatu halaman web. Melalui
komponen yang ada di form, klien bisa mengisikan informasi (dalam berbagai bentuk isian),
yang selanjutnya akan diberikan ke server untuk diolah. Bila anda melakukan registrasi
webmail, blog, atau lainnya dan anda diminta mengisikan informasi, saat itu anda
memanfaatkan form dan komponen. Konsep form di halaman web kurang lebih seperti form
yang ada pada bahasa pemrograman bergaya visual seperti Delphi atau Visual Basic.
Suatu halaman web bisa berisi lebih dari satu form, tetapi hanya satu form yang bisa
dikirimkan ke server pada satu saat. Sintaks HTML untuk mendeklarasikan form dalam suatu
halaman web adalah:
<form name="namaform" method="POST|GET" action="namafile">
name adalah nama form, method adalah cara pengiriman isian form ke aplikasi yang
memproses, dan action adalah nama file PHP yang memproses data dari pengguna. Bila
dipilih method POST maka data isian disertakan dalam header HTTP (header berisi permintaan
suatu halaman tertentu di server oleh pengguna), sedangkan GET akan menyertakan data
dalam URL (bisa dilihat dalam address bar di browser). POST memiliki kelebihan dari GET,
selain menyembunyikan isian pengguna juga bisa menangani data dalam jumlah yang lebih
banyak. Pengolahan hasil input (oleh yang disebutkan dalam action) bisa dilakukan dalam
file yang terpisah atau dalam file yang sama dengan pendefinisian komponen dan formnya.
Pengiriman data dilakukan pada saat user menekan tombol Submit. Browser akan
mengirimkan semua isian yang ada di setiap komponen ke file yang disebutkan di atribut
action dengan metode GET atau POST (sesuai yang didefinisikan di method). Di file yang
dituju, semua isian yang dikirimkan akan diambil lalu diolah lebih lanjut. Dengan
menggunakan Submit, browser memuat hasil eksekusi file yang tersebut di action, dan
menimpa tampilan sebelumnya. Kejadian menimpa ini dinamakan dengan reload. Ada cara
untuk menghindari proses reload, antara lain dengan menggunakan Ajax. Kedua cara dengan
menggunakan reload dan tanpa reload, akan dibahas pada bagian ini.
Setiap komponen memiliki nama, yang ditunjukkan melalui atribut name. Atribut id
digunakan untuk memberi identitas komponen, fungsinya sebenarnya sama dengan name.
Atribut name digunakan untuk pengolahan dengan PHP atau bahasa script lainnya, sedangkan
4.2.1. Text
Text adalah komponen untuk memasukkan input berupa suatu teks alfanumerik,
misalnya untuk isian nama, umur, dan alamat. Teks yang diisikan hanya sebaris. Gambar 4.1.
menunjukkan contoh halaman yang menggunakan komponen text untuk entry data. Anda
bisa menggunakan Dreamweaver untuk menghasilkan kode HTMLnya, atau menggunakan
editor teks untuk memasukkan kodenya.
Untuk lebih jelasnya, lihat contoh kode HTML berikut ini untuk Gambar 4.1. Tabel
digunakan untuk meluruskan posisi komponen (bukan merupakan keharusan). Kalau anda
menggunakan aplikasi desain web seperti Dreamweaver, kodenya mungkin sedikit berbeda.
Praktikum 4.4: Menambahkan kode untuk mengambil isi komponen radio (file:
prosesdata.php)
<?php
... // kode lainnya
$alamat = $_GET['alamat'];
$jenkel = $_GET['jk'];
... // kode lainnya
echo "Jenis kelamin: $jenkel <br/>";
?>
Bila pilihannya banyak, bisa kita gunakan komponen Select (drop-down list) untuk
menyembunyikan item pilihan dan hanya menampilkannya ketika diakses. Sebagai contoh
Nama komponen untuk pengisian data nama bulan adalah “bln”. Di deklarasinya ada
properti size yang digunakan untuk menentukan jenis atau sifat komponen. Bila size
bernilai 1, maka komponen akan bersifat sebagai combobox, sedangkan nilai lebih besar dari
itu akan menghasilkan komponen yang bersifat sebagai listbox. Isian yang ditampilkan
ditentukan melalui elemen <option>. Yang penting adalah harus ada properti value yang
Sebenarnya elemen select bisa menerima 1 atau lebih pilihan. Bila elemen (sebagai
combo atau listbox) hanya diatur menerima 1 pilihan, cara pengambilannya sama dengan
elemen lain yaitu dimasukkan ke dalam satu variabel tunggal. Kode dari file prosesdata.php
bisa disesuaikan menjadi sebagai berikut:
Praktikum 4.6: Menambahkan kode untuk mengambil isi komponen select (file:
prosesdata.php)
<?php
... // kode lainnya
$tempat = $_GET['tempat'];
$tanggal = $_GET['tgl'];
$tahun = $_GET['thn'];
$bulan = $_GET['bln'];
... // kode lainnya
echo "Tempat/tanggal lahir: $tempat, $tanggal-$bulan-$tahun <br>";
?>
4.2.3. Textarea
Komponen text hanya bisa menerima sebaris teks. Untuk keperluan isian teks yang lebih
dari sebaris, misalkan mengisi komentar, perlu komponen pengisian lain yaitu Textarea.
Contoh kode penggunaan textarea dalam form:
Atributnya adalah cols dan rows yang digunakan untuk mengatur ukuran lebar (dalam
karakter) dan tinggi baris. Secara default, fontnya berjenis fixed (biasanya adalah Courier
New). Modifikasi yang dilakukan untuk formproses.php adalah berikut ini (tercetak tebal):
Praktikum 4.10: Menambahkan kode untuk mengambil isi komponen text area
(file: prosesdata.php)
<?php
... // kode lainnya
$komentar = $_GET['komentar'];
... // kode lainnya
echo "Komentar: $komentar <br />";
?>
Misal diisikan sejumlah isian dan tiga baris teks di dalam textarea sebagai berikut:
Halo
Apa
Kabar
Setelah submit, lihatlah value yang dikirimkan form melalui address bar:
http://localhost/pronet/prosesdata.php?nim=1234&nama=Joko&alamat=Malan
g&jk=L&tempat=Malang&tgl=12&bln=3&thn=1997&hobi%5B%5D=Membaca&hobi%5B%
5D=Nonton+TV&komentar=Halo%0D%0AApa%0D%0AKabar&Submit=Submit
Tampak elemen dengan nama “komentar” memiliki nilai Halo%0D%0AApa%0D%0AKabar.
Nilai “%OD” adalah karakter ASCII yang menyatakan carriage return (disingkat CR), yaitu
mengarahkan kursor ke awal baris. Nilai “%OA” adalah line feed (disingkat LF, ada yang
menyebut sebagai new line yang disingkat dengan NL), yaitu mengarahkan kursor ke baris
baru. Pasangan CRLF digunakan untuk menyatakan pergantian baris teks dan memulai
penulisan dari karakter pertama di baris baru (ini terminologi yang dibuat di awal
diciptakannya komputer dan ketika mesin ketik manual masih digunakan).
Perhatikan output dari prosesdata.php, terlihat bahwa PHP tidak langsung bisa
mengenali adanya karakter CRLF sehingga teks ditampilkan dalam 1 baris. Untuk
Pada bab II telah disebutkan bahwa secara umum tipe data terbagi menjadi tipe data
skalar (variabelnya hanya bisa menyimpan satu nilai) dan tipe data gabungan (variabelnya
bisa menyimpan lebih dari satu nilai dalam satu waktu). Ada dua tipe dalam tipe gabungan
yaitu Array dan Object, tetapi yang akan dibahas kali ini adalah array saja. Konsep tentang
array sama dengan yang ada di bahasa pemrograman pada umumnya, yaitu bahwa variabel
berjenis array bisa menyimpan banyak nilai sekaligus dan masing-masing nilai terletak pada
elemen dengan nomor indeks tertentu.
Dalam PHP, ada dua macam array: enumerated array dan associative array.
Keduanya dibedakan dari bentuk indeks elemennya. Kelebihan array di PHP bila dibandingkan
dengan bahasa lain adalah tidak perlu mendeklarasikan ukuran array, dan array bisa
menampung data dengan tipe string dan numerik sekaligus (tidak hanya satu tipe seperti
array pada umumnya).
Untuk key asosiatif, pada dasarnya sama dengan contoh key yang numeris. Perhatikan
contoh berikut:
<?php
// contoh pertama: array dg key berupa konstanta
$harga[kacang] = 1000;
$harga[emping] = 3000;
$harga[kripik] = 1500;
$harga[soto] = 6000;
$kota["BL"] = "Blitar";
?>
Yang membedakan dengan array di bahasa pemrograman lainnya, penambahan elemen
bisa saja tidak memperhatikan nomor indeks elemen terakhir, yaitu dengan memberikan
nomor yang ”meloncat” atau bisa juga tanpa menyebutkan nomor indeksnya. Contohnya
sebagai berikut:
$minuman[10] = "Air putih";
$minuman[] = "Teh manis";
”Air putih” akan menempati elemen dengan indeks nomor 10 (indeks nomor 6 sampai 9 tidak
ada di array), sedangkan ”Teh manis” akan menempati elemen setelah elemen terakhir
(menjadi elemen dengan nomor indeks 11). Banyaknya elemen di $minuman hanya 7 elemen
(pada indeks 0,1,2,3,4,5,10).
Untuk mengacu elemen tertentu, harus menyebutkan indeksnya, misalkan pada
assignment di atas atau untuk menampilkan isi elemen, sebagai berikut:
<?php
$minuman[3] = "Juice Mangga";
echo "Menu saat ini: $makanan[1]<br>";
echo "Harga kacang: $harga[kacang]<br>";
echo "Ibukota Jawa Timur: $ibukota["Jatim"]<br>";
?>
Untuk array berdimensi dua dan seterusnya (multidimensi) digunakan cara yang serupa,
seperti contoh berikut:
<?php
// contoh pertama: key dengan nilai numerik
$aNilai[0][0] = 90; $aNilai[0][1] = 83; $aNilai[0][2] = 78;
$aNilai[1][0] = 83; $aNilai[1][1] = 76; $aNilai[1][2] = 71;
echo 'Nilai anda: '.$aNilai[1][1];
<ol>
<?php // contoh untuk array asosiatif
foreach ($ibukota as $kota)
{ echo "<li>".$kota."</li>";
}
?>
</ol>
Perhatikan potongan kode berikut untuk mendefinisikan isi array $makanan.
$makanan[0] = "Nasi Pecel";
$makanan[1] = "Tahu Campur";
$makanan[2] = "Soto Ayam";
$makanan[3] = "Gado-gado";
$makanan[10] = "Rujak cingur";
Hanya ada 5 elemen di array $makanan, elemen ke 4 sampai 9 tidak ada. Pernyataan for
yang menghendaki keterurutan indeks elemen tidak bisa digunakan karena nomor indeks 4
tidak dikenali di array $makanan. Gunakan foreach untuk keadaan seperti ini.
Cara ketiga adalah khusus untuk array asosiatif, yaitu menggunakan variabel yang
dicantumkan dalam foreach, dalam bentuk pasangan key dan value (berarti harus digunakan
dua variabel untuk menampung kedua hal itu). Bentuk umum sintaksnya:
foreach (array as key=>value)
{ pernyataan;
}
Berikut contoh penggunaan untuk array asosiatif satu dimensi, dengan mengambil
contoh array $ibukota yang didefinisikan sebelumnya. Setiap elemen array $ibukota terdiri
dari key (sebagai indeks) dan value yang tersimpan dalam elemen array.
<?php
foreach($ibukota as $prop=>$kota)
{ echo "Propinsi: $prop, Nama ibukota: $kota<br>";
}
?>
// menggabungkan array
$gabung=array_merge($makanan, $minuman);
// mengurutkan array
sort($gabung);
foreach($gabung as $menu)
{ echo "$menu<br>";
}
Ada komponen yang dibahas di sini karena sifatnya bisa menerima banyak isian
sekaligus, yang harus ditangani dengan array.
5.6.1. Checkbox
Untuk data yang tersedia pilihannya tetapi tidak ada batasan pemilihan (misalkan isian
hobi dimana seseorang bisa memiliki lebih dari satu hobi atau tidak samasekali), bisa
Nama komponennya adalah “hobi”. Perhatikan bahwa karena nanti komponen hobi bisa
terisi dengan beberapa pilihan maka tambahkan tanda ‘[]’ di belakang namanya. Kalau tidak
ditambahkan tanda ‘[]’ maka yang terbaca hanya opsi yang terakhir kali diisikan. Sama halnya
dengan radio, atribut id juga harus memiliki nilai yang berbeda antar komponennya.
Modifikasi yang dilakukan untuk prosesdata.php adalah sebagai berikut (yang tercetak tebal):
Untuk menyatakan bisa menerima lebih dari 1 pilihan, maka ada atribut multiple pada
elemen <select>. Seperti halnya dengan checkbox, nama komponen juga harus diakhiri oleh
‘[]’. Pemilihan dilakukan dengan menekan tombol Ctrl dan click mouse.
Variabel yang menerima isian dari komponen select juga berupa array. Contoh untuk
sekedar menampilkan item yang dipilih pengguna:
Praktikum 5.4: Menambahkan kode untuk mengambil isi komponen select (file:
prosesdata.php)
<?php
... // kode lainnya
$aKonsen = $_GET['konsen'];
... // kode lainnya
echo "Konsentrasi favorit:<br>";
foreach($aKonsen as $konsen)
{ echo "* $konsen<br />";
}
?>
Isi komponen bisa diatur isinya dengan memanfaatkan script PHP, dengan
memanfaatkan array asosiatif, misalnya menentukan nama bulan:
... (kode lainnya)
<tr>
<td>Tempat/tanggal lahir:</td>
<td><input type="text" name="tempat" id="tempat" size="20">,
<input type="text" name="tgl" id="tgl" size="8">
<select name="bln" id="bln" size="1">
<?php
$bulan = array(1 => "Januari", 2 => "Pebruari", 3 => "Maret",
4 => "April", 5 => "Mei", 6 => "Juni", 7 => "Juli", 8 => "Agustus",
9 => "September", 10 => "Oktober", 11 => "Nopember",
12 => "Desember");
foreach($bulan as $bl=>$nm)
{ echo "<option value=\"$bl\">$nm</option>\n";
}
6.1. Persyaratan
Untuk menggunakan bootstrap, halaman harus memuat library dalam bentuk file offline
(diletakkan pada home directory tempat halaman web berada) atau secara online (dengan
mengakses situs tertentu yang menyediakan file library bootstrap). Cara kedua harus
menggunakan koneksi internet, dan dikenal dengan CDN (Content Delivery Network).
Persyaratan lain halaman HTML yang menggunakan bootstrap harus memenuhi struktur
tertentu. Berikut struktur minimal dokumen HTML yang memuat bootstrap:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Ketiga meta tags harus ada di head; isi lain setelahnya -->
<title>Contoh Bootstrap </title>
<!-- Bootstrap -->
<link href="path_ke/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js untuk dukungan IE8 thd elemen HTML5
dan media -->
<!--[if lt IE 9]>
Ada 4 kelas yang disediakan, disesuaikan dengan device-nya: .col-xx (extra small),
.col-sm-xx (small), .col-md-xx (medium), .col-lg-xx (large) dan .col-xl-xx (large).
xx adalah angka yang menunjukkan ukuran kolom (nilainya 1 sampai 12). Contoh:
<div class="container">
<div class="row">
<div class="col-md-4">.col-md-4< /div>
<div class="col-md-4">.col-md-4< /div>
<div class="col-md-4">.col-md-4< /div>
</div>
<div class="row">
<div class="col-md-3">.col-md-3< /div>
<div class="col-md-3">.col-md-3< /div>
<div class="col-md-3">.col-md-3< /div>
<div class="col-md-3">.col-md-3< /div>
</div>
<div class="row">
<div class="col-md-6">.col-md-6< /div>
<div class="col-md-6">.col-md-6< /div>
</div>
<div class="row">
<div class="col-md-8">.col-md-8< /div>
<div class="col-md-4">.col-md-4< /div>
</div>
</div>
<div class="container"> adalah wadah semua <div> lainnya. Untuk menyatakan 1 baris
tampilan, digunakan <div class="row"> (mengemas sejumlah kolom). Pada setiap baris
didefinisikan <div> lain yang berfungsi sebagai kolom dengan class yang menunjukkan lebar
kolomnya. Definisi kelas yang disebutkan akan berlaku untuk device yang disebutkan dan
kelas di atasnya, tapi tidak di bawahnya. Contoh di atas berlaku untuk medium, large, dan
extra large devices, tetapi tidak untuk small dan extra small.
Bila didefinisikan kolom untuk extra small device kemudian ditampilkan di large device,
ukurannya akan menyesuaikan (melebar), tetapi tidak sebaliknya.
Bila lebar kolom tidak disebutkan, maka kolom dalam satu baris ditentukan secara
otomatis memiliki lebar yang sama. Contoh berikut berlaku untuk semua jenis device, yang
membagi satu baris menjadi tiga kolom dengan lebar yang sama (33,3%).
<div class="row">
<div class="col">col</div>
<div class="col">col</div>
<div class="col">col</div>
</div>
Untuk mengantisipasi tampilan yang dibuka di perangkat yang berbeda, digunakan
multiple classes (definisi lebih dari 1 kelas pada elemen yang sama) seperti contoh berikut ini:
<!-- Lebar kolom adalah 100% dan 50% pada mobile (2 baris) serta 60%
dan 40% pada desktop (1 baris) -->
<div class="row">
<div class="col-12 col-md-8">.col-12 .col-md-8</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
</div>
<!-- Lebar kolom adalah 50% pada mobile (2 baris) dan 33.3% pada
desktop (1 baris) -->
<!-- lebar kolom adalah 50% pada mobile dan desktop -->
<div class="row">
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
</div>
<!-- lebar kolom selalu 50% pada mobile dan desktop -->
<div class="row">
<div class="col-6">.col-6</div>
<div class="col-6">.col-6</div>
</div>
Ini adalah tampilan bila dibuka di medium device. Baris pertama ada 2 kolom dengan
lebar masing-masing 8 dan 4. Tetapi pada baris pertama juga didefinisikan lebar bila dibuka di
small device yaitu 12 dan 6. Karena 12+6 = 18 > 12 maka kolom kedua baris pertama akan
ditampilkan pada baris berikutnya.
Penjelasan dan contoh yang cukup lengkap bisa dilihat di
https://www.w3schools.com/bootstrap4/ dan https://getbootstrap.com/docs/4.3/getting-
started/introduction/
<script src="jquery-3.3.1.min.js"></script>
<script src="boostrap/js/bootstrap.min.js"></script>
</body>
</html>
Setiap pasangan label (teks) dan komponen dikemas dalam <div> dengan kelas
.form-group dan .row untuk menyatakan form horizontal. Pada form ini lebar label diatur
selebar 2 kolom, 10 kolom sisanya untuk komponen pengisian. Komponen <label> (teks awal
setiap komponen) menggunakan kelas .col-form-label.Radio dan checkbox dikemas dalam
wrapper yang sama yaitu kelas .form-check. Input menggunakan kelas .form-check-input
dan label (teks) menggunakan kelas .form-check-label. Yang baru adalah pengaturan
submit yang menggunakan kelas .offset-md-2. “offset” adalah untuk menggeser kolom ke
kanan selebar satuan tertentu.
Untuk button, bisa digunakan <a> (dipasangkan dengan atribut role), <input> atau
<button> yang dikenai kelas .btn, diikuti kelas lain untuk menyatakan jenis button dan
ukurannya. Jenis style button ada 9 macam: btn-primary, btn-secondary, btn-success,
btn-danger, btn-warning, btn-info, btn-light, btn-dark, dan btn-link. Ukuran
button ada 2 macam: .btn-lg, dan .btn-sm. Contoh penggunaannya:
<a href="#" class="btn btn-info" role="button">Link Button</a>
<button type="button" class="btn btn-info">Button</button>
<input type="button" class="btn btn-info" value="Input Button">
<input type="submit" class="btn btn-info btn-lg" value="Submit
Button">
Proses sinkron tidak bisa dihindari, misalnya saat berpindah ke halaman baru melalui
suatu hyperlink. Akan tetapi cara ini terasa kuno karena aplikasi terus beragam jenisnya dan
kebutuhan data pada satu saat yang sama semakin banyak. Bila anda punya akun facebook,
bukalah wall anda. Tanpa anda perintahkan, isi timeline berubah ketika ada posting baru dari
teman anda. Tanpa diperintahkan, isi iklan berganti sendiri, isi aktifitas teman berubah. Tidak
ada perintah untuk memulai menampilkan update kegiatan itu. Siapa yang melakukan?
Contoh lain adalah ketika anda mengisikan satu karakter di mesin pencari google, maka ada
suggested words yang diberikan. Bagaimana bisa muncul?
Perhatikan Gambar 7.2, pada saat diperlukan request ke server maka halaman yang
terbuka saat itu meminta script bekerja mengirimkan request-nya. Response dari server
diterima oleh script (melalui callback function), yang kemudian mengolah hasil response dan
melakukan update sebagian isi halaman. Jadi tidak ada halaman baru dan reloading seperti
yang dilakukan pada komunikasi sinkron. Callback function adalah script di client yang
menerima data response dan mengolahnya (dalam hal ini meng-update tampilan).
Satu teknologi yang memungkinkan terjadinya proses asinkron ini adalah Ajax. Istilah
AJAX diutarakan oleh Jesse James Garrett pada 2005 sebagai singkatan dari Asynchronous
JavaScipt and XML (walaupun teknologi semacam ini sudah muncul sebelumnya). Engine Ajax
7.2. JQuery
jQuery adalah library yang dibangun dari JavaScript dan menyediakan berbagai macam
tools dan fungsi antara lain untuk tampilan, penyediaan berbagai widget untuk menambah
fungsionalitas suatu page, penanganan berbagai event, animasi, dan komunikasi client-server
secara sinkron maupun asinkron. Khusus untuk keperluan komunikasi asinkron, jQuery sudah
menyediakan fasilitas Ajax.
function doSomething()
{ // tulis kode di sini,
Praktikum 7.1: Membuat kode jQuery untuk submit data (file: formisi-bs-jq.php)
<body>
... // kode lainnya
</form>
<div id="hasil"></div>
<script src="jquery-3.3.1.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){ // bila page dimuat lengkap
$("#isian").submit(function(e){ // bila #isian melakukan submit
e.preventDefault(); // gagalkan submit oleh form
$.ajax({ // lakukan pemanggilan dg Ajax
type: "GET", // method
url: "prosesdata.php", // file yg dipanggil
data: $("#isian").serialize() // serialize data di form
})
.done(function(hasilProses) { // bila request sukses
$("#hasil").html(hasilProses); // tampilkan di #hasil
})
.fail(function(jqXHR, textStatus) { // bila request gagal
alert( "Request gagal: " + textStatus );
});
});
});
</script>
</body>
</html>
Penjelasan dari kode tersebut:
Library jQuery mengacu ke file jquery-3.3.1.min.js. Pastikan anda memiliki file library ini
(versi library bisa berbeda), sesuaikan dengan nama file yang anda miliki, perhatikan path
tempat file berada, dan pastikan filenya ada.
Keadaan ketika dokumen dimuat lengkap adalah menentukan kode yang harus dieksekusi
Coba jalankan, bila anda benar maka hasil pemanggilan prosesujian.php ditampilkan di
bawah form, sesuai dengan lokasi definisi elemen #hasil. Inilah contoh proses update
sebagian halaman oleh proses Ajax dengan menggunakan jQuery. Prosesnya sendiri belum
asinkron, nanti akan kita lihat pada contoh yang lain.
7.6. datePicker
Pada praktikum terakhir, pengisian tanggal dilakukan dengan menggunakan 3
HTML5 sebenarnya memiliki komponen input untuk data tanggal. Sayangnya komponen
ini tidak bisa ditampilkan di Firefox. Bentuk penulisan dan tampilan awalnya sama dengan
input untuk teks, tetapi memiliki tipe date.
<input type="date" name="tgl" id="tgl">
Contoh tampilan komponen date di Chrome:
Unduhlah file script SBAdmin dari alamat yang disebutkan itu, lalu ekstraklah ke dalam
home directory (nama folder default hasil ekstrak adalah “startbootstrap-sb-admin-2-gh-
pages”, sebaiknya diganti agar lebih ringkas, misal “mahasiswa”). Cobalah tampilkan file
index.html di browser.
File index.html berisi contoh semua fitur yang ada di SBAdmin. Pada sisi kiri ada sidebar
yang berisi sejumlah menu dan sub menu, di antaranya bagaimana menggunakan form,
komponen, tabel, utility lainnya. Di sisi atas ada header yang antara lain berisi link profil dan
notifikasi. Bagian tengah digunakan untuk isi utama halaman. Di sisi bawah dari bagian
tengah ada footer. Tidak semua fitur akan digunakan di kuliah ini karena waktu yang terbatas.
Template yang digunakan untuk pembahasan kuliah ini sudah disiapkan untuk dimodifikasi
lebih lanjut.
Struktur halaman di SBAdmin dapat dilihat di Gambar 8.3. Satu halaman dibagi menjadi
4 bagian: sidebar, header, isi utama, dan footer.
<div id="wrapper"> halaman
<ul class="navbar ..."> ... </ul> sidebar
<div id="content-wrapper">
<div id="content">
<nav class="navbar ..."> ... </nav> header
<div class="container-fluid"> ... </div> isi utama
</div>
<footer class="sticky-footer ..."> ... </footer> footer
</div>
</div>
Gambar 8.3. Struktur halaman dalam SBAdmin
File utama template yang digunakan dalam praktikum ini diambil dari file index.html dan
disederhanakan dengan menghapus beberapa menu dari sidebar, dan fitur notifikasi dari
header dan isi utama. Secara garis besar, kode HTML yang membentuk susunan di Gambar
8.3 ditunjukkan di kode Praktikum 8.1 (diambil bagian bodynya saja). File ini hanya sebagai
penjelasan, file aslinya bisa diunduh di link bahan kuliah yang telah disiapkan.
</div>
<!-- End of Main Content -->
</div>
<!-- End of Content Wrapper -->
</div>
<!-- End of Page Wrapper -->
</body>
Untuk keperluan file pendukung di praktikum ini (bootbox dan datepicker), copykan
folder datepicker dan folder bootbox yang telah digunakan di praktikum sebelumnya ke dalam
folder vendor sebagai folder yang disediakan SBAdmin untuk fitur pendukung. Bootstrap dan
jQuery tidak perlu dicopy karena telah dimiliki oleh SBAdmin. Satu hal lagi, SBAdmin
memerlukan koneksi Internet untuk menggunakan font teks. Page tetap bisa dibuka bila tidak
Pada file aslinya, file javascript yang diperlukan oleh halaman ini dimuat di akhir
halaman (tepat sebelum </body>). Padahal file tersebut diperlukan untuk eksekusi script di
tengah halaman, sehingga kalau menggunakan susunan aslinya akan timbul error karena
terbalik posisinya (definisi variabel dan fungsi yang diperlukan untuk eksekusi justru terletak
lebih akhir). Untuk itu semua pemanggilan script dipindah ke bagian <head> setelah
pemuatan file css. Carilah posisi yang sesuai, lalu sisipkan baris yang tercetak tebal berikut.
a. Query SQL
Untuk menyisipkan data baru ke dalam tabel, digunakan query INSERT INTO. Yang
penting diperhatikan adalah tipe data setiap field. Gunakan tanda petik untuk data string
(CHAR dan VARCHAR) dan date, serta tanpa petik untuk data numerik. Bentuk umum query
INSERT INTO adalah:
INSERT INTO <namatabel> [(<namafield> {, <namafield>})]
VALUES (<nilai> {, <nilai>}) | <pernyataan SELECT>;
Nama field bisa tidak dicantumkan bila kita yakin bahwa urutan dan banyaknya data yang
dimasukkan adalah sama dengan struktur tabel.
<script type="text/javascript">
$(document).ready(function(){
$('#tgl').datepicker({
format: 'dd-mm-yyyy',
$("#formisi").submit(function(e){
e.preventDefault(); // gagalkan proses aslinya
$.ajax({
url : "simpanmhs.php", // tujuan data
type : "POST", // cara kirim data
data : $("#formisi").serialize() // data yg dikirim
})
.done(function(hasil){
bootbox.alert({
title: "Hasil entry data",
message: hasil
});
})
.fail(function(q, textStatus) { // bila gagal
alert(textStatus); // tampilkan sbg alert
})
});
});
</script>
Pada kode tersebut tidak ada deklarasi <body> karena file ini akan disisipkan ke dalam
file default.php. Bila melihat kodenya, ada panel yang menjadi wadah semua komponen,
selebar container-nya. Di dalam panel terdapat form yang terbagi ke dalam 2 kolom: kolom
untuk judul isian dan kolom untuk komponen isian. Ada sejumlah komponen yang digunakan,
disesuaikan dengan struktur tabel yang dibuat (kecuali untuk field foto yang akan dikerjakan
selanjutnya). Isian untuk NIM, nama, tempat lahir, alamat menggunakan text, isian untuk
tanggal lahir menggunakan datepicker, isian untuk jenis kelamin menggunakan radio button
secara inline (sebaris), dan isian untuk prodi menggunakan select. Nama komponen untuk
masing-masing isian secara berurutan adalah nim, nama, alamat, jk (berisi Laki-laki dan
Perempuan; dengan nilai masing-masing L dan P), tempat, tanggal, dan prodi (berisi
sejumlah nilai yang merupakan kode prodi). Script untuk penanganan datepicker pada
dasarnya sama dengan yang digunakan di praktikum 7.3.
Kode jQuery untuk memanggil file script yang bertugas menyimpan data ke tabel basis
data, kurang lebih sama dengan kode yang dibahas pada bab 7. Kode jQuery ini diletakkan di
entrymhs.php karena kodenya hanya spesifik digunakan oleh file entrymhs.php.
Kode entrymhs.php dipanggil dari file default.php. Kode tidak dicopy ke dalamnya, tapi
dipanggil dengan menggunakan include(). Ubahlah kode di default.php menjadi berikut ini:
Pada definisi menu untuk input data mahasiswa, ditentukan kode <a class="
collapse-item" href="?kode=entry">Entry data</a>. Ini berarti link untuk
memanggil file yang sama (dalam hal ini adalah default.php), dengan menambahkan properti
URL “kode” dengan nilai “entry”. Itulah yang kemudian dilihat oleh script PHP. Variabel $kode
berisi GET dari properti kode. Bila nilainya sama dengan “entry” maka isi file entrymhs.php
disisipkan ke posisi itu. Cara ini nantinya akan digunakan untuk menyisipkan file lainnya.
Cobalah memanggil file default.php dan memastikan bahwa link ke input data mahasiswa bisa
bekerja dan form bisa ditampilkan. Bila ada, perbaiki semua kesalahan yang ada. Gunakan
fasilitas untuk debugging (pemeriksaan kesalahan) script Javascript dengan Firebug, atau
tools bawaan dari browser (Developer Toolbar pada Firefox atau Developer tools pada
Chrome).
Berikut kode file simpanmhs.php untuk mendapatkan data dari form dan
menyisipkannya ke tabel MAHASISWA. Pastikan tidak ada tag HTML di luar <?php .. ?>
untuk menghindari kesalahan tampilan, karena nanti akan digabungkan dengan file lain.
if (!$hasil)
{ echo "Error: " . mysqli_error($koneksi); // tampilkan pesan
}
else
{ echo "<table width='100%' border='0'>";
echo "<tr><td width='35%'>NIM:</td><td width='65%'>$nim</td>
</tr>";
echo "<tr><td>Nama:</td><td>$nama</td></tr>";
echo "<tr><td>Alamat:</td><td>$alamat</td></tr>";
echo "<tr><td>Tempat lahir:</td><td>$tempat</td></tr>";
a. Query SQL
Pencarian data dilakukan dengan query SELECT. Pencarian bisa didasarkan pada suatu
kondisi tertentu untuk mendapatkan data tertentu atau tanpa kondisi apapun untuk
mendapatkan semua data. Bentuk umum query SELECT adalah:
SELECT <namafield>{, <namafield>}
FROM <namatabel>
[ WHERE <kondisi> ];
Yang mengikuti klausa SELECT adalah nama field yang akan ditampilkan mengacu ke
nama field di tabel (urutannya bebas, tidak harus sama dengan struktur tabel), atau karakter
‘*’ yang mewakili pernyataan untuk mengambil semua field. Yang mengikuti klasa WHERE
adalah kondisi pencarian, sehingga record yang dihasilkan dipastikan sesuai dengan kondisi
yang disebutkan. WHERE diperlukan bila ingin mendapatkan record dengan kriteria tertentu.
Operasi SELECT mungkin tidak menghasilkan record apapun (bila tidak ada data yang
sesuai dengan kriteria pencarian atau bila tabelnya kosong), beberapa record yang sesuai
dengan kondisi pencarian, atau semua record dalam tabel (bila semua record sesuai dengan
kondisi pencarian, atau bila tidak menggunakan klausa WHERE). Seperti yang dijelaskan
sebelumnya, pernyataan mysqli_query() untuk query SELECT menghasilkan FALSE bila
</div>
<?php
if (isset($_GET['kode']))
{ $kode = $_GET['kode'];
if ($kode == 'entry')
{ include('entrymhs.php');
}
else if ($kode == 'browse')
{ include('browsemhs.php');
}
}
?>
Data mahasiswa ditampilkan dalam format standar dan semua record ditampilkan.
Tentunya akan jadi tabel yang sangat panjang bila ada banyak data di tabel basis data. Ingin
yang lebih baik? Gunakan library dari DataTables (https://datatables.net/), yang merupakan
plug-in jQuery. Dengan library ini, data bisa diurutkan per kolom, difilter melalui search box,
dan dibuat pagination (keseluruhan data dibagi menjadi beberapa halaman). SBAdmin telah
menyediakan librarynya (ada di folder “vendor”), tetapi belum dimuat di default.php.
Pertama kali, modifikasilah file default.php untuk memuat css dan js milik datatables.
Praktikum 8.10: Memuat file css dan js untuk datatables (file: default.php)
... // kode sebelumnya
<script src="vendor/datatables/jquery.dataTables.min.js"></script>
<script src="vendor/datatables/dataTables.bootstrap4.min.js">
</script>
</head>
<script type="text/javascript">
$(document).ready(function(){
var dataTable = $('#tblMahasiswa').DataTable( {
"processing": true,
"serverSide": true,
"bSort" : false,
"ajax":{
url :"getmhs.php", // json datasource
type: "post", // method , by default get
error: function(){ // error handling
$(".lookup-error").html("");
$("#tblMahasiswa").append('<tbody class="employee-grid-
error"><tr><th colspan="7">Data tidak
ditemukan</th></tr></tbody>');
$("#lookup_processing").css("display","none");
}
}
});
});
</script>
Apa yang ditampilkan kalau semua script dibuang? Pembacaan isi tabel mahasiswa akan
dilakukan pada script yang lain (dalam hal ini bernama getmhs.php). Pemanggilan script
getmhs.php dilakukan dari script jQuery pemanggilan datatables di default.php.
Tabel dengan id #tblMahasiswa selanjutnya dikenai method DataTables. Ada
beberapa atribut yang digunakan, antara lain serverSide yang menyatakan bahwa data
Praktikum 8.12: Membuat kode untuk membaca isi tabel (file: getmhs.php)
<?php
require 'koneksi.php';
$requestData = $_REQUEST; // dapatkan semua parameter pencarian
$jsonData = array(
"draw" => intval($requestData['draw']),
// suatu angka yg dikirim method DataTable(), dan dikembalikan
// lagi ke DataTable()
"recordsTotal" => intval($totalData), // banyak record di tabel
"recordsFiltered" => intval($totalFilter), // banyaknya record
hasil pencarian, jika tidak ada pencarian maka $totalFilter =
$totalData
"data" => $data // array berisi data yang ditemukan
);
echo json_encode($jsonData); // kirim data dalam format json
?>
Alur proses:
Semua request diambil dengan variabel global $_REQUEST, dimasukkan ke
$requestData. Ini adalah alternatif mendapatkan data, selain dengan $_POST atau
$_GET. $_REQUEST tidak membedakan method asalnya apakah POST atau GET, sehingga
lebih fleksibel.
Query yang pertama kali dieksekusi adalah untuk menghitung berapa banyak record dalam
tabel dengan menggunakan COUNT(*). Hasil query dimasukkan ke variabel $totalData
dan $totalFilter (keduanya saat ini bernilai sama karena pencarian dilakukan tanpa
kriteria apapun). Ini nantinya digunakan untuk antara lain untuk menghitung berapa
banyak halaman yang harus disediakan, bila diketahui berapa record per halaman.
Alternatif dari penggunaan COUNT(*) adalah menggunakan fungsi PHP mysql_num_rows
untuk menghitung banyaknya record hasil query.
3 parameter yang ada di $requestData diambil, yaitu dari
$requestData['search']['value'] (ke variabel $parameter), dari
$requestData['start'] (ke variabel $start), dan dari $requestData['length']
(ke variabel $length). Variabel $parameter berisi string yang ada di search box sebagai
Pada bagian atas tabel ada penentuan berapa banyak record per halaman (di sebelah
kiri atas), dan isian keyword filter (di sebelah kanan atas). Masukkan satu atau lebih huruf,
maka script akan menampilkan record yang mengandung keyword itu. Pada bagian bawah,
ditunjukkan total record yang ada serta record ke berapa yang sedang ditampilkan (di sebelah
kiri bawah), dan link ke halaman tertentu (di sebelah kanan bawah).
a. Query SQL
Data yang telah tersimpan di tabel bisa diubah dengan operasi UPDATE. Syaratnya
adalah kondisi record yang akan diubah harus ditentukan, karena bila tidak ada maka semua
record dalam tabel akan berubah. Bentuk umum query UPDATE:
UPDATE <namatabel>
SET <namafield>=<ekspresi> {, <namafield>=<ekspresi>}
[WHERE <kondisi>];
ekspresi adalah data baru yang akan direkam ke dalam field yang disebutkan di
namafield. kondisi adalah syarat penentuan record yang akan diubah. Banyaknya
ekspresi disesuaikan dengan banyaknya field yang akan diupdate.
Untuk mengetahui apakah perubahan berhasil atau tidak, bisa menggunakan function
mysqli_affected_rows(). Function ini akan menghasilkan berapa banyak record yang
terpengaruh oleh query itu.
$nestedData[] = $row[5];
$nestedData[] = '<a href="?kode=edit&nim='.$row[0].'"><button
type="button" class="btn btn-primary">Edit</button></a>';
$data[] = $nestedData;
Arahkan pointer mouse di atas setiap link, maka anda akan lihat nilai parameter yang
if (isset($_GET['page']))
{ ... // kode selanjutnya
else if ($kode == 'browse')
{ include('browsemhs.php');
}
else if ($kode == 'edit')
{ include('editmhs.php');
}
}
Praktikum 8.15: Membuat kode untuk menampilkan data tersimpan dan isian
untuk edit data (file: editmhs.php)
<?php
if (!isset($_GET['nim']))
{ die("<script>alert('Tentukan dulu data yang akan diubah!');
window.location.href = 'default.php?kode=browse'</script>");
}
$nim = $_GET['nim'];
require 'koneksi.php';
$sql = "SELECT * FROM Mahasiswa WHERE NIM='$nim'";
$hasil = mysqli_query($koneksi, $sql) or die("Error: ".
mysqli_error($koneksi));
if (mysqli_num_rows($hasil) == 0)
{ die("NIM $nim tidak ditemukan!");
}
$data = mysqli_fetch_row($hasil);
$aTgl = explode('-', $data[4]);
$tgl_lahir = "$aTgl[2]-$aTgl[1]-$aTgl[0]";
mysqli_close($koneksi);
?>
<div class="container">
<h1>Edit Data Mahasiswa</h1>
<div class="row">
<div>
<form method="GET" name="formedit" id="formedit">
<div class="form-group row">
<script type="text/javascript">
$(document).ready(function(){
$('#tgl').datepicker({
format: 'dd-mm-yyyy',
startDate: '01-01-2000',
todayBtn: 'linked',
autoclose: true
});
$("#formedit").submit(function(e){
e.preventDefault();
$.ajax({
type: "POST",
url: "simpaneditmhs.php",
data: $("#formedit").serialize()
})
.done(function(hasilProses) {
bootbox.alert({
title: 'Hasil edit data',
message: hasilProses,
callback: function(result){
window.location.href = "default.php?kode=browse";
}
});
})
.fail(function(jqXHR, textStatus) { // bila request gagal
alert( "Request gagal: " + textStatus );
});
Setelah dilakukan pengubahan data dan tombol Simpan data ditekan, maka perubahan
disimpan dalam tabel Mahasiswa. Manfaatkan kode dari simpanmhs.php sebelumnya untuk
membuat file simpaneditmhs.php berikut ini. Perbedaan terletak query SQL (lihat kode
yang tercetak tebal):
Praktikum 8.16: Membuat kode untuk menyimpan hasil edit data (file:
simpaneditmhs.php)
... // kode sebelumnya
if (!$hasil)
{ echo "Error: " . mysqli_error($koneksi); // tampilkan pesan
}
else if (mysqli_affected_rows($koneksi) == 0)
{ echo "Data tidak berubah";
}
else
{ echo "<table width='100%' border='0'>";
a. Query SQL
Data yang telah tersimpan di tabel tentunya juga bisa dihapus. SQL menyediakan
operasi DELETE. Bentuk umum query-nya:
DELETE FROM <namatabel>
[WHERE <kondisi>];
Bila WHERE tidak dicantumkan, maka seluruh record akan terhapus.
while($row = mysqli_fetch_row($hasil))
{ ... // kode selanjutnya
$nestedData[] = '<a href="?kode=edit&nim='.$row[0].'"><button
type="button" class="btn btn-primary">Edit</button></a>
<a href=" javascript:KonfirmasiHapus('.$row[0].');"><button
type="button" class="btn btn-danger">Delete</button></a>';
$data[] = $nestedData;
$counter++;
}
... // kode selanjutnya
Link “Hapus” diarahkan ke suatu function dengan nama KonfirmasiHapus(), dengan parameter
adalah NIM dari mahasiswa yang akan dihapus record-nya. Untuk bentuk linknya, sama
dengan untuk Edit yaitu berupa button.
Fungsi KonfirmasiHapus() diletakkan di browsemhs.php sebagai yang bertugas
menampilkan data mahasiswa. Letakkan kodenya diluar $(document).ready().
<script type="text/javascript">
function KonfirmasiHapus(x)
Klik pada button untuk menghapus salah satu data mahasiswa. Ketika link dipilih akan tampil
kotak konfirmasi untuk memastikan apakah record dihapus atau tidak. Bila dipilih OK maka
proses penghapusan dilakukan.
$("#formisi").submit(function(e){
e.preventDefault();
var namafile = $("#foto").val().toLowerCase();// ambil nama file
if (namafile.length == 0) // periksa apa ada yg diupload
{ bootbox.alert({
title: "Error",
message: 'Tidak ada file yang diupload !'
});
return false;
}
// ambil ekstensi file
var ext = namafile.substring(namafile.lastIndexOf('.')+1);
var aExt = ['jpg','jpeg','gif','png']; // ekstensi yg dibolehkan
if (aExt.indexOf(ext) == -1) // apakah ekstensi ada di array?
{ bootbox.alert({
title: "Error",
message: namafile + ' bukan file image !'
});
Praktikum 9.2: Membuat kode untuk menyimpan image ke suatu folder (file:
simpanmhs.php)
... // kode sebelumnya
$tgl_lahir = "$aTgl[2]-$aTgl[1]-$aTgl[0]";
$foto = $_FILES['foto']; // 'foto' adalah nama komponen file
$pesan = array(1=>'Ukuran file terlalu besar', 2=>'Ukuran file
terlalu besar', 3=>'Proses upload gagal', 4=>'Tidak ada file yang
diunggah', 6=>'Folder temporer tidak ada', 7=>'Gagal menulis ke
disk');
if ($foto["error"] > 0)
{ die("Error: ".$pesan[$foto["error"]]);
}
require("koneksi.php"); // buka koneksi dan database
$ext = pathinfo($foto['name'], PATHINFO_EXTENSION);
Praktikum 9.3: Membuat kode untuk menampilkan image di halaman edit data
(file: editmhs.php)
... // kode sebelumnya
$("#formedit").submit(function(e){
e.preventDefault(); // gagalkan submit oleh form
var namafile = $("#fotobaru").val().toLowerCase();//nama file
if (namafile != '' ) // jika ada file diunggah
{ var ext = namafile.substring(namafile.lastIndexOf('.')+1);
var aExt = ['jpg','jpeg','gif','png']; // ekstensi yg dibolehkan
// apakah file ada dan ekstensi ada di array?
if (aExt.indexOf(ext) == -1)
{ bootbox.alert({
title: "Error",
message: namafile + ' bukan file image !'
});
return false;
}
// cek ukuran file
var ukuran = $("#fotobaru")[0].files[0].size;
if (ukuran > 1048576)
{ bootbox.alert({
title: "Error",
message: 'Ukuran file lebih dari 1 MB !'
});
return false;
}
}
var formdata = new FormData($('#formedit')[0]); // isi form
$.ajax({
type: "POST",
url: "simpaneditmhs.php",
data: formdata, // serialize data di form
enctype: "multipart/form-data", // encoding type
processData: false,
contentType: false
})
.done(function(hasilProses) { // bila request sukses
$tgl_lahir = "$aTgl[2]-$aTgl[1]-$aTgl[0]";
require("koneksi.php"); // buka koneksi dan database
$fotoLama = $_POST['fotolama'];
$fotoBaru = $_FILES['fotobaru'];
$pesan = array(1=>'Ukuran file terlalu besar', 2=>'Ukuran file
terlalu besar', 3=>'Proses upload gagal', 4=>'Tidak ada file yang
diunggah', 6=>'Folder temporer tidak ada', 7=>'Gagal menulis ke
disk');
if ($fotoBaru["error"] == 4) // jika tidak ada yg diupload
{ $query = "UPDATE MAHASISWA SET Nama='$nama', Alamat='$alamat',
TempatLahir='$tempat', TanggalLahir='$tgl_lahir',
JenisKelamin='$jk', Prodi='$prodi' WHERE NIM='$nim'";
$namaFile = $fotoLama;
}
else if ($fotoBaru["error"] == 0) // jika tidak ada error
{ if (($fotoLama != '') && file_exists("upload/$fotoLama")) //
apakah file lama ada?
{ unlink("upload/$fotoLama"); // hapus file lama
}
$ext = pathinfo($fotoBaru['name'], PATHINFO_EXTENSION);
$namaFile = "$nim.$ext"; // tentukan nama file
// pindahkan file dari folder temporer ke folder upload
$hasil = move_uploaded_file($fotoBaru["tmp_name"],
"upload/$namaFile");
if (!$hasil)
{ die("Error: Gagal upload $namaFile ke server");
}
$query = "UPDATE MAHASISWA SET Nama='$nama', Alamat='$alamat',
TempatLahir='$tempat', TanggalLahir='$tgl_lahir',
JenisKelamin='$jk', Prodi='$prodi', Foto='$namaFile' WHERE
NIM='$nim'";
}
else
{ die("Error: ".$pesan[$fotoBaru["error"]]);
}
echo "<tr><td>Prodi:</td><td>$prodi</td></tr>";
if (mysqli_num_rows($hasil) == 0)
{ die("NIM $nim tidak ditemukan!");
}
$arData = mysqli_fetch_row($hasil);
$namaFile = $arData[7];
if (file_exists("upload/$namaFile")) // apakah file ada?
{ unlink("upload/$namaFile"); // hapus file lama
}
$sql = "DELETE FROM Mahasiswa WHERE NIM='$nim'";
$foto = $_FILES['foto'];
if ($foto["error"] > 0)
{ die("Error: " . $foto["error"]);
}
$tmpName = $foto['tmp_name']; // dapatkan nama file temporer
$fp = fopen($tmpName,'r'); // buka file temporer
$dataImage = fread($fp,filesize($tmpName)); // baca isi file
$dataImage = addslashes($dataImage); // tangani backslash
fclose($fp); // tutup filenya
unlink($tmpName); // hapus file temporer
Praktikum 9.7: Membuat kode untuk membaca data image dari tabel (file:
tampilfoto.php)
<?php
if (!isset($_GET['nim']))
{ die("Tentukan dulu NIM-nya! ");
}
$nim = $_GET['nim'];
require("koneksi.php");
$query = "SELECT foto FROM mahasiswa WHERE NIM='$NIM'";
$hasil = mysqli_query($koneksi, $query) or
die(mysqli_error($koneksi));
$data = mysqli_fetch_array($hasil);
if (empty($data[0]))
{ echo "<script>alert('Tidak ada foto yang terupload!') </script>";
}
else
{ header("Content-type: image/jpeg");
echo $data[0];
}
?>
Mula-mula dicari dulu record mahasiswa sesuai dengan NIM yang dikirimkan. Bila data
ada dan ada image yang tersimpan maka akan dibentuk output berupa image bertipe jpeg
(asumsi: yang diunggah adalah image bertipe jpeg). Output adalah isi field foto. Untuk
mengantisipasi kesalahan maka isi field foto ($data[0]) dilihat apakah kosong atau tidak.
Bila kosong maka akan ada pesan yang ditampilkan.
Isi field foto ditampilkan sebagai image, ini ditandai dengan definisi header bahwa
content bertipe image/jpeg. Konsekuensinya, jangan memberi kode apapun sebelum <?php,
dan setelah ?> karena akan terikut sebagai output, yang justru menyebabkan data tidak
dikenal sebagai data image.
Dengan demikian, kelebihan cara penyimpanan image ke dalam tabel adalah semua
foto tersimpan di tabel. Konsekuensi dari penyimpanan data adalah ukuran file tabel yang
menjadi besar. Tetapi penamaan file tidak menjadi masalah karena record penyimpanan yang
berbeda.
Untuk proses edit dan penghapusan data, silahkan disesuaikan sendiri. Yang pasti, tidak
ada pemeriksaan keberadaan file dan penghapusan file seperti halnya upload image ke folder.