7/06/2017

Query Sql Where dengan Banyak Kondisi Dinamis di PHP

Terkadang dalam pengambilan data dari database diperlukan beberapa kondisi dalam menyaring data yang diinginkan. Misal dalam mengambil data mahasiswa di seleksi berdasarkan nim, nama, jenis kelamin atau pun ketiga-tiganya. Jika pengambilannya statis atau telah ditetapkan dalam query maka itu tidak jadi masalah, lalu bagaimana jika filter tersebut bersifat dinamis? dalam artian ke tiga kondisi tersebut tidak selalu terpenuhi. Untuk itu kita perlu membuat clausa where yang bernilai pasti (true).

Lalu bagaimana penggunakan clausa where nya? Saya biasanya menggunakan clausa WHERE 1=1, apa itu? Clausa WHERE 1=1 ialah kondisi dimana query akan mengeksekusi data yang bernilai true, kemudian dilanjut dengan kondisi-kondisi lainnya. Dalam contoh kita menggunakan filter untuk data mahasiswa yang di seleksi berdasarkan nim, nama, jenis kelamin. Tabelnya data nya seperti ini:


Jadi penggunaan querynya ialah "SELECT * FROM tb_mhs WHERE 1=1 and NIM='$nim' and NAMA like '%$nama%' and JEN_KEL = '$jen_kel'". Query terebut masih bersifat statis karena semua kolom tabel harus terpenuhi dan setiap variabel yang dijadikan parameter harus diisi. Untuk membuatnya dinamis, kita implementasikan dalam coding php.

Pertama buat database db_mhs
Buat tabel tb_mhs
CREATE TABLE `tb_mhs` (
  `nim` varchar(10) NOT NULL,
  `nama` varchar(30) NOT NULL,
  `jen_kel` varchar(10) NOT NULL,
  PRIMARY KEY (`nim`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Masukkan data ke tb_mhs
INSERT INTO `tb_mhs` VALUES ('123', 'Indra', 'Laki-Laki');
INSERT INTO `tb_mhs` VALUES ('124', 'Santi', 'Perempuan');
INSERT INTO `tb_mhs` VALUES ('125', 'Angga', 'Laki-Laki');

Selanjutnya buat project php
Buat file index.php
Ketik kode berikut
<html>
    <head>
        <meta charset="UTF-8">
        <title>Query Multi Kondisi</title>
        <style>
            #stabel {
                margin: 0 auto;
                width: 50%;
            }
        </style>
    </head>
    <body>

        <div id="stabel">
            <form action="" method="GET">
                <fieldset style="margin-bottom: 5px; width: 50%;">
                    <legend>Filter</legend>
                    <table>
                        <tr>
                            <td>Nim</td>
                            <td>: <input type="text" name="nim" placeholder="nim"></td>
                        </tr>
                        <tr>
                            <td>Nama</td>
                            <td>: <input type="text" name="nama" placeholder="nama"></td>
                        </tr>
                        <tr>
                            <td>Jenis Kelamin</td>
                            <td> : <select name="jen_kel">
                                    <option value="">-- Pilih --</option>
                                    <option value="Laki-Laki">Laki-Laki</option>
                                    <option value="Perempuan">Perempuan</option>
                                </select>
                                <input type="submit" name="cari" value="Cari">
                            </td>
                        </tr>
                    </table>
                </fieldset>
            </form>
            <table border="1" width="55%">
                <tr align="center">
                    <td>No</td>
                    <td>Nim</td>
                    <td>Nama</td>
                    <td>Jenis Kelamin</td>
                </tr>
                <?php
                // Awal Koneksi
                date_default_timezone_set('Asia/Jakarta');
                $host = "localhost";$user = "root";$password = "";$database = "db_mhs";
                $koneksi = mysql_connect($host, $user, $password);
                mysql_select_db($database, $koneksi);
                
                // Akhir Koneksi
                // Cek action tombol cari
                // Jika tombol cari di klik
                if (!empty($_GET['cari'])) {

                    $nim = $_GET['nim'];

                    // jika nim diisi
                    if (!empty($nim)) {
                        $nim = " and nim = '$nim'";
                    }
                    // jika nim tidak diisi
                    else {
                        $nim = '';
                    }

                    $nama = $_GET['nama'];

                    // jika nama diisi
                    if (!empty($nama)) {
                        $nama = " and nama like '%$nama%'";
                    }
                    // jika nama tidak diisi
                    else {
                        $nama = '';
                    }

                    // jika jenis kelamin diisi
                    $jen_kel = $_GET['jen_kel'];
                    if (!empty($jen_kel)) {
                        $jen_kel = " and jen_kel = '$jen_kel'";
                    }
                    //jika jenis kelamin tidak diisi
                    else {
                        $jen_kel = '';
                    }

                    // jalankan query
                    $query = mysql_query("select * from tb_mhs where 1=1 $nim $nama $jen_kel", $koneksi);
                }

                //jika tombol cari tidak di klik
                else {
                    $query = mysql_query("select * from tb_mhs", $koneksi);
                }
                $no = 1;
                while ($data = mysql_fetch_array($query)) {
                    echo "<tr>
                            <td>$no</td>
                            <td>$data[nim]</td>
                            <td>$data[nama]</td>
                            <td>$data[jen_kel]</td>
                          </tr>";
                    $no++;
                }
                ?>
            </table>    
        </div>
    </body>
</html>

Coba jalankan project tersebut, maka filter yang dibuat akan terpenuhi sesuai kondisi yang diperlukan.
Bagian sintaks yang dimaksud penggunaan 1=1 adalah pada
$query = mysql_query("select * from tb_mhs where 1=1 $nim $nama $jen_kel", $koneksi);

Kondisi tersebut tidak akan menyebabkan eror meski form filter tidak diisi satupun.
Silahkan mengirim komentar jika ada yang ingin ditanyakan.

Mulai menulis blog sejak tahun 2012. Saat ini sedang disibukkan dengan karir dibidang IT nya.

Komentar yang mengandung spam / link aktif akan secara otomatis disembunyikan. Mohon maaf atas ketidaknyamanan jika pertanyaan telat ataupun tidak terbalas karena keterbatasannya waktu. Silahkan hubungi kami di menu Contact Us. Terimakasih
EmoticonEmoticon