Cookie Pada PHP – Panduan Lengkap

Hi sobat, pada kesempatan kali ini kita akan  membahas tentang cookie pada PHP.  Untuk memiliki gambaran tentang cookie: sobat dapat membaca artikel sebelumnya: Memahami Cookies.

Pembahasan demo diatas dapat diikuti pada bagian III artikel ini.

I. Memahami Cookies

Meskipun telah dibahas pada artikel sebelumnya, sebelum kita melangkah lebih jauh, kita perlu memahami terlebih dahulu apa itu cookies dan bagaimana cara kerjanya.

Apa itu Cookie?

Cookies adalah sebuah file teks yang berisi data tertentu yang disimpan oleh  browser.

Data pada cookie ini dikelompokkan berdasarkan domain, sehingga  ketika browser mengakses domain tertentu (misal: www.example.com), maka hanya data cookie yang terkait domain tersebut yang dikirim.

Cara kerja cookie

Cara kerja cookie dapat dimisalkan sebagai berikut:

Pertama-tama, browser meminta webserver (misal pada www.example.com) untuk memberikan data halaman tertentu, ketika mengirim data, webserver memerintahkan browser untuk menyimpan data ke file cookie.

Selanjutnya, ketika browser kembali mengakses website tersebut, browser akan sekaligus mengirim data cookie yang disimpan tadi.

Data cookie tersebut digunakan oleh webserver untuk berbagai keperluan, termasuk menerapkan setting tertentu pada data yang akan dikirim kembali ke browser.

Misal:

  • User A dengan browser Firefox mengunjungi website www.example.com kemudian mengakses menu setting dan menerapkan tema biru dan bahasa antar muka Bahasa Inggris.
  • Di belahan negara lain, user B dengan browser Firefox menerapkan tema hijau dengan bahasa antar muka Bahasa  Indonesia.

Nah agar server www.example.com mengetahui tema dan bahasa  yang telah diterapkan oleh masing-masing user pada masing masing browser, maka  www.example.com memerintahkan browser untuk menyimpan data setting tersebut.

Selanjutnya ketika browser tersebut kembali mengunjungi www.example.com, data cookie tersebut ikut dikirim sehingga server tahu tema dan bahasa apa yang akan diterapkan kepada browser tersebut.

Untuk lebih jelasnya, perhatikan ilustrasi berikut:

Cookie Pada PHP

Pada contoh diatas terlihat bahwa server (dalam hal ini www.example.com) dapat memanfaatkan data cookie hanya  pada request ke dua (step ke 3) dan seterusnya,  tidak bisa pada request pertama, karena pada request pertama tersebut, data cookie sedang dibuat.

II. Cookie Pada PHP

Nah, setelah kita paham tentang cookie, selanjutnya kita bahas penerapan cookie pada PHP. Setidaknya ada tiga hal yang akan kita bahas yaitu: membuat, membaca, dan menghapus data Cookie.

1 Membuat Cookies Pada PHP

Untuk membuat cookies pada PHP, kita gunakan fungsi setcookie(). Fungsi ini memiliki enam argumen, yaitu:

  1. Nama cookie, yang berisi nama cookie.
  2. Nilai cookie, data yang akan disimpan yang merujuk pada nama cookie (nomor 1)
  3. Expire. Kapan cookie akan berakhir.  Format waktu berupa Unix timestamp, yang pada PHP kita buat dengan menggunakan fungsi time().

    Jika nilai expire dikosongkan atau bernilai 0, maka data cookie akan expire/dihapus ketika browser ditutup (ketika session berakhir)

  4. Path. Path/Lokasi pada server di mana cookie dapat digunakan. Jika diisi tanda slash ‘/’, maka cookie  dapat digunakan diseluruh bagian website.

    Jika diisi nilai tertentu, misal ‘/blog/’, maka cookie hanya dapat digunakan pada direktori blog dan subdirektorinya, misal: ‘/blog/archive/’ .

    Jika nilai dikosongkan, maka  lokasi akan merujuk ke direktori dimana cookie di buat.

  5. Domain. subdomain dimana cookie dapat digunakan.

    Misal: jika kita isi (jagowebdev.com), maka cookie akan dapat digunakan pada semua subdomain seperti: blog.jagowebdev.com, themes.jagowebdev.com w2.www.jagowebdev.com, dll.

    Namun, jika kita isi (www.jagowebdev.com) maka subdomain yang tersedia hanya  sebelum www misal: w2.www.jagowebdev.com.

    Jika nilainya kosong, maka cookie akan berlaku pada seluruh bagian domain namun tidak pada subdomainnya.

  6. Secure. Default  false. Jika true,  browser akan mengirim cookie ke websever hanya jika koneksi berbentuk HTTPS.
  7. Httponly. Default false. Cookie hanya dapat diakses hanya melalui protokol http.
