Menyimpan Data & Menampilkan Beberapa Tabel

Tutorial PHP Menyimpan Data & Menampilkan Beberapa Tabel Sekaligus, akan menjelaskan cara Menyimpan data ke beberapa tabel dan menampilkan data dari beberapa tabel yang berelasi. Baik itu tabel dengan relasi one-to-one atau satu-ke-satu, one-to-many atau satu-ke-banyak dan many-to-many atau banyak-ke-banyak. Sebenarnya tidak ada trik atau cara khusus saat menyimpan data ke beberapa table, begitu pula dengan menampilkan data dari beberapa table. Selama memahami cara memproses HTML form yang benar dan memahami cara menyimpan & menampilkan data ke satu tabel.

Relasi Antar Tabel

Pada saat melakukan normalisasi terhadap sebuah data, maka data akan dipecah kedalam beberapa tabel yang berelasi satu sama lainnya. Ada 3 relasi antar table sebagai berikut.

One-to-one Satu-ke-satu

Relasi one-to-one merupakan relasi tabel yang jarang digunakan, relasi ini merelasikan satu data sebuah tabel dengan hanya satu data dari tabel lainnya. Indikasi untuk menggunakan tipe relasi ini adalah jika sebuah data memiliki sebuah subset data tertentu yang menerangkan lebih detil data itu, dimana subset data ini tidak dimiliki oleh data tersebut pada umumnya. Sebagai contoh, sebuah product secara umum memiliki id_produk, nama, harga, jenis. Namun pada tipe product tertentu seperti buku, memiliki data tambahan seperti penulis, penerbit, ISBN, tanggal_terbit. Satu data di tabel product hanya terhubung dengan satu data di tabel buku. Jika digambarkan seperti di bawah. one-to-one1.png

One-to-many Satu-ke-banyak

Relasi one-to-many adalah relasi antar dua tabel dimana satu data (record) dari Tabel 1 bisa terhubung dengan beberapa record di Tabel 2. Misalnya penjualan memiliki id_penjualan, tanggal_jual, kasir. Setiap penjualan bisa terhubung dengan banyak item_penjualan. item_penjualan memiliki id_item,id_penjualan, id_produk, jumlah, harga_jual. Jika digambarkan seperti: !one-to-many.png

Many-to-many Banyak-ke-Banyak

Relasi many-to-many merupakan relasi yang paling kompleks, karena diperlukan tabel lain untuk menghubungkan dua tabel data yang saling berkepentingan. Seperti halnya penjualan bisa terhubung (berkepentingan) dengan banyak product, dan product bisa terhubungan dengan banyak penjualan. Tabel penjualan dan product memiliki relasi banyak ke banyak yang dihubungkan oleh tabel item_penjualan. Contoh lain adalah dosen bisa memiliki banyak mahasiswa dan mahasiswa bisa memiliki banyak dosen. Relasi banyak ke banyak antara dosen dan mahasiswa memerlukan tabel lain, sebut saja tabel mahasiswa_dosen. Jika digambarkan seperti di bawah. many-to-many.png

Menyimpan Data ke Beberapa Tabel

Seperti dijelaskan sebelumnya tidak ada cara khusus untuk menyimpan data ke beberapa tabel. Berikut adalah cara menyimpan data ke beberapa tabel berdasarkan tipe relasi tabel.

Menyimpan Data ke Tabel Berelasi Satu-ke-satu

Disini akan diambil contoh seperti contoh di atas, menyimpan produk dengan tipe buku. Pertama buat html form dengan kode di bawah.

<form name="form1" action="simpan.php" method="post">
    <dl>
        <dt>Nama</dt>
        <dd><input type="text" name="nama"/></dd>
        <dt>Harga</dt>
        <dd><input type="text" name="harga"/></dd>
        <dt>Jenis</dt>
        <dd>
            <select name="jenis">
                <option value="BUKU">Buku</option>
            </select>
        </dd>
        <dt>Penulis</dt>
        <dd><input type="text" name="penulis"/></dd>
        <dt>Penerbit</dt>
        <dd><input type="text" name="penerbit"/></dd>
        <dt>ISBN</dt>
        <dd><input type="text" name="isbn"/></dd>
        <dt>Tanggal Terbit</dt>
        <dd><input type="text" name="tgl_terbit"/></dd>
        <dt></dt>
        <dd><input type="submit" value="Simpan"/></dd>
    </dl>
</form>

