Coding PHP dengan cepat dan efektif merupakan suatu hal yang senantiasa ingin kita lakukan untuk itu dikesempatan kali ini, saya akan membagi beberapa pengalaman coding yang akan menghemat penulisan coding Anda dan bisa jadi akan kelihatan lebih canggih.
Menulis code seperti menyusun puisi, “seni menyusun kata” banyak sekali pilihan cara yang dapat kita lakukan untuk menempuh suatu tujuan. Cara tersebut tentu berbeda beda bagi tiap programmer, tergantung pengetahuan, pengalaman, dan jam terbang masing – masing.
Langsung saja, berikut ini beberapa alternatif coding yang bisa sobat gunakan untuk mempercepat coding:
1. Menggunakan fungsi list()
Ketika menyusun ulang susunan kata (string), kita sering menggunkan fungsi explode untuk memecah string tersebut menjadi array, kemudian menyusun ulang sesuai dengan susunan yang kita inginkan.
Sebagai contoh, biasanya format tanggal yang ada di database adalah yyyy-mm-dd, misal 2020-09-01 nah untuk menyusun ulang menjadi format dd-mm-yyyy kita melakukan coding berikut:
$nama_bulan = [1=>'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'];
$tanggal_db = '2020-10-05';
$split = explode('-', $tanggal_db);
echo $split[2] . ' ' . $nama_bulan[$split[1]] . ' ' . $split[0];
// Hasil 05 Oktober 2020
Bisa juga si, yang jauh lebih ringkas:
setlocale(LC_ALL, 'id-ID');
echo strftime(%d %B %Y", strtotime('2020-10-05'));
// Hasil 05 Oktober 2020
Taruhlah kita menggunakan cara yang pertama, karena kita ingin sudah terbiasa menggunakan fungsi date (cara kedua tidak bisa diterapkan di fungsi date), maka akan lebih cepat dan mudah dibaca jika kita menggunakan fungsi list()
sebagai berikut:
list($tahun, $bulan, $tanggal) = explode('-', $tanggal_db);
echo $tanggal . ' ' . $nama_bulan[$bulan] . ' ' . $tahun;
Jadi setiap menggunakan explode ingat kemungkinan bisa menggunakan fungsi list()
2. Menambahkan angka 0 di awal
Contoh kedua adalah ketika kita ingin membuat angka dengan jumlah digit yang sama, misal: 1,2,3,4,5, … 99 ingin kita buat memiliki dua digit semua, sehingga angka dibawah 10 kita tambahkan 0 didepannya
Bagaimana melakukannya?
Mungkin ada yang menggunakan cara seperti ini:
if ($angka < 10) {
$angka = '0' . $angka;
}
Jika sobat masih menggunakan cara seperti itu, coba cara berikut:
$angka = substr('0' . $angka, -2);
Lebih ringkas dan mudah bukan?
Contoh implementasinya adalah ketika menuliskan opsi bulan sebagai berikut:
<select name="bulan">
<option value="01">Januari</option>
<option value="02">Februari</option>
<option value="03">Maret</option>
<option value="04">April</option>
<option value="05">Mei</option>
<option value="06">Juni</option>
<option value="07">Juli</option>
<option value="08">Agustus</option>
<option value="09">September</option>
<option value="10">Oktober</option>
<option value="11">November</option>
<option value="12">Desember</option>
</select>
Untuk membuat dropdown diatas ada yang menulisnya dengan code berikut:
$bulan = [1 => 'Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember'];
echo '<select name="bulan">';
for ($i = 1; $i <= 12; $i++) {
if ($i < 10) {
echo '<option value="0' . $i . '">' . $bulan[$i] . '</option>';
} else {
echo '<option value="' . $i . '">' . $bulan[$i] . '</option>';
}
}
echo '</select>';
Penulisan diatas dapat diringkas menjadi:
echo '<select name="bulan">';
for ($i = 1; $i <= 12; $i++) {
echo '<option value="' . substr('0' . $i, -2) . '">' . $bulan[$i] . '</option>';
}
echo '</select>';
Dari contoh diatas, juga dapat diambil pelajaran bahwa jika sobat menulis kode yang panjang dan berulang, maka ajukan pertanyaan ke diri sendiri, bisakah menggunakan loop?
Jika ya, dan kebanyakan ya, maka gunakan loop
Pada contoh diatas, selain lebih cepat dan ringkas, jika ada perubahan pada option kita tinggal mengubah data pada array saja
3. Menulis Query SQL Dengan Cepat
Contoh lain adalah ketika ingin memasukkan data pada database menggunakan perintah sql INSERT, misal kita ingin memasukkan data profil user pada form registrasi sebagai berikut:
$sql = 'INSERT INTO user( email , nama , alamat , no_hp , password )
VALUES ("' . $_POST['email'] . '"
, "' . $_POST['nama'] . '"
, "' . $_POST['alamat'] . '"
, "' . $_POST['no_hp'] . '"
, "' . password_hash($_POST['nama'], PASSWORD_DEFAULT) . '"
)';
Bandingkan dengan cara berikut ini:
<?php
$list_field = ['email', 'nama', 'alamat', 'no_hp', 'password'];
foreach ($list_field as $field) {
if ($field == 'password')
$list_value[] = password_hash($_POST['nama'], PASSWORD_DEFAULT);
else
$list_value[] = $_POST[$field];
}
$sql = 'INSERT INTO user(' . join($list_field, ', ') . ') VALUES ("' . join($list_value, '", "') . '")';
Cara diatas lebih aman dan stabil, karena jika ada perubahan data, kita cukup mengganti nilai yang ada pada array saja, misal kita ingin menambahkan field kota, maka kita cukup merubah data $list_field menjadi:
$list_field = ['email', 'nama', 'alamat', 'no_hp', 'kota', 'password'];
Cara diatas juga merupakan penerapan prinsip DRY (don’t repeat yourself), dimana sebisa mungkin kita menghindari penulisan yang sama di lebih dari satu tempat, pada cara diatas, ketika ada perubahan data, kita perlu mengubah script di dua tempat, yaitu di nama kolom dan di value kolom (di variabel $_POST.
4. Logika dengan banyak kondisi OR
Ketika coding kita pasti sering menggunakan banyak operator logika seperti if
pada operator logika tersebut, terkadang mengandung banyak operator OR.
Sebagai contoh kita ambil data anggaran dari database kemudian kita uji kode anggarannya sebagai berikut:
$sql = 'SELECT * FROM anggaran';
$conn = mysqli_conncect('localhost', 'root', 'pass', 'anggaran');
$query = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($query)) {
if ($row['kode'] == 'A' || $row['kode'] == 'a') {
echo $row['jumlah_anggaran'];
}
}
Pada baris 5 kita mengakomodir semua kondisi, seharusnya didatabse penulisan kode menggunakan huruf besar yaitu “A”, tetapi untuk antisipasi salah input menjadi huruf kecil “a” kita tulis dua kondisi.
Kondisi ini dapat dipersingkat sebagai berikut:
$kode = strtolower($row['kode']);
if ($kode == 'a') {
echo $row['jumlah_anggaran'];
}
Selanjutnya jika kondisi OR lebih dari satu, maka biasanya kita menulis:
$kode = strtolower($row['kode']);
if ($kode == 'a' || $kode == 'b' || $kode == 'c') {
echo $row['jumlah_anggaran'];
}
Kode diatas tidak masalah dan sudah wajar, namun, bisa lebih dipersingkat lagi dengan fungsi in_array()
sebagai berikut:
$kode = strtolower($row['kode']);
if ( in_array($kode, ['a','b','c']) ) {
echo $row['jumlah_anggaran'];
}
Dengan cara diatas, jika ada perubahan kondisi, kita tambahkan element pada array, jauh lebih simpel, tapi mungkin lebih sulit dipahami dibanding menulis operator OR secara manual
But, at least ketika kita sudah terbiasa, akan lebih nyaman.
5. Gunakan empty()
Ketika mengetes nilai suatu variabel kita sering dihadapkan dengan error bahwa variabel tersebut undefined, misal kita punya kode sebagai berikut:
<?php
if (!$nama) {
$nama = 'agus';
}
atau seperti ini:
<?php
if ($nama == '') {
$nama = 'agus';
}
Ketika nama belum didefinisikan maka akan muncul pesan seperti ini:
Notice: Undefined variable: nama in D:\xampp\htdocs\proses.php on line 3
Untuk mengantisipasi error tersebut, bisanya kita akan tambahkan fungsi isset() untuk mengetes apakah variabel $nama telah didefinisikan, misal seperti ini:
<?php
if (isset($nama) && $nama == '') {
$nama = 'agus';
}
Cara tersebut sudah benar, namun ada cara yang lebih ringkas, yaitu menggunakan fungsi empty() seperti ini:
<?php
if (empty($nama)) {
$nama = 'agus';
}
Dengan menggunakan fungsi empty()
, maka kita tidak perlu memilikirkan apakah variabel telah didefinisikan atau belum.
Tidak hanya string, fungsi ini juga dapat digunakan pada array, misal ketika kita mengetes suatu kondisi array pada variable $_POST seperti ini
if (key_exists('status', $_POST) && $_POST['status'] == '') {
$status = 'aktif';
}
Dengan menggunakan empty()
maka penulisan akan menjadi jauh lebih ringkas, seperti ini:
if (empty($_POST['status'])) {
$status = 'aktif';
}
6. Membuat List Dengan Cepat
Pada kondisi tertentu kita perlu untuk membuat angka ataupun abjad secara berurutan, seperti 1 s.d 100, A s.d Z, misal seperti ketika membuat dropdown tanggal (1-31) atau dropdown bulan (1-12).
Biasanya untuk keperluan, kita menggunakan perulangan for atau while sebagai berikut:
for ($i = 1; $i<=31; $i++) {
$range[] = $i
}
Ada cara yang lebih cepat untuk melakukan itu, yaitu menggunakan fungsi range()
sebagai berikut:
$range = range(1, 31);
// Hasil Array( [0] => 1
[1] => 2
[2] => 3
[3] => 4
....
[30] => 31
)
Perlu diperhatikan bahwa pada contoh diatas, index pada Array yang dihasilkan dari fungsi range dimulai dari angka 0, untuk mengubah index tersebut, kita dapat menggunakan fungsi array_combine()
misal sebagai berikut:
$range = array_combine( range(1,31), range(1,31) );
/* Hasil Array (
[1] => 1
[2] => 2
[3] => 3
[4] => 4
...
[31] => 31
) */
Contoh lain, misal ingin membuat dropdown tahun:
$year_range = range(date('Y'), date('Y')-5);
/* Hasil Array (
[0] => 2020
[1] => 2019
[2] => 2018
[3] => 2017
[4] => 2016
[5] => 2015
) */
$range = array_combine( $year_range, $year_range );
/* Hasil Array (
[2020] => 2020
[2019] => 2019
[2018] => 2018
[2017] => 2017
[2016] => 2016
[2015] => 2015
)*/
7. Menggunakan Shorthand Ternary Operator
Seperti kita ketahui bahwa PHP menyediakan fitur penulisan statemen if else yang lebih ringkas yaitu menggunakan ternary operator. misal terdapat kondisi sebagai berikut:
<?php
if ($data['nama'] != '') {
$nama = $data['nama'];
} else {
$nama = 'Tidak diketahui';
}
echo '<table>
<thead>
<tr>
<th>Nama</th>
<th>Alamat</th>
</tr>
</thead>
<tbody>
<tr>
<td>' . $nama . '</td>
<td>' . $data['alamat'] . '</td>
</tr>
</tbody>
</table>';
Penulisan statemen if else diatas dapat dipersingkat menggunakan ternary operator sebagai berikut:
<?php
$nama = $data['nama'] != '' ? $data['nama'] : 'Tidak diketahui';
echo '<table>
<thead>
<tr>
<th>Nama</th>
<th>Alamat</th>
</tr>
</thead>
<tbody>
<tr>
<td>' . $nama . '</td>
<td>' . $data['alamat'] . '</td>
</tr>
</tbody>
</table>';
Cara diatas dapat dipersingkat lagi menggunakan shorthand ternary operator sebagai berikut:
echo '<table>
<thead>
<tr>
<th>Nama</th>
<th>Alamat</th>
</tr>
</thead>
<tbody>
<tr>
<td>' . ($data['nama'] != '' ?: 'Tidak diketahui') . '</td>
<td>' . $data['alamat'] . '</td>
</tr>
</tbody>
</table>';
Perlu dicatat bahwa shorthand ternary operator ini mulai tersedia pada PHP versi 5.3
Pada shorthand ternary operator misal: expresi1 ?: expresi3, maka jika expresi1 bernilai true, maka nilai yang dihasilkan adalah expresi1, sebaliknya, jika expresi1 bernilai false, maka akan dihasilkan expresi3
Pembahasan lebih dalam tentang ternary operator dapat dibaca pada artikel ini: Penulisan If Else Pada PHP Dengan Ternary Operator ?:
Sedangkan untuk dokumentasi official nya, dapat dibaca melalui halaman: PHP: Comparison Operators – Manual
8. The Power of Array
Dalam menuliskan script terkadang kita sering dihadapkan dengan penulisan kode yang berulang, dan ketika ada coding yang berulang maka pertanda bahwa coding kita berpotensi melanggar prinsip DRY (Don’t repeat yourself) yang tentunya bukanlah hal yang baik untuk diterapkan, untuk itu sebisa mungkin kita harus menyederhanakannya.
Pada case dimana penulisan koding berulang, maka salah satu solusinya adalah menggunakan array, dan seringnya case seperti ini dapat terpecahkan menggunakan array, so tidak berlebihan kan jika bagian ini saya beri sub judul The Power Of Array.
Sebagai contoh kita ingin menghapus data di beberapa tabel sekaligus dengan id_produk yang sama sebagai berikut:
$id_produk = $_POST['id'];
$this->db->transStart();
// Produk
$sql = 'DELETE FROM produk WHERE id_produk = ?';
$this->db->query($sql, $id_produk);
// Produk Author
$sql = 'DELETE FROM produk_author WHERE id_produk = ?';
$this->db->query($sql, $id_produk);
// Produk Rating
$sql = 'DELETE FROM produk_rating WHERE id_produk = ?';
$this->db->query($sql, $id_produk);
// Produk Download
$sql = 'DELETE FROM produk_download WHERE id_produk = ?';
$this->db->query($sql, $id_produk);
// Produk Kategori
$sql = 'DELETE FROM produk_kategori WHERE id_produk = ?';
$this->db->query($sql, $id_produk);
// Comment
$sql = 'DELETE FROM comment WHERE id_produk = ?';
$this->db->query($sql, $id_produk);
$this->db->transComplete();
Dari script diatas terlihat banyak penulisan query yang berulang, bedanya hanya nama tabelnya saja. Untuk mengatasi hal tersebut, bagian yang berbeda, yaitu nama tabel kita kumpulkan kedalam satu array, selanjutnya nama tabel tersebut kita loop ke dalam query sql. Hasilnya adalah sebagai berikut:
$this->db->transStart();
$list_table = ['produk'
, 'produk_author'
, 'produk_rating'
, 'produk_download'
, 'produk_kategori'
, 'comment'
];
foreach ($list_table as $nama_tabel) {
$sql = 'DELETE FROM ' . $nama_tabel . ' WHERE id_produk = ?';
$this->db->query($sql, $this->request->getPost('id'));
}
$this->db->transComplete();
Script diatas terlihat lebih rapi dan ringkas, disamping juga lebih mudah untuk di maintain, misal jika ada penambahan atau pengurangan tabel.
Note: menjalankan query didalam loop bisa menyebabkan load server tinggi, yang tentunya tidak bagus untuk performa database. Lebih lanjut bisa di baca di artikel: Query MySQL di Dalam PHP Loop – Bad Practice !!!
9. The Power of Array (2)
Pada suatu kondisi, kita menggunakan banyak kondisi if … else seperti ini:
<?php
$query = mysqli_query($conn, 'SELECT * FROM absensi');
while ($row = mysqli_fetch_assoc($query)) {
$status = strtolower($row['status'];
if ($status == 'sakit') {
echo '<span class="text-success">Sakit</span>';
} else if ($status == 'ijin') {
echo '<span class="text-primary">Ijin</span>';
} else if ($status == 'alpha') {
echo '<span class="text-danger">Alpha</span>';
}
}
Dari script diatas, terlihat pola perulangannya yaitu penulisan tag html <span> dengan class tertentu, model diatas dapat kita buat lebih sederhana dan rapi menggunakan array sebagai berikut:
<?php
$query = mysqli_query($conn, 'SELECT * FROM absensi');
$status_class = ['sakit' => 'text-success', 'ijin' => 'text-primary', 'alpha' => 'text-danger'];
while ($row = mysqli_fetch_assoc($query)) {
$status = strtolower($row['status']);
echo '<span class="' . $status_class[$status] . '">' . $row['status'] . '</span>';
}
Dengan model diatas, perubahan scipt dapat dilakukan dengan cepat, yaitu cukup merubah data pada array, disamping itu model diatas dapat meminimalisir terjadinya error.
10. Membalik Format Tanggal Dengan Cepat
Ketika menyimpan data tanggal pada database, format yang kita gunakan adalah YYYY-MM-DD, misal: 2020-12-13.
Selanjutnya ketika kita ingin menampilkannya, format yang digunakan biasanya DD-MM-YYYY dengan berbagai separator, misal 13-12-2020 atau 13/12/2020.
Untuk mengubah format tersebut, cara konvensional yang digunakan biasanya mecah tanggal database berdasarkan separator ‘-‘, kemudian menggabungkan pecahan tersebut sesuai dengan format yang diinginkan, misal:
<?php
$tanggal = '2020-12-13';
$split = explode('-', $tanggal);
$tampil = $split[2] . '-' . $split[1] . '-' . $split[0];
Cara diatas sudah benar, namun terlihat ribet. Ada cara yang lebih ringkas dan elegan yaitu membalik urutan array menggunakan fungsi krsort() sebagai berikut:
<?php
$tanggal = '2020-12-13';
$split = krsort(explode('-', $tanggal));
$tampil = join('-', $split);
Cara diatas jauh lebih ringkas dan elegan dan meminimalisir kemungkinan program error karena salah ketik.
11. Mendefinisikan Nilai Default Suatu Variabel
Ketika melakukan coding, terkadang kita dihadapkan dengan satu kondisi dengan logika yang cukup panjang. Ketika coding kita mengikuti alur logika tersebut, script menjadi kompleks dan tidak readable.
Sebagai contoh terdapat form penjualan dengan method GET dengan pilihan tahun 2019, 2020, dan 2021. Ketika form disubmit, url berubah menjadi misal https://jagowebdev.com/penjualan?tahun=2021. Nilai tahun tersebut nantinya digunakan untuk melakukan query database.
Selanjutnya terdapat kondisi berikut:
- Jika tahun tidak didefinisikan (misal: https://jagowebdev.com/penjualan) maka tahunnya adalah 2021
- Jika parameter tahun ada di URL dan nilai tahun adalah 2019, 2020, atau 2021 (misal: https://jagowebdev.com/penjualan?tahun=2021) maka gunakan nilai tahun pada URL tersebut.
- Jika ada parameter tahun di URL namun nilainya bukan 2019, 2020, atau 2021 maka tahunnya adalah 2021 (misal user ada yang menulis: https://jagowebdev.com/penjualan?tahun=2017)
Ketika mengikuti alur diatas, maka script PHP nya adalah
$list_tahun = [2019, 2020, 2021];
if (empty($_GET['tahun'])) {
$tahun = 2021;
} else {
if (in_array($_GET['tahun'], $list_tahun)) {
$tahun = 2021;
} else {
$tahun = $_GET['tahun'];
}
}
$sql = 'SELECT * FROM penjualan WHERE tahun_penjualan = ' . $tahun;
Jika dilihat sekilas, script diatas tidak efisien karena terlalu panjang untuk menghandle kondisi yang simpel, untuk itu perlu kita fikirkan kembali kemungkinan untuk menyederhanakannya.
Caranya adalah pertama tama kita definisikan terlebih dahulu nilai default untuk variabel tahun, kemudian jika kondisi lain terpenuhi, sesuaikan nilai variabel tahun tersebut. Script nya adalah sebagai berikut:
$list_tahun = [2019, 2020, 2021];
$tahun = 2021;
if (!empty($_GET['tahun']) && in_array($_GET['tahun'], $list_tahun)) {
$tahun = $_GET['tahun'];
}
Kesimpulannya adalah: Jika ada nilai default, definisikan nilai default tersebut terlebih dahulu baru kemudian buat penyesuaian nilai tersebut sesuai kondisi yang telah disyaratkan
Penutup
Sekian dulu trik coding php dari kami.
Kami akan menambahkan berbagai trik lain di kesempatan berikutnya, so, rutin cek artikel ini, siapa tau ada tambahan tips dan trik yang belum sobat ketahui.
Jika sobat punya trik juga, jangan segan segan untuk di share ke pembaca lain melalui kolom komentar…
Demikian artikel mengenai tips dan trik coding cepat dengan php, semoga bermanfaat
Salam…
Subscibe Now
Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com
21 Feedback dari pembaca
Bagus pak artikelnya. Semoga barokah
Aamiin, terima kasih mas…
Yeay ada update artikel
Siap mas… 😀
Nah, waktunya belajar lagi nih, makasi artikelnya 🙂
Sama sama mas…
Menunggu artikel .htaccess… hehehee
Semoga segera muncul
Siap mas…
Poin ke-4 sangat penting untuk diterapkan terutama terkait fleksibilitas.
Nice share min, sangat edukatif…
Terima kasih mas…
list($tahun, $bulan, $tanggal) = explode(‘-‘, $tanggal_db);
echo $tanggal . ‘ ‘ . $nama_bulan[$bulan] . ‘ ‘ . $tahun;
Cara ini tidak jalan. Karena key dari array nama_bulan itu 1, 2, 3 dst
dalam kasus format tgl 2020-01-01
Sudah dicoba mas?
Saya coba di PHP 5.3 dan 7.4 code diatas dapat berjalan dengan baik….
Sudah mas.
Variable tanggalnya
$tanggal_db = “2020-01-01”;
Array nama bulannya
$nama_bulan = [1 => “Januari”, “Februari”];
Solusi saya,
$tanggal_db = date(“Y-n-d”, strtotime($tanggal_db);
Fitur balas komentar kok g bisa ya? Saya pake HP.
Maturnuwun.. Semoga ilmu yg mas bagikan berkah dan menjadikan tambahnya kebaikan untuk mas dan pembaca. Amin
Aamiin, terima kasih mas…
Terima kasih juga atas report error di bagian comment reply
Coding lengkapnya seperti apa mas?
Yang seperti ini saya coba bisa jalan dengan baik:
Saya waktu itu pake tutorial mas yang ini:
hanya saja, $tanggal_db nya saya ganti ke 2020-01-01. Hasilnya tidak work, karena $bulan isinya adalah 01, bukan 1. kalau tanggalnya persis seperti tutorial mas, work. karena memang isi dari $bulan adalah 10, dan key >10 itu ada.
kalau yang code mas coba ini:
jelas work, karena isi dari $bulan jadi 1, bukan 01.
dan ini lebih simpel dari pada problem solved saya. hehehe.. Makasih mas.
cukup dengan (int) saja. gak perlu panjang-panjang seperti ini $tanggal_db = date(“Y-n-dâ€Â, strtotime($tanggal_db);
Terima kasih mas atas masukannya, memang cukup pakai type casting (int) saja 🙂
ini maksud kode nya apa ya bang masih belum mengerti:
setlocale(LC_ALL, ‘id-ID’);
setlocale maksudnya apa? simbol ( ini apa?. LC huruf besar ini apa garis bawah ini apa fungsinya_ ALL itu apa fungsinya koma apa fungsinya, koma atas apa fungsinya contoh’. id-ID’); apa fungsinya dan kenapa simbol nya seperti ini
Itu adalah fungsi pada PHP, nama fungsi udah predefined, jadi harus dihafal, tidak bisa di logika, kalau dari manual PHP nya (yang membuat fungsi) setlocale artinya “Set local information) mungkin maksudnya mendefinisikan informasi lokal, yang biasanya suatu negara/region tertentu, parameter fungsi juga predefined, perlu dihapal atau lihat manualnya, lebih lanjut bisa dibaca di: https://www.php.net/manual/en/function.setlocale.php
terimakasih artikelnya , sy coba langsung berhasil
Sama sama mas
Artikel lama tapi masih bermanfaat