PHP session verisi sayfa yenilenince kayboluyor gibi görünüyorsa sorun çoğu zaman yenileme işleminin kendisi değil, isteğin aynı oturumla eşleşmemesidir. İlgili istekte session_start() çağrılmaması, tarayıcının oturum çerezini taşımaması, farklı bir oturum adı kullanılması veya verinin başka bir $_SESSION anahtarıyla okunmaya çalışılması ilk kontrol noktalarıdır.
Yaygın PHP oturum yapısında veri sunucudaki oturum kaydında tutulur, tarayıcı ise bu kayda ulaşmayı sağlayan oturum kimliğini çerez aracılığıyla taşır. Sayfayı yenilemek yeni bir HTTP isteği oluşturur, ancak aynı oturum kimliği gönderildiğinde PHP aynı oturum kaydını yeniden okuyabilir. Bu nedenle yenileme tek başına session verisinin silindiğini göstermez.
Sayfa yenilenince session verisi neden kaybolmuş görünür?

Bir session değerinin sonraki istekte okunabilmesi için yazma ve okuma işlemlerinin aynı oturumla ilişkilendirilmesi gerekir. Bunun ilk koşulu, session kullanılacak her PHP isteğinde session_start() çağrısının yapılmasıdır. Bu çağrı PHP'nin oturum bağlamını açar, tarayıcıdan gelen oturum kimliğini değerlendirir ve ilgili session verisini kullanıma hazırlar.
Oturum kimliği ile session verisini birbirinden ayırmak önemlidir. Tarayıcı genellikle verinin tamamını taşımaz; oturum kimliğini içeren çerezi gönderir. Sunucu bu kimliği kullanarak kendi oturum kaydını bulur. Çerez hiç gönderilmezse, farklı bir oturum kimliği gönderilirse veya uygulama farklı bir oturum adı beklerse PHP önceki veriye ulaşamayabilir. Bu durumda sunucudaki eski kayıt yerinde dursa bile sayfa yeni ya da farklı bir oturum okuyabilir.
Session verisinin kaybolmuş gibi görünmesine yol açan başlıca eşleşme sorunları şunlardır:
- Yazma veya okuma sayfasında
session_start()çağrısının bulunmaması. - Tarayıcının oturum çerezini ilgili istekte göndermemesi.
- Sayfaların farklı bir
session_name()değeriyle çalışması. - Değerin
$_SESSION['kullanici_adi']anahtarıyla yazılıp başka bir anahtarla okunması. - Anahtar adında yazım, büyük harf veya küçük harf farkı bulunması.
Session verisi kalıcı bir veritabanı kaydı gibi düşünülmemelidir. Oturum mekanizmasının kendi yaşam döngüsü ve kayıt yöntemi vardır. Yine de yalnızca sayfayı yenilemek, aynı oturum kimliği korunuyorsa veriyi kendiliğinden silmez. Teşhis sırasında önce oturumun başlatılıp başlatılmadığına, ardından tarayıcının aynı kimliği taşıyıp taşımadığına ve son olarak kullanılan anahtarların birebir eşleşip eşleşmediğine bakmak daha sağlıklı bir sıradır.
İki PHP sayfasında aynı session verisi nasıl yazılır ve okunur?
Basit bir örnekte bir sayfa session verisini kaydeder, ardından başka bir sayfaya yönlendirir. Yazma sayfasında yönlendirmeden önce hiçbir çıktı üretilmemelidir. header() çağrısından sonra exit kullanılması da mevcut istekteki kodun devam etmesini engeller.
Yazma sayfası: yaz.php
<?php
session_start();
$_SESSION['kullanici_adi'] = 'Ayşe';
header('Location: oku.php');
exit;
Burada session_start() çağrısı session bağlamını açtıktan sonra kullanici_adi anahtarına bir değer atanır. Ardından tarayıcı oku.php sayfasına yönlendirilir. Yazma sayfasında session başlatılmadan değer atanırsa bu değer, beklenen oturumla ilişkilendirilmeyebilir.
Okuma sayfasında da yeni istek için tekrar session_start() çağrılır. Değerin HTML içinde gösterilmesi gerektiğinde htmlspecialchars() kullanmak, session içeriğini doğrudan HTML çıktısına eklemekten daha uygun bir yaklaşımdır.
Okuma sayfası: oku.php
<?php
session_start();
$kullaniciAdi = $_SESSION['kullanici_adi'] ?? null;
if (is_string($kullaniciAdi)) {
echo htmlspecialchars($kullaniciAdi, ENT_QUOTES, 'UTF-8');
} else {
echo 'Oturum verisi bulunamadı.';
}
Tarayıcı aynı oturum çerezini koruyarak oku.php isteğini gönderirse beklenen çıktı Ayşe olur. Bu sonuç için iki sayfada da aynı oturum bağlamı ve aynı anahtar kullanılmalıdır. Yazma sayfasında kullanici_adi, okuma sayfasında ise örneğin kullaniciAdi kullanılırsa PHP bunları iki farklı session anahtarı olarak değerlendirir.
Ayrıca session_start() çağrısı yalnızca verinin yazıldığı sayfada değil, verinin okunacağı her istekte bulunmalıdır. Sayfa yenilendiğinde okuma kodu yeniden çalışır ve session verisini tekrar yüklemeye çalışır. Çıktı beklenenden farklıysa önce iki dosyadaki anahtar adlarını, sonra session başlatma satırlarını ve ardından oturum çerezinin korunup korunmadığını karşılaştırabilirsin.
session_start() satırı eksikse ne değişir?