Simpan kode di atas dengan nama form.php, kemudian buat file simpan.php untuk menyimpan data ke tabel product dan tabel buku, dengan kode di bawah.

<?php
if($_POST){
    $conn = mysql_connect("localhost","root","");
    mysql_select_db("test",$conn); 
    //menyimpan ke table product
    $sql = "insert into product (nama,harga,jenis) values ('{$_POST['nama']}','{$_POST['harga']}','{$_POST['jenis']}')";
    mysql_query($sql) or die('Gagal menyimpan produk');
    //mencari id produk
    $sql = "select max(id_produk) as last_id from product limit 1";
    $hasil = mysql_query($sql);
    $row = mysql_fetch_array($hasil);
    $lastId = $row['last_id'];
    //menyimpan data buku ke table buku
    $sql = "insert into buku (id_produk,penulis,penerbit,isbn,tgl_terbit) 
    values ('$lastId','{$_POST['penulis']}','{$_POST['penerbit']}','{$_POST['isbn']}','{$_POST['tgl_terbit']}')";
    mysql_query($sql) or die('Gagal menyimpan data buku');
    echo 'data tersimpan';
}

Bisa dilihat kode di atas hampir sama dengan kode untuk menyimpan data ke satu tabel. Pada baris ke-2 dilakukan pengecekan apakah ada data yang dikirim atau tidak. Jika ada data yang dikirim, di baris ke-3 dan 4 dilakukan koneksi ke database. Kemudian pada baris ke-6 dan 7 menyimpan data ke tabel product. Selanjutnya dari ke ke-9 sampai 16 adalah untuk menyimpan data ke tabel buku. Setiap tabel yang berelasi, tabel anak (dalam kasus ini tabel buku) memiliki sebuah foreign key, nilai foreign key ini diambil dari nilai referenced column -- primary key tabel induk (referenced table, tabel product dalam contoh ini). Pada contoh ini, kolom id_produk pada tabel buku adalah foreign key dan primary key tabel product (kolom id_produk) adalah referenced column. Nilai dari foreign key tidak boleh berisi nilai nilai yang tidak ada di reference colomn kecuali null. Sekarang lihat kembali baris ke-9. Baris ke-9 sampai 12 adalah untuk mencari id_produk yang baru saja disimpan pada tabel product (baris ke-6 dan 7). Kenapa proses ini diperlukan? Karena nilai dari kolom id_produk tabel buku tidak boleh berisi nilai nilai selain nilai yang ada di kolom id_produk tabel product. Selanjutnya baris ke-14 sampai 16 adalah untuk menyimpan data ke tabel buku, dan kolom id_produk diisi dengan nilai yang diperoleh dari baris sebelumnya (baris ke-9 sampai 12).

Menyimpan Data ke Tabel Berelasi Satu-ke-banyak

Disini akan diberikan contoh menyimpan Album musik. Album musik yang memiliki beberapa lagu. Struktur tabel album dan lagu seperti: album-lagu.jpg Pertama buatlah form html berikut:

<!-- file album.php -->
<form name="formalbum" action="simpan-album.php" method="post">
Judul Album: <input type="text" name="judul"/> Nama Artis: <input type="text" name="artis"/>
<table id="tabel-lagu" cellspacing="0" border="1" cellpadding="3">
    <tr>
        <td>NO. Track</td>
        <td>Judul</td>
        <td>Durasi</td>
        <td>Delete</td>
    </tr>
    <tr>
        <td><input type="text" name="no_track[0]"/></td>
        <td><input type="text" name="judul_lagu[0]"/></td>
        <td><input type="text" name="durasi[0]"/></td>
        <td><button type="button" class="del">Del</button></td>
    </tr>
    <tr id="last">
        <td colspan="4" align="right"><button type="button" id="addRow">Add</button></td>
    </tr>
</table>
<input type="submit" value="Simpan"/>
</form>
<script type="text/javascript" src=" https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
var i = 1;
$(function(){
    $("#addRow").click(function(){
        row = '<tr>'+
        '<td><input type="text" name="no_track['+i+']"/></td>'+
        '<td><input type="text" name="judul_lagu['+i+']"/></td>'+
        '<td><input type="text" name="durasi['+i+']"/></td>'+
        '<td><button type="button" class="del">Del</button></td>'+
        '</tr>';
        $(row).insertBefore("#last");
        i++;
        });
    });
    $(".del").live('click', function(){
        $(this).parent().parent().remove();
        });
</script>

