Kenapa Session PHP Tidak Tersimpan?
Session PHP tidak tersimpan biasanya karena session_start() belum dipanggil di setiap halaman, dipanggil setelah output HTML, cookie session tidak terkirim, atau data session ditulis setelah redirect. Solusi cepatnya: panggil session_start() di baris paling atas setiap halaman yang memakai session, set data sebelum header('Location: ...'), lalu pastikan browser menerima cookie PHPSESSID.
Masalah ini sering terlihat seperti: login berhasil, tetapi saat pindah ke dashboard user kembali dianggap belum login. Untuk pemula, ini terasa seperti data $_SESSION hilang sendiri. Padahal session bekerja dengan kombinasi data di server dan cookie session ID di browser.
Cara Kerja Session PHP
Alurnya seperti ini:
Jadi session bisa gagal jika salah satu bagian ini rusak: PHP tidak start session, cookie tidak tersimpan, cookie tidak terkirim, atau data di server tidak bisa ditulis.
Dasarnya bisa kamu pelajari di Session dan Autentikasi.
Checklist Cepat
Periksa ini dulu sebelum mengganti banyak kode:
session_start()ada di halaman login dan dashboard.session_start()ditulis sebelum HTML, spasi, atauecho.- Data
$_SESSIONdiset sebelumheader('Location: ...'). - Setelah redirect, kode dihentikan dengan
exit. - Browser tidak memblokir cookie.
- Domain dan protocol konsisten, misalnya tidak campur
localhostdan127.0.0.1. - Folder penyimpanan session di server bisa ditulis.
Pola Login yang Benar
Contoh sederhana:
Poin pentingnya:
session_start()ada di paling atas.$_SESSIONdiisi sebelum redirect.exitdipanggil setelah redirect.- HTML baru muncul setelah proses login selesai.
Jika redirect menghasilkan warning, baca Cara Mengatasi Headers Already Sent di PHP.
Pola Dashboard yang Benar
Halaman yang dilindungi juga harus memulai session.
Jangan hanya memanggil session_start() di halaman login. Setiap request PHP berdiri sendiri, jadi halaman dashboard juga harus memanggilnya.
Penyebab 1: session_start() Terlambat
Salah:
Benar:
Jika session_start() terlambat, cookie session bisa gagal dikirim. Biasanya muncul error headers already sent.
Penyebab 2: Data Session Diset Setelah Redirect
Salah:
Benar:
Set data dulu, baru redirect.
Penyebab 3: Lupa exit Setelah Redirect
Tanpa exit, kode di bawah redirect masih bisa berjalan dan mengubah session lagi.
Ini penting terutama jika di bawahnya ada logika logout, reset variable, atau include template lain.
Penyebab 4: Domain Berbeda
Cookie session terikat ke domain. Jika login memakai:
tetapi dashboard dibuka dengan:
browser menganggap keduanya host berbeda. Cookie dari localhost tidak otomatis dipakai di 127.0.0.1.
Gunakan satu alamat secara konsisten selama development.
Penyebab 5: Cookie Diblokir atau Tidak Terkirim
Session PHP default memakai cookie bernama PHPSESSID. Cek di browser DevTools:
- Buka tab Application atau Storage.
- Cari Cookies.
- Pastikan ada
PHPSESSID. - Refresh halaman dan pastikan nilainya tidak berubah terus-menerus.
Jika session ID berubah di setiap refresh, browser tidak menyimpan cookie atau server terus membuat session baru.
Penyebab 6: Session Storage Tidak Bisa Ditulis
PHP menyimpan data session di server. Lokasinya tergantung konfigurasi session.save_path.
Kamu bisa mengeceknya:
Jika folder itu tidak bisa ditulis oleh PHP, data session tidak tersimpan. Di hosting, masalah ini lebih jarang, tetapi bisa muncul di server manual atau container.
Penyebab 7: Logout Tidak Sengaja Terpanggil
Pastikan kode logout hanya berjalan di halaman logout.
Jangan letakkan session_destroy() di file config atau helper yang di-include banyak halaman.
Debug Session dengan Aman
Saat development, cek isi session seperti ini:
Jika session_id() berubah setiap refresh, masalahnya kemungkinan di cookie atau konfigurasi session. Jika session_id() tetap tetapi $_SESSION kosong, cek apakah ada kode yang menghapus session.
Jangan tampilkan dump session di production karena bisa berisi data sensitif.
Contoh Helper Auth yang Rapi
Agar tidak lupa mengecek session di banyak halaman, buat helper.
Lalu pakai di halaman dashboard:
Untuk konsep role dan akses admin, lanjutkan ke Authentication vs Authorization.
Kesalahan yang Sering Terjadi
1. Memulai session hanya di halaman login
Session harus dimulai di setiap halaman yang membaca atau menulis $_SESSION.
2. Ada HTML sebelum session_start()
Ini membuat PHP tidak bisa mengirim cookie session dengan benar. Pindahkan semua logika session ke bagian atas file.
3. Membuka website dari host yang berbeda
Pilih salah satu: localhost, 127.0.0.1, atau domain .test. Jangan campur-campur saat menguji login.
4. Menyimpan data terlalu banyak di session
Session sebaiknya menyimpan data kecil seperti user_id, username, dan role. Data lengkap user lebih baik diambil dari database saat diperlukan.
5. Menghapus session di file yang dipakai bersama
Jangan panggil session_destroy() di file config, header, atau helper umum.
FAQ
Apakah session_start() harus ada di semua halaman?
Harus ada di semua halaman yang memakai $_SESSION. Kalau halaman tidak membaca atau menulis session, tidak perlu.
Kenapa login berhasil tetapi dashboard balik ke login?
Biasanya karena dashboard tidak memanggil session_start(), cookie session tidak terkirim, atau key $_SESSION['user_id'] tidak pernah diset sebelum redirect.
Apakah session sama dengan cookie?
Tidak sama. Session menyimpan data di server, sedangkan cookie menyimpan session ID di browser. Keduanya bekerja bersama.
Apakah boleh menyimpan password di session?
Jangan. Simpan ID user, username, atau role saja. Password cukup diverifikasi saat login.
Bagaimana cara tahu session benar-benar tersimpan?
Cek session_id() dan var_dump($_SESSION) di development. Jika session ID tetap dan data ada setelah refresh, session bekerja.