Category: PHP

  • Menyingkat Kode PHP menggunakan Operator Ternary (?:)

    Salah satu konsep dasar pemrograman yang penting adalah pernyataan bersyarat, atau lebih dikenal dengan istilah percabangan. Percabangan adalah suatu kondisi yang dipakai oleh bahasa pemrograman untuk mengatur alur logika program. Dalam bahasa pemrograman PHP setidaknya dikenal 2 macam percabangan, yaitu if/else dan switch/case.

    Percabangan dengan if/else dapat disederhanakan menggunakan operator ternary. Contoh operator ternary bisa dijumpai pada artikel ini, ini, dan ini. Operator ternary memiliki bentuk dasar sebagai berikut:

    (pernyataan1) ? (pernyataan2) : (pernyataan3)

    Bentuk di atas memiliki arti: jika “pernyataan1” adalah benar, nilai kembalian adalah “pernyataan2”, dan jika sebaliknya, nilai kembalian adalah “pernyataan3”. Untuk lebih jelasnya, perhatikan contoh berikut.

    <?php
    $var = 7;
    $cek_var = $var > 5 ? true : false;
    

    Pada contoh di atas nilai variable $cek_var adalah true, karena pernyataan nilai $var lebih besar dari 5 adalah benar. Berikut ini adalah padanannya dalam bentuk if/else.

    <?php
    $var = 7;
    if ($var > 5)
      $cek_var = true;
    
    else
      $cek_var = false;
    

    Contoh aplikasi di dunia nyata adalah seperti yang biasa digunakan untuk memberikan nilai default pada sebuah variable.

    <?php
    $action = !isset($_POST['action']) ? 'default' : $_POST['action'];
    

    Kode di atas identik dengan:

    <?php
    if (!isset($_POST['action'])) {
        $action = 'default';
    } else {
        $action = $_POST['action'];
    }
    

    Bonus:
    Operasi menghitung jumlah hari (termasuk memeriksa tahun kabisat) dalam satu bulan menggunakan operator ternary bertingkat.

    <?php
    $bulan = 2; // bulan Februari
    $tahun = 2012; // ini tahun kabisat
    
    $jumlah_hari = ($bulan == 2 ? ($tahun % 4 ? 28 : ($tahun % 100 ? 29 : ($tahun %400 ? 28 : 29))) : (($bulan - 1) % 7 % 2 ? 30 : 31));
    echo $jumlah_hari;
    
  • Membuat Tombol “Back”

    Pada umumnya browser sudah memiliki tombol “back” yang berfungsi untuk kembali ke halaman sebelumnya. Seorang web developer harus mempunyai alasan yang bagus untuk memasangnya pada website, misal karena adanya permintaan khusus dari klien. Namun, artikel ini ditulis bukan demi klien, melainkan demi ilmu pengetahuan 🙂

    Ada 2 cara yang bisa dipakai, yaitu dengan JavaScript dan PHP. Untuk mencoba kode-kode di bawah ini, dibutuhkan sebuah halaman lain yang berisi link menuju ke halaman yang berisi tombol “back” ini.

    <input type="button" value="Go Back" onclick="history.back(-1)" />
    

    Tentunya implementasi menggunakan JavaScript masih kurang, karena ada kemungkinan user mematikan JavaScript di browser-nya. Berikut ini adalah implementasi dengan PHP.

    <?php
      $url = htmlspecialchars($_SERVER['HTTP_REFERER']);
    ?>
      <a href="<?=$url?>">Go Back</a>
    

    Pada snippet di atas digunakan fungsi PHP htmlspecialchars untuk mensanitasi input dari client. Meskipun secara fisik tidak ada input yang bisa disusupi oleh user, namun harus tetap berpegang pada prinsip dasar pengembangan website, yaitu jangan pernah percaya apa yang dikirimkan oleh client.

    Jika kode PHP di atas langsung dieksekusi tanpa melalui halaman lain, maka akan muncul pesan peringatan:

    Notice: Undefined index: HTTP_REFERER in /var/www/index.php on line 2

    Itu adalah pesan peringatan karena ada yang salah pada kode PHP. Untuk memperbaiki kesalahan itu bisa dipelajari di sini.

    <?php
      $url = isset($_SERVER['HTTP_REFERER']) ? htmlspecialchars($_SERVER['HTTP_REFERER']) : '';
    ?>
      <a href="<?=$url?>">Go Back PHP</a>
    

    Dalam artikel singkat ini selain dipelajari cara membuat tombol “back” namun juga pentingnya menulis kode yang baik dan berkualitas. Kode yang baik dan berkualitas akan membuat website yang dibuat menjadi lebih aman. Mulailah menulis kode yang berkualitas dari kasus yang paling sederhana.

  • Update Tahun Copyright Secara Otomatis pada Footer

    Tahun baru telah tiba, saatnya untuk mengganti tahun copyright pada bagian footer website/blog. Jika webmaster lupa menggantinya, sebuah website akan tampak ketinggalan tahun 😀 Jadi kita akan membuat sebuah kode yang akan melakukan pekerjaan meng-update tahun secara otomatis. Berikut ini adalah sebuah snippet untuk meng-update tahun copyright secara otomatis pada footer sebuah website.

    <?php 
    $copyYear = 2011; 
    $curYear = date('Y'); 
    echo '&copy;' . $copyYear . (($copyYear != $curYear) ? ' - ' . $curYear : ''); 
    ?>
    

    Jangan lupa untuk mengganti variabel $copyYear sesuai dengan tahun terbit website/blog. Variabel $curYear akan secara otomatis berubah sesuai dengan tahun yang sedang berjalan di komputer server. Pada contoh di bagian footer blog ini (pada saat tulisan ini dibuat) menunjukkan tahun 2011 – 2012. Untuk website yang baru saja terbit, hanya akan memunculkan $copyYear.

    Snippet di atas juga bisa diterapkan untuk blog yang menggunakan WordPress. Letakkan pada bagian footer.php sesuai theme yang digunakan.

  • Validasi File Upload di PHP

    Validasi file upload sangat penting dilakukan karena adanya fitur mengunggah file ke web server adalah kegiatan yang cukup berbahaya. Ambil contoh pada sebuah web yang mengijinkan user untuk meng-upload foto/gambar bisa jadi dijadikan celah bagi para hacker untuk meletakan script berbahaya pada server.

    Berbekal beberapa baris kode PHP kita sudah bisa membuat file upload sederhana. Namun hanya mengandalkan script sederhana tersebut tidak cukup untuk membuat file upload yang bisa diandalkan.

    Untuk meminimalkan celah pada fitur file upload, dapat dilakukan dengan cara memverifikasi jenis file yang diupload. Kita tidak boleh mengandalkan informasi dari ekstensi file atau dari nilai $_FILES['berkas']['type'] atau dari mime type karena ketiga informasi tersebut bisa dipalsukan. Lebih baik menggunakan fungsi PHP exif_imagetype() untuk memeriksa signature dari file yang diupload atau fungsi PHP getimagesize() untuk memperoleh ukuran gambar.

    $fileType = exif_imagetype($_FILES['myFile']['tmp_name']);
    $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
    if (!in_array($fileType, $allowed)) {
      echo "hanya diijinkan untuk meng-upload file gambar (gif, jpg, atau png)";
    }
    

    Namun tidak menutup kemungkinan, fungsi PHP di atas juga belum cukup untuk menghentikan hacker yang kelewat kreatif. Jadi perlu ditambahkan juga pemeriksaan ekstensi file, dan ubah paksa file .php menjadi file .jpg sehingga kode php yang mungkin lolos dari pemeriksaan pertama tidak bisa dieksekusi di server.

    <form action="" method="post" enctype="multipart/form-data">
     <input type="file" name="myFile"/>
     <input type="submit" value="Upload"/>
    </form>
    
    <?php
    define("UPLOAD_DIR", "images/");
    
    if (!empty($_FILES['myFile']['name'])) {
    	
      // verifikasi file gambar (GIF, JPEG, atau PNG)
      $fileType = exif_imagetype($_FILES['myFile']['tmp_name']);
      $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
      if (!in_array($fileType, $allowed)) {
        echo "hanya diijinkan untuk meng-upload file gambar (gif, jpg, atau png)";
      }
    	
      else{
        $myFile = $_FILES['myFile'];
    
    
        // ubah paksa nama file yg mengandung selain huruf, angka, ".", "_", dan "-" dengan regex
        $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile['name']);
    
        // periksa ekstensi file
        $parts = pathinfo($name);		
        if (isset($parts['extension'])) {
          $ext = $parts['extension'];
    			
          if ($ext !== 'jpg' && $ext !== 'gif' && $ext !== 'png')
            $ext = "jpg";
    			
    	$name = $parts['filename'] . '.' . $ext;
          }
    		
          else { // jika file tidak memiliki ekstensi maka berikan ekstensi .jpg
            $ext = 'jpg';
    	$name = $parts['filename'] . '.jpg';
          }
    
          // simpan file
          move_uploaded_file($myFile['tmp_name'], UPLOAD_DIR . $name);
      }
    }
    

    Sebagai tambahan, mungkin juga perlu untuk membatasi ukuran file yang diupload untuk melindungi website dari serangan yang mencoba mengganggu network traffic atau system load.

  • Dasar File Upload dengan PHP

    file upload php
    Jika ingin membuat sebuah mekanisme pengunggah data umumnya kita menggunakan kode berikut:

    <form action="" method="post" enctype="multipart/form-data">
      <input type="file" name="berkas" />
      <input type="submit" value="Upload" />
    </form>
    

    Simpan kode HTML di atas dengan nama upload.php, kemudian lihat hasilnya di browser.

    Agar kode di atas agar dapat digunakan untuk meng-upload file maka tambahkan dengan script PHP berikut.

    <?php
    if(isset($_FILES&#91;'berkas'&#93;)) {
      move_uploaded_file($_FILES&#91;'berkas'&#93;&#91;'tmp_name'&#93;, "uploads/{$_FILES&#91;'berkas'&#93;&#91;'name'&#93;}");
    }
    ?>
    

    Letakkan kode tersebut setelah tag penutup html. Kemudian buatlah sebuah folder dengan nama “uploads” pada tempat yang sama script tersebut disimpan. Maka script sudah siap dicoba untuk meng-upload file yang akan diletakkan pada folder “uploads”.

    Fungsi move_uploaded_file() digunakan untuk memindahkan file dari folder “temp” ke folder yang telah kita tentukan. Kemudian darimana saya mendapatkan kedua parameter tersebut? Untuk menjelaskan hal tersebut, lebih mudah jika kita langsung mempraktekannya.

    Sekarang tuliskan kode dibawah ini untuk menggantikan fungsi move_uploaded_file() di atas, atau letakkan saja di bawahnya, tanpa menghapus fungsi tersebut.

    print_r($_FILES);
    

    Fungsi print_r($_FILES) akan menampilkan isi dari variable $_FILES. Lakukan upload file sekali lagi, maka selain meng-upload file ke server, browser akan menampilkan isi dari variable $_FILES.

    Array
    (
    [berkas] => Array
    (
    [name] => Boston City Flow.jpg
    [type] => image/jpeg
    [tmp_name] => /tmp/php1UOmUg
    [error] => 0
    [size] => 339773
    )
    )

    Pada contoh di atas terlihat variable $_FILES bertipe array. Untuk mengakses indeks “name” dengan menggunakan $_FILES['berkas']['name'], sedangkan untuk mengakses indeks “tmp_name” caranya sama, $_FILES['berkas']['tmp_name'].

    Bersambung ke catatan berikutnya untuk meng-upload banyak file sekaligus menggunakan HTML5 dan PHP. Source code lengkap tutorial ini ada di bawah. Kalau ada pertanyaan, silakan tinggalkan komentar.

    <!DOCTYPE html>
    <html>
      <head>
        <title>upload file</title>
        <meta charset="utf-8">
      </head>
      <body>
        <div>
          <form action="" method="post" enctype="multipart/form-data">
            <p>
            <input type="file" name="berkas" />
            <input type="submit" value="Upload" />
            </p>
          </form>
        </div>
      </body>
    </html>
     
    <pre>
    <?php
    if(isset($_FILES&#91;'berkas'&#93;)) {
      move_uploaded_file($_FILES&#91;'berkas'&#93;&#91;'tmp_name'&#93;, "uploads/{$_FILES&#91;'berkas'&#93;&#91;'name'&#93;}");
      print_r($_FILES);
    }
    ?>
    

    Catatan: Tulisan ini juga pernah diterbitkan di sini. Saya terbitkan kembali karena saya berencana membuat catatan berseri.