Kode diatas akan membentuk form seperti berikut: album-form.jpg Yang perlu diperhatikan adalah atribut name dari element form (baris ke-12 sampai 14) yang diberi nilai seperti [u]no_track[0][/u], [u]judul_lagu[0][/u], [u]durasi[0][/u]. Penamaan seperti itu bertujuan agar data dikirim ke server berupa array. Selanjut buatlah file simpan-album.php untuk menyimpan data ke database.

<?php
//file simpan-album.php
if(!$_POST){
    die('Tidak ada data yang disimpan!');
}
//koneksi ke database
$conn = mysql_connect("localhost","root","blah");
mysql_select_db("test");
//simpan ke tabel album
$sql = "insert into album (judul,artis) values ('{$_POST['judul']}','{$_POST['artis']}')";
mysql_query($sql) or die('Gagal menyimpan album');
//mencari id album
$sql = "select max(id) as id_album from album limit 1";
$row = mysql_fetch_array(mysql_query($sql));
$id_album = $row['id_album'];
//menyimpan data ke tabel lagu
foreach($_POST['judul_lagu'] as $key => $judul){
    $sql = "insert into lagu(id_album, no_track,judul,durasi) 
    values ('{$id_album}','{$_POST['no_track'][$key]}','{$judul}','{$_POST['durasi'][$key]}')";
    mysql_query($sql);
}
echo 'Data telah disimpan';

Baris ke-1 sampai 15 sama dengan cara yang dilakukan untuk menyimpan data ke tabel berelasi satu ke satu. Pertama membuka koneksi ke database (baris ke-7 dan 8 ). Kemudian menyimpan data ke tabel album (baris ke-10 dan 11). Selanjutnya mencari id album yang baru saja disimpan (baris ke-13 s/d 15). Langkah terakhir (baris ke-17 s/d 21) adalah melakukan perulangan dan menyimpan satu persatu data ke tabel lagu, serta id_album diisi dengan nilai yang diperoleh sebelumnya di baris ke-13 s/d 15.

Menyimpan Data ke Tabel Berelasi Banyak-ke-banyak

Menyimpan data ke tabel yang berelasi banyak ke banyak merupakan bagian yang paling kompleks. Menyimpan datanya tidak bisa seperti cara cara sebelumnya, yang hanya sekali langkah. Menyimpan data ke tabel yang berelasi banyak ke banyak paling sedikit melewati 3 langkah. Agar lebih jelas akan dicontohkan relasi antara [u]mahasiswa[/u] dan [u]mata_kuliah[/u] yang direlasikan oleh tabel [u]mahasiswa_mk[/u], sebagai berikut: mahasiswa-154.png Langkah Pertama: Menyimpan Data Mahasiswa. Untuk menyimpan data mahasiswa gunakan kode php di bawah. Kode di bawah sama seperti yang digunakan untuk menyimpan data ke satu tabel.

<?php
// file mahasiswa.php
if($_POST){
    $conn = mysql_connect("localhost","root","blah");
    mysql_select_db("test",$conn); 
    $sql = "insert into mahasiswa (nim,nama,jurusan) values ('{$_POST['nim']}','{$_POST['nama']}','{$_POST['jurusan']}')";
    mysql_query($sql);
    echo 'Data telah disimpan';
} 
?>
<h3>Input Mahasiswa</h3>
<form name="form1" method="post" action="">
<dl>
    <dt>NIM</dt>
    <dd><input type="text" name="nim"/></dd>
    <dt>Nama</dt>
    <dd><input type="text" name="nama"/></dd>
    <dt>Jurusan</dt>
    <dd><input type"text" name="jurusan"/></dd>
    <dt></dt>
    <dd><input type="submit" value="Simpan"/></dd>
</dl>
</form>

Simpan kode di atas dengan nama file mahasiswa.php Langkah Kedua: Menyimpan Data Mata Kuliah Menyimpan data mata kuliah sama seperti menyimpan data mahasiswa. Gunakan kode di bawah dan simpan dengan nama mata_kuliah.php.

<?php
//file mata_kuliah.php
if($_POST){
    $conn = mysql_connect("localhost","root","blah");
    mysql_select_db("test",$conn); 
    $sql = "insert into mata_kuliah (kode,nama) values ('{$_POST['kode']}','{$_POST['nama']}')";
    mysql_query($sql);
    echo 'Data telah disimpan';
} 
?>
<h3>Input Mata Kuliah</h3>
<form name="form1" method="post" action="">
<dl>
    <dt>Kode MK</dt>
    <dd><input type="text" name="kode"/></dd>
    <dt>Nama</dt>
    <dd><input type="text" name="nama"/></dd>
    <dt></dt>
    <dd><input type="submit" value="Simpan"/></dd>