$_SESSION dizisi, önceki istekte yazılan veriyi kendi başına yüklemez. session_start() çağrıldığında PHP, istekle gelen oturum kimliğine göre yeni oturum başlatır veya mevcut oturumu sürdürür. Kayıtlı oturum verileri de bu işlemden sonra $_SESSION içine alınır.
Eksik satırı küçük bir örnekle gör
yaz.php
<?php
session_start();
$_SESSION['secilen_dil'] = 'PHP';
echo 'Değer yazıldı.';
oku.php dosyasında session_start() satırı olmadığında:
<?php
echo $_SESSION['secilen_dil'] ?? 'Session verisi okunamadı';
session.auto_start kapalı bir yapılandırmada oku.php, önceki isteğin oturumunu açıp veriyi $_SESSION içine taşımaz. Bu örnekte yedek metin ekrana gelebilir. Otomatik başlatma etkinse davranış farklılaşabilir, çünkü PHP oturumu istek başlangıcında kendiliğinden başlatabilir. Bu nedenle oluşan uyarıların veya ekrandaki çıktıların her ortamda aynı olacağını varsayma.
Okuma sayfasının doğru başlangıcı şöyledir:
<?php
session_start();
echo $_SESSION['secilen_dil'] ?? 'Session verisi bulunamadı';
Çerez kabul edilmiş ve sonraki istekte aynı oturum kimliği taşınmışsa bu sayfada beklenen değer PHP olur. session_id() ile karşılaştırma yapacaksan iki istekte de önce oturumu başlat, ardından değeri yalnızca sunucu günlüğü gibi herkese açık olmayan bir yerde incele. Oturum başlatılmadan yapılan çağrı aktif bir oturumu temsil etmeyebilir; PHP bu durumda boş dize döndürebilir. Ham oturum kimliğini sayfaya yazma.
Tarayıcı, PHP kodu ve oturum kaydı hangi sırayla kontrol edilmeli?
Teşhisi üç katmana ayırmak, sorunun kodda mı, tarayıcıda mı yoksa sunucudaki kayıt alanında mı olduğunu daha hızlı anlamanı sağlar. Önce oturumun açıldığını, sonra kimliğin sonraki isteğe taşındığını, en son da bu kimliğe karşılık gelen kaydın okunup yazılabildiğini incele.
- PHP kodu: Değeri yazan ve okuyan her istekte
session_start()var mı kontrol et. Özel bir oturum adı kullanıyorsansession_name()her istekte vesession_start()çağrısından önce aynı adla çalıştırılmalı. Doğru$_SESSIONanahtarının okunduğuna ve başka bir satırın aynı anahtarı boş ya da farklı bir değerle yanlışlıkla değiştirmediğine bak. Oturum çerezi kullanılacaksa oturum başlatma işlemi tarayıcıya çıktı gönderilmeden önce yapılmalıdır. - Tarayıcı ve istek bağlamı: İlk yanıtta oturum çerezi oluşturulmuş mu, sonraki istekte aynı çerez geri gönderiliyor mu incele. İsteğin aynı alan adı ve çerez yolu içinde kalıp kalmadığına bak. Alan adı veya yol kapsamı uyuşmuyorsa tarayıcı çerezi ilgili isteğe taşımayabilir. Farklı alt alan adları, yerel geliştirme adresleri ve uygulamanın bir alt klasörde çalışması bu kontrolü önemli hâle getirir. PHP, oturum kimliğini çoğunlukla çerez aracılığıyla alır ve bu kimlikle oturum kaydını bulur.
- Oturum kaydı: Kullanılan
session.save_handlervesession.save_pathdeğerlerini öğren. Dosya tabanlı kayıtta oturum verisi yapılandırmadaki kayıt yolunda tutulur. Uygulamanın bu alana erişme ve yazma yetkisini, kayıtların temizlenme davranışını etkileyensession.gc_probability,session.gc_divisorvesession.gc_maxlifetimeayarlarını incele. Birden fazla çalışma ortamı varsa hepsinin aynı kayıt alanına bakıp bakmadığını da kontrol et.
Bu kontrollerden sonra değerin hangi istekte yazıldığını ve hangi istekte silindiğini ayrı ayrı izole et. Session verisi, istekler arasında durum taşımaya yarar; kalıcı kullanıcı kaydı veya veritabanı arşivi yerine geçmez. Kalıcı olması gereken bilgiler için yaşam süresi, saklama yeri ve veri modeli ayrıca tasarlanmalıdır.
Kısacası önce session_start() ve anahtar kullanımını, sonra çerezin sonraki isteğe taşınıp taşınmadığını, ardından oturum kaydının aynı kimlikle okunup yazılabildiğini kontrol et. Bu sıra, PHP session verisi sayfa yenilenince neden kayboluyor sorusunun kaynağını daha net gösterir.