Tuesday, December 27, 2016

Bab 8. PHP/MySQL Untuk Programer


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