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:

1. PHP memanggil session_start()
2. Server membuat session ID
3. Browser menyimpan session ID di cookie
4. Request berikutnya mengirim cookie itu lagi
5. PHP memakai session ID untuk membaca data session di server

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:

  1. session_start() ada di halaman login dan dashboard.
  2. session_start() ditulis sebelum HTML, spasi, atau echo.
  3. Data $_SESSION diset sebelum header('Location: ...').
  4. Setelah redirect, kode dihentikan dengan exit.
  5. Browser tidak memblokir cookie.
  6. Domain dan protocol konsisten, misalnya tidak campur localhost dan 127.0.0.1.
  7. Folder penyimpanan session di server bisa ditulis.

Pola Login yang Benar

Contoh sederhana:

<?php
session_start();

$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';

    if ($username === 'admin' && $password === 'secret') {
        $_SESSION['user_id'] = 1;
        $_SESSION['username'] = $username;

        header('Location: dashboard.php');
        exit;
    }

    $error = 'Username atau password salah.';
}
?>

<form method="POST">
    <input type="text" name="username">
    <input type="password" name="password">
    <button type="submit">Login</button>
</form>

Poin pentingnya:

  • session_start() ada di paling atas.
  • $_SESSION diisi sebelum redirect.
  • exit dipanggil 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.

<?php
session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}
?>

<!DOCTYPE html>
<html lang="id">
<body>
    <h1>Dashboard</h1>
    <p>Halo, <?= htmlspecialchars($_SESSION['username']) ?></p>
</body>
</html>

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:

<!DOCTYPE html>
<html>
<body>
<?php
session_start();
$_SESSION['user_id'] = 1;

Benar:

<?php
session_start();
$_SESSION['user_id'] = 1;
?>

<!DOCTYPE html>
<html>
<body>

Jika session_start() terlambat, cookie session bisa gagal dikirim. Biasanya muncul error headers already sent.

Penyebab 2: Data Session Diset Setelah Redirect

Salah:

<?php
session_start();

header('Location: dashboard.php');
$_SESSION['user_id'] = 1;
exit;

Benar:

<?php
session_start();

$_SESSION['user_id'] = 1;
header('Location: dashboard.php');
exit;

Set data dulu, baru redirect.

Penyebab 3: Lupa exit Setelah Redirect

Tanpa exit, kode di bawah redirect masih bisa berjalan dan mengubah session lagi.

<?php
session_start();

$_SESSION['user_id'] = 1;
header('Location: dashboard.php');
exit;

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:

http://localhost/login.php

tetapi dashboard dibuka dengan:

http://127.0.0.1/dashboard.php

browser menganggap keduanya host berbeda. Cookie dari localhost tidak otomatis dipakai di 127.0.0.1.

Gunakan satu alamat secara konsisten selama development.

Session PHP default memakai cookie bernama PHPSESSID. Cek di browser DevTools:

  1. Buka tab Application atau Storage.
  2. Cari Cookies.
  3. Pastikan ada PHPSESSID.
  4. 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:

<?php
echo session_save_path();

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.

<?php
session_start();

$_SESSION = [];
session_destroy();

header('Location: login.php');
exit;

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:

<?php
session_start();

echo '<pre>';
var_dump(session_id());
var_dump($_SESSION);
echo '</pre>';

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.

<?php
// config/auth.php
session_start();

function wajibLogin(): void
{
    if (!isset($_SESSION['user_id'])) {
        header('Location: login.php');
        exit;
    }
}

function userLogin(): ?array
{
    if (!isset($_SESSION['user_id'])) {
        return null;
    }

    return [
        'id' => $_SESSION['user_id'],
        'username' => $_SESSION['username'] ?? '',
    ];
}

Lalu pakai di halaman dashboard:

<?php
require 'config/auth.php';

wajibLogin();
$user = userLogin();
?>

<h1>Halo, <?= htmlspecialchars($user['username']) ?></h1>

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.

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.

Artikel Terkait