Rengaver
PHP Cookie ile Sepet Yapımı - Baskı Önizleme

+- Rengaver (https://rengaver.com)
+-- Forum: Yazılım Dersleri (https://rengaver.com/forum-yazilim-dersleri)
+--- Forum: PHP (https://rengaver.com/forum-php)
+--- Konu Başlığı: PHP Cookie ile Sepet Yapımı (/konu-php-cookie-ile-sepet-yapimi)



PHP Cookie ile Sepet Yapımı - seraph - 03-24-2021

Öncelikle temel html taglerimizi yazıyoruz ve ardından basit bir sepet arayüzü yazıyoruz.
[Resim: 1616579955_ea2CH1WjB0GloPe.png]
Gördüğünüz üzere bir sepet alanımız ve ürün listemiz var. Her üründe de isim, açıklama ve sepet ekle butonu bulunuyor. Butonların her biri bir formun içinde ve formlar da bulunduğumuz sayfaya ürün bilgisi gönderiyor. Görünümü iyileştirmek için biraz css yazalım.
[Resim: 1616579978_KUxyKr0uXr4W1kw.png]
Şimdi daha net bir görüntü oluşturduk. Arayüzümüz hazır, artık php kısmına geçebiliriz. Öncelikle sayfanın en tepesine php tagleri arasına ob_start() fonksiyonunu ve sayfanın en altına da ob_end_flush() yazmalıyız. Bu fonksiyonları kullanmazsak cookie işlemleri sağlıklı çalışmayabilir. Bu fonksiyonları yazdıktan sonra devam edebilirsiniz.
[Resim: 1616580002_sSlvgXTDQNowGn8.png]
Yukarıdaki kod bloğunu sayfanın en üstüne, ob_start() ın altına yazabilirsiniz. Ürün eklemeye yarayacak. Önce ürün eklemek için istek atılmış mı diye bakıyoruz. İstek atılmışsa, daha önce sepet için bir cookie oluşturulmuş mu diye bakıyoruz.

Eğer oluşturulmadıysa bir sepet değişkeni oluşturup içine boş bir dizi atıyoruz.

Eğer oluşturulduysa cookiede saklanan sepeti unserialize fonksiyonu ile alıyoruz. Bu fonksiyonu kullanmamızın nedeni şu ki; sepete ürün eklerken ürünleri bir diziye atacağız ve bu diziyi serialize fonksiyonuyla stringe çevirip cookiede o şekilde saklayacağız. Çünkü cookie içinde dizi saklanamıyor. Burada unserialize fonksiyonu, stringe çevrilmiş diziyi normal diziye çeviriyor.

Sepet dizisini oluşturduktan sonra bu diziye yeni gelen ürünü eklememiz gerekiyor. Bunun için array_push() fonksiyonunu kullanıyoruz ve ürün adını alıp bu diziye ekliyoruz.

Artık elimizde yeni ürünün eklenmiş olduğu bir sepet dizisi var. Şimdi de bunu cookieye dönüştürmeliyiz. Bunun için setcookie fonksiyonunu kullanıyoruz. İlk parametre cookienin anahtarı, ikinci parametre sepet dizisinin stringe çevrilmiş hali ve üçüncü parametre de bu cookienin hangi tarihe kadar saklanacağı. Yukarıdaki kodda 30 gün sonrasına ayarlı.

Ürün ekleme işlemini yaptıktan sonra yeni ürünün de olduğu sepet verisini sayfada listelememiz gerekiyor fakat aynı sayfada bir cookieyi hem güncelleyip hem de güncel halini gösteremiyoruz. Bu yüzden son satırda da sayfayı yeniletiyoruz.

Şimdi de sepetimizi sayfada listeleyelim.
[Resim: 1616580029_6SZcmujQ1WBkpBD.png]
İlk olarak sepet cookiesi tanımlı mı diye kontrol ediyoruz. Tanımlı değilse sepet boş yazısını yazdırıyoruz. Tanımlıysa sepet değişkeni oluşturup unserialize ile cookieden veriyi alıyoruz.

Adet bilgisini de almamız gerektiği için şu şekilde bir algoritma düşündüm:

Tekrar eden elementleri silen array_unique fonksiyonuyla her üründen 1 tane içeren bir dizi oluşturuyoruz ve foreach ile bu dizide geziyoruz. Her ürün için adet sayısını tutacak olan miktar değişkenini oluşturup 0 veriyoruz ve asıl sepet dizimizin içinde foreach ile geziyoruz. Eğer bizim asıl ürünümüzün adı sepetteki ürün adıyla eşleşiyorsa miktar değişkenini 1 arttırıyoruz ve bu işlem bittiğinde de ürün adı ile miktarını, bir de silme butonunu ekrana basıyoruz.

Şimdi de silme işlemini gerçekleştirelim.
[Resim: 1616580064_BOY7lCip4PqUn0g.png]
Bu kodu da ekleme işlemi gibi sayfanın üstlerine bir yerlere yazabilirsiniz. Silme isteğini get ile alacağız. Silme isteği gelmiş mi diye kontrol ederek başlıyoruz. Geldiyse öncelikle sepet datamızı cookieden unserialize fonksiyonuyla alıyoruz. Foreach ile bu sepet dizisinde index numarası ve ürün adıyla geziyoruz. Eğer ürün adı ve bize gelen get isteğindeki veriler eşleşiyorsa sepet dizisinin o elemanını diziden siliyoruz. Silme işleminin ardından sepet tamamen boşalmamışsa yeni sepet dizimizi cookieye gönderiyoruz. Aksi halde sepet cookiesine null değerini ve zaman olarak da -1 veriyoruz yani cookieyi silmiş oluyoruz. Eğer bu şekilde null atmazsak, isset($_COOKIE[‘sepet’]) sorgusu yapıldığında cookie hala var gözükür ve sepetiniz boş yazısı ekrana basılmaz.

Ve son olarak, sepetin güncel halini gösterebilmek için sayfayı yeniletiyoruz. Burada refresh komutunu kullanmıyoruz çünkü o zaman get isteğiyle beraber sayfayı yenilemiş oluruz ve döngüye gireriz.