PHP setcookie başarısız

5 Cevap php

Ben bir PHP bakire (ilk gün) değilim, bu yüzden yavaş yavaş yazın lütfen.

Ben sayfa her yenilendiğinde zamanla döndürmek istediğiniz görüntü bir dizi bg_001.jpg, bg_002.jpg, vb var. Ben bu çalıştı:

if (isset($_COOKIE["bg1"])) {
  $img_no = $_COOKIE["bg1"] + 1;
} else {
  $img_no = 1;
}
$filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg';
if (!file_exists("/img/" . $filename)) {
  $img_no = 1;
  $filename = 'bg_' . sprintf("%03d", $img_no) . '.jpg';
}
setcookie("bg1", $img_no, time() + 86400);
print '<img src="img/' . $filename . '" alt="" height="175" width="800"> ';

Bunun yerine bir çerez bir olsun

Warning: Cannot modify header information - headers already sent by (output 
started at /home2/.../about.php:7) in /home2/.../about.php on line 31

Line 31 being the line with the setcookie. I already found pointers about PHP having trouble with Unicode's BOM, but I have no idea how to fix it (if it is the problem here in the first place). So, to make it official (and avoid a "not a real question" label), how do I fix this? :-)

Benim kodu yapıcı eleştiri çok açığız.

epilogue:
Seemed like a common newbie error: several answers toward the same solution within fifteen minutes. Thanks guyz/galz.

Yani dosyanın başlangıcına print hariç her şeyi taşındı, ve gerçekten de: sabit.

5 Cevap

önce gönderilen herhangi bir bilgi varsa çerezler sadece gönderilebilir. Bu şey ilk {[(0 öncesi çünkü eğer PHP dosyasında ilk şey, <?php olmak ve hiçbir şey o bölümü (hatta korkunç UTF-8 BOM) önce alabilirsiniz anlamına gelir )]} (gibi <html>), daha sonra php tarayıcı için bu veri göndermek ve veri gönderilmeden sonra setcookie kullanamazsınız. Böyle bir şey bakmak için kodunuzu refactor:

<?php
 (...)
 setcookie(...)
 (...)
?>
<HTML>
(...)
</HTML>

Ve not defteri gibi editörler dosyasındaki ilk <?php önce herhangi bir UTF-8 BOM imza koymadı ki çift kontrol.

HTTP ile başlık (istek / yanıt bilgi) ve İçerik (gerçek textor ikili içeriği) ayrı ayrı belirlenir ve Kafa İçeriği gelmelidir.

Bir çerez ayarlama aslında başlık yanıt için bir komut ekler, böylece çerez herhangi bir değişiklik herhangi bir içerik çıktısı başlamadan önce gerçekleşmesi gerekiyor.

Sayfanızda açılış html öğesi önce çerez başvuran ve ok olmalıdır tüm kodunuzu taşıyın.

Sen de daha kolay yerine çerezleri kendilerini manipüle oturumlarını kullanmak bulabilirsiniz. session_start() hala diğer herhangi bir içeriği önce gelmek gerekiyor ama daha kolay veri yapıları, vb saklamak için yapar

http://php.net/session_start bakabilirsiniz

, Önemli kod değişiklikleri olmadan bu aşmanın Output Buffering gibi kullanmak çok, -

<?php
  ob_start();
  // ... my code here
?>
<html></html>
<?php
  // ... end of the file
  ob_end_flush();
?>

Başlıklar zaten gönderilir: Hata / seni var uyarı says it all

Bu çıkış zaten setcookie () yöntemi çağrıldı önce tarayıcınıza gönderilen olduğu anlamına gelir.

Eğer çerezleri herhangi bir çıkıştan önce "ayarlanmış olmalıdır" anlamak gibi tarayıcıya gönderilir.

Yani about.php at hattını 7 edin. Orada html kodu olmalıdır veya yazdırmak veya yankı için bir çağrı olabilir.