</dl>
</form>

Langkah Ketiga: Menyimpan Data Mata Kuliah Seorang Mahasiswa Untuk mempermudah proses menyimpan data Mata Kuliah Seorang Mahasiswa, diperlukan kode untuk menampilkan daftar mahasiswa di bawah.

<?php
//file list-mahasiswa.php
$conn = mysql_connect("localhost","root","blah");
mysql_select_db("test",$conn); 
$sql = "select * from mahasiswa";
$result = mysql_query($sql);
?>
<table cellspacing="0" cellpadding="5" border="1">
    <tr>
        <td>NIM</td>
        <td>Nama</td>
        <td>Jurusan</td>
        <td>Aksi</td>
    </tr>
    <?php while($mhs = mysql_fetch_array($result)){?>
    <tr>
        <td><?php echo $mhs['nim'];?></td>
        <td><?php echo $mhs['nama'];?></td>
        <td><?php echo $mhs['jurusan'];?></td>
        <td><a href="mahasiswa_mk.php?nim=<?php echo $mhs['nim'];?>">Tambah Mata Kuliah</a></td>
    </tr>
    <?php }?>
</table>

Simpan kode di atas dengan nama list-mahasiswa.php. Kode tersebut berfungsi untuk menampilkan daftar mahasiswa dan membuat link berjudul "Tambah Mata Kuliah" ke halaman mahasiswa_mk.php. Halaman mahasiswa_mk.php digunakan untuk menyimpan data mata kuliah seorang mahasiswa.

<?php
//file mahasiswa_mk.php
$conn = mysql_connect("localhost","root","blah");
mysql_select_db("test",$conn);
//mencari data mahasiswa
$sql = "select * from mahasiswa where nim='".mysql_real_escape_string($_GET['nim'])."'";
$mhs = mysql_fetch_array(mysql_query($sql));
?>
<h2>Tambah Mata Kuliah Mahasiswa: <?php echo $mhs['nama'];?></h2>
<form name="form" method="post" action="simpan_mahasiswa_mk.php">
<?php
//mencari semua data mata kuliah
$subquery = "select id_mk from mahasiswa_mk where nim='".$mhs['nim']."'";
$sql = "select * from mata_kuliah where id not in ({$subquery})";
$result = mysql_query($sql);
while($mataKuliah = mysql_fetch_array($result)){
    //membut checkbox
    echo '<input type="checkbox" name="mata_kuliah[]" value="'.$mataKuliah['id'].'"/>';
    echo $mataKuliah['kode'].': '.$mataKuliah['nama'].' ';
}
?>
<input type="hidden" name="nim" value="<?php echo $mhs['nim'];?>"/>
<br/>
<input type="submit" value="Simpan"/>
</form>

Baris ke-6 dan 7 kode di atas adalah untuk mencari data mahasiswa yang akan di tambahkan mata kuliahnya. Baris ke-8 menampilkan nama mahasiswa. Baris ke-13 dan 14 adalah membuat sql query untuk mencari mata kuliah yang belum ditambahkan ke mahasiswa bersangkutan. Untuk mempermudah di baris 13 dan 14 menggunakan subquery. Selanjutnya baris 15 s/d 20 untuk menampilkan checkbox mata kuliah yang belum dimiliki oleh mahasiswa bersangkutan. Langkah berikutnya adalah membuat file simpan_mahasiswa_mk.php untuk menyimpan data mata kuliah mahasiswa.

<?php
//file simpan_mahasiswa_mk.php
if($_POST){
    $conn = mysql_connect("localhost","root","blah");
    mysql_select_db("test",$conn);
    foreach($_POST['mata_kuliah'] as $id_matakuliah){
        $sql = "insert into mahasiswa_mk (nim,id_mk) values ('{$_POST['nim']}','{$id_matakuliah}')";
        mysql_query($sql) or die("Gagal Menyimpan Data".mysql_error());
    }
}
header("Location: list-mahasiswa.php");
exit('Data disimpan');

Kode di atas hampir sama dengan cara menyimpan data ke tabel berelasi satu ke banyak.

Menampilkan Data Dari Beberapa Tabel

Agar tutorial tidak terlalu panjang, akan dilanjukan ke tutorial selanjutnya Menampilkan Data Beberapa Tabel