kan akhir baris jika perlu. File data untuk tabel
Inventaris mungkin terlihat seperti ini:
Rock<TAB>Classic<TAB>Steely Dan<Tab>Aja<Tab>10.99
RockTAB>Pop<TAB>Semisonic<Tab>All About
Chemistry<Tab>11.99
Rock<TAB>Classic<TAB>Beatles<TAB>Abbey Roa d<Tab>9.99
File data dengan tab di antara field adalah file yang dibatasi tab. Format umum lainnya adalah
file yang dipisahkan koma, di mana koma memisahkan field. Jika data kita dalam format file
lain, kita perlu mengonversinya menjadi delimit file. Untuk mengonversi data dalam format
file perangkat lunak lain menjadi delimit file, periksa manual untuk perangkat lunak tersebut
atau bicarakan dengan pakar lokal yang memahami format data saat ini . Banyak program,
seperti Excel, Access, dan Oracle, memungki nkan kita untuk membuat data ke dalam delimit
file. Untuk file teks, kita mungkin dapat mengonversinya ke delimit format dengan
memakai fungsi search-and-replace dari editor atau pengolah kata. Untuk file yang
benar-benar merepotkan, kita mungkin perlu mencari bantuan ahli atau programmer yang
lebih berpengalaman.
Anda dapat mengosongkan field dalam file data dengan menyertakan separator field
tanpa data di antaranya. Jika field tidak didefinisikan sebagai NOT NULL, field tersebut kosong.
Jika field didefinisikan sebagai NOT NULL, pemuatan file data gagal dan pesan kesalahan
dikembalikan. Jika salah satu field adalah field AUTO_INCREMENT, seperti field SERIAL, kita
dapat mengosongkannya dan MySQL akan memasukkan nilai AUTO_INCREMENT. Misalnya,
file data berikut berisi data yang akan dimuat ke tabel Pelanggan.
,Prakasa,Andi,,Austin,TX,88888,,,
,Contrary,Mary,,Garden,ID,99999,,,
,Sprat,Jack,,Pumpkin,NY,11111,,,
File data ini dibatasi koma. Setiap baris dimulai dengan koma, membiarkan field
pertama kosong untuk field ID pelanggan, yaitu SERIAL. Field lain di baris juga kosong dan akan
75
Manajemen Database MySQL
kosong di database sesudah file data dimuat. Pernyataan SQL yang membaca data dari file teks
adalah LOAD. Bentuk dasar dari pernyataan LOAD adalah:
LOAD DATA INFILE “path/datafilename” INTO TABLE tablename
Pernyataan memuat data dari file teks yang terletak di server Anda. Jika nama file tidak
menyertakan jalur, MySQL mencari file data di direktori tempat file definisi tabel Anda, yang
disebut namatabel.frm, berada. Secara default, file ini terletak di direktori bernama database
Anda, seperti direktori bernama CustomerOrderInformation. Direktori ini terletak di direktori
data Anda, yang terletak di direktori utama tempat MySQL diinstal. Misalnya, jika file bernama
data.dat, status LOAD mungkin mencari file di C:\ Program Files\ MySQL\ MySQL Server
5.0\ data\ CustomerOrderInformation\ data.dat. Bentuk dasar dari pernyataan LOAD dapat
diikuti oleh frase opsional jika kita ingin mengubah pembatas default. Pilihannya adalah:
FIELDS TERMINATED BY ‘character’
FIELDS ENCLOSED BY ‘character’
LINES TERMINATED BY ‘character’
Misalkan kita memiliki file data untuk tabel Pelanggan, kecuali bahwa field dipisahkan oleh
koma, bukan tab. Nama file data adalah customer.dat, dan terletak di direktori yang sama
dengan database. Pernyataan SQL untuk membaca data ke dalam tabel adalah:
LOAD DATA INFILE “customer.dat” INTO TABLE Customer FIELDS TERMINATED BY ‘,’
Untuk memakai pernyataan LOAD DATA INFILE, akun MySQL harus memiliki privileges
FILE di host server. Kita membahas privileges akun MySQL. Kita juga dapat memuat data dari
file teks di komputer lokal kita dengan memakai kata LOCAL, sebagai berikut:
LOAD DATA LOCAL INFILE “path/datafilename” INTO TABLE tablename
Anda harus menyertakan jalur ke file. Gunakan garis miring untuk jalur, bahkan di komputer
Windows, seperti "C:/data/datafile1 .txt". Jika kita mendapatkan pesan kesalahan saat
mengirim pernyataan ini, LOCAL mungkin tidak diaktifkan. Lihat
http://dev.mysql.com/doc/refman/5.1/en/load-data.html untuk informasi lebih lanjut
tentang kata kunci LOCAL.
Untuk melihat data yang kita muat — untuk memastikan bahwa itu benar — gunakan
kueri SQL yang mengambil data dari database. Kita menjelaskan jenis kueri SQL ini secara rinci
di bagian selanjutnya. Singkatnya, gunakan kueri berikut untuk melihat semua data dalam
tabel sehingga kita dapat memeriksanya:
SELECT * FROM Customer
Melihat Data dalam Database
sesudah data dimasukkan ke dalam database, kita mungkin ingin menelusuri data untuk
melihat apakah data yang dimasukkan terlihat benar atau untuk mendapatkan gambaran
76
Manajemen Database MySQL
tentang tipe data apa yang ada dalam database. Kita juga bisa menelusuri data untuk
menentukan informasi sederhana tentang database, seperti berapa banyak catatan yang
dikandungnya. Kita dapat melihat semua data dalam tabel dengan kueri berikut:
SELECT * FROM tablename
Kueri ini mendapatkan semua data dari tabel. Kita dapat mengetahui berapa banyak catatan
dalam tabel dan mendapatkan gambaran umum tentang data dengan menelusuri output. Kita
bisa melihat persis berapa banyak catatan dalam tabel dengan kueri berikut:
SELECT COUNT(*) FROM tablename
Kueri ini menampilkan jumlah record yang terdapat dalam tabel.
Mengambil Informasi dari Database
Satu-satunya tujuan menyimpan informasi adalah menyediakannya saat kita
memerlukan nya. Sebuah database hidup untuk menjawab pertanyaan. Produk apa yang
dijual? Siapa pelanggannya? Berapa banyak pelanggan yang tinggal di Indonesia? Apa yang
dibeli pelanggan? Banyak pertanyaan dijawab dengan mengambil data dari database.
Misalnya, untuk mengetahui berapa banyak pelanggan yang tinggal di Indonesia, kita dapat
mengambil semua catatan pelanggan di mana field bernama negara berisi IN. Sangat sering,
kita mengajukan pertanyaan semacam ini dalam skrip PHP dan menampilkan jawabannya di
halaman web. Dalam skrip PHP, kita dapat mengambil semua catatan untuk pelanggan
Indonesia dan menampilkan daftar nama dan alamat mereka di halaman web. Untuk
menjawab pertanyaan spesifik, kita memakai kueri SELECT. Kita dapat mengajukan
pertanyaan yang tepat, kompleks, dan terperinci dengan kueri SELECT. Kueri SELECT yang
paling sederhana adalah:
SELECT * FROM tablename
Kueri ini mengambil semua informasi dari tabel. Tanda bintang (*) adalah wildcard yang
berarti semua kolom. Kueri SELECT bisa jauh lebih selektif. Kata dan frasa SQL dalam kueri
SELECT dapat menunjukkan informasi yang diperlukan untuk menjawab pertanyaan Anda.
Berikut adalah beberapa trik yang dapat kita lakukan untuk membuat kueri SELECT:
• Anda hanya dapat meminta informasi (kolom) yang kita butuhkan untuk menjawab
pertanyaan Anda. Misalnya, kita hanya dapat meminta nama depan dan belakang
untuk membuat daftar pelanggan.
• Anda dapat meminta informasi dalam urutan tertentu. Misalnya, kita dapat meminta
agar informasi diurutkan dalam urutan abjad.
• Anda dapat meminta informasi dari objek yang dipilih (baris) di tabel Anda. Misalnya,
kita dapat meminta nama depan dan belakang hanya untuk pelanggan yang alamatnya
di Florida.
Di MySQL 4.1, MySQL menambahkan kemampuan untuk menyarangkan kueri SELECT ke
dalam kueri lain. Kueri bersarang disebut subkueri. Kita dapat memakai subquery dalam
pernyataan SELECT, INSERT, UPDATE, atau DELETE atau dalam klausa SET. Subquery dapat
mengembalikan satu nilai, satu baris atau kolom, atau tabel, yang digunakan dalam kueri luar.
77
Manajemen Database MySQL
Semua fitur kueri SELECT dapat digunakan dalam subkueri. Lihat manual online MySQL di
http://dev.mysql.com/doc/refman/5.5/en/subqueries.htm untuk informasi rinci tentang
penggunaan subqueries.
Mengambil informasi spesifik
Untuk mengambil informasi tertentu, buat daftar kolom yang berisi informasi yang kita
inginkan. Sebagai contoh:
SELECT columnname,columnname,columnname,... FROM tablename
Kueri ini mengambil nilai dari semua baris untuk kolom yang ditunjukkan. Misalnya, kueri
berikut mengambil semua nama belakang dan nama depan dari kolom LastName dan
FirstName yang disimpan di tabel Customer:
SELECT lastName,firstName FROM Customer
Anda dapat melakukan operasi matematika pada kolom saat kita memilihnya. Misalnya, kita
dapat memakai kueri SELECT berikut untuk menambahkan dua kolom:
SELECT col1+col2 FROM tablename
Atau kita dapat memakai kueri berikut:
SELECT price,price*1.08 FROM Inventory
Hasilnya adalah harga dan harga ditambah pajak penjualan 8 persen. Kita dapat mengubah
nama kolom saat memilihnya, sebagai berikut:
SELECT price,price*1.08 AS priceWithTax FROM Inventory
Klausa AS memberi tahu MySQL untuk memberi nama priceWithTax ke kolom kedua yang
diambil. Dengan demikian, kueri mengambil dua kolom data: harga dan priceWithTax. Dalam
beberapa kasus, kita tidak ingin melihat nilai dalam kolom, tetapi kita ingin mengetahui
sesuatu tentang kolom tersebut. Misalnya, kita mungkin ingin mengetahui nilai terendah atau
tertinggi di kolom. Tabel dibawah ini mencantumkan beberapa informasi yang tersedia
tentang kolom.
Tabel 4.1 Informasi yang dapat dipilih
Format SQL Deskripsi Informasi
AVG( columnname ) Mengembalikan rata-rata semua nilai dalam columnname
COUNT( columnname ) Mengembalikan jumlah baris di mana columnname tidak
kosong
MAX( columnname ) Mengembalikan nilai terbesar dalam columnname
MIN( columnname ) Mengembalikan nilai terkecil dalam columnname
SUM( columnname ) Mengembalikan jumlah semua nilai dalam columnname
Misalnya, kueri untuk mengetahui harga tertinggi dalam tabel Inventaris adalah:
78
Manajemen Database MySQL
SELECT MAX(price) FROM Inventory
Kata-kata SQL yang terlihat seperti MAX() dan SUM(), dengan tanda kurung sesudah namanya,
adalah fungsi. SQL menyediakan banyak fungsi selain yang ada pada tabel diatas. Beberapa
fungsinya memberikan informasi tentang kolom. Fungsi lain mengubah setiap nilai yang
dipilih. Misalnya, SQRT() mengembalikan akar kuadrat dari setiap nilai dalam kolom, dan
DAYNAME() mengembalikan nama hari dalam seming gu untuk setiap nilai dalam kolom
tanggal, bukan tanggal sebenarnya yang disimpan di kolom. Lebih dari 100 fungsi tersedia
untuk digunakan dalam kueri SELECT. Untuk deskripsi semua fungsi, lihat manual online
MySQL di http://dev.mysql.com/doc/refman/5.5/en/functions.html.
Mengambil data dalam urutan tertentu
Anda mungkin ingin mengambil data dalam urutan tertentu. Misalnya, dalam tabel
Pelanggan, kita mungkin ingin pelanggan diatur dalam urutan abjad menurut nama belakang.
Atau, dalam tabel Inventaris, kita mungkin ingin berbagai produk dikelompokkan menurut
kategori. Dalam kueri SELECT, ORDER BY dan GROUP BY memengaruhi urutan di mana data
dikirimkan kepada Anda:
• ORDER BY: Untuk mengurutkan informasi, tambahkan frasa ini ke kueri SELECT
Anda:
ORDER BY columnname
Data diurutkan berdasarkan nama kolom dalam urutan menaik. Misalnya, jika
nama kolom adalah nama belakang, data dikirimkan kepada kita dalam urutan
abjad dengan nama belakang. Kita dapat mengurutkan dalam urutan menurun
dengan menambahkan DESC sebelum nama kolom. Sebagai contoh:
SELECT * FROM Customers ORDER BY DESC lastName
• GROUP BY: Untuk mengelompokkan informasi, gunakan frasa berikut:
GROUP BY columnname
Baris yang memiliki nilai nama kolom yang sama dikelompokkan bersama. Misalnya,
gunakan kueri ini untuk mengelompokkan baris yang memiliki nilai yang sama dengan
Kategori:
SELECT * FROM Inventory GROUP BY Category
Anda dapat memakai GROUP BY dan ORDER BY dalam kueri yang sama
Meminta Database MySQL
Kita telah membuat database dan tabel MySQL, mengisinya dengan data, dan
menambahkan indeks agar mudah dan cepat kditemukan saat dicari. Sekarang saatnya
untuk melihat bagaimana pencarian ini dilakukan.
Mengambil data dari baris tertentu
Seringkali, kita tidak menginginkan semua informasi dari tabel. Kita menginginkan
informasi hanya dari baris yang dipilih. Tiga kata SQL sering digunakan untuk menentukan
sumber informasi:
• WHERE: Memungkinkan kita untuk meminta informasi dari objek database dengan
karakteristik tertentu. Misalnya, kita dapat meminta nama pelanggan yang tinggal di
California, atau kita hanya dapat membuat daftar produk yang merupakan kategori
pakaian tertentu.
• LIMIT: Memungkinkan kita untuk membatasi jumlah baris dari mana informasi diambil.
Misalnya, kita dapat meminta informasi hanya dari tiga baris pertama dalam tabel.
79
Manajemen Database MySQL
• DISTINCT: Memungkinkan kita meminta informasi hanya dari satu baris baris yang
identik. Misalnya, dalam tabel Login, kita dapat meminta loginNametetapi tidak
menentukan nama duplikat, sehingga membatasi respons ke satu record untuk setiap
member. Ini akan menjawab pertanyaan, “Apakah pelanggan pernah login?” daripada
pertanyaan “Berapa kali pelanggan login?
DELETE
Untuk menghapus baris dari tabel gunakan perintah DELETE. Sintaksnya mirip dengan
perintah SELECT, ini dapat mempersempit baris atau memakai kualifikasi seperti WHERE
dan LIMIT. Sekarang kita telah melihat efek dari qualifier DISTINCTkita harus menghapus
Potret Diri Sebagai Komunikasi Visual Simbolik dengan memasukkan perintah dibawah ini.
Contoh Menghapus entri baru
DELETE FROM classics WHERE title='Potret Diri Sebagai Komunikasi Visual Simbolik';
Contoh ini mengeluarkan perintah DELETE untuk semua baris yang kolom judulnya
berisi string Potret Diri Sebagai Komunikasi Visual Simbolik. Kata kunci WHERE sangat kuat,
dan penting untuk dimasukkan dengan benar; kesal ahan dapat mengarahkan perintah ke baris
yang salah (atau tidak berpengaruh jika tidak ada yang cocok dengan klausa WHERE).
WHERE
Kata kunci WHERE berfungsi untuk mempersempit kueri dengan mengembalikan kueri
yang ekspresi tertentunya benar. Contoh menghapus entri diatas hanyalah mengembalikan
baris yang kolomnya sama persis dengan string Potret Diri Sebagai Komunikasi Visual Simbolik
dengan memakai operator persamaan =. Contoh dibawah ini menunjukkan
memakai perintah WHERE dengan =.
Contoh memakai kata kunci WHERE
SELECT author,title FROM classics WHERE author="Agus Widodo";
SELECT author,title FROM classics WHERE isbn="9781598184891 ";
Kita dapat dengan mudah menambahkan lebih banyak buku karya Agus Widodo,
dalam hal ini baris pertama akan menampilkan semua judul buku yang dimilikinya, dan baris
kedua akan berlanjut (karena kita tahu ISBN itu unik) untuk menampilkan Belajar PHP Dari
Dasar. Dengan kata lain, penelusuran memakai kunci unik lebih dapat diprediksi. Kita juga
dapat melakukan pencocokan pola untuk pencarian kita memakai qualifier LIKE, yang
memungkinkan pencarian pada bagian string. Kualifikasi ini harus digunakan dengan karakter
% sebelum atau sesudah beberapa teks. saat ditempatkan sebelum kata kunci, % berarti
“apa pun sebelumnya” dan sesudah kata kunci berarti “apa pun sesudah nya”.
Contoh memakai kualifikasi LIKE
SELECT author,title FROM classics WHERE author LIKE "Mars Caroline W%";
SELECT author,title FROM classics WHERE title LIKE "%Species";
SELECT author,title FROM classics WHERE title LIKE "%and%";
Perintah pertama mengeluarkan publikasi oleh Mars Caroline W dan Sarwo Nugroho
karena kualifikasi LIKE diatur untuk mengembalikan apa pun yang cocok dengan string Mars
Caroline W diikuti oleh teks lainnya. Kemudian hanya Teknik Desain Realis dan Tata Warna
yang dikembalikan, karena itu satu-satunya baris yang kolomnya diakhiri dengan string
Species. Terakhir, Membangun PODCAST dan Potret Diri Sebagai Komunikasi Visual Simbolik
dikembalikan, karena keduanya cocok dengan string dan di kolom mana saja.
80
Manajemen Database MySQL
Klausa WHERE dari kueri SELECT memungkinkan kita membuat pilihan yang rumit.
Misalnya, bos kita ingin mengetahui semua pelanggan yang nama belakangnya dimulai
dengan B, yang tinggal di Semarang, dan yang memiliki angka 8 di nomor telepon atau faks
mereka. (Kita yakin ada banyak kegunaan untuk daftar seperti itu.) kita bisa mendapatkan
daftar ini untuk bos kita dalam kueri SELECT dengan klausa WHERE. Format dasar klausa
WHERE adalah:
WHERE expression AND|O R expression AND|OR expression ...
expression menentukan nilai untuk dibandingkan dengan nilai yang disimpan dalam database.
Hanya baris yang berisi kecocokan untuk ekspresi yang dipilih. Kita dapat memakai
ekspresi sebanyak yang diperlukan, masing-masing dipisahkan oleh AND atau OR. Saat kita
memakai AND, kedua ekspresi yang dihubungkan oleh AND (yaitu, ekspresi sebelum AND
dan ekspresi sesudah AND) harus benar agar baris dapat dipilih. Saat kita memakai OR,
hanya satu dari ekspresi yang dihubungkan oleh OR yang harus benar untuk baris yang akan
dipilih. Beberapa ekspresi umum ditunjukkan pada Tabel dibawah ini.
Tabel 4.2 Ekspresi Klausa WHERE
Ekspresi Contoh Hasil
column = value zip=“12345” Pilih hanya baris tempat
12345 disimpan di kolom
bernama zip
column > valu zip > “50000” Hanya memilih baris yang
kode posnya 50001 atau
lebih tinggi
column >= value zip >= “50000” Hanya memilih baris dengan
kode pos 50000 atau lebih
tinggi
column < value zip < “50000” Hanya memilih baris dengan
kode pos 49999 atau lebih
rendah
column <= value zip <= “50000” Hanya memilih baris dengan
kode pos 50000 atau lebih
rendah
column BETWEEN value1
AND value2
zip BETWEEN “20000” AND
“30000”
Hanya memilih baris yang
kode posnya lebih besar dari
19999 tetapi kurang dari
30001
column IN
(value1,value2,…)
zip IN (“90001”,”30044”) Hanya memilih baris dengan
kode pos 90001 atau 30044
column NOT IN
(value1,value2,…)
zip NOT IN
(“90001”,”30044”)
Hanya memilih baris di
mana kode ZIP adalah kode
ZIP apa pun kecuali 90001
atau 30044
column LIKE value
zip LIKE “9%” Pilih semua baris di mana
kode ZIP dimulai dengan 9
81
Manajemen Database MySQL
Catatan: value dapat berisi %
wildcard (yang cocok dengan
string apa pun) dan _ (yang
cocok dengan karakter apa
pun).
column NOT LIKE value
Catatan: value dapat berisi %
wildcard (yang cocok dengan
string apa pun) dan _ (yang
cocok dengan karakter apa
pun).
zip NOT LIKE “9%” Pilih semua baris
Anda dapat menggabungkan ekspresi dari tabel diatas dengan AND dan OR. Dalam
beberapa kasus, kita perlu memakai tanda kurung untuk memperjelas kriteria pemilihan.
Misalnya, kita dapat memakai kueri berikut untuk menjawab kebutuhan mendesak bos
kita untuk menemukan semua pelanggan yang namanya dimulai dengan B, yang tinggal di
Semarang, dan yang memiliki angka 8 di nomor telepon atau faks mereka:
SELECT lastName,firstName FROM Customer
WHERE lastName LIKE “B%”
AND city = “Semarang”
AND (phone LIKE “%8%” OR fax LIKE “%8%”)
Perhatikan tanda kurung di baris terakhir. Kita tidak akan mendapatkan hasil yang kita minta
tanpa tanda kurung. Setiap konektor akan diproses secara berurutan dari yang pertama
hingga yang terakhir akan menghasilkan daftar yang mencakup semua pelanggan yang
namanya dimulai dengan B dan yang tinggal di Semarang dan yang nomor teleponnya memiliki
angka 8 dan semua pelanggan yang faksnya nomor memiliki 8 di dalamnya, apakah mereka
tinggal di Semarang atau tidak dan apakah nama mereka dimulai dengan B atau tidak. saat
OR terakhir diproses, pelanggan yang karakteristiknya cocok dengan ekspresi sebelum OR
atau ekspresi sesudah OR dipilih. Ekspresi sebelum OR terhubung ke ekspresi sebelumnya oleh
AND sebelumnya, sehingga tidak berdiri sendiri, tetapi ekspresi sesudah OR berdiri sendiri,
menghasilkan pemilihan semua pelanggan dengan 8 di nomor faks mereka.
LIMIT
Kualifikasi LIMIT memungkinkan kita memilih berapa banyak baris yang akan
dikembalikan dalam kueri, dan di mana dalam tabel untuk mulai mengembalikannya. saat
melewati satu parameter, maka MySQL akan diberitahu untuk memulai dari awal hasil dan
hanya mengembalikan jumlah baris yang diberikan dalam parameter itu. Jika kita melewati
dua parameter, yang pertama menunjukkan offset dari awal hasil di mana MySQL harus
memulai tampilan, dan yang kedua menunjukkan berapa banyak yang harus dikembalikan.
Kita dapat memikirkan parameter pertama yang mengatakan, "Lewati jumlah hasil ini di awal."
Contoh Membatasi jumlah hasil yang dikembalikan
SELECT author,title FROM classics LIMIT 3;
SELECT author,title FROM classics LIMIT 1,2;
SELECT author,title FROM classics LIMIT 3,1;
82
Manajemen Database MySQL
Gambar 4.1 Membatasi baris yang dikembalikan dengan LIMIT
memakai kata kunci LIMIT
LIMIT menentukan berapa banyak baris yang dapat dikembalikan. Bentuk untuk LIMIT
adalah:
LIMIT startnumber,numberofrows
Baris pertama yang ingin kita ambil adalah startnumber, dan jumlah baris yang akan diambil
adalah numberofrows. Jika startnumber tidak ditentukan, 1 diasumsikan. Untuk memilih
hanya tiga pelanggan pertama yang tinggal di Salatiga, gunakan kueri ini:
SELECT * FROM Customer WHERE state= “SL” LIMIT 3
SELECT
Perintah SELECT digunakan untuk mengekstrak data dari tabel. Sekarang mari kita
periksa SELECT secara lebih rinci. Sintaks dasarnya adalah:
SELECT something FROM tablename;
Ini dapat berupa * (tanda bintang) yang berarti “setiap kolom”, atau kita dapat memilih untuk
memilih kolom tertentu saja. Misalnya, contoh dibawah ini menunjukkan bagaimana memilih
penulis dan judul saja.
Contoh Dua pernyataan SELECT yang berbeda
SELECT author,title FROM classics;
SELECT title,isbn FROM classics;
SELECT COUNT
Pengganti lain untuk parameter something adalah COUNT, yang dapat digunakan
dalam banyak cara. Dalam Contoh dibawah, ini menampilkan jumlah baris dalam tabel dengan
melewatkan * s ebagai parameter, yang berarti “semua baris”. Seperti yang kita harapkan,
hasil yang dikembalikan adalah 5, karena ada lima publikasi dalam tabel.
83
Manajemen Database MySQL
Contoh Menghitung baris
SELECT COUNT(*) FROM classics;
SELECT DISTINCT
Kualifikasi ini (dan sinonimnya DIST INCTOW) memungkinkan kita untuk menyingkirkan
beberapa entri yang berisi data yang sama. Misalnya, jika kita hanya memilih kolom penulis
dari tabel yang berisi beberapa buku dengan penulis yang sama, kita hanya akan melihat
daftar panjang dengan nama penulis yang sama berulang-ulang. Tetapi dengan menambahkan
kata kunci DISTINCT penulis akan ditampilkan hanya sekali. Jadi mari kita uji dengan
menambahkan baris lain yang mengulangi salah satu penulis kita yang ada.
Baris dalam tabel dapat memiliki nilai yang identik dalam satu atau beberapa kolom.
Namun, dalam beberapa kasus, saat kita klik SELECT sebuah kolom, kita tidak ingin mengambil
beberapa baris dengan nilai yang sama. Kita ingin mengambil nilai hanya sekali. Misalnya, kita
memiliki tabel produk dengan satu field yang disebut Kategori. Data tersebut tidak diragukan
lagi mengandung banyak produk di setiap kategori. Sekarang anggaplah kita mau
menampilkan daftar semua kategori yang tersedia di database. Kita ingin daftar ini berisi
setiap kategori yang terdaftar hanya sekali. Kata kunci DISTINCT disediakan untuk tujuan ini.
Untuk mencegah kueri SELECT mengembalikan semua rekaman identik, tambahkan kata kunci
DISTINCT segera sesudah SELECT, sebagai berikut:
SELECT DISTINCT Category FROM Product
Contoh Duplikasi data
INSERT INTO classics(author, title, category, year, isbn)
VALUES('Sarwo Nugroho','Potret Diri Sebagai Komunikasi Visual Simbolik','Ilmiah','1857',
'9780141439969');
Sekarang sesudah Sarwo Nugroho muncul dua kali dalam tabel, kita dapat
membandingkan hasil penggunaan SELECT dengan dan tanpa qualifier DISTINCT. Dalam
contoh dan gambar dibawah ini menunjukkan bahwa SELECT sederhana mencantumkan
perintah dengan qualifier DISTINCT hanya akan menampilkannya sekali.
Contoh Dengan dan tanpa kualifikasi DISTINCT
SELECT author FROM classics;
SELECT DISTINCT author FROM classics;
84
Manajemen Database MySQL
Gambar 4.2 Memilih data dengan dan tanpa DISTINCT
MATCH ... AGAINS
Konstruksi MATCH ... AGAINST dapat digunakan pada kolom yang telah diberi indeks
FULLTEXT. Kita dapat melakukan pencarian bahasa alami seperti yang kita lakukan di mesin
pencari Internet dengan indeks tersebut. Berbeda dengan penggunaan WHERE ... = atau
WHERE ... LIKE, MATCH ... AGAINST, ini memungkinkan kita memasukkan beberapa kata dalam
permintaan pencarian dan memeriksa semua kata di kolom FULLTEXT.
Contoh memakai MATCH ... AGAINST pada indeks FULLTEXT
SELECT author,title FROM classics
WHERE MATCH(author,title) AGAINST('and');
SELECT author,title FROM classics
WHERE MATCH(author,title) AGAINST('old shop');
SELECT author,title FROM classics
WHERE MATCH(author,title) AGAINST('tom sawyer');
MATCH ... AGAINST ... IN BOOLEAN MODE
Jika kita ingin memberi kueri MATCH ... AGAINS gunakan mode Boolean. Ini akan
mengubah efek kueri FULLTEXT standar. Kehadiran satu kata dalam kolom menyebabkan
pencarian mengembalikan baris. Mode Boolean juga memungkinkan kita untuk mengawali
kata pencarian dengan tanda + atau untuk menunjukkan apakah kata tersebut harus
disertakan atau dikecualikan. Jika mode Boolean normal mengatakan, "Salah satu dari kata -
kata ini akan dilakukan," tanda plus berarti "Kata ini harus ada; jika tidak, jangan kembalikan
barisnya.” Tanda minus berarti “Kata ini tidak boleh ada; kehadirannya mendiskualifikasi baris
agar tidak dikembalikan. ” Contoh dibawah ini mengilustrasikan mode Boolean melalui dua
kueri.
Contoh memakai MATCH ... AGAINST ... IN BOOLEAN MODE
SELECT author,title FROM classics
WHERE MATCH(author,title)
AGAINST(' +Mars -Desain Tata Warna' IN BOOLEAN MODE);
SELECT author,title FROM classics
85
Manajemen Database MySQL
WHERE MATCH(author,title)
AGAINST(' "Potret Diri"' IN BOOLEAN MODE);
Seperti yang kita harapkan, permintaan pertama hanya mengembalikan Potret Diri
Sebagai Komunikasi Visual Simbolik oleh Sarwo Nugroho, karena setiap baris yang
mengandung kata spesies telah dikecualikan, sehingga publikasi Mars Caroline W diabaikan.
UPDATE ... SET
Konstruksi ini memungkinkan kita untuk memperbarui konten field. Jika kita ingin
mengubah konten dari satu atau lebih field, kita harus terlebih dahulu mempersempit field
atau field yang akan diubah, dengan cara yang sama seperti kita memakai perintah
SELECT. Contoh dibawah ini menunjukkan penggunaan UPDATE ... SET dalam dua cara yang
berbeda.
Contoh memakai UPDATE ... SET
UPDATE classics SET author='Agus Widodo '
WHERE author='Agus Widodo';
UPDATE classics SET category='Classic Ilmiah'
WHERE category='Ilmiah';
Dalam pertanyaan pertama, nama asli Agus Widodo ditambahkan ke nama penanya
dalam tanda kurung, yang hanya mempengaruhi satu baris. Kueri kedua, mempengaruhi tiga
baris, karena mengubah semua kemunculan kata Ilmiah di kolom kategori menjadi istilah
Ilmiah Klasik. Saat melakukan pembaruan, kita juga dapat memakai kualifikasi yang telah
kita lihat, seperti LIMIT, dan kata kunci ORDER BY dan GROUP BY.
ORDER BY
ORDER BY mengurutkan hasil yang dikembalikan menurut satu atau beberapa kolom
dalam urutan menaik atau menurun.
Contoh memakai ORDER BY
SELECT author,title FROM classics ORDER BY author;
SELECT author,title FROM classics ORDER BY title DESC;
Seperti yang kita lihat, kueri pertama mengembalikan publikasi menurut penulis dalam
urutan abjad menaik (default), dan k ueri kedua mengembalikannya menurut judul dalam
urutan menurun Jika kita ingin mengurutkan semua baris menurut penulis dan kemudian
menurut tahun publikasi, kita akan mengeluarkan kueri berikut:
SELECT author,title,year FROM classics ORDER BY author,year DESC;
Ini menunjukkan bahwa setiap kualifikasi naik dan turun berlaku untuk satu kolom. Kata kunci
DESC hanya berlaku untuk kolom sebelumnya, tahun. Karena kita mengizinkan penulis untuk
memakai urutan pengurutan default, itu diurutkan dalam urutan menaik. Kita juga dapat
secara eksplisit menentukan urutan menaik untuk kolom itu, dengan hasil yang sama:
SELECT author,title,year FROM classics ORDER BY author ASC,year DESC;
GROUP BY
Dengan cara yang mirip dengan ORDER BY, kita dapat mengelompokkan hasil yang
dikembalikan dari kueri memakai GROUP BY untuk mengambil informasi tentang
86
Manajemen Database MySQL
sekelompok data. Misalnya, jika kita ingin mengetahui berapa banyak publikasi yang ada dari
setiap kategori dalam tabel klasik, kita bisa mengeluarkan kueri berikut:
SELECT category,COUNT(author) FROM classics GROUP BY category;
yang mengembalikan output berikut:
+---------------------+----------------+
| category | COUNT(author) |
+---------------------+----------------+
| Classic Ilmiah | 3 |
| Ilmiah | 1 |
| Play | 1 |
+---------------------+----------------+
3 rows in set (0.00 sec)
4.2 MENGGABUNGKAN TABEL BERSAMA
Sangat normal untuk memelihara beberapa tabel dalam database, masing-masing
menyimpan jenis informasi yang berbeda. Misalnya, pertimbangkan kasus tabel pelanggan
yang harus dapat direferensikan silang dengan publikasi yang dibeli dari tabel klasik.
Masukkan perintah dalam Contoh dibawah ini untuk membuat tabel baru ini dan mengisinya
dengan tiga pelanggan dan pembelian mereka.
Contoh Membuat dan mengisi tabel pelanggan
CREATE TABLE customers (
name VARCHAR(128),
isbn VARCHAR(13),
PRIMARY KEY (isbn)) ENGIN E MyISAM;
INSERT INTO customers(name,isbn)
VALUES('Agus Widodo','9780099533474');
INSERT INTO customers(name,isbn)
VALUES('Mars Caroline','9780582506206');
INSERT INTO customers(name,isbn)
VALUES('Sarwo Nugroho','9780517123201');
SELECT * FROM customers;
Dalam tabel yang tepat yang berisi detail pelanggan juga akan ada alamat, nomor
telepon, alamat email, dan sebagainya. Saat membuat tabel baru, kita harus memperhatikan
bahwa tabel tersebut memiliki kesamaan dengan tabel klasik: kolom bernama isbn. Karena
memiliki arti yang sama di kedua tabel (ISBN mengacu pada buku, dan selalu buku yang sama),
kita dapat memakai kolom ini untuk mengikat kedua tabel menjadi satu kueri, seperti
pada Contoh dibawah ini.
SELECT name,author,title from customers,classics
WHERE customers.isbn=classics.isbn;
Hasil dari operasi ini adalah sebagai berikut:
87
Manajemen Database MySQL
+---------------+-----------------+------------------------------------------------+
| name | author | title |
+---------------+-----------------+------------------------------------------------+
| Agus Widodo | Sarwo Nugroho | Potret Diri Sebagai Komunikasi Visual Simbolik |
| Mars Caroline | Agus Widodo | Membangun PODCAST |
| Sarwo Nugroho | Mars Caroline W | Teknik Desain Realis dan Tata Warna |
+---------------+-----------------+------------------------------------------------+
3 rows in set (0.00 sec)
Lihat bagaimana kueri ini mengikat kedua tabel dengan rapi untuk memperlihatkan publikasi
yang dibeli dari tabel klasik oleh orang-orang di tabel pelanggan.
Menggabungkan informasi lebih dari satu tabel
Sekarang kita akan menggabungkan informasi dari tabel yang berbeda. Kita dapat
melakukannya dengan mudah dalam satu kueri. Terkadang pertanyaan kita memerlukan
informasi dari lebih dari satu tabel. Misalnya, pertanyaan, "Berapa banyak pesanan yang
dilakukan pelanggan Andik prakasa selama bulan April dan Desember?" memerlukan
informasi dari beberapa tabel. Kita dapat mengajukan pertanyaan ini dengan mudah dalam
satu kueri SELECT dengan menggabungkan beberapa tabel. Dua kata dapat digunakan dalam
kueri SELECT untuk menggabungkan informasi dari dua atau lebih tabel:
• UNION: Baris diambil dari satu atau lebih tabel dan disimpan bersama, satu demi satu,
dalam satu hasil. Misalnya, jika kueri kita memilih 6 baris dari satu tabel dan 5 baris
dari tabel lain, hasilnya akan berisi 11 baris.
• JOIN: Tabel digabungkan berdampingan, dan informasi diambil dari kedua tabel.
UNION
UNION digunakan untuk menggabungkan hasil dari dua atau lebih kueri pemilihan.
Hasil dari setiap kueri ditambahkan ke kumpulan hasil mengikuti hasil kueri sebelumnya.
Format kueri UNION adalah sebagai berikut:
SELECT query UNION ALL SELECT query ...
Anda dapat menggabungkan kueri SELECT sebanyak yang kita butuhkan. Kueri SELECT dapat
menyertakan format SELECT yang valid, termasuk klausa WHERE, klausa LIMIT, dan
seterusnya. Aturan untuk kueri adalah:
• Semua kueri SELECT harus memilih jumlah kolom yang sama.
• Kolom yang dipilih dalam kueri harus berisi tipe data yang sama.
Kumpulan hasil berisi semua baris dari kueri pertama, diikuti oleh semua baris dari kueri
kedua, dan seterusnya. Nama kolom yang digunakan dalam kumpulan hasil adalah nama
kolom dari kueri SELECT pertama. Rangkaian kueri SELECT dapat memilih kolom yang berbeda
dari tabel yang sama, tetapi situasi di mana kita menginginkan tabel baru dengan satu kolom
dalam tabel diikuti oleh kolom lain kolom dari tabel yang sama tidak biasa. Kemungkinan besar
kita ingin menggabungkan kolom dari tabel yang berbeda. Misalnya, kita mungkin memiliki
tabel member yang telah mengundurkan diri dari klub ( Member Lama) dan tabel terpisah dari
member saat ini ( Member) . Kita bisa mendapatkan daftar semua member, baik saat ini
maupun yang mengundurkan diri, dengan kueri berikut:
SELECT lastName,firstName FROM Member UNION ALL
88
Manajemen Database MySQL
SELECT lastName,firstName FROM OldMember
Hasil dari query ini adalah nama belakang dan nama depan dari semua member saat ini, diikuti
dengan nama belakang dan nama depan dari semua member yang telah mengundurkan diri.
Bergantung pada cara kita mengatur data, kita mungkin memiliki nama duplikat. Misalnya,
mungkin seorang member mengundurkan diri, dan namanya ada di tabel Member Lama —
tetapi dia bergabung lagi, jadi namanya ditambahkan ke Member Table. Jika kita tidak ingin
duplikat, jangan sertakan kata ALL. Jika ALL tidak disertakan, baris duplikat tidak ditambahkan
ke hasil.
Anda dapat memakai ORDER BY dengan setiap kueri SELECT atau kita dapat
memakai ORDER BY dengan kueri UNION untuk mengurutkan semua baris dalam
kumpulan hasil. Jika kita ingin ORDER BY diterapkan ke seluruh rangkaian hasil, bukan hanya
kueri yang mengikutinya, gunakan tanda kurung sebagai berikut:
(SELECT lastName FROM Me mber UNION ALL
SELECT lastName FROM OldMember) ORDER BY lastName
JOIN
Menggabungkan tabel berdampingan adalah gabungan. Tabel digabungkan dengan
mencocokkan data dalam kolom — kolom yang memiliki kesamaan. Tabel hasil gabungan yang
dihasilkan oleh gabungan berisi semua kolom dari kedua tabel. Misalnya, jika table1 memiliki
dua kolom (memberID dan tinggi), dan table2 memiliki dua kolom (memberID dan bobot),
hasil inner join tabel dengan empat kolom: memberID (dari table1), tinggi, memberID (dari
table2), d an bobot. Dua jenis gabungan yang umum adalah inner join dan outer join.
Perbedaan antara inner dan outer join terletak pada jumlah baris yang disertakan dalam tabel
hasil.
• Inner join: Tabel hasil yang dihasilkan oleh inner join hanya berisi baris yang ada di
kedua tabel.
• Outer join: Tabel gabungan yang dihasilkan oleh outer join berisi semua baris yang ada
di satu tabel dengan kolom kosong di kolom untuk baris yang tidak ada di tabel kedua.
Misalnya, jika table1 berisi satu baris untuk Wiwid dan satu baris untuk Sally, dan table2 hanya
berisi satu baris untuk Sally, inner join hanya akan berisi satu baris: baris untuk Sally. Namun,
outer join akan berisi dua baris — satu baris untuk Wiwid dan satu baris untuk Sally —
meskipun baris untuk Wiwid akan memiliki field kosong untuk bobot.
Tabel hasil untuk outer join berisi semua baris untuk satu tabel. Jika salah satu baris
untuk tabel tersebut tidak ada di tabel kedua, kolom untuk tabel kedua akan kosong. Jelas, isi
tabel hasil ditentukan oleh tabel mana yang memberikan kontribusi semua barisnya,
memerlukan tabel kedua untuk mencocokkannya. Dua jenis outer join mengontrol tabel
mana yang mengatur baris dan mana yang harus cocok: LEFT JOIN dan RIGHT JOIN . Kita
memakai kueri SELECT yang berbeda untuk inner join dan dua jenis outer join. Kueri
berikut adalah inner join:
SELECT columnnamelist FROM table1,table2
WHERE table1.col2 = table2.col2
89
Manajemen Database MySQL
Dan kueri ini adalah outer join:
SELECT columnnamelist FROM table1 LEFT JOIN table2
ON table1.col1=table2.col2
SELECT columnnamelist FROM table1 RIGHT JOIN table2
ON table1.col1=table2.col2
Dalam ketiga kueri, table1 dan table2 adalah tabel yang akan digabungkan. Kita dapat
bergabung dengan lebih dari dua tabel. Di kedua kueri, col1 dan col2 adalah nama kolom yang
dicocokkan untuk bergabung dengan tabel. Tabel dicocokkan berdasarkan data di kolom ini.
Kedua kolom ini dapat memiliki nama yang sama atau nama yang berbeda, tetapi keduanya
harus berisi tipe data yang sama.
Sebagai contoh sambungan dalam dan luar, pertimbangkan katalog Pakaian dengan
dua tabel. Satu tabel adalah Produk, dengan dua kolom Nama dan Jenis menyimpan data
berikut:
Name Type
T-shirt Shirt
Dress shirt Shirt
Jeans Pants
Tabel kedua adalah Warna, dengan dua kolom Nama dan Warna menyimpan data berikut:
Name Color
T-shirt white
T-shirt red
Loafer black
Anda perlu mengajukan pertanyaan yang memerlukan informasi dari kedua tabel. Jika kita
melakukan inner join dengan query berikut:
SELECT * FROM Product,Co lor WHERE Product.Name = Color.Name
Anda mendapatkan tabel hasil berikut dengan empat kolom: Nama (dari Produk), Jenis, Nama
(dari Warna), dan Warna.
Name Type Name Color
T-shirt Shirt T-shirt white
T-shirt Shirt T-shirt red
Perhatikan bahwa hanya T-shirt yang muncul di tabel hasil — karena hanya T-shirt yang
ada di kedua tabel asli, sebelum bergabung. Di sisi lain, misalkan kita melakukan outer join kiri
dengan kueri berikut:
SELECT * FROM Product LEFT JOIN Color ON Product. Name=Color. Name
90
Manajemen Database MySQL
Anda mendapatkan tabel hasil berikut, dengan empat kolom yang sama — Nama (dari
Produk), Jenis, Nama (dari Warna), dan Warna — tetapi dengan baris yang berbeda:
Name Type Name Color
T-shirt Shirt T-shirt white
T-shirt Shirt T-shirt red
Dress shirt <NULL> <NULL>
Jeans Pants <NULL> <NULL>
Tabel ini memiliki empat baris. Ini memiliki dua baris pertama yang sama dengan gabungan
bagian dalam, tetapi memiliki dua baris tambahan — baris yang ada di tabel Produk di sebelah
kiri tetapi tidak di tabel Warna. Perhatikan bahwa kolom dari tabel Warna kosong untuk dua
baris terakhir. Dan, di sisi ketiga, misalkan kita melakukan outer join kanan dengan kueri
berikut:
SELECT * FROM Product RIGHT JOIN Color
ON Product.petName=Color. Name
Anda mendapatkan tabel hasil berikut, dengan empat kolom yang sama, tetapi dengan baris
yang masih berbeda:
petName petType petName petColor
T-shirt Shirt T-shirt white
T-shirt Shirt T-shirt red
<NULL> <NULL> Loafers Black
Perhatikan bahwa hasil ini berisi semua baris untuk tabel Warna di sebelah kanan tetapi tidak
untuk tabel Produk. Perhatikan bagian yang kosong di kolom untuk tabel Produk, yang tidak
memiliki baris untuk Loafers. Gabungan yang kita diskusikan sejauh ini menemukan entri yang
cocok dalam tabel. Terkadang berguna untuk mengetahui baris mana dalam tabel yang tidak
memiliki entri yang cocok di tabel lain. Misalnya, kita ingin tahu siapa yang tidak pernah masuk
ke bagian Only Member. Misalkan kita memiliki satu tabel dengan nama login member
( Member) dan tabel lain dengan tanggal login (Login) . Kita dapat mengajukan pertanyaan ini
dengan memilih dari dua tabel. Kita dapat mengetahui nama login mana yang tidak memiliki
entri di tabel Login dengan kueri berikut:
SELECT loginName FROM Member LEFT JOIN Login
ON Member.loginName=Login.loginName
WHERE Login.loginName IS NULL
Kueri ini memberi kita daftar semua nama login di tabel Member yang tidak ada di tabel Login.
NATURAL JOIN
Dengan perintah NATURAL JOIN, kita dapat menghemat pengetikan dan membuat
kueri sedikit lebih jelas. Jenis gabungan ini mengambil dua tabel dan secara otomatis
menggabungkan kolom yang memiliki nama yang sama. Jadi, untuk mencapai hasil yang sama
lakukan seperti contoh dibawah ini:
91
Manajemen Database MySQL
SELECT name,author,title FROM customers NATURAL JOIN classics;
JOIN . . . ON
Jika kita ingin menentukan kolom untuk menggabungkan dua tabel, gunakan
konstruksi JOIN ... ON seperti ini:
SELECT name,author,title FROM customers
JOIN classics ON customers.isbn=classics.isbn;
memakai AS
Anda juga dapat menghemat pengetikan dan meningkatkan keterbacaan kueri dengan
membuat alias memakai kata kunci AS. Ikuti nama tabel dengan AS dan alias yang akan
digunakan. Kode berikut, oleh karena itu, juga identik dalam tindakan dengan Contoh dibawah
ini. Alias dapat sangat berguna saat kita memiliki kueri panjang yang merujuk nama tabel
yang sama berkali-kali.
SELECT name,author,title from customers AS cust, classics AS class WHERE
cust.isbn=class.isbn;
Hasil dari operasi ini adalah sebagai berikut:
+---------------+-----------------+------------------------------------------------+
| name | author | title |
+---------------+-----------------+------------------------------------------------+
| Agus Widodo | Sarwo Nugroho | Potret Diri Sebagai Komunikasi Visual Simbolik |
| Mars Caroline | Agus Widodo | Membangun PODCAST |
| Sarwo Nugroho | Mars Caroline W | Teknik Desain Realis dan Tata Warna |
+---------------+-----------------+------------------------------------------------+
3 rows in set (0.00 sec)
4.3 memakai OPERATOR LOGIKA
Anda juga dapat memakai operator logika AND, OR, dan NOT dalam kueri MySQL
WHERE kita untuk mempersempit pilihan kita lebih jauh. Contoh dibawah ini menunjukkan
satu contoh masing-masing, tetapi kita dapat mencampur dan mencocokkannya dengan cara
apa pun yang kita butuhkan.
Contoh memakai operator logika
SELECT author,title FROM classics WHERE
author LIKE "Guswi%" AND author LIKE "%Andik Prakasa";
SELECT author,title FROM classics WHERE
author LIKE "%Agus Widodo%" OR author LIKE "%Joseph Teguh %";
SELECT author,title FROM classics WHERE
author LIKE "Guswi%" AND author NOT LIKE "%Andik Prakasa";
Memperbarui Informasi dalam database
Mengubah informasi di baris yang ada berarti memperbarui informasi. Misalnya, kita
mungkin perlu mengubah alamat pelanggan karena dia pindah, atau kita mungkin perlu
menambahkan nomor faks yang dibiarkan kosong oleh pelanggan saat dia memasukkan
informasinya. Pernyataan UPDATE sangat mudah:
92
Manajemen Database MySQL
UPDATE tablename SET column=value,column=value,...
WHERE clause
Dalam klausa SET, kita mencantumkan kolom yang akan diperbarui dan nilai baru yang akan
dimasukkan. Daftar semua kolom yang ingin kita ubah dalam satu pernyataan. Tanpa klausa
WHERE, nilai kolom akan diubah di semua baris. Tetapi dengan klausa WHERE, kita dapat
menentukan baris mana yang akan diperbarui. Misalnya, untuk memperbarui alamat di tabel
Pelanggan, gunakan pernyataan ini:
UPDATE Customer SET street=”3423 RoseLawn”,
phone=”555-555-5555”
WHERE lastName=”Contrary”
Menghapus Informasi dari Database
Perbarui informasi dalam database kita dengan menghapus informasi yang sudah
usang. Namun, berhati-hatilah saat menghapus informasi. sesudah kita meletakkan data, itu
hilang selamanya. Itu tidak dapat dipulihkan. Kita hanya mendapatkannya kembali jika kita
memasukkan semuanya lagi. Kita dapat menghapus baris atau kolom dari tabel, atau kita
dapat menghapus seluruh tabel atau database dan memulai dari awal. Kita dapat menghapus
baris dari tabel dengan pernyataan DELETE:
DELETE FROM tablename WHERE clause
Berhati-hatilah saat memakai DELETE. Jika kita memakai pernyataan DELETE tanpa
klausa WHERE, itu akan menghapus semua data dalam tabel. Maksud kita semua data. Kita
ulangi, semua data. Data tidak dapat dipulihkan. Fungsi pernyataan DELETE ini berada tepat
di bagian atas daftar jangan coba-coba ini di rumah. Kita dapat menghapus kolom dari tabel
dengan memakai pernyataan ALTER:
ALTER TABLE tablename DROP columnname
Anda dapat menghapus seluruh tabel atau database dengan DROP TABLE tablename atau
DROP DATABASE databasename
93
Manajemen Database MySQL
BAB 5
MENGAKSES MySQL memakai PHP
5.1 MEMINTA DATABASE MYSQL DENGAN PHP
Alasan memakai PHP sebagai antarmuka ke MySQL adalah untuk memformat
hasil query SQL dalam bentuk yang terlihat di halaman web. Selama kita dapat masuk ke
instalasi MySQL kita memakai nama user dan kata sandi.
Proses
Proses penggunaan MySQL dengan PHP adalah:
1. Hubungkan ke MySQL.
2. Pilih database yang akan digunakan.
3. Buat string kueri.
4. Lakukan kueri.
5. Ambil hasilnya dan keluarkan ke halaman web.
6. Ulangi Langkah 3 sampai 5 sampai semua data yang diinginkan telah diambil.
7. Putuskan sambungan dari MySQL.
Kita akan mengerjakan bagian ini secara bergantian, tetapi pertama, kita harus mengatur
detail login dengan cara yang aman agar tidak ada orang yang bisa mengakses database kita.
5.2 MEMBUAT FILE LOGIN
Sebagian besar situs web yang dikembangkan dengan PHP berisi beberapa file
program yang memerlukan akses ke MySQL, oleh karena itu, detail login dan kata sandi sangat
diperlukan. Selanjutnya, mari kita buat file login terlebih dahulu, dengan mengeetikkan
contoh, ganti nilai placeholder (seperti nama pengguna) dengan nilai aktual yang kita gunakan
untuk database MySQL Anda, dan simpan ke direktori pengembangan web. Hostname
localhost akan berfungsi selama kita memakai database MySQL di sistem lokal.
Contoh File login.php
<?php // login.php
$db_hostname = 'localhost';
$db_database = 'publications';
$db_username = 'username';
$db_password = 'password';
?
Tag <?php dan ?> yang terlampir sangat penting untuk file login.php pada Contoh
diatas ini berarti bahwa garis perantara hanya dapat ditafsirkan sebagai kode PHP. Jika kita
meninggalkannya dan seseorang memanggil file langsung dari situs web Anda, itu akan
ditampilkan sebagai teks dan mengungkapkan rahasia kita. Tapi, dengan tag di tempatnya,
yang akan dilihat orang itu hanyalah halaman kosong. File akan disertakan dengan benar
dalam file PHP kita yang lain. Variabel $db_hostname akan memberi tahu PHP komputer mana
yang akan digunakan saat menghubungkan ke database. Ini diperlukan, karena kita dapat
mengakses database MySQL di komputer mana pun yang terhubung ke instalasi PHP Anda,
dan yang berpotensi mencakup host mana pun di Web. Namun, contoh dalam bab ini akan
bekerja di server lokal. Jadi, alih-alih menentukan domain seperti mysql.myserver.com, kita
bisa memakai kata localhost (atau alamat IP 127.0.0.1).
94
Manajemen Database MySQL
Database yang akan kita gunakan, $db_database ini disebut publikasi. Variabel
$db_username dan $db_password harus disetel ke nama user dan kata sandi yang telah kita
gunakan dengan MySQL.
Menghubungkan ke MySQL
Sekarang sesudah kita menyimpan file login.php, kita dapat memasukkannya ke dalam
file PHP apa pun yang perlu mengakses database dengan memakai pernyataan
require_once. Ini lebih disukai daripada pernyataan include, karena akan menghasilkan
kesalahan fatal jika file tidak ditemukan. Dan percayalah, tidak menemukan file yang berisi
detail login ke database kita adalah kesalahan fatal.
Selain itu, memakai require_once berarti file akan dibaca han ya jika sebelumnya
tidak disertakan, ini mencegah akses duplikat disk. Contoh dibawah ini menunjukkan kode
yang akan digunakan.
Contoh Menghubungkan ke server MySQL
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
?>
Contoh ini menjalankan fungsi mysql_connect PHP, yang memerlukan tiga parameter:
hostname, user name, dan password server MySQL. sesudah berhasil, ia mengembalikan
identifikator ke server; jika tidak, FALSE dikembalikan. Perhatikan bahwa baris kedua
memakai pernyataan if dengan fungsi die, yang melakukan seperti apa bunyinya dan
keluar dari PHP dengan pesan kesalahan jika $d b_server is not TRUE. Pesan die menjelaskan
bahwa tidak mungkin untuk terhubung ke database MySQL, dan—untuk membantu
mengidentifikasi mengapa ini terjadi—termasuk panggilan ke fungsi mysql_error. Fungsi ini
menampilkan teks kesalahan dari fungsi MySQL yang terakhir disebut. Pointer server database
$db_server akan digunakan dalam beberapa contoh berikut untuk mengidentifikasi server
MySQL yang akan ditanyakan. Dengan memakai identifikator dengan cara ini, kita dapat
terhubung ke dan mengakses beberapa server MySQL dari satu program PHP. Fungsi die
sangat bagus saat kita mengembangkan kode PHP, tetapi tentu saja kita akan menginginkan
pesan kesalahan yang lebih ramah user di server produksi. Dalam hal ini kita tidak akan
membatalkan program PHP Anda, tetapi memformat pesan yang akan ditampilkan saat
program keluar secara normal, seperti:
function mysql_fatal_error($msg)
{
$msg2 = mysql_error();
echo <<< END
We are sorry, but it was not possible to complete
the requested task. The error message we got was:
<p>$msg: $msg2</p>
Please click the back button on your browser
and try again. If you are still having problems,
please <a href="mailto:admin@server.com">email
our administrator</a>. Thank you.
END;
}
95
Manajemen Database MySQL
Memilih database
sesudah berhasil terhubung ke MySQL, kita sekarang siap untuk memilih database yang
akan kita gunakan..
Contoh Memilih database
<?php
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
?>
Memilih database
sesudah berhasil terhubung ke MySQL, kita sekarang siap untuk memilih database yang
akan kita gunakan.
Contoh Memilih database
< ?php
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
?>
Perintah untuk memilih database adalah mysql_select_db. Berikan nama database
yang kita inginkan dan server yang kita hubungkan. Seperti contoh sebelumnya, pernyataan
die telah disertakan untuk memberikan pesan kesalahan dan penjelasan, jika pemilihan
gagal—satu-satunya perbedaan adalah tidak perlu mempertahankan nilai kembalian dari
fungsi mysql_select_db, karena hanya mengembalikan TRUE atau FALSE. Oleh karena itu
digunakanlah PHP atau pernyataan yang artinya “jika perintah sebelumnya gagal, lakukan hal
berikut.” Perhatikan bahwa agar atau berfungsi, tidak boleh ada titik koma di akhir baris kode
pertama.
Membangun dan mengeksekusi kueri
Mengirim kueri ke MySQL dari PHP semudah mengeluarkannya memakai fungsi
mysql_query.
Contoh Meminta database
<?php
$query = "SELECT * FROM classics";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
?>
Pertama, variabel $query disetel ke kueri yang akan dibuat. Dalam hal ini, ia meminta
untuk melihat semua baris dalam tabel klasik. Perhatikan bahwa, tidak seperti command line
MySQL, titik koma tidak diperlukan di bagian ekor kueri, karena fungsi mysql_query digunakan
untuk mengeluarkan kueri lengkap; itu tidak dapat digunakan untuk kueri yang dikirim dalam
beberapa bagian, satu per satu. Oleh karena itu, MySQL mengetahui bahwa kueri telah selesai
dan tidak mencari titik koma.
Fungsi ini mengembalikan hasil yang kita tempatkan dalam variabel $result. Setela h
memakai MySQL pada command line, kita mungkin berpikir bahwa isi $result akan sama
dengan hasil yang dikembalikan dari kueri command line, dengan garis horizontal dan vertikal,
dan seterusnya. Namun, tidak demikian halnya dengan hasil yang dikembalikan ke PHP.
96
Manajemen Database MySQL
Sebagai gantinya, sesudah berhasil, $result akan berisi sumber daya yang dapat digunakan
untuk mengekstrak hasil kueri. Kita akan melihat cara mengekstrak data di bagian selanjutnya.
Saat gagal, $result berisi FALSE. Jadi contoh selesai dengan m emeriksa $result. Jika FALSE,
berarti ada kesalahan, dan perintah die dijalankan.
Mengambil hasil
sesudah kita memiliki sumber daya yang dikembalikan dari fungsi mysql_query, kita
dapat memakai nya untuk mengambil data yang kita inginkan. Cara paling sederhana
untuk melakukannya adalah dengan mengambil sel yang kita inginkan, satu per satu,
memakai fungsi mysql_result. Contoh selanjutnya menggabungkan dan memperluas
contoh sebelumnya ke dalam program yang dapat kita ketik dan jalankan sendiri untuk
mengambil hasil yang dikembalikan. Saya sarankan kita menyimpannya di folder yang sama
dengan login.php dan beri nama query.php.
Contoh Mengambil hasil satu sel pada satu waktu
<?php // query.php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error());
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error());
$query = "SELECT * FROM classics";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error());
$rows = mysql_num_rows($result);
for ($j = 0 ; $j < $rows ; ++$j)
{
echo 'Author: ' . mysql_result($result,$j,'author') . '<br>';
echo 'Title: ' . mysql_result($result,$j,'title') . '<br>';
echo 'Category: ' . mysql_result($result,$j,'category') . '<br>';
echo 'Year: ' . mysql_result($result,$j,'year') . '<br>';
echo 'ISBN: ' . mysql_result($result,$j,'isbn') . '<br><br>';
}
?>
10 baris kode terakhir adalah yang baru, jadi mari kita lihat. Mereka mulai dengan
mengatur variabel $rows ke nilai yang dikembalikan oleh panggilan ke mysql_num_rows.
Fungsi ini melaporkan jumlah baris yang dikembalikan oleh kueri. Berbekal jumlah baris, kita
memasuki loop for yang mengekstrak setiap sel data dari setiap baris memakai fungsi
mysql_result. Parameter yang disediakan untuk fungsi ini adalah sumber daya $result, yang
dikembalikan oleh mysql_query, nomor baris $j, dan nama kolom tempat mengekstrak data.
Hasil dari setiap panggilan ke mysql_result kemudian digabungkan dalam pernyataan echo
untuk menampilkan satu field per baris, dengan umpan baris tambahan di antara baris. Seperti
yang kita ingat dan lima baris data dikembalikan oleh query.php. Namun, sebagaimana
adanya, kode ini sebenarnya sangat tidak efisien dan lambat, karena total 25 panggilan dibuat
ke fungsi mysql_result untuk mengambil semua data, satu sel pada satu waktu. Untungnya,
ada cara yang jauh lebih baik untuk mengambil data, yaitu mendapatkan satu baris sekal igus
memakai fungsi mysql_fetch_row.
Mengambil baris
97
Manajemen Database MySQL
Penting untuk menunjukkan bagaimana kita dapat mengambil satu sel data dari
MySQL, tetapi sekarang mari kita lihat metode yang jauh lebih efisien. Ganti loop for dari
query.php dengan loop baru pada contoh dibwah ini dan kita akan menemukan hasil yang
sama persis.
Contoh Penggantian untuk loop untuk mengambil hasil satu baris dalam satu waktu.
<?php
for ($j = 0 ; $j < $rows ; ++$j)
{
$row = mysql_fetch_row($result);
echo 'Author: ' . $row[0] . ' <br>' ;
echo 'Title: ' . $row[1] . ' <br>' ;
echo 'Category: ' . $row[2] . ' <br>' ;
echo 'Year: ' . $row[3] . ' <br>' ;
echo 'ISBN: ' . $row[4] . ' <br><br>' ;
}
?>
Dalam kode yang dimodifikasi ini, hanya seperlima dari panggilan yang dilakukan ke
fungsi pemanggilan MySQL (berkurang 80% penuh), karena setiap baris diambil secara
keseluruhan melalui fungsi mysql_fetch_row. Ini mengembalikan satu baris data dalam array,
yang kemudian ditetapkan ke variabel $row. Maka, yang diperlukan hanyalah mereferensikan
setiap elemen array $row secara bergantian (dimulai dari offset 0). Oleh karena itu $row[0]
berisi data Author, $row[1] Judul, dan seterusnya, karena setiap kolom ditempatkan dalam
array sesuai urutan kemunculannya di tabel MySQL. Juga, dengan memakai
mysql_f etch_row alih -alih mysql_result, kita memakai kode PHP yang jauh lebih sedikit
dan mencapai waktu eksekusi yang jauh lebih cepat, karena hanya mereferensikan setiap item
data dengan offset daripada nama.
Menutup koneksi
sesudah kita selesai memakai database, kita harus menutup koneksi. Kita
melakukannya dengan mengeluarkan perintah pada dibawah ini.
Contoh Menutup koneksi server MySQL.
<?php
mysql_close($db_server);
?>
Contoh Praktis
Saatnya untuk menulis contoh pertama kita memasukkan data dan menghapusnya
dari tabel MySQL memakai PHP. Saya sarankan kita mengetik kode seperti contoh
dibawah ini dan menyimpannya ke direktori pengembangan web kita memakai nama file
sqltest.php.
Contoh Memasukkan dan menghapus memakai sqltest.php
<?php // sqltest.php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_selec t_db($db_database, $db_server)
98
Manajemen Database MySQL
or die("Unable to select database: " . mysql_error()) ;
if (isset($_POST['delete']) && isset($_POST['isbn']))
{
$isbn = get_post('isbn');
$query = "DELETE FROM classics WHERE isbn=' $isbn'";
if (!mysql_query($query, $db_server) )
echo "DELETE failed: $query<br>" .
mysql_error() . "<br><br>";
}
if (isset($_POST['author']) &&
isset($_POST['title' ]) &&
isset($_POST['category']) &&
isset($_POST['year']) &&
isset($_POST['isbn']))
{
$author = get_post('author');
$title = get_post('titl e' );
$category = get_post('category');
$year = get_post('year');
$isbn = get_post('isbn');
$query = "INSERT INTO classics VALUES" .
"(' $author', ' $title', ' $category', ' $year', ' $isbn')";
if (!mysql_query($query, $db_server))
echo "INSERT failed: $query<br>" .
mysql_error() . "<br><br>";
}
echo <<<_END
<form action="sqltest.php" method="post"><pre>
Author <input type="text" name="author">
Title <input type="text" name="title">
Category <input type="text" name="category">
Year <input type="text" name="year">
ISBN <input type="text" name="isbn">
<input type="submit" value="ADD RECORD">
</pre></form>
END;
$query = "SELECT * FROM classics";
$result = mysqlquery($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
$rows = mysql_num_rows($result);
for ($j = 0 ; $j < $rows ; ++$j)
{
$row = mysql_fetch_row($result);
echo <<<_END
<pre>
Author $row[0]
Title $row[1]
Category $row[2]
Year $row[3]
99
Manajemen Database MySQL
ISBN $row[4]
</pre>
<form action="sqltest.php" method="post">
<input type="hidden" name="delete" value="yes">
<input type="hidden" name="isbn" value="$row[4]">
<input type="submit" value="DELETE RECORD"></form>
END;
}
mysqlclose($db_server);
function get_post($var)
{
return mysql_real_escape_string($_POST[$var]);
}
?>
Pada lebih dari 80 baris kode, program ini mungkin tampak menakutkan, tetapi jangan
khawatir karena kita sudah mencoba berbagai kode MySQL sejauh ini. Ini pertama-tama
periksa input apa pun yang mungkin telah dibuat dan kemudian memasukkan data baru ke
dalam tabel klasik dari database publikasi atau menghapus baris darinya, sesuai dengan input
yang diberikan. Terlepas dari apakah ada input, program kemudian mengeluarkan semua baris
dalam tabel ke browser. Jadi mari kita lihat cara kerjanya.
Bagian pertama dari kode baru dimulai dengan memakai fungsi isset untuk
memeriksa apakah nilai untuk semua field telah diposting ke program. sesudah konfirmasi,
setiap baris dalam pernyataan if memanggil fungsi get_post, yang muncul di akhir program.
Fungsi ini memiliki satu pekerjaan kecil namun penting: mengambil input dari browser.
Array $_POST
Browser mengirimkan input user melalui permintaan GET atau permintaan POST. Dan
disini kita akan memakai permintaan POST. Server web menggabungkan semua input
user (bahkan jika formulir diisi dengan seratus field) dan dimasukkan ke dalam array bernama
$_POST. $_POST adalah larik asosiatif. Tergantung pada apakah formulir telah diatur untuk
memakai metode POST atau GET, baik larik asosiatif $_POST atau $_GET akan diisi
dengan data formulir. Keduanya dapat dibaca dengan cara yang persis sama. Setiap f ield
memiliki elemen dalam array yang dinamai sesuai field itu.
Jadi, jika formulir berisi field bernama isbn, array $_POST berisi elemen yang dikunci
oleh kata isbn. Program PHP dapat membaca field itu dengan merujuk ke $_POST['isbn'] atau
$_POST["isbn"] (tanda kutip tunggal dan ganda memiliki efek yang sama dalam kasus ini). Jika
sintaks $_POST masih tampak rumit bagi Anda, yakinlah bahwa kita dapat memakai
konvensi, salin input user ke variabel lain, dan lupakan $_POST sesudah itu. Ini normal dalam
program PHP: mereka mengambil semua field dari $_POST di awal program dan kemudian
mengabaikannya. Jadi, kembali ke fungsi get_post: melewati setiap item yang diambilnya
melalui fungsi mysql_real_escape_string untuk menghapus karakter apa pun yang mungkin
telah dimasukkan peretas untuk membobol atau mengubah database kita.
Menghapus Rekaman
Sebelum memeriksa apakah data baru telah diposting, program memeriksa apakah
variabel $_POST['delete'] memiliki nilai. Jika demikian, user telah mengklik tombol DELETE
RECORD untuk menghapus record. Dalam hal ini, nilai $isbn juga akan diposting. Seperti yang
kita ingat, ISBN secara unik mengidentifikasi setiap catatan. Formulir HTML menambahkan
ISBN ke string kueri DELETE FROM yang dibuat dalam variabel $query, yang kemu dian
diteruskan ke fungsi mysql_query untuk mengeluarkannya ke MySQL. mysql_query
100
Manajemen Database MySQL
mengembalikan TRUE atau FALSE, dan FALSE menyebabkan pesan kesalahan ditampilkan
menjelaskan apa yang salah. Jika $_POST['delete']) tidak disetel (dan karena itu tidak ada
catatan yang akan dihapus), $_POST['author']) dan nilai yang diposting lainnya diperiksa. Jika
semuanya telah diberi nilai, maka $query diatur ke perintah INSERT INTO, diikuti oleh lima
nilai yang akan dimasukkan. Variabel kemudian diteruskan ke mysql_query, yang sesudah
selesai mengembalikan TRUE atau FALSE. Jika FALSE dikembalikan, pesan kesalahan
ditampilkan.
Menampilkan Formulir
Selalu ingat bahwa struktur echo <<<_END dari bab sebelumnya, yang menampilkan
semua yang ada di antara tag _END. Selain perintah echo, program juga bisa keluar dari PHP
memakai ?>, mengeluarkan HTML, lalu masuk kembali ke pemrosesan PHP dengan
<?php. Gaya apa pun yang digunakan adalah masalah preferensi programmer, tetapi saya
selalu merekomendasikan untuk tetap memakai kode PHP karena alasan berikut:
• Ini membuat PHP sangat jelas saat debugging (dan juga untuk user lain) bahwa semua
yang ada di dalam file.php adalah kode PHP. Oleh karena itu, tidak perlu pergi berburu
untuk putus sekolah ke HTML.
• Saat kita ingin memasukkan variabel PHP langsung ke dalam HTML, kita cukup
mengetiknya. Jika kita kembali ke HTML, kita harus memasukkan kembali pemrosesan
PHP untuk sementara, mengeluarkan variabel, dan kemudian keluar lagi.
Bagian formulir HTML hanya mengatur tindakan formulir ke sqltest.php. Artinya, saat
formulir dikirimkan, isi field formulir akan dikirim ke file sqltest.php, yang merupakan program
itu sendiri. Formulir juga diatur untuk mengirim field sebagai POST daripada permintaan GET.
Ini karena permintaan GET ditambahkan ke URL yang dikirimkan dan dapat terlihat berantakan
di browser kita. Mereka juga memungkinkan user untuk dengan mudah memodifikasi kiriman
dan mencoba meretas server kita. Oleh karena itu, bila memungkinkan, kita harus
memakai pengiriman POST, yang juga memiliki manfaat menyembunyikan data yang
diposting dari tampilan. sesudah menampilkan field formulir, HTML menampilkan tombol
Kirim dengan nama ADD RECORD dan menutup formulir. Perhatikan penggunaan tag <pre>
dan </pre> di sini, yang telah digunakan untuk memaksa font monospace dan memungkinkan
semua input berbaris dengan rapi. Pengembalian carriage di akhir setiap baris juga
dikeluarkan saat berada di dalam tag <pre>.
Menanyakan Database
Selanjutnya, kode kembali ke wilayah dalam empat baris kode berikut, permintaan
dikirim ke MySQL meminta untuk melihat semua catatan dalam tabel klasik. sesudah itu, $rows
diatur ke nilai yang mewakili jumlah baris dalam tabel dan loop for dimasukkan untuk
menampilkan konten setiap baris. Saya telah mengubah sedikit kode berikutnya untuk
menyederhanakan banyak hal. Alih-alih memakai tag <br> untuk umpan baris, saya
memilih untuk memakai tag <pre> untuk menyelaraskan tampilan setiap catatan dengan
cara yang menyenangkan. sesudah tampilan setiap record, ada form kedua yang juga diposting
ke sqltest.php (program itu sendiri) tapi kali ini berisi dua field tersembunyi: delete dan isbn.
Field hapus diatur ke "ya" dan isbn ke nilai yang disimpan di $baris[4], yang berisi ISBN untuk
catatan. Kemudian muncul tombol Submit dengan nama DELETE RECORD dan form ditutup.
Tanda kurung kurawal kemudian melengkapi perulangan for, yang akan berlanjut hingga
semua record ditampilkan.
Terakhir, kita melihat definisi fungsi get_post, yang telah kita lihat. Dan hanya itu —
program PHP pertama kita untuk memanipulasi database MySQL. Jadi, mari kita periksa apa
yang bisa dilakukannya. sesudah kita mengetik program (dan memperbaiki kesalahan
pengetikan), coba masukkan data berikut ke berbagai field input untuk menambahkan catatan
baru untuk buku Moby Dick ke database:
101
Manajemen Database MySQL
Agus Widodo
Moby Dick
Ilmiah
1851
9780199535729
Menjalankan Program
saat kita telah mengirimkan data ini memakai tombol ADD RECORD, gulir ke
bawah ke bagian bawah halaman web untuk melihat tambahan baru. Sekarang mari kita lihat
bagaimana menghapus catatan bekerja dengan membuat catatan dummy. Coba masukkan
hanya nomor 1 di masing-masing dari lima field dan klik tombol ADD RECORD. Jika sekarang
kita menggulir ke bawah, kita akan melihat catatan baru yang hanya terdiri dari 1 detik. Jelas
catatan ini tidak berguna dalam tabel ini, jadi sekarang klik tombol DELETE RECORD dan gulir
ke bawah lagi untuk mengonfirmasi bahwa catatan telah dihapus. Dengan asumsi bahwa
semuanya bekerja, kita sekarang dapat menambah dan menghapus catatan sesuka hati. Coba
lakukan ini beberapa kali, tetapi biarkan catatan utama tetap di tempatnya (termasuk yang
baru untuk Moby Dick), karena ki ta akan memakai nya nanti. Kita juga dapat mencoba
menambahkan catatan dengan semua 1 lagi beberapa kali dan perhatikan pesan kesalahan
yang kita terima untuk kedua kalinya, yang menunjukkan bahwa sudah ada ISBN dengan
nomor 1.
MySQL Praktis
Sekarang kita siap untuk melihat beberapa teknik praktis yang dapat kita gunakan di
PHP untuk mengakses database MySQL, termasuk tugas-tugas seperti membuat dan
menjatuhkan tabel; memasukkan, memperbarui, dan menghapus data; serta melindungi
database dan situs web kita dari user jahat. Perhatikan bahwa contoh selanjutnya dengan
mengasumsikan bahwa kita telah membuat program login.php.
Membuat Tabel
Anggap saja kita sedang bekerja untuk taman margasatwa dan perlu membuat
database untuk menyimpan detail tentang semua jenis kucing yang dikandungnya. Kita diberi
tahu bahwa ada sembilan keluarga kucing—Lion, Tiger, Jaguar, Leopard, Cougar, Cheetah,
Lynx, Caracal, dan Domestic —jadi kita memerlukan kolom untuk itu. Kemudian setiap kucing
telah diberi nama, jadi itu kolom lain, dan kita juga ingin melacak usia mereka, yang lain. Tentu
saja, kita mungkin akan memerlukan lebih banyak kolom nanti, mungkin untuk memenuhi
persyaratan diet, inokulasi, dan detail lainnya, tetapi untuk saat ini sudah cukup untuk
memulai. Identifikator unik juga diperlukan untuk setiap hewan, jadi kita juga memutuskan
untuk membuat kolom untuk yang disebut id. Contoh dibawah ini menunjukkan kode yang
mungkin kita gunakan untuk membuat tabel MySQL untuk disimpan data ini, dengan tugas
kueri utama dalam teks tebal.
Contoh Membuat tabel bernama kucing
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "CREATE TABLE cats (
id SMALLINT NOT NULL AUTO_INCREMENT,
family VARCHAR(32) NOT NULL,
102
Manajemen Database MySQL
name VARCHAR(32) NOT NULL,
age TINYINT NOT NULL,
PRIMARY KEY (id)
)";
$resu lt = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
?>
Seperti yang kita lihat, kueri MySQL terlihat sangat mirip dengan cara kita mengetiknya
langsung di command line, kecuali jika tidak ada tanda titik koma, karena tidak diperlukan saat
kita mengakses MySQL dari PHP.
Menggambarkan Tabel
Saat kita tidak masuk ke command line MySQL, berikut adalah kode praktis yang dapat
kita gunakan untuk memverifikasi bahwa tabel telah dibuat dengan benar dari dalam browser.
Ini hanya mengeluarkan kueri DESCRIBE cats dan kemudian menampilkan tabel HTML dengan
empat judul—Column, Type, Null, dan Key—di bawahnya semua kolom di dalam tabel akan
ditampilkan. Untuk memakai nya dengan tabel lain, cukup ganti nama cat (kucing) dala m
kueri dengan nama tabel baru.
Contoh Menggambarkan tabel kucing
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($ db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "DESCRIBE cats";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
$rows = mysql_num_rows($result);
echo "<table><tr><th>Column</th><th>Type</th><th>Null</th><th>Key</th></tr>";
for ($j = 0 ; $j < $rows ; ++$j)
{
$row = mysql_fetch_row($result);
echo "<tr>";
for ($k = 0 ; $k < 4 ; ++$k)
echo "<td>$row[$k]</td>";
echo "</tr>";
}
echo "</table>";
?>
Output dari program akan terlihat seperti ini:
Column Type Null Key
id smallint(6) NO PRI
family varchar(32) NO
name varchar(32) NO
age tinyint(4) NO
103
Manajemen Database MySQL
Meletakkan Tabel
Menjatuhkan kolom sangat mudah dilakukan dan karena itu sangat berbahaya, jadi
berhati-hatilah. Contoh selanjutnya menunjukkan kode yang kita butuhkan. Namun, saya
tidak menyarankan kita mencobanya sampai kita telah melalui contoh lain, karena akan
menjatuhkan kolom kucing dan kita harus membuatnya kembali memakai contoh
sebelumnya.
Contoh Menjatuhkan kolom kucing
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "DROP TABLE cats";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
?>
Menambahkan Data
Mari tambahkan beberapa data ke tabel memakai kode dari contoh dibawah ini.
Contoh Menambahkan data ke tabel cat
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "INSERT INTO cats VALUES(NULL, 'Lion', 'Leo', 4)";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error() ) ;
?>
Anda mungkin ingin menambahkan beberapa item data lagi dengan memodifikasi
$query sebagai berikut dan memanggil program di browser kita lagi:
$query = "INSERT INTO cats VALUES(NULL, 'Cougar', ' Growler', 2)";
$query = "INSERT INTO cats VALUES(NULL, 'Cheetah', 'Charly', 3)";
Pilai NULL yang dilewatkan sebagai parameter pertama? Ini karena kolom id bertipe
AUTO_INCREMENT, dan MySQL akan memutuskan nilai apa yang akan diberikan sesuai
dengan nomor yang tersedia berikutnya secara berurutan, jadi kita cukup memberikan nilai
NULL, yang akan diabaikan. Tentu saja, cara paling efisien untuk mengisi MySQL dengan data
adalah dengan membuat larik dan menyisipkan data dengan satu kueri.
Mengambil Data
Sekarang beberapa data telah dimasukkan ke dalam tabel cat, Contoh dibawah ini
menunjukkan bagaimana kita dapat memeriksa apakah itu dimasukkan dengan benar.
Contoh Mengambil baris dari tabel kucing
104
Manajemen Database MySQL
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "SELECT * FROM cats";
$result = mysql_query($query);
if (!$result) die ("Data base access failed: " . mysql_error()) ;
$rows = mysql_num_rows($result);
echo "<table><tr> <th>Id</th> <th>Family</th><th>Name</th><th>Age</th></tr>";
for ($j = 0 ; $j < $rows ; ++$j)
{
$row = mysql_fetch_row($result);
echo "<tr>";
for ($k = 0 ; $k < 4 ; + +$k)
echo "<td>$row[$k]</td>";
echo "</tr>";
}
echo "</table>";
?>
Kode ini hanya mengeluarkan kueri MySQL SELECT * FROM cats dan kemudian
menampilkan semua baris yang dikembalikan. Outputnya adalah sebagai berikut:
Id Family Name Age
1 Lion Leo 4
2 Cougar Growler 2
3 Cheetah Charly 3
Di sini kita dapat melihat bahwa kolom id telah bertambah secara otomatis dengan benar.
Memperbarui Data
Mengubah data yang sudah kita masukkan juga cukup sederhana. Apakah kita
memperhatikan ejaan Charly untuk nama cheetah?
Contoh Mengganti nama Charly si cheetah menjadi Charlie
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "UPDATE cats SET name='Charlie' WHERE name='Charly'";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
?>
If
105
Manajemen Database MySQL
Jika kita menjalankan contoh diatas maka kita akan melihat bahwa itu sekarang menampilkan
yang berikut:
Id Family Name Age
1 Lion Leo 4
2 Cougar Growler 2
3 Cheetah Charlie 3
Menghapus Data
Growler si tante girang telah dipindahkan ke kebun binatang lain , jadi sekarang saatnya
untuk menghapusnya dari database.
Contoh Menghapus Growler si tante girang dari kolom kucing
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "DELETE FROM cats WHERE name=' Growler'";
$result = mysql_query($query);
if (!$result) die ("Database access f ailed: " . mysql_error()) ;
?>
Ini memakai kueri DELETE FROM standar, dan saat kita menjalankan Contoh diatas kita
dapat melihat bahwa baris telah dihapus dalam output berikut:
Id Family Name Age
1 Lion Leo 4
3 Cheetah Charlie 3
memakai AUTO_INCREMENT
Saat memakai AUTO_INCREMENT, kita tidak dapat mengetahui nilai apa yang
telah diberikan ke kolom sebelum baris disisipkan. Sebaliknya, jika kita perlu mengetahuinya,
kita harus bertanya ke MySQL sesudahnya memakai fungsi mysql_insert_id. Kebutuhan
ini umum: misalnya, saat kita memproses pembelian, kita mungkin memasukkan pelanggan
baru ke dalam tabel Pelanggan dan kemudian merujuk ke CustId yang baru dibuat saat
memasukkan pembelian ke dalam tabel pembelian.
Contoh Menambahkan data ke tabel kucing dan melaporkan id penyisipan
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_databas e)
or die("Unable to select database: " . mysql_error()) ;
$query = "INSERT INTO cats VALUES(NULL, 'Lynx', 'Stumpy', 5)";
$result = mysql_query($query);
echo "The Insert Id was: " . mysql_insert_id();
106
Manajemen Database MySQL
if (!$result) die ("Database access failed: " . mysql_error()) ;
?>
Isi tabel sekarang akan terlihat seperti berikut (perhatikan bagaimana nilai id sebelumnya dari
2 tidak digunakan kembali, karena ini dapat menyebabkan komplikasi dalam beberapa kasus):
Id Family Name Age
1 Lion Leo 4
3 Cheetah Charlie 3
4 Lynx Stumpy 5
memakai Insert ID
Sangat umum untuk menyisipkan data dalam beberapa tabel: buku diikuti oleh
penulisnya, atau pelanggan diikuti oleh pembeliannya, dan seterusnya. Saat melakukan ini
dengan kolom kenaikan otomatis, kita harus mempertahankan ID sisipan yang dikembalikan
untuk disimpan di tabel terkait. Sebagai contoh, mari kita asumsikan bahwa kucing-kucing ini
dapat "diadopsi" oleh publik sebagai sarana penggalangan dana, dan saat seekor kucing
baru disimpan di kolom kucing, kita juga ingin membuat kunci untuk mengikatnya ke pemilik
hewan adopsi. Kodenya adalah sebagai berikut:
$query = "INSERT INTO cats VALUES(NULL, 'Lynx', 'Stumpy', 5)";
$result = mysql_query($query);
$insertID = mysql_insert_i d();
$query = "INSERT INTO owners VALUES($insertID, 'Ann', 'Smith')";
$result = mysql_query($query);
Sekarang kucing terhubung ke "pemiliknya" melalui ID unik kucing, yang dibuat secara
otomatis oleh AUTO_INCREMENT.
memakai kunci
Prosedur yang benar-benar aman untuk menghubungkan tabel melalui sisipan ID
adalah dengan memakai kunci. Ini dapat sedikit memperlambat waktu respons saat ada
banyak orang yang mengirimkan data ke tabel yang sama. Urutannya adalah sebagai berikut:
1. Kunci tabel pertama (mi s., Cat (kucing dalam bahasa inggris).
2. Masukkan data ke tabel pertama.
3. Ambil ID unik dari tabel pertama melalui mysql_insert_id.
4. Buka kunci tabel pertama.
5. Masukkan data ke dalam tabel kedua.
Anda dapat melepaskan kunci dengan aman sebelum memasukkan data ke tabel kedua,
karena ID penyisipan telah diambil dan disimpan dalam variabel program. Kita juga bisa
memakai transaksi alih-alih mengunci, tetapi itu semakin memperlambat server MySQL.
Melakukan Pertanyaan Tambahan
Untuk menjelajahi beberapa kueri yang sedikit lebih kompleks, kita perlu kembali
memakai tabel pelanggan dan klasik. Akan ada dua pelanggan di tabel pelanggan; tabel
klasik menyimpan detail beberapa buku. Mereka juga berbagi kolom umum ISBN, yang disebut
isbn, yang dapat kita gunakan untuk melakukan kueri tambahan. Misalnya, untuk
menampilkan semua pelanggan beserta judul dan penulis buku yang mereka beli, kita dapat
memakai kode seperti contoh dibawah ini.
Contoh Melakukan kueri sekunder
107
Manajemen Database MySQL
<?php
require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$query = "SELECT * FROM custome rs";
$result = mysql_query($query);
if (!$result) die ("Database access failed: " . mysql_error()) ;
$rows = mysql_num_rows($result);
for ($j = 0 ; $j < $rows ; ++$j)
{
$row = mysql_fetch_row($result);
echo "$row[0] purchased ISBN $row[1]:<br>";
$subquery = "SELECT * FROM classics WHERE isbn=' $row[1]' ";
$subresult = mysql_query($subquery);
if (!$subresult) die ("Database access failed: " . mysql_error()) ;
$subrow = mysql_fetch_row($subresult);
echo " ' $subrow[1]' by $subrow[0]<br>";
}
?>
Program ini memakai kueri awal ke tabel pelanggan untuk mencari semua
pelanggan, kemudian, dengan memberikan ISBN buku yang dibeli setiap pelanggan, akan
membuat kueri baru ke tabel klasik untuk mengetahui judul dan pengarang masing-masing.
Output dari kode ini harus sebagai berikut:
Mars Caroline purchased ISBN 9780582506206:
'Membangun PODCAST' by Agus Widodo
Sarwo Nugroho purchased ISBN 9780517123201:
'Desain Seri Rupa Realis dan Tata warna' by Mars Caroline W
Catatan: Tentu saja, meskipun tidak menggambarkan melakukan kueri tambahan, dalam
kasus khusus ini kita juga dapat mengembalikan informasi yang sama memakai kueri
NATURAL JOIN seperti ini:
SELECT name,isbn,title,author
FROM customers NATURAL JOIN classics;
Mencegah Injeksi SQL
Mungkin sulit untuk memahami betapa berbahayanya melewatkan input user yang
tidak dicentang ke MySQL. Misalnya, kita memiliki sepotong kode sederhana untuk
memverifikasi user, dan terlihat seperti ini:
$user = $_POST['user'];
$pass = $_POST['pass'];
$query = "SELECT * FROM users WHERE user=' $user' AND pass=' $pass'";
108
Manajemen Database MySQL
Pada pandangan pertama, kita mungkin berpikir kode ini baik-baik saja. Jika user memasukkan
nilai fredsmith dan mypass masing-masing untuk $user dan $pass, maka string kuer i, yang
diteruskan ke MySQL, akan menjadi sebagai berikut:
SELECT * FROM users WHERE user='fredsmith' AND pass='mypass'
Ini semua baik dan bagus, tetapi bagaimana jika seseorang memasukkan yang berikut untuk
$user (dan bahkan tidak memasukkan apa pun unt uk $pass)?
admin' #
Mari kita lihat string yang akan dikirim ke MySQL:
SELECT * FROM users WHERE user='admin' #' AND pass=' '
Apakah kita melihat masalah di sana? Di MySQL, simbol # mewakili awal komentar. Oleh
karena itu, user akan masuk sebagai admin (dengan asumsi ada admin pengguna), tanpa harus
memasukkan kata sandi. Berikut ini, bagian dari kueri yang akan dieksekusi ditampilkan dalam
huruf tebal; sisanya akan diabaikan.
SELECT * FROM users WHERE user='admin' #' AND pass=''
Jika aplikasi kita menghapus user dari database, maka kodenya akan terlihat seperti ini:
$user = $_POST['user'];
$pass = $_POST['pass'];
$query = "DELETE FROM users WHERE user=' $user' AND pass=' $pass'";
Sekali lagi, ini terlihat cukup normal pada pandangan pertama, tetapi bagaimana jika
seseorang memasukkan yang berikut untuk $user?
anything' OR 1=1 #
Ini akan ditafsirkan oleh MySQL sebagai:
DELETE FROM users WHERE user='anything' OR 1=1 #' AND pass=''
Kueri SQL akan selalu BENAR sehingga kita akan kehilangan seluruh database user kita. Jadi
bagaimana jika ada serangan seperti ini? Jangan mengandalkan tanda kutip ajaib bawaan
PHP, yang secara otomatis keluar dari karakter apa pun seperti tanda kutip tunggal dan ganda
dengan mengawalinya dengan garis miring terbalik ( \ ). Mengapa? Karena fitur ini bisa
dimatikan; banyak programmer melakukannya untuk menempatkan kode keamanan mereka
sendiri. Jadi tidak ada jaminan bahwa ini tidak terjadi di server yang kita kerjakan. Faktanya,
fitur tersebut tidak digunakan lagi pada PHP 5.3.0 dan telah dihapus di PHP 6.0.0. Sebagai
gantinya, kita harus selalu memakai fungsi mysql_real_escape_string untuk semua
panggilan ke MySQL. Contoh dibawah ini adalah fungsi yang dapat kita gunakan yang akan
menghapus tanda kutip ajaib yang ditambahkan ke string yang dimasukkan user dan kemudian
membersihkannya dengan benar untuk kita.
Contoh Cara membersihkan input user untuk MySQL dengan benar
109
Manajemen Database MySQL
<?php
function mysql_fix_string($string)
{
if (get_magic_quotes_gpc()) $string = stripslashe s($string);
return mysql_real_escape_string($string);
}
?>
Fungsi get_magic_quotes_gpc mengembalikan TRUE jika tanda kutip ajaib aktif. Dalam
hal ini, garis miring apa pun yang telah ditambahkan ke string harus dihapus, atau fungsi
mysql_real_escape_string dapat membuat karakter keluar ganda, membuat string rusak.
Contoh dibawah ini mengilustrasikan bagaimana kita akan memasukkan mysql_fix_string ke
dalam kode kita sendiri.
Contoh Cara aman mengakses MySQL dengan input pengguna
<?ph p
$user = mysql_fix_string($_POST['user']) ;
$pass = mysql_fix_string($_POST['pass']) ;
$query = "SELECT * FROM users WHERE user=' $user' AND pass=' $pass'";
function mysql_fix_string($string)
{
if (get_magic_quotes_gpc()) $string = stripslashes($string);
return mysql_real_escape_string($string);
}
?>
memakai Placeholder
Cara lain untuk mencegah injeksi SQL adalah dengan memakai fitur yang disebut
placeholder. Idenya adalah untuk menentukan kueri memakai ? karakter di mana data
akan muncul. Kemudian, panggil kueri yang telah ditentukan sebelumnya untuk meneruskan
data ke sana. Ini memiliki efek memastikan bahwa setiap item data yang dimasukkan
dimasukkan langsung ke dalam database dan tidak dapat ditafsirkan sebagai kueri SQL.
Dengan kata lain, injeksi SQL menjadi tidak mungkin. Urutan kueri yang akan dieksekusi saat
memakai command line MySQL akan seperti pada contoh berikut ini:
Contoh memakai placeholder
PREPARE statement FROM "INSERT INTO classics VALUES(?,?,?,?,?) ";
SET @author = "Emily Brontë",
@title = "Wuthering Heights",
@category = "Classic Ilmiah",
@year = "1847",
@isbn = "9780553212587";
EXECUTE statement USING @author,@title,@category,@year,@isbn;
DEALLOCATE PREPARE statement;
Perintah pertama menyiapkan pernyataan yang disebut pernyataan untuk
memasukkan data ke dalam tabel klasik. Seperti yang kita lihat, sebagai pengganti nilai atau
variabel untuk data yang akan disisipkan, pernyataan berisi serangkaian ? karakter. Ini adalah
placeholder. Lima baris berikutnya memberikan nilai ke variabel MySQL sesuai dengan data
110
Manajemen Database MySQL
yang akan dimasukkan. Kemudian pernyataan yang telah ditentukan dieksekusi, melewati
variabel-variabel ini sebagai parameter. Terakhir, pernyataan tersebut dihapus, untuk
mengembalikan sumber daya yang digunakannya. Di PHP, kode untuk prosedur ini terlihat
seperti contoh dibawah (dengan asumsi kita telah membuat login.php dengan detail yang
benar untuk mengakses database).
Contoh memakai placeholder dengan PHP.
< ?php
require 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()) ;
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error()) ;
$quer y = 'PREPARE statement FROM "INSERT INTO classics VALUES(?,?,?,?,?) "' ;
mysql_query($query);
$query = 'SET @author = "Emily Brontë",' .
' @title = "Wuthering Heights",' .
' @category = "Classic Ilmiah",' .
' @year = "1847",' .
' @isbn = "9780553212587"' ;
mysql_ query($query);
$query = 'EXECUTE statement USING @author,@title,@category,@year,@isbn';
mysql_query($query);
$query = 'DEALLOCATE PREPARE statement';
mysql_query($query);
?>
sesudah kita menyiapkan pernyataan dan belum alokasinya, kita masih dapat
memakai nya sesering yang kita inginkan. Pernyataan seperti itu biasanya digunakan
dalam satu lingkaran untuk memasukkan data ke dalam database dengan cepat dengan
memberikan nilai ke variabel MySQL dan kemudian mengeksekusi pernyataan tersebut.
Pendekatan ini lebih efisien daripada membuat seluruh pernyataan dari awal pada setiap
melewati loop.
Mencegah Injeksi HTML
Ada jenis injeksi lain yang perlu kita perhatikan—bukan untuk keamanan situs web kita
sendiri, tetapi untuk privasi dan perlindungan user kita. Itu skrip lintas situs, juga disebut
sebagai XSS. Ini terjadi saat kita mengizinkan HTML, atau lebih sering kode JavaScript, untuk
dimasukkan oleh user dan kemudian ditampilkan kembali oleh situs web kita. Satu tempat ini
umum adalah dalam bentuk komentar. Disini yang paling sering terjadi adalah user jahat akan
mencoba menulis kode yang mencuri cookie dari user situs Anda, memungkinkannya
menemukan pasangan nama user dan sandi atau informasi lainnya. Lebih buruk lagi, user jahat
mungkin meluncurkan serangan untuk mengunduh Trojan ke komputer user.
<script src='http://x.com/hack.js' >
</script><script>hack();</script>
Tetapi mencegahnya semudah memanggil fungsi htmlentities, yang menghapus
semua kode markup HTML dan menggantinya dengan formulir yang menampilkan karakter,
111
Manajemen Database MySQL
tetapi tidak mengizinkan browser untuk bertindak berdasarkan kode tersebut. Sebagai
contoh, perhatikan HTML berikut:
<script src='http://x.com/hack.js' >
</script><script>hack();</script>
Oleh karena itu, jika kita akan menampilkan apa pun yang dimasukkan user Anda, baik segera
atau sesudah menyimpannya dalam database, kita harus terlebih dahulu membersihkannya
dengan htmlentities. Untuk melakukan ini, saya sarankan kita membuat fungsi baru, seperti
yang pertama pada Contoh dibawah ini, yang dapat membersihkan untuk injeksi SQL dan XSS.
Contoh Fungsi untuk mencegah serangan injeksi SQL dan XSS
<?php
function mysql_entities_fix_string($string)
{
return htmlentities(mysql_fix_string($string));
}
function mysql_f ix_string($string)
{
if (get_magic_quotes_gpc()) $string = stripslashes($string);
return mysql_real_escape_string($string);
}
?>
Fungsi mysql_entities_fix_string pertama -tama memanggil mysql_fix_string dan kemudian
meneruskan hasilnya melalui htmlentities sebelum mengembalikan string yang sepenuhnya
dibersihkan.
Contoh Cara aman mengakses MySQL dan mencegah serangan XSS.
<?php
$user = mysql_entities_fix_string($_POST['user']) ;
$pass = mysql_entities_fix_string($_POST['pass']) ;
$query = "SELECT * FROM users WHERE user=' $user' AND pass=' $pass'";
function mysql_entities_fix_string($string)