Membangun Database
Menciptakan Database dan Tabel Komik
Pada kasus ini, Anda akan menciptakan file
yang akan menampung hostname, username, password, dan nilai-nilai database.
Kemudian Anda akan menciptakan tabel-tabel database.
Contoh
|
Menciptakan
tabel komik
|
1.
Jalankan
perintah ini pada command line MySQL:
CREATE DATABASE
IF NOT EXISTS situskomik;
2.
Bukalah
teks editor Anda, dan masukkan kode berikut (pastikan bahwa Anda menggunakan
nilai-nilai yang sesuai dengan server Anda):
<?php
define('MYSQL_HOST','localhost');
define('MYSQL_USER','rismon');
define('MYSQL_PASSWORD','Dolokulu77');
define('MYSQL_DB','situskomik');
?>
Simpan file tersebut dengan nama otorisasi_komik.inc.php. File ini akan
dicantumkan pada tiap file PHP berikut yang memerlukan akses ke database, dan
menyediakan informasi koneksi. Hal ini sangat praktis karena Anda akan
menggunakannya pada bab-bab berikutnya.
3.
Ketikkan
kode berikut pada editor teks Anda, dan simpan dengan nama tabel_karakter_komik.php.
<?php
require 'otorisasi_komik.inc.php';
$db = mysql_connect(MYSQL_HOST, MYSQL_USER,
MYSQL_PASSWORD) or
die ('Tidak
bisa terhubung. Periksa parameter-parameter koneksi.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));
// menciptakan tabel karakter_komik
$query = 'CREATE TABLE IF NOT EXISTS karakter_komik (
id_karakter
INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
alias
VARCHAR(40) NOT NULL DEFAULT "",
nama_riil
VARCHAR(80) NOT NULL DEFAULT "",
id_lokasi
INTEGER UNSIGNED NOT NULL DEFAULT 0,
kecenderungan ENUM("baik", "jahat") NOT NULL DEFAULT
"baik",
PRIMARY KEY
(id_karakter)
)
ENGINE=MyISAM';
mysql_query($query, $db) or die (mysql_error($db));
// menciptakan tabel power_komik
$query = 'CREATE TABLE IF NOT EXISTS power_komik (
id_power
INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
power
VARCHAR(40) NOT NULL DEFAULT "",
PRIMARY
KEY (id_power)
)
ENGINE=MyISAM';
mysql_query($query, $db) or die (mysql_error($db));
// menciptakan tabel penghubung power_karakter_komik
$query = 'CREATE TABLE IF NOT EXISTS power_karakter_komik
(
id_karakter
INTEGER UNSIGNED NOT NULL DEFAULT 0,
id_power
INTEGER UNSIGNED NOT NULL DEFAULT 0,
PRIMARY
KEY (id_karakter, id_power)
)
ENGINE=MyISAM';
mysql_query($query, $db) or die (mysql_error($db));
// menciptakan tabel lokasi_komik
$query = 'CREATE TABLE IF NOT EXISTS lokasi_komik (
id_lokasi
INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
id_kodepos
CHAR(5) NOT NULL DEFAULT "00000",
alamat
VARCHAR(40) NOT NULL DEFAULT "",
PRIMARY
KEY (id_lokasi)
)
ENGINE=MyISAM';
mysql_query($query, $db) or die (mysql_error($db));
// menciptakan tabel kodepos_komik
$query = 'CREATE TABLE IF NOT EXISTS kodepos_komik (
id_kodepos
CHAR(5) NOT NULL DEFAULT "00000",
kota
VARCHAR(40) NOT NULL DEFAULT "",
propinsi
CHAR(30) NOT NULL DEFAULT "",
PRIMARY
KEY (id_kodepos)
)
ENGINE=MyISAM';
mysql_query($query, $db) or die (mysql_error($db));
// menciptakan tabel musuh_komik
$query = 'CREATE TABLE IF NOT EXISTS musuh_komik (
id_hero
INTEGER UNSIGNED NOT NULL DEFAULT 0,
id_penjahat
INTEGER UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (id_hero, id_penjahat)
)
ENGINE=MyISAM';
mysql_query($query, $db) or die (mysql_error($db));
echo 'Selesai.';
?>
4.
Jalankan
tabel_karakter_komik.php dengan
browser Anda. Anda akan melihat pesan “Selesai” pada browser Anda, dan sekarang
database situskomik akan memuat enam
tabel.
Setiap skript PHP yang memerlukan akses ke
database Anda pada server MySQL perlu mencantumkan otorisasi_komik.inc.php. Konstanta-konstanta yang dimuat file
tersebut akan dipakai pada skript Anda untuk mendapatkan akses ke database
Anda. Dengan menempatkannya dalam satu file, Anda dapat mengubah nilai-nilainya
pada waktu kapanpun Anda memindahkan server, mengubah nama database, atau
mengubah username atau password Anda, tanpa perlu secara eksplisit mengedit
setiap file kode. Kapanpun Anda memiliki kode atau informasi yang akan
digunakan pada lebih dari satu skript PHP, Anda sebaiknya mencantumkannya pada
sebuah file terpisah, sehingga Anda hanya perlu memodifikasi satu lokasi ketika
Anda ingin mengubahnya.
define('MYSQL_HOST','localhost');
define('MYSQL_USER','rismon');
define('MYSQL_PASSWORD','Dolokulu77');
define('MYSQL_DB','situskomik');
File tabel_karakter_komik.php
merupakan skript yang hanya boleh dijalankan sekali saja. Anda jangan pernah
menjalankannya kembali, kecuali jika Anda perlu menghapus tabel-tabel Anda dan
menciptakannya ulang. Amati salah satu statemen SQL berikut:
CREATE TABLE
IF NOT EXISTS karakter_komik (
id_karakter INTEGER UNSIGNED NOT NULL
AUTO_INCREMENT,
alias VARCHAR(40) NOT NULL DEFAULT
"",
nama_riil VARCHAR(80) NOT NULL DEFAULT
"",
id_lokasi INTEGER UNSIGNED NOT NULL
DEFAULT 0,
kecenderungan ENUM("baik",
"jahat") NOT NULL DEFAULT "baik",
PRIMARY KEY (id_karakter)
)
ENGINE=MyISAM';
Menciptakan Aplikasi Karakter Komik
Contoh
|
Skript
transaksi
|
1.
Mulailah
sebuah skript transaksi. Kode ini adalah kode terpanjang, karena memuat banyak
statemen SQL. Anda akan semakin belajar banyak tentang SQL pada buku ini.
Setelah Anda ketikkan, simpan file tersebut dengan nama transaksi_karakter.php:
<?php
require
'otorisasi_komik.inc.php';
$db = mysql_connect(MYSQL_HOST,
MYSQL_USER, MYSQL_PASSWORD) or
die ('Tidak bisa terhubung. Periksa
parameter-parameter koneksi.');
mysql_select_db(MYSQL_DB, $db) or
die(mysql_error($db));
switch ($_POST['aksi']) {
case 'Tambah Karakter':
// mengawal nilai-nilai yang masuk untuk
memproteksi database
$alias =
mysql_real_escape_string($_POST['alias'], $db);
$nama_riil =
mysql_real_escape_string($_POST['nama_riil'], $db);
$alamat =
mysql_real_escape_string($_POST['alamat'], $db);
$kota = mysql_real_escape_string($_POST['kota'],
$db);
$propinsi =
mysql_real_escape_string($_POST['propinsi'], $db);
$id_kodepos =
mysql_real_escape_string($_POST['id_kodepos'], $db);
$kecenderungan = ($_POST['kecenderungan']
== 'baik') ? 'baik' : 'jahat';
// menambah informasi karakter ke
tabel-tabel database
$query = 'INSERT IGNORE INTO kodepos_komik
(id_kodepos, kota, propinsi)
VALUES
("' . $id_kodepos . '",
"' . $kota . '", "' . $propinsi . '")';
mysql_query($query, $db) or die
(mysql_error($db));
$query = 'INSERT INTO lokasi_komik
(id_lokasi, id_kodepos, alamat)
VALUES
(NULL, "' . $id_kodepos .
'", "' . $alamat . '")';
mysql_query($query, $db) or die
(mysql_error($db));
// membaca id_lokasi baru yang dihasilkan
oleh MySQL
$id_lokasi = mysql_insert_id($db);
$query = 'INSERT INTO karakter_komik
(id_karakter, alias, nama_riil,
id_lokasi, kecenderungan)
VALUES
(NULL, "' . $alias . '",
"' . $nama_riil . '", ' .
$id_lokasi . ', "' .
$kecenderungan . '")';
mysql_query($query, $db) or die
(mysql_error($db));
// membaca id_karakter baru yang dihasilkan
oleh MySQL
$id_karakter = mysql_insert_id($db);
if (!empty($_POST['daya'])) {
$arraynilai = array();
foreach ($_POST['daya'] as $id_power) {
$arraynilai[] = sprintf('(%d, %d)',
$id_karakter, $id_power);
}
$query = 'INSERT IGNORE INTO
power_karakter_komik
(id_karakter, id_power)
VALUES ' .
implode(',', $arraynilai);
mysql_query($query, $db) or die
(mysql_error($db));
}
if (!empty($_POST['musuh'])) {
$arraynilai = array();
foreach ($_POST['musuh'] as $id_mush) {
$arraynilai[] = sprintf('(%d, %d)',
$id_karakter, $id_mush);
}
// kecenderungan akan memengaruhi
urutan kolom
$kolom = ($kecenderungan = 'baik') ?
'(id_hero, id_penjahat)' :
'(id_penjahat, id_hero)';
$query = 'INSERT IGNORE INTO musuh_komik
' . $kolom . '
VALUES
' . implode(',', $arraynilai);
mysql_query($query, $db) or die
(mysql_error($db));
}
$redirect = 'daftar_karakter.php';
break;
case 'Hapus Karakter':
// memastikan id_karakter adalah sebuah
angka untuk jaga-jaga
$id_karakter = (int)$_POST['id_karakter'];
//
menghapus informasi karakter dari tabel-tabel
$query = 'DELETE FROM c, l
USING
karakter_komik c, lokasi_komik l
WHERE
c.id_lokasi = l.id_lokasi AND
c.id_karakter = ' . $id_karakter;
mysql_query($query, $db) or die
(mysql_error($db));
$query = 'DELETE FROM power_karakter_komik
WHERE
id_karakter = ' . $id_karakter;
mysql_query($query, $db) or die
(mysql_error($db));
$query
= 'DELETE FROM musuh_komik
WHERE
id_hero = ' . $id_karakter . ' OR
id_penjahat = ' . $id_karakter;
mysql_query($query, $db) or die
(mysql_error($db));
$redirect = 'daftar_karakter.php';
break;
case 'Edit Karakter':
// mengawal nilai-nilai yang masuk untuk
memproteksi database
$id_karakter = (int)$_POST['id_karakter'];
$alias =
mysql_real_escape_string($_POST['alias'], $db);
$nama_riil =
mysql_real_escape_string($_POST['nama_riil'], $db);
$alamat =
mysql_real_escape_string($_POST['alamat'], $db);
$kota = mysql_real_escape_string($_POST['kota'],
$db);
$propinsi =
mysql_real_escape_string($_POST['propinsi'], $db);
$id_kodepos =
mysql_real_escape_string($_POST['id_kodepos'], $db);
$kecenderungan = ($_POST['kecenderungan']
== 'baik') ? 'baik' : 'jahat';
//
memperbarui informasi karakter yang ada pada tabel-tabel
$query = 'INSERT IGNORE INTO kodepos_komik
(id_kodepos, kota, propinsi)
VALUES
("' . $id_kodepos . '",
"' . $kota . '", "' . $propinsi . '")';
mysql_query($query, $db) or die (mysql_error($db));
$query
= 'UPDATE lokasi_komik l, karakter_komik c
SET
l.id_kodepos = ' . $id_kodepos . ',
l.alamat = "' . $alamat .
'",
c.nama_riil = "' . $nama_riil
. '",
c.alias = "' . $alias .
'",
c.kecenderungan = "' .
$kecenderungan . '"
WHERE
c.id_karakter = ' . $id_karakter .
' AND
c.id_lokasi = l.id_lokasi';
mysql_query($query, $db) or die
(mysql_error($db));
$query
= 'DELETE FROM power_karakter_komik
WHERE
id_karakter = ' . $id_karakter;
mysql_query($query, $db) or die
(mysql_error($db));
if
(!empty($_POST['daya'])) {
$arraynilai = array();
foreach ($_POST['daya'] as $id_power) {
$arraynilai[] = sprintf('(%d, %d)',
$id_karakter, $id_power);
}
$query = 'INSERT IGNORE INTO
power_karakter_komik
(id_karakter, id_power)
VALUES
' . implode(',', $arraynilai);
mysql_query($query, $db) or die
(mysql_error($db));
}
$query
= 'DELETE FROM musuh_komik
WHERE
id_hero = ' . $id_karakter . ' OR
id_penjahat = ' . $id_karakter;
mysql_query($query, $db) or die
(mysql_error($db));
if (!empty($_POST['musuh'])) {
$arraynilai = array();
foreach ($_POST['musuh'] as $id_musuh)
{
$arraynilai[] = sprintf('(%d, %d)',
$id_karakter, $id_musuh);
}
//
kecenderungan akan memengaruhi urutan kolom
$kolom = ($kecenderungan = 'baik') ?
'(id_hero, id_penjahat)' :
'(id_penjahat, id_hero)';
$query = 'INSERT IGNORE INTO
musuh_komik
' . $kolom . '
VALUES
' . implode(',', $arraynilai);
mysql_query($query, $db) or die
(mysql_error($db));
}
$redirect = 'daftar_karakter.php';
break;
case 'Hapus Power Yang
Diseleksi':
if (!empty($_POST['daya'])) {
// mengawal nilai-nilai yang masuk
untuk melindungi database
// harus nilai-nilai numerik, untuk
jaga-jaga
$daya = implode(',', $_POST['daya']);
$daya = mysql_real_escape_string($daya,
$db);
//
menghapus power
$query = 'DELETE FROM power_komik
WHERE
id_power IN (' . $daya . ')';
mysql_query($query, $db) or die
(mysql_error($db));
$query
= 'DELETE FROM power_karakter_komik
WHERE
id_power IN (' . $daya . ')';
mysql_query($query, $db) or die
(mysql_error($db));
}
$redirect = 'edit_power.php';
break;
case 'Tambah Power Baru':
// memotong dan memeriksa power untuk
menghindari nilai-nilai kosong
$power = trim($_POST['daya_baru']);
if ($power != '')
{
// mengawal nilai yang masuk
$power =
mysql_real_escape_string($power, $db);
// menciptakan power baru
$query = 'INSERT IGNORE INTO
power_komik
(id_power, power)
VALUES
(NULL, "' . $power .
'")';
mysql_query($query, $db) or die
(mysql_error($db));
}
$redirect = 'edit_power.php';
break;
default:
$redirect = 'daftar_karakter.php';
}
header('Location: ' . $redirect);
?>
Query INSERT yang ada di dalam bagian Tambah
Karakter cukup mudah. Dalam bahasa sederhana, dikatakan: “Sisipkan nilai-nilai
$id_kodepos, $kota, dan $propinsi ke dalam kolom id_kodepos, kota, dan kolom
propinsi pada tabel kodepos_komik. Katakunci IGNORE merupakan cara yang efektif
yang bisa Anda pakai untuk melakukan penyisipan tanpa terlebih dahulu
menggunakan query SELECT untuk melihat apakah data telah ada dalam tabel. Pada
kasus ini, Anda mengetahui bahwa mungkin telah ada sebuah rekaman untuk kode
pos ini, jadi IGNORE memberitahu query “jika melihat kode pos ini dalam tabel,
maka jangan lakukan INSERT”.
$query =
'INSERT IGNORE INTO kodepos_komik
(id_kodepos, kota, propinsi)
VALUES
("' . $id_kodepos . '",
"' . $kota . '", "' . $propinsi . '")';
mysql_query($query, $db) or die (mysql_error($db));
Statemen IGNORE hanya membandingkan primary
key. Oleh karena itu, meski jika kode pos lain ada dalam database dengan
propinsi yang sama, maka INSERT akan
dilakukan. Jadi, penggunaan IGNORE ketika penyisipan data ke dalam tabel dimana
primary key diinkremen secara otomatis tidak akan berpengerahu sama sekali,
karena INSERT akan selalu dilakukan pada kasus tersebut.
Pada INSERT berikutnya, Anda menggunakan NULL
sebagai nilai pertama. Ketika Anda menyisipkan NULL ke dalam suatu kolom, maka
MySQL akan melakukan: Jika kolom membolehkan nilai-nilai NULL, maka ia menerima
NULL apa adanya dan menyisipkannya; jika kolom tidak mengijinkan nilai-nilai
NULL (misalnya, kolom id_lokasi ditetapkan menjadi NOT NULL), maka hal itu akan
menetapkan nilai default untuk kolom tersebut. Jika nilai default tidak
ditentukan, maka default standar untuk tipe data tertentu akan disisipkan
(misalnya, nilai default string kosong untuk bertipe VARCHAR/CHAR, 0 untuk
bertipe INTEGER, dan lainnya). Jika kolom ditetapkan AUTO_INCREMENT, seperti
kasus di sini, maka nilai integer tertinggi berikutnya untuk kolom tersebut
akan disisipkan. Inilah apa yang Anda inginkan di sini karena id_lokasi
merupakan primary key, dan nilainya harus unik.
$query =
'INSERT INTO lokasi_komik
(id_lokasi, id_kodepos, alamat)
VALUES
(NULL, "' . $id_kodepos . '",
"' . $alamat . '")';
mysql_query($query, $db) or die (mysql_error($db));
Anda juga dapat membiarkan bidang id_lokasi
dari penyisipan dan menyisipkan nilai-nilai hanya ke dalam kolom id_kodepos dan
id_lokasi. MySQL memerperlakukan kolom yang diabaikan sama seperti ketika Anda
mencoba menyisipkan NILL ke dalamnya.
Bila diasumsikan bahwa penyisipan berhasil
dilakukan ($hasil menghasilkan TRUE), maka fungsi mysql_insert_id() akan
menghasilkan nilai dari AUTO_INCREMENT yang terakhir ketika query dijalankan
terakhir kali. Hal ini bisa dilakukan hanya setelah dilakukan query terhadap
suatu tabel dengan suatu kolo AUTO_INCREMENT. Pada kasus ini, yang dihasilkan
adalah nilai primary key untuk baris id_lokasi yang Anda sisipkan ke dalam
tabel lokasi_komik. Anda akan memerlukan nilai tersebut untuk disisipkan ke
dalam tabel karakter_komik.
$id_lokasi =
mysql_insert_id($db);
Variabel koneksi bersifat opsional, tetapi
adalah kebiasaan baik untuk selalu mencantumkannya ketika memanggil fungsi
mysql_insert_id(). Jika Anda mengabaikannya, maka fungsi tersebut akan
menggunakan koneksi database yang terakhir dibuka. Ini bukanlah masalah pada
aplikasi sederhana seperti ini, tetapi pada aplikasi yang lebih kompleks,
dimana Anda akan memiliki beberapa koneksi database yang dibuka pada saat yang
bersamaan, hal itu akan membingungkan.
Lagi, perhatikan penggunaan NULL untuk
primary key dan penggunaan mysql_insert_id() untuk menghasilkan primary key
pada:
$query =
'INSERT INTO karakter_komik
(id_karakter, alias, nama_riil,
id_lokasi, kecenderungan)
VALUES
(NULL, "' . $alias . '",
"' . $nama_riil . '", ' .
$id_lokasi . ', "' .
$kecenderungan . '")';
mysql_query($query,
$db) or die (mysql_error($db));
// membaca
id_karakter baru yang dihasilkan oleh MySQL
$id_karakter = mysql_insert_id($db);
Sekarang waktunya untuk menyisipkan
power-power karakter ke dalam database. Pertama-tama, Anda dapat menggunakan
kode berikut untuk melakukan pekerjaan itu:
if
(!empty($_POST['daya'])) {
$arraynilai = array();
foreach ($_POST['daya'] as $id_power) {
$arraynilai[] = sprintf('(%d, %d)',
$id_karakter, $id_power);
}
$query = 'INSERT IGNORE INTO
power_karakter_komik
(id_karakter, id_power)
VALUES ' .
implode(',', $arraynilai);
mysql_query($query, $db) or die
(mysql_error($db));
}
Ada dua hal yang perlu diperhatikan di sini.
Pertama, jika telah ada sebuah power sebelumnya untuk pengguna ini (seharusnya
tidak ada, karena ia merupakan karakter baru, tetapi tetap saja Anda perlu
bersiap-siap), maka Anda tidak perlu menyisipkan baris. Anda telah mengetahui
bagaimana menangani hal ini dengan menggunakan katakunci IGNORE.
Kedua, Anda harus menyisipkan beberapa baris
data hanya dengan satu wuery. Ini cukup mudah; yang perlu Anda lakukan adalah
menyediakan sebuah daftar kelompok nilai (dimana setiap nilai dipisahkan koma)
yang sesuai dengan kelompok kolom pada query. Sebagai contoh:
INSERT INTO table (col1, col2) VALUES (val1,
val2), (val3, val4)
Anda melakukannya pada kode dengan menjelajah
array $_POST[‘daya’] dan menempatkan nilai-nilai untuk id karakter dan id power
ke dalam sebuah array baru. Anda kemudian menyambungkan array tersebut dengan
sebuah separator koma.
Anda kemudian melakukan hal yang sama dengan
array $_POST[‘musuh’] sama seperti yang Anda lakukan dengan array
$_POST[‘daya’]. Kali ini, Anda menyisipkan data ke dalam kolom-kolom
berdasarkan apakah karakter baik atau jahat.
if
(!empty($_POST['musuh'])) {
$arraynilai = array();
foreach ($_POST['musuh'] as $id_mush) {
$arraynilai[] = sprintf('(%d, %d)',
$id_karakter, $id_mush);
}
// kecenderungan akan memengaruhi urutan
kolom
$kolom = ($kecenderungan = 'baik') ?
'(id_hero, id_penjahat)' :
'(id_penjahat, id_hero)';
$query = 'INSERT IGNORE INTO musuh_komik
' . $kolom . '
VALUES
' . implode(',', $arraynilai);
mysql_query($query, $db) or die
(mysql_error($db));
}
Karena Anda telah selesai melakukan
penyisipan data karakter yang baru, Anda perlu menetapkan halaman yang Anda
tuju berikutnya, dan keluar dari statemen switch.
$redirect = 'daftar_karakter.php';
break;
Ketika menghapus sebuah karakter, Anda hanya
perlu menghapus semua instans di dalamnya dari tabel-tabel yang relevan. Untuk
menghapus data dari tabel lokasi_komik, Anda harus melakukan menggabungkannya
(JOIN) dengan tabel karakter_komik dengan mencocokkan id_lokasi terlebih
dahulu. Kemudian Anda menghapus semua baris yang cocok.
// menghapus
informasi karakter dari tabel-tabel
$query =
'DELETE FROM c, l
USING
karakter_komik c, lokasi_komik l
WHERE
c.id_lokasi = l.id_lokasi AND
c.id_karakter = ' . $id_karakter;
mysql_query($query,
$db) or die (mysql_error($db));
$query =
'DELETE FROM power_karakter_komik
WHERE
id_karakter = ' . $id_karakter;
mysql_query($query, $db) or die (mysql_error($db));
$query =
'DELETE FROM musuh_komik
WHERE
id_hero = ' . $id_karakter . ' OR
id_penjahat = ' . $id_karakter;
mysql_query($query,
$db) or die (mysql_error($db));
$redirect =
'daftar_karakter.php';
break;
Pembaruan sebuah karakter adalah dimana hal
menjadi menarik. Pertama, Anda hanya perlu melakukan INSERT IGNORE pada tabel
kode pos. Jika alamat dan kode pos berubah, maka Anda tidak perlu menghapus
data lama karena bisa saja hal itu untuk karakter lain.
// memperbarui informasi karakter yang ada pada
tabel-tabel
$query = 'INSERT IGNORE INTO kodepos_komik
(id_kodepos,
kota, propinsi)
VALUES
("' .
$id_kodepos . '", "' . $kota . '", "' . $propinsi .
'")';
mysql_query($query, $db) or die
(mysql_error($db));
Ini merupakan query UPDATE yang pertama, dan
merupakan satu-satunya pada aplikasi ini. Sangat mirip dengan query INSERT dan
SELECT, dengan pengecualian katakunci SET. Katakunci SET memberitahu MySQL
kolom-kolom apa yang perlu diubah dan nilai-nilai apa yang perlu ditetapkan.
Nilai-nilai lama pada baris akan diganti. Ini merupakan sebuah query JOIN
karena terdapat lebih dari satu tabel. Katakunci WHERE menetapkan kolom penghubung
(id_lokasi) dan kondisi bahwa hanya baris-baris untuk karakter ini yang akan
diperbarui.
$query = 'UPDATE lokasi_komik l, karakter_komik c
SET
l.id_kodepos
= ' . $id_kodepos . ',
l.alamat
= "' . $alamat . '",
c.nama_riil
= "' . $nama_riil . '",
c.alias
= "' . $alias . '",
c.kecenderungan
= "' . $kecenderungan . '"
WHERE
c.id_karakter
= ' . $id_karakter . ' AND
c.id_lokasi
= l.id_lokasi';
mysql_query($query, $db) or die
(mysql_error($db));
Karena tabel power_karakter_komik tidak
memiliki sebuah kolom yang secara otomatis terinkremen sebagai primary key,
Anda tidak melakukan pembaruan pada tabel tersebut. Pembaruan dimungkinkan,
tetapi jauh lebih mudah untuk menghapus semua link lama dari karakter ke power
dan menyisipkan baris-baris baru.
$query = 'DELETE FROM power_karakter_komik
WHERE
id_karakter
= ' . $id_karakter;
mysql_query($query, $db) or die (mysql_error($db));
if (!empty($_POST['daya'])) {
$arraynilai
= array();
foreach
($_POST['daya'] as $id_power) {
$arraynilai[]
= sprintf('(%d, %d)', $id_karakter, $id_power);
}
$query =
'INSERT IGNORE INTO power_karakter_komik
(id_karakter,
id_power)
VALUES
' .
implode(',', $arraynilai);
mysql_query($query,
$db) or die (mysql_error($db));
}
Ini membawa Anda ke data musuh, dimana Anda
tidak hanya harus mempertahankan integritas referensial, tetapi juga harus
memperbarui bari-baris dimana ID dapat berada di salah satu dari dua kolom
penghubung. Anda harus mempertahankan integritas referensial balik.
$query = 'DELETE FROM musuh_komik
WHERE
id_hero
= ' . $id_karakter . ' OR id_penjahat = ' . $id_karakter;
mysql_query($query, $db) or die (mysql_error($db));
if (!empty($_POST['musuh'])) {
$arraynilai
= array();
foreach
($_POST['musuh'] as $id_mush) {
$arraynilai[]
= sprintf('(%d, %d)', $id_karakter, $id_mush);
}
//
kecenderungan akan memengaruhi urutan kolom
$kolom =
($kecenderungan = 'baik') ? '(id_hero, id_penjahat)' :
'(id_penjahat, id_hero)';
$query =
'INSERT IGNORE INTO musuh_komik
' .
$kolom . '
VALUES
' .
implode(',', $arraynilai);
mysql_query($query,
$db) or die (mysql_error($db));
}
Contoh
|
Mengedit
power superhero
|
1.
Masukkan
kode berikut pada editor teks Anda, dan simpan dengan nama edit_power.php:
<html>
<head>
<title> Edit Power </title>
<style type="text/css">
td { vertical-align: top; }
</style >
</head >
<body >
<img src="logo.jpg"
alt="Situs Buku Komik" style="float: left;"/>
<h1 > Buku Komik <br/>
Apresiasi </h1>
<h2 > Edit Power Karakter </h2>
<hr style="clear: both;"/>
<form
action="transaksi_karakter.php" method="post">
<div>
<input type="text"
name="daya_baru" size="20" maxlength="40"
value=""/>
<input type="submit"
name="aksi" value="Tambah Power Baru"/>
</div>
<?php
require
'otorisasi_komik.inc.php';
$db =
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
die ('Tidak bisa terhubung. Periksa
parameter-parameter koneksi.');
mysql_select_db(MYSQL_DB,
$db) or die(mysql_error($db));
$query =
'SELECT id_power, power FROM power_komik ORDER BY power ASC';
$hasil =
mysql_query($query, $db) or die (mysql_error($db));
if
(mysql_num_rows($hasil) > 0) {
echo '<p><em> Menghapus sebuah
power akan menghapus sembarang karakter ' .
'yang berkaitan dengannya-- pilih
dengan bijak! </em></p>';
$nomor_power = mysql_num_rows($hasil);
$threshold = 5;
$kolom_maks = 2;
$nomor_kolom = min($kolom_maks,
ceil($nomor_power/$threshold));
$hitung_per_kolom =
ceil($nomor_power/$nomor_kolom);
$i = 0;
echo ' <table><tr><td>';
while ($baris = mysql_fetch_assoc($hasil))
{
if (($i > 0) && ($i %
$hitung_per_kolom == 0)) {
echo '</td><td>';
}
echo ' <input
type="checkbox" name="daya[]" "value="' .
$baris['id_power'] . '"/>';
echo $baris['power'] . '<br/>';
$i++;
}
echo
'</td></tr></table>';
echo '<br/><input
type="submit" name="aksi" ' .
'value="Hapus Power Yang
Diseleksi"/>';
} else {
echo '<p><strong> Tidak Anda
Power yang dimasukkan... </strong></p>';
}
?>
</div>
</form>
<p><a
href="daftar_karakter.php"> Kembali ke Home </a></p>
</body>
</html>
2.
Buka
file edit_power.php dengan browser
Anda. Ketika halaman muncul, mulanya kosong, dan tambahkan beberapa power
sesuka Anda:
3.
Centang
beberapa kotak teks, dan klik Hapus Power Yang Diseleksi. Power-power tersebut
akan terhapus.
Contoh
|
Mengelola
karakter
|
1.
Masukkan
kode berikut, dan simpanlah dengan nama daftar_karakter.php:
<html>
<head>
<title>
Character Database </title>
<style
type="text/css">
th {
background-color: #999; }
td {
vertical-align: top; }
.baris_ganjil
{ background-color: #EEE; }
.baris_genap
{ background-color: #FFF; }
</style>
</head>
<body>
<img
src="logo.jpg" alt="Situs Buku Komik" style="float:
left;"/>
<h1>
Situs Buku <br/> Komik </h1>
<h2>
Database Karakter </h2>
<hr
style="clear: both;"/>
<?php
require 'otorisasi_komik.inc.php';
$db = mysql_connect(MYSQL_HOST, MYSQL_USER,
MYSQL_PASSWORD) or
die ('Tidak
bisa terhubung. Periksa parameter-parameter koneksi.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));
// menentukan pengurutan tabel
$urutan = array(1 => 'alias ASC',
2
=> 'nama_riil ASC',
3
=> 'kecenderungan ASC, alias ASC');
$o = (isset($_GET['o']) &&
ctype_digit($_GET['o'])) ? $_GET['o'] : 1;
if (!in_array($o, array_keys($urutan))) {
$o = 1;
}
// memilih daftar karakter untuk tabel
$query = 'SELECT
id_karakter, alias, nama_riil, kecenderungan
FROM
karakter_komik
ORDER BY ' .
$urutan[$o];
$hasil = mysql_query($query, $db) or die
(mysql_error($db));
if (mysql_num_rows($hasil) > 0) {
echo
'<table>';
echo
'<tr><th><a href="' . $_SERVER['PHP_SELF'] .
'?o=1">Alias</a></th>';
echo
'<th><a href="' . $_SERVER['PHP_SELF'] . '?o=2">Nama
Riil</a></th>';
echo
'<th><a href="' . $_SERVER['PHP_SELF'] .
'?o=3">Kecenderungan</a></th>';
echo
'<th> Power </th>';
echo
'<th> Musuh </th></tr>';
$ganjil = true;
while ($baris =
mysql_fetch_array($hasil)) {
echo
($ganjil == true) ? '<tr class="baris_ganjil">' : ' <tr
class="baris_genap">';
$ganjil =
!$ganjil;
echo
'<td><a href="edit_karakter.php?id=' . $baris['id_karakter'] .
'">' . $baris['alias'] . '</a></td>';
echo
'<td>' . $baris['nama_riil'] . '</td>';
echo
'<td>' . $baris['kecenderungan'] . '</td>';
// memilih
daftar power untuk karakter ini
$query2 =
'SELECT
power
FROM
power_komik p
JOIN
power_karakter_komik cp
ON
p.id_power = cp.id_power
WHERE
cp.id_karakter = ' . $baris['id_karakter'] . '
ORDER BY
power
ASC';
$hasil2 =
mysql_query($query2, $db) or die (mysql_error($db));
if
(mysql_num_rows($hasil2) > 0) {
$daya =
array();
while
($baris2 = mysql_fetch_assoc($hasil2)) {
$daya[] = $baris2['power'];
}
echo
'<td>' . implode(', ', $daya) . '</td>';
} else {
echo
'<td>tidak ada</td>';
}
mysql_free_result($hasil2);
// memilih
daftar power untuk karakter ini
$query2 =
'SELECT
c2.alias
FROM
karakter_komik c1
JOIN karakter_komik c2
JOIN musuh_komik r
ON (c1.id_karakter = r.id_hero AND
c2.id_karakter = r.id_penjahat) OR
(c2.id_karakter = r.id_hero AND
c1.id_karakter = r.id_penjahat)
WHERE
c1.id_karakter = ' . $baris['id_karakter'] . '
ORDER BY
c2.alias ASC';
$hasil2 =
mysql_query($query2, $db) or die (mysql_error($db));
if
(mysql_num_rows($hasil2) > 0) {
$array_alias = array();
while
($baris2 = mysql_fetch_assoc($hasil2)) {
$array_alias[] = $baris2['alias'];
}
echo
'<td>' . implode(', ', $array_alias) . '</td>';
} else {
echo
'<td>tidak ada</td>';
}
mysql_free_result($hasil2);
echo
'</tr>';
}
echo
'</table>';
} else {
echo
'<p><strong> Tidak ada karakter yang dimasukkan...
</strong></p>';
}
?>
<p><a
href="edit_karakter.php">Tambah Karakter Baru</a></p>
<p><a
href="edit_power.php">Edit Power</a></p>
</body>
</html>
2.
Sebagai
file terakhir pada bab ini, Anda akan menciptakan kemampuan untuk menambah dan
memodifikasi karakter. Masukkan kode berikut dan simpan dengan nama edit_karakter.php.
<?php
require 'otorisasi_komik.inc.php';
$db = mysql_connect(MYSQL_HOST, MYSQL_USER,
MYSQL_PASSWORD) or
die ('Tidak
bisa terhubung. Periksa parameter-parameter koneksi.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));
$aksi = 'Tambah';
$karakter = array('alias' => '',
'nama_riil' => '',
'kecenderungan' => 'baik',
'alamat' => '',
'kota' => '',
'propinsi' => '',
'id_kodepos' => '');
$power_karakter = array();
$musuh = array();
// memvalidasi nilai id karakter yang masuk
$id_karakter = (isset($_GET['id']) &&
ctype_digit($_GET['id'])) ?
$_GET['id'] :
0;
// membaca informasi tentang karakter yang diminta
if ($id_karakter != 0) {
$query =
'SELECT
c.alias, c.nama_riil, c.kecenderungan,
l.alamat, z.kota, z.propinsi, z.id_kodepos
FROM
karakter_komik c, lokasi_komik l, kodepos_komik z
WHERE
z.id_kodepos = l.id_kodepos AND
c.id_lokasi = l.id_lokasi AND
c.id_karakter = ' . $id_karakter;
$hasil =
mysql_query($query, $db) or die (mysql_error($db));
if
(mysql_num_rows($hasil) > 0) {
$aksi =
'Edit';
$karakter =
mysql_fetch_assoc($hasil);
}
mysql_free_result($hasil);
if ($aksi ==
'Edit') {
//
mendapatkan power dari tiap karakter
$query =
'SELECT
id_power
FROM
power_karakter_komik
WHERE
id_karakter = ' . $id_karakter;
$hasil =
mysql_query($query, $db) or die (mysql_error($db));
if
(mysql_num_rows($hasil) > 0) {
while
($baris = mysql_fetch_array($hasil)) {
$power_karakter[$baris['id_power']] = true;
}
}
mysql_free_result($hasil);
// membacah
musuh tiap karakter
$query =
'SELECT
c2.id_karakter
FROM
karakter_komik c1
JOIN karakter_komik c2
JOIN musuh_komik r
ON (c1.id_karakter = r.id_hero AND
c2.id_karakter = r.id_penjahat) OR
(c2.id_karakter = r.id_hero AND
c1.id_karakter = r.id_penjahat)
WHERE
c1.id_karakter = ' . $id_karakter . '
ORDER
BY
c2.alias ASC';
$hasil =
mysql_query($query, $db) or die (mysql_error($db));
$musuh =
array();
if
(mysql_num_rows($hasil) > 0) {
while
($baris = mysql_fetch_array($hasil)) {
$musuh[$baris['id_karakter']] = true;
}
}
}
}
?>
<html>
<head>
<title><?php echo $aksi;?> Karakter </title>
<style
type="text/css" >
td {
vertical-align: top; }
</style>
</head>
<body>
<img
src="logo.jpg" alt="Situs Buku Komik" style="float:
left;"/>
<h1>
Situs Buku <br/> Komik </h1>
<h2><?php echo $aksi;?> Karakter </h2>
<hr
style="clear: both;"/>
<form
action="transaksi_karakter.php" method="post">
<table>
<tr>
<td> Nama Karakter: </td>
<td><input type="text" name="alias"
size="40" maxlength="40"
value="<?php echo $karakter['alias'];?>"></td>
</tr><tr>
<td> Nama Riil: </td>
<td><input
type="text" name="nama_riil" size="40"
maxlength="80"
value="<?php echo
$karakter['nama_riil'];?>"></td>
</tr><tr>
<td> Power: <br/><small><em> Klik CTRL untuk
memilih lebih dari satu power
</em></small>
</td>
<td>
<?php
// membaca dan menyajikan daftar power
$query = 'SELECT
id_power,
power
FROM
power_komik
ORDER BY
power ASC';
$hasil = mysql_query($query, $db) or die
(mysql_error($db));
if (mysql_num_rows($hasil) > 0) {
echo
'<select multiple name="daya[]">';
while ($baris =
mysql_fetch_array($hasil)) {
if
(isset($power_karakter[$baris['id_power']])) {
echo
'<option value="' . $baris['id_power'] . '"
selected="selected" > ';
} else {
echo
'<option value="' . $baris['id_power'] . '">';
}
echo
$baris['power'] . '</option>';
}
echo
'</select>';
} else {
echo
'<p><strong> Tidak ada power yang dimasukkan... </strong></p>';
}
mysql_free_result($hasil);
?>
</td>
</tr><tr>
<td
rowspan="2"> Lokasi: <br/><small><em> Alamat
<br/> Kota, Propinsi,
Kode Pos
</em></small></td>
<td><input type="text" name="alamat"
size="40" maxlength="40"
value="<?php echo $karakter['alamat'];?>"></td>
</tr><tr>
<td><input type="text" name="kota"
size="23" maxlength="40"
value="<?php echo $karakter['kota'];?>">
<input
type="text" name="propinsi" size="2"
maxlength="2"
value="<?php echo
$karakter['propinsi'];?>">
<input
type="text" name="id_kodepos" size="5"
maxlength="5"
value="<?php echo
$karakter['id_kodepos'];?>"></td>
</tr><tr>
<td>
Kecenderungan: </td>
<td><input type="radio" name="kecenderungan"
value="baik"
<?php
echo ($karakter['kecenderungan']=='baik') ? 'checked="checked"' : '';
?>/>
Baik <br/>
<input
type="radio" name="kecenderungan" value="jahat"
<?php
echo ($karakter['kecenderungan']=='jahat') ? 'checked="checked"' :
'';
?>/> Jahat
</td>
</tr><tr>
</tr><tr>
<td>
Musuh: <br/><small><em> Tekan CTRL untuk memilih lebih dari
satu musuh </em>
</small>
</td>
<td>
<?php
// membaca dan menyajikan daftar karakter yang ada
$query = 'SELECT
id_karakter, alias
FROM
karakter_komik
WHERE
id_karakter
!= ' . $id_karakter . '
ORDER BY
alias ASC';
$hasil = mysql_query($query, $db) or die
(mysql_error($db));
if (mysql_num_rows($hasil) > 0) {
echo '
<select multiple name="musuh[]"> ';
while ($baris =
mysql_fetch_array($hasil)) {
if
(isset($musuh[$baris['id_karakter']])) {
echo
'<option value="' . $baris['id_karakter'] .
'" selected="selected" > ';
} else {
echo
'<option value="' . $baris['id_karakter'] . '">';
}
echo
$baris['alias'] . '</option>';
}
echo
'</select>';
} else {
echo
'<p><strong> Tidak ada karakter yang dimasukkan...
</strong></p>';
}
mysql_free_result($hasil);
?>
</td>
</tr><tr>
<td
colspan="2">
<input
type="submit" name="aksi"
value="<?php echo $aksi;?> Karakter"/>
<input
type="reset" value="Reset" >
<?php
if ($aksi == "Edit") {
echo '<input
type="submit" name="aksi" value="Hapus
Karakter"/>';
echo '<input
type="hidden" name="id_karakter" value="' .
$id_karakter .
'"/>';
}
?>
</td>
</tr>
</table>
</form>
<p><a
href="daftar_karakter.php"> Kembali ke Home </a></p>
</body>
</html>
3.
Bukalah
browser Anda untuk menjalankan daftar_karakter.php.
Ini merupakan halaman rumah database karakter Anda. Layar Anda akan menampilkan
berikut:
4.
Klik
link Tambah Karakter Baru. Sebuah halaman baru akan muncul, siap untuk masukan
data Anda, yang tampak seperti berikut:
5.
Masukkan
data yang sesuai untuk karakter Anda, dan klik Tambah Karakter. Layar akan
menampilkan seperti berikut:
No comments:
Post a Comment