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:
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:
- Nama cookie, yang berisi nama cookie.
- Nilai cookie, data yang akan disimpan yang merujuk pada nama cookie (nomor 1)
- 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)
- 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.
- 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.
- Secure. Default
false
. Jikatrue
, browser akan mengirim cookie ke websever hanya jika koneksi berbentuk HTTPS. - Httponly. Default
false
. Cookie hanya dapat diakses hanya melalui protokol http.
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)
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:
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">© <?=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
21 Feedback dari pembaca
thanks sangat membantu
Terimakasih om.
Terimakasih sangat membantu
sama sama mas…
Mksih mas
Sangat Membantu Mas 😀
makasih mas ilmunya, kebetulan saya lagi belajar php. sangat membantu sekali.
Sama sama mas…
kalo ngatur expirenya pake selain time() emang nggabisa ya min ?
Bisa mas, time() berarti waktu saat ini, sehingga dapat memudahkan penghitungan waktu kedepan, misal 1 hari kedepan, 1 bulan kedepan, dll
mas kalau cookies versi lengkap nya dengan codeigniter 3 ada mas ?
Coba di lihat di manual nya mas…
Mohon bantuannya pak saya menemui masalah dengan manajemen cookie dan login multi user
dengan script dibawah ini :
muncul pesan error spt dibawah ini
Notice: Undefined index: USERNAME in C:\xampp\htdocs\siimut\index.php on line 56
Notice: Undefined index: PASSWORD in C:\xampp\htdocs\siimut\index.php on line 56
Mohon Untuk Login
terima kasih
Itu berarti $_COOKIE dengan index USERNAME dan PASSWORD belum di set mas…
contoh scriptnya
Bisa didownload di artikel diatas mas
Terima kasih banyak mas, tutorial jelas dan lengkap. Berhasil diterapkan di website saya
Siap, sama sama mas…
Terimakasih mas, saya sangat terbantu
Sama sama mas
mantap mas