(PHP 4, PHP 5)
setcookie — Bir çerez gönderir
$isim
[, string $değer
[, int $zaman_aşımı
= 0
[, string $yol
[, string $alan
[, bool $güvenli
= false
[, bool $sadece_http
= false
]]]]]] )setcookie() işlevi, HTTP başlıklarının kalanıyla gönderilmek üzere bir çerez tanımlar. Diğer başlıklar gibi, çerezlerde betiğinizin herhangi bir çıktısından önce gönderilmelidir (bu bir protokol kısıtlamasıdır). Bu kısıtlama, bu işleve yapılacak çağrıların, <html> ve <head> etiketleri ve hatta her türlü boşluk karakteri çıktısından bile önce yer almasını gerektirir.
Çerezler bir kere atandı mı, artık $_COOKIE veya $HTTP_COOKIE_VARS dizileri ile sonraki sayfa yüklemesinde erişilebilir olacaktır. $_COOKIE gibi süper küresellerin PHP 4.1.0'dan itibaren kullanılabilir hale geldiğini unutmayınız. Çerez değerleri ayrıca, $_REQUEST içinde de mevcuttur.
isim
değiştirgesi dışında tüm değiştirgeler isteğe
bağlıdır. Bir değiştirgeyi belirtmeden geçmek için değer olarak bir boş
dizge ("") belirtebilirsiniz.
zaman_aşımı
değeri bir tamsayı olduğundan bir boş
dizge ile atlanamaz, yerine sıfır (0) kullanın.
setcookie() değiştirgelerinin her birinin nasıl çalıştığını hakkında bilgi edinmek için » Netscape çerez belirtimine bakınız.
isim
Çerezin ismi.
değer
Çerezin değeri. Bu değer istemcinin bilgisayarında saklanır. Bu
bakımdan çerezlerde güvenlik ihlaline konu bilgiler saklamayın.
isim
değiştirgesinde 'çerezim' ismini
kullandığınız varsayımıyla, bu çerezin değerini
$_COOKIE['çerezim'] değişkeni ile alabilirsiniz.
zaman_aşımı
Çerezin zaman aşımına uğrama süresi. Değer bir Unix zaman damgasıdır. Başka bir deyişle time() işlevinden dönen değere çerezin zaman aşımına uğrayacağı süreyi saniye cinsinden eklemek suretiyle bulacağınız değerdir. Ayrıca, mktime() işlevini de kullanabilirsiniz. time()+60*60*24*30 ile çerez 30 gün sonra zaman aşımına uğrar. Burada 0 atanır veya birşey belirtilmezse, çerez oturumun sonunda (tarayıcı kapandığında) zaman aşımına uğrar.
Bilginize:
zaman_aşımı
değiştirgesinin değer olarak bir Unix zaman damgası aldığını fark etmişsinizdir. Bu, başlıkta belirtilen Wdy, DD-Mon-YYYY HH:MM:SS GMT tarih biçeminin zıddı olup bu dönüşümü PHP dahili olarak yapar.
zaman_aşımı
istemci zamanının sunucu zamanından farkı hesaba katılarak karşılaştırılır.
yol
Çerezin üzerinde etkin olacağı sunucudaki yol. '/'
belirtilirse çerez alan
'ın tamamında
kullanılabilir olacaktır. Eğer '/foo/'
belirtilirse, çerez sadece /foo/ dizininde ve
/foo/bar/ gibi alt dizinlerde kullanılabilir
olacaktır. Öntanımlı değer çerezin atandığı içinde bulunulan dizindir.
alan
Çerezin kullanılabileceği alan. Çerezi mesela.dom ve alt alanlarında kullanılabilir yapmak için değer olarak '.mesela.dom' belirtmelisiniz. Baştaki nokta gereksiz olsa da bazı tarayıcılarla uyumluluk adına bulunması daha iyidir. Değer olarak, 'belge.mesela.dom' belirtilirse çerez sadece belge alt alanında kullanılabilir olacaktır. Sondan eşleme ile ilgili kurallar için » belirtime bakınız.
güvenli
Çerezin istemciye güvenli bir HTTPS bağlantısı üzerinden mi
aktarılması gerektiğini belirtmek için kullanılır. TRUE
belirtildiği
takdirde, çerez sadece güvenli bağlantı mevcutsa gönderilecektir.
FALSE
öntanımlı değerdir. Sunucu tarafında, bu çeşit çerezin sadece
($_SERVER["HTTPS"] ile ilgili) güvenli bağlantı
üzerinden gönderilmesi kararı programcıya aittir.
sadece_http
TRUE
olduğu takdirde çerez sadece HTTP protokolü üzerinden
erişilebilir olacaktır. Yani çerez, JavaScript gibi betik dilleri
tarafından erişilebilir olmayacaktır. Bu ayarlama, XSS saldırılarıyla
kimlik hırsızlığı riskini etkin şekilde azaltmaya (tüm tarayıcılar
tarafından desteklenmese de) yardımcı olabilir. Bu değiştirge PHP
5.2.0'da eklenmiştir. Değer olarak TRUE
veya FALSE
belirtilebilir.
Bu işlev çağrılmadan önce yapılmış çıktı varsa
setcookie() başarısız olup FALSE
döndürür.
setcookie() başarılı olduğu takdirde TRUE
döndürür.
Dönüş değeri, kullanıcının çerezi kabul ettiği ya da etmediği anlamına
gelmez.
Çerez gönderimi ile ilgili bazı örnekler:
Örnek 1 - setcookie() gönderim örneği
<?php
$value = 'bir şeyler bir yerlere';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); /* 1 saatliğine geçerli */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".mesela.dom", 1);
?>
Çerez gönderilirken çerez değerinin özdevinimli olarak URL kodlamasından geçirileceğine, alınırken ise bu kodlamanın yine özdevinimli olarak çözüleceğine ve yine aynı çerez ismine atanacağına dikkat ediniz. Bunu istemiyorsanız, PHP 5 kullanıyorsanız bu işlevin yerine setrawcookie() işlevini kullanabilirsiniz. Deneme çerezimizin bir betik içindeki değerini görmek için aşağıdaki örneklerden birini kullanabilirsiniz:
<?php
// Bağımsız bir çerez bas
echo $_COOKIE["TestCookie"];
echo $HTTP_COOKIE_VARS["TestCookie"];
// Tüm çerezleri görmek için başka bir yol
print_r($_COOKIE);
?>
Örnek 2 - setcookie() silme örneği
Bir çerezi silerken, tarayıcınızın yürürlükten kaldırma mekanizmasını tetikleyebilmek için, süre bitiminin geçmişte kalmasını sağlamanız gerekir. Önceki örnekte gönderilen çerezin nasıl silineceğini görelim:
<?php
// süre bitimini 1 saat önceye ayarlayalım
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".mesela.dom", 1);
?>
Örnek 3 - setcookie() ve diziler
Çerez ismini belirtirken dizi gösterimini kullanmak suretiyle çerez dizileri tanımlayabilirsiniz. Bu sayede dizi elemanı sayısı kadar çerez tanımlayabilirsiniz, fakat çerezleri betiğinizle aldığınızda değerlerin hepsi çerez isminde bir diziye yerleştirilirler:
<?php
// çerezleri tanımlayalım
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// sayfayı yeniden yükledikten sonra çerezler basalım
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
Yukarıdaki örneğin çıktısı:
three : cookiethree two : cookietwo one : cookieone
Sürüm: | Açıklama |
---|---|
5.2.0 |
sadece_http değiştirgesi eklendi.
|
Bilginize:
PHP 4'ten itibaren, bu işlevi çağırmadan önce, tarayıcıya gönderilene kadar sunucuda bekletilmek üzere çıktıyı bir tampona yazabilirsiniz. Bu işlemi betiğinizden ob_start() ve ob_end_flush() işlevlerini çağırarak veya output_buffering yapılandırma yönergesini php.ini veya sunucu yapılandırma dosyalarında belirterek yapabilirsiniz.
Bilginize:
register_globals yönergesine on değeri atanmışsa çerez değerleri değişkenlere de atanabilir. Bu takdirde, yukarıdaki örnekte $TestCookie değişkeni mevcut olacaktır. Ancak böyle yapmak yerine $_COOKIE kullanılmasını öneriyoruz.
Bilinen Güçlükler:
zaman_aşımı
değiştirgesi ile
belirtebilirsiniz. Bir çerezin varlığını sınamanın en kolay yolu
print_r($_COOKIE); çağrısı yapmaktır.
değer
değiştirgesinde bir boş
dizge veya FALSE
belirtir ve tüm diğer değiştirgelerin çerezi atarken
kullandığınız değiştirgelerle aynı olmasını sağlarsanız, ismini
belirttiğiniz çerez uzak istemciden silinir. Bu işlem dahili olarak
çereze 'deleted' değeri atanarak ve zaman aşımı tarihi bir yıl önceye
çekilerek gerçekleştirilir.
FALSE
değeri atarken mantıksal değerler
kullanmamalısınız. FALSE
için 0, TRUE
için
1 kullanın.
Peşpeşe pek çok setcookie() çağrısı yapılabilir.