Kita tidak bisa mengosongkan waktu expire, dengan demikian, kita tidak bisa membuat cookie dengan umur yang tidak terbatas, solusinya, kita buat waktu expired cookie sangat lama, misal 5 tahun kedepan

Dari ketujuh argumen tersebut, yang paling sering digunakan adalah empat pertama.  Khusus untuk argumen domain, isinya (jika ada) harus menggunakan dot (.) sehingga jika kita menuliskan localhost maka akan gagal.

Contoh: kita set cookie dengan nama background-color dengan nilai #4e79a0  dan cookie dengan nama font-size dengan nilai 15px

setcookie('background-color', '#4e79a0', time() + (60 * 60), '/');
setcookie('font-size', '15px', time() + (60 * 60), '/');

Selanjutnya cek apakah cookie ini berhasil disimpan di browser. Caranya, buka developer tools (tekan  F12 – Google Chrome)

Cek Data Cookie Menggunakan Google Chrome

Menghitung Waktu Expired

Pada argumen ke tiga, kita menentukan kapan cookie akan berakhir (expired), karena nilai yang diisikan berupa timestamp, maka cara yang paling mudah untuk menentukan waktu expire adalah menggunakan hitungan mundur dari detik, menit, jam, hari, dst…

Contoh kita ingin membuat waktu expire cookie 30 hari kedepan, maka kita isikan  time() + (60 * 60 * 24 * 30) yang artinya:

  • time() yang berarti waktu ketika script dieksekusi (dalam unix timestamp).
  • 60 pertama yang berarti 60 detik (1 menit = 60 detik);
  • 60 kedua yang berarti 60 menit (1 jam = 60 detik)
  • 24 yang berarti 24 jam (1 hari = 24 jam)
  • 30 yang berarti 30 hari

Cara ini jauh lebih mudah dibaca dan di-maintenance daripada kita menggunakan  time() + 2595000

Cara lain yang lebih mudah adalah dengan menggunakan format tanggal relatif (Relative Date Format) yaitu dengan menggunakan kata-kata day, month, weeks, year, dsb.

Contoh penggunaan relative date format pada cookie:

// Expire 7 hari kedepan
setcookie('background-color', '#75b14a', strtotime('+7 days'), '/');
// Expire 3 bulan kedepan
setcookie('background-color', '#75b14a', strtotime('+3 months'), '/');
// Expire 1 tahun kedepan
setcookie('background-color', '#75b14a', strtotime('+1 year'), '/');

NOTEkita dapat menggunakan bentuk tunggal maupun bentuk jamak (dengan tambahan s). Misal: penggunaan  day atau days  akan menghasilkan nilai yang  sama.

Bentuk Array

Jika kita menyimpan cookie lebih dari satu, maka nama cookie ini dapat kita buat dalam bentuk array. Ketika disimpan di browser, data tetap disimpan per nama, namun ketika dipanggil, maka pemanggilannya menggunakan model array.

Contoh kita set cookie dengan nama settings dengan index background-color dan font-size:

setcookie('settings[background-color]', '#4e79a0', time() + (60 * 60), '/');
setcookie('settings[font-size]', '15px', time() + (60 * 60), '/');

Jika kita lihat di developer tools, maka kita dapatkan seperti ini:

Cookie Pada PHP Menggunakan Model Array

Ketika kita memanggil cookie tersebut, kita memanggilnya menggunakan bentuk array, misal untuk mengambil nilai background-color, maka kita gunakan $_COOKIE['settings']['background-color']

Url Encode

Jika kita perhatikan, nilai dari cookie berbeda dari nilai yang kita set. Pada contoh diatas, kita set cookie background-color dengan nilai #4e79a0, namun ketika kita lihat pada developer tools, nilainya  %2375b14a

Nah, hal ini disebabkan karena PHP mengencode nilai tersebut menjadi format standar url (fungsi url_encode). Hal ini untuk antisipasi, ketika user tidak menggunakan cookie, maka nilai cookie dapat disimpan pada url

Jika kita menginginkan nilai cookie apa adanya (sama seperti nilai yang kita set) maka kita dapat menggunakan fungsi setrawcookie()

Namun setrawcookie ini kita tidak bisa menggunakan karakter tertentu seperti titik koma dan spasi.

2 Membaca Data Cookie Pada PHP

Untuk membaca data cookie, kita gunakan variabel bawaan PHP $_COOKIE, jika tidak ada cookie sama sekali maka variabel ini tetap ada namun bernilai kosong.

Untuk mengambil data cookie tertentu, gunakan variabel $_COOKIE dengan index nama cookie tersebut, misal: untuk nama cookie theme, kita panggil  menggunakan  $_COOKIE['theme']

Untuk menampilkan semua data cookie, kita gunakan fungsi print_r(), contoh: echo '<pre>'; print_r($_COOKIE)

echo '<pre>'; print_r($_COOKIE);
/* Hasil:
Array
(
    [PHPSESSID] => vprkeu3jsk7qmkohbhcu0fcto7
    [settings] => Array
        (
            [background-color] => #4e79a0
            [font-size] => 15px
        )

)*/

Penting diperhatikan ketika membaca data cookie

Pada PHP, cookie yang dikirim oleh browser disimpan dalam variabel global $_COOKIE. Hal ini berarti bahwa kita tidak dapat langsung mengambil nilai cookie ketika baru saja membuatnya, karena, data tersebut belum dikirim kembali ke server.

Contoh:

setcookie('theme', 'jagowebdev', strtotime('+7 days'), '/');
echo $_COOKIE['theme'];

Ketika script diatas dijalankan pertama kali, maka kita akan dapatkan hasil:

Notice: Undefined index: theme in E:\xampp-1.8.3.2\htdocs\tutorial\cookie-pada-php\index3.php on line 3

Namun, ketika script diatas dijalankan untuk kedua kali dan seterusnya, maka  variabel $_COOKIE['theme'] akan bernilai jagowebdev

Seperti pada gambar ilustrasi sebelumnya, cookie baru tersedia pada step ke 3, dimana data cookie dikirim oleh browser, sedangkan fungsi setcookie() baru berada pada step ke 2

3 Menghapus Cookie Pada PHP

Untuk menghapus cookie pada PHP, kita cukup memberi nilai kosong pada nama cookie yang ingin kita hapus datanya.

Misal kita ingin hapus data cookie font-size:

setcookie('font-size', '');

Jika pada waktu membuat cookie kita memberikan argumen lain selain nama cookie, nilai, dan expire, misal path atau domain, maka untuk menghapus data cookie tersebut, kita juga harus menyertakan argumen tersebut.

Misal pada contoh sebelumnya kita membuat cookie dengan memberikan argumen path '/'.

setcookie('font-size', '14px', time + (60 * 60), '/');

maka untuk menghapusnya, kita juga harus menuliskan argumen tersebut

setcookie('font-size', '', 0, '/');

III. Contoh Penggunaan Cookies Pada PHP

Untuk dapat lebih memahami cookie pada PHP, mari kita buat sedikit simulasi. Kita buat sebuah form setting dimana user dapat memilih warna background dan ukuran huruf.

Dalam form tersebut, terdapat checkbox “Remember” yang akan memerintahkan browser menyimpan data cookie berupa warna background dan ukuran font. Waktu expire cookie tersebut kita set 7 hari kedepan.

Dengan demikian, jika dalam 7 hari user kembali mengunjungi halaman tersebut, maka warna background dan ukuran huruf akan sama persis ketika user terakhir kali berkunjung.

Script PHP yang kita gunakan:

<?php
	$font_size = '15px';
	$background_color = '#4e79a0';
	
	if ($_POST) {
		$background_color = $_POST['background_color'];
		$font_size = $_POST['font_size'];
	} else {
		if (isset($_COOKIE['background-color'])) {
			 $_POST['background_color'] = $background_color = $_COOKIE['background-color'];
		}
		if (isset($_COOKIE['font-size'])) {
			 $_POST['font_size'] = $font_size = $_COOKIE['font-size'];
		}
	}
	
	// Delete Cookies
	$msg = false;
	if (isset($_POST['hapus_cookie']))
	{
		setcookie('background-color', '', 1, '/');
		setcookie('font-size', '', 1, '/');
		$msg = 'Data cookie berhasil dihapus';
	}

	// Set Cookie 7  hari
	if (isset($_POST['remember']))
	{
		setcookie('background-color', $_POST['background_color'], strtotime('+7 days'), '/');
		setcookie('font-size', $_POST['font_size'], strtotime('+7 days'), '/');
		$msg = 'Data cookie berhasil disimpan';
	}
?>
<html>
<head>
	<title>Format Rupiah Dengan Javascript</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<style type="text/css">
	body {
		font: <?=$font_size?> "open sans", "segoe ui", tahoma;
		background-color: <?=$background_color?>;
	}
	h3 {
		margin-top: 0;
		margin-bottom: 10px;
	}
	div {
		margin-bottom: 5px;
	}
	select {
		padding: 5px 10px;
		font-size: 17px;
		border: 1px solid #CCCCCC;
		color: #5d5d5d;
		text-align: right;
		width: 200px;
		margin-bottom: 10px;
	}
	form {
		margin: 0;
	}
	.container {
		width: 250px;
		margin: auto;
		margin-top: 15px;
		border: 0;
		padding: 20px;
		background-color: #FFFFFF;
	}
	.copyright {
		padding: 0;
		background: none;
		text-align: center;
		margin-top: 10px;
		color: #FFFFFF;
		font-size: smaller;
	}
	.button {
		border: 0;
		padding: 7px 20px;
		float: left;
		font-family: "open sans";
		color: #FFFFFF;
		font-size: 16px;
		margin-right: 5px;
		cursor: pointer;
	}
	.blue {
		background-color: #3e97e2;
	}
	.red {
		background-color: #e26b3e;
	}
	.clearfix::before,
	.clearfix::after
	{
		content: "";
		float: none;
		clear: both;
		display: block;
	}
	.remember {
		margin-bottom: 12px;
	}
	.success {
		background-color: #abffc1;
		padding: 5px 10px;
		color: #696969;
	}
	</style>
	
</head>
<body>
<div class="container">
	<form method="post" action="">
		<h3>SETTINGS</h3>
		<?php 
			if ($msg) {
				echo '<div class="success">'.$msg.'</div>';
			}
		?>
		<div>Background</div>
		<select name="background_color">
			<?php 
			$colors = array('#4e79a0' => 'Biru', '#75b14a' => 'Hijau', '#d06353;' => 'Merah');
			foreach ($colors as $name => $value) {
				$selected = $name == @$_POST['background_color'] ? 'SELECTED="SELECTED"' : '';
				echo '<option value="'.$name.'"'.$selected.'>'.$value.'</option>';
			}
			?>
		</select>
		<div>Font Size</div>
		<select name="font_size">
			<?php 
			$font_sizes = array('15px', '17px', '20px', '25px');
			foreach ($font_sizes as $value) {
				$selected = $value == @$_POST['font_size'] ? 'SELECTED="SELECTED"' : '';
				echo '<option value="'.$value.'"'.$selected.'>'.$value.'</option>';
			}
			?>
		</select>
		<div class="remember">
			<input type="checkbox" id="remember" name="remember"/>
			<label for="remember"> Remember</label>
		</div>
		<div class="clearfix">
			<input type="submit" class="button blue" name="submit" value="Simpan"/>
			<input type="submit" class="button red" name="hapus_cookie" value="Hapus Cookie"/>
		</div>
	</form>
</div>
<div class="container copyright">&copy; <?=date('Y')?> JagoWebDev.com</div>
</body>
</html>

Pada script diatas,  pertama tama kita definisikan warna background #4e79a0 dan ukuran font 15px  yang disimpan pada variabel  $background_color dan $font_size

Jika ada key “submit” pada variabel $_POST, yang artinya user mengklik tombol submit, maka kita gunakan warna background dan ukuran huruf dari form.

Jika user tidak mengklik tombol submit, maka kita cek apakah ada data background dan ukuran font pada cookie, jika ada, maka kita gunakan data tersebut.

Demikian pembahasan cookie pada PHP, semoga bermanfaat.

Subscibe Now

Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com

Komitmen Kami: Kami senantiasa menghargai privasi Anda dan tidak akan membagikan identitas Anda ke pihak manapun.

21 Feedback dari pembaca

Silakan tinggalkan komentar

Newsletter

Jadilah yang pertama tahu berita terbaru dari Jagowebdev.com