SIFIRDAN E-TİCARET BACKEND ÇALIŞMASI
Merhaba arkadaşlar. Bu yazıda sizlere sıfırdan E-Ticaret yazılımı nasıl yapılır onu göstereceğim. Sıfırdan e-ticaret sitesi yazmak aslında saçma gelebilir ama bu yazı eğitim niteliğinde olacağı için fazla sorgulamayın Kullandığım yöntemler bazılarınıza saçma gelebilir daha önce bir E-Ticaret yazılımı yapan şirkette çalışmadım. Dediğim gibi amacım tamamen eğitim.
E-Ticaret ciddi bir iştir. Açık bırakmamaya ne kadar özen gösteriyorsak burada kat kat fazla dikkat edeceğiz. Normal sitede vereceğiniz açık en fazla siteye zarar verir ancak E-Ticaret sitelerinde işler öyle değil. Sitenizdeki her kullanıcının bilgilerinden siz sorumlu oluyorsunuz. Bu ayrıntıya dikkat etmenizi istiyorum. Konusu geçmişken Web zafiyetleri hakkında bilgi almak istiyorsanız bu konumu incelemenizi öneririm İşin tasarım kısmına değinmeyeceğim.
Ek olarak JavaScript taraflı yapılan her türlü kontrolü aslında yapılmamış sayıyoruz. Her türlü kontrol sunucu taraflı olacak. Yani kontrolleri (yapılmış bile olsa) PHP ile yapacağız.
E-Ticaret Sitemizde Bulunan Özellikler:
» Çoklu dil destekli kategori
» Ürün varyant
» Ürün sıralama
» Yorum yapma
» Sınırsız alt kategori
Kullanılacak Diller:
» PHP
» SQL
1 - Veri Tabanı Tasarlama
Ufak ufak başlayalım. Sitemizde öncelikle ne gerekli onları belirlememiz lazım. Örneğin site bilgileri, ürün bilgileri, kullanıcı bilgileri vb. Benim (konuyu da fazla uzatmama cabasıyla) gerek duyduğum veriler için tablo listesi şu şekilde;
» Site Bilgileri
» Kullanıcı Bilgileri
» Ürün Bilgileri
» Kategoriler
» Siparişler
» Sipariş Edilen Ürünler (1 Siparişte Birden Çok Ürün Olabilir)
» Adresler
» Sepet (Kayıtlı Kullanıcılar İçin)
» Dil Listesi
» Yorumlar
» Varyasyon Grubu
» Ürün Resim Galerisi
Not: Tabloda uzunluk değerlerini vermiyorum siz kendiniz değer verirsiniz.
1.1 Site Bilgileri
Site bilgilerinde yer alan veriler sitemizin başlığı, kargo ücreti, iletişim adresi gibi veriler olabilir. Bu sizin keyfinize kalmış örneğin iletişim bilgileri için ayrı tablo da oluşturulabilir. Ek olarak ayar_ismi / deger şeklinde 2 sütun çok sayıda satırla da oluşturulabilir. Ben tek satır çok sayıda sütun oluşturmayı seçtim.
Site bilgilerine ait tablomuzun ismine site_ayar koyuyorum. Tablodaki sütunlar ise;
P.K = Primary Key (Birincil anahtar)
id (int) P.K
favicon (varchar)
baslik (varchar)
slogan (varchar)
logo (varchar)
m eta_baslik (varchar)
m eta_icerik (text)
ziyaret_araligi (int)
sosyal_fb (varchar)
sosyal_tw (varchar)
sosyal_ig (varchar)
whatsapp (varchar)
duyuru (text)
varsayilan_dil (varchar)
bakimmodu (tinyint)
1.2 Kullanıcı Bilgileri
E-Ticaret sitemizdeki müşteriler için oluşturmamız gereken tablo. İçerisinde giriş yapabilmesi için gerekli bilgilerin yanında telefon vb. gibi temel verilere de yer vereceğim. Normalde adresler diye bir tablo oluşturacağız zaten o yüzden adres verisini buraya eklemeyeceğim sadece seçili adresinin ID'sini burada tutacağım. Ek olarak ben tabloda tarihlerin tipini varchar veya text olarak tutuyorum. Siz nasıl isterseniz öyle yapın.
Bu tablomuzun adını hesaplar koyuyorum.
id (int) P.K
kullanici_adi (varchar)
kullanici_sifre (varchar)
kullanici_mail (varchar)
isim (varchar)
soyisim (varchar)
kayit_tarihi (varchar)
son_giris_tarihi (varchar)
secili_adres_id (int)
1.3 Ürün Bilgileri
Geldik sıkıntılı bir tabloya. Bu tabloyu oluştururken zor olduğunu düşündüğüm 2 olay vardı. 1.'si varyasyon, 2.'si ise ürünün indirim durumunda fiyata göre listeleme durumu. Çünkü indirim varsa/yoksa durumlarında ürünü neye göre sıralayacağımızı belirlemek karmaşık olabilir. Varyasyon sisteminde ise her varyasyonu neredeyse farklı bir ürünmüş gibi düşünmenin mantıklı olduğunu düşündüm ve diğer siteleri incelediğimde böyle bir karara vardım. Bunu sizin yerinize ben düşündüm zorlamayacağım sizi Ayrıca ürüne bir ID atıyoruz ancak buna rağmen yine de bir stok kodu atamanın gerektiğini düşünüyorum. Diğer eklediğim sütunlar ise ürünün puanı, gösterim sayısı vb... Bir de iade durumu var. Bazı ürünler iade edilemez statüsündedir bu sütun da onlar için gelsin...
Bu tablonun adı da urunler olsun.
id (int) P.K
urun_adi (varchar)
urun_aciklama (text)
urun_aciklama_detay (text)
urun_ozellikler (text)
urun_etiket (text)
indirim_durum (tinyint)
indirim_degeri (int)
urun_fiyat (int)
urun_kategori_id (int)
urun_resim (varchar)
urun_stok_kodu (varchar)
urun_stok (int)
eklenme_tarihi (varchar)
yayin_durum (tinyint)
gosterim_sayisi (int)
puan_1 (int)
puan_2 (int)
puan_3 (int)
puan_4 (int)
puan_5 (int)
toplam_satis (int)
ust_urun_id (int)
varyant_grup (int)
varyant_urun_ad (varchar)
iade_durum (tinyint)
1.4 Kategoriler
Şöyle bir şey denemek istedim. Sitede çoklu dil desteği oluşturmakla ilgili. Normalde istenirse her türlü yazıya eklenir ama ben konunun da daha fazla uzamaması için sadece kategorilerde kurdum bu mantığı.
Mantık şöyle;
Sitede ekli diller olacak. Kullanıcı bu diller arasında seçim yapabilecek. Örneğin ingilizceyi seçti diyelim. Aşama şu şekilde;
Kategorilerde dile ait sütun bulunmakta. Buraya kategori ismini dile göre yazıyoruz. Daha sonra varsayılan veya seçili dil veritabanında aratılıyor. Varsa daha sonra kategorilerde aratılıyor. Yoksa yine varsayılan dil kullanılıyor.
Tablo ismine kategoriler dedik.
id (int) P.K
ust_kategori_id (int)
kategori_seflink (varchar)
aktif (tinyint)
Ek olarak dil tabloları gelecek ancak bunlar panelden eklenecek. Şimdilik deneme amaçlı onları da ekliyorum.
tr (varchar)
en (varchar)
br (varchar)
Ben yapmadım ama dil tercihinde SEF link için de tablo oluşturabilirsiniz.
1.5 Siparişler
Siparişler tablosunda sipariş numarası, sipariş eden kişi, adres, tarih, sipariş durumu gibi verileri tutuyoruz. Eğer site tek firmaya aitse (başka tedarikçi yoksa) kargo takip numarası, kargo ücreti gibi verileri burada barındırabilirsiniz. Yoksa sipariş edilen ürünler tablosunda tutmanız daha mantıklı.
Bu tablomuzun ismi de siparisler olsun.
siparis_numarasi (int) P.K
müsteri_id (int)
toplam_tutar (float)
kargo_ucreti (float)
adres (text)
siparis_tarihi (varchar)
siparis_durum (int)
ip_adresi (varchar)
kargo_takip_no (varchar)
Ben bir de ek olarak sipariş tekrarlanmasın diye bir token sütunu koyuyorum. Farklı yollarla da engellenebilir benim aklıma bu şekil yapmak geldi.
token (text)
1.6 Sipariş Edilen Ürünler
Siparişe ek olarak her ürün için farklı seçenek olabilir. Örneğin 4 farklı ürün siparişinde 1 ürüne iptal/iade/değişim uygulanabilir, panelde siparişteki her ürünün fiyatı ayrı tutulmak istenebilir veya bir üründe sipariş notu gerekebilir. Bu yüzden sipariş edilen ürünler için ayrı tablo oluşturuyoruz.
Tablomuzun ismine siparis_urunler verelim.
id (int) P.K
siparis_id (int)
urun_stok_kodu (varchar)
urun_adedi (int)
urun_tutari (float)
siparis_notu (text)
siparis_eden_id (int)
siparis_tarihi (varchar)
siparis_urun_durum (int)
1.7 Adresler
Bir üye birden fazla adres ekleyebiliyor. Bu yüzden hesaplar tablosunda seçili adresin için bir sütun ekledik. Adreslere bir sütun açıp yapabilirdik de ancak bu sefer 50 adres varsa hepsini güncellememiz gerekecek böyle şeylere gerek yok
Tablo adı adresler olacak.
id (int) P.K
adres_baslik (varchar)
kullanici_id (int)
kullanici_ad (varchar)
kullanici_soyad (varchar)
kullanici_mail (varchar)
telefon (varchar)
kullanici_adres1 (text)
kullanici_adres2 (text)
kullanici_ulke (varchar)
kullanici_il (varchar)
kullanici_ilce (varchar)
kullanici_postakodu (int)
1.8 Sepet
Sepet için veritabanı oluşturmamızın nedeni giriş yapanlar için. Normalde SESSION'da da tutarız ancak farklı farklı yerlerden hesabına girdiğinde sepeti kaybolmasın diye kayıtlı kullanıcıların sepeti için ekstra veritabanı oluşturuyoruz. Bir de ödeme sonucu alırken SESSION sorun çıkarabiliyor (Bkz. Chrome Samesite Problemi). Önleyebilsek bile işimizi tarayıcının keyfine bırakmıyoruz Burada sepetin kime ait olduğunu, ürünün ID'sini veya stok kodunu, kaç tane alınacağını ve siparis notunu tutacağız. Ek olarak isterseniz eklenme tarihini de koyabilirsiniz.
Tablonun ismi sepet olacak.
id (int) P.K
kullanici_id (int)
urun_id (int)
urun_adet (int)
sepet_siparis_notu (text)
1.9 Dil Listesi
Kategorilerde bahsettiğimiz dil listesini tutacağımız tablo. Dilin kısaltması, dilin ismi ve aktif/pasif verisini tutacağız sadece.
Tablo ismi diller olsun.
dil_kodu (varchar) P.K
dil_ismi (varchar)
aktif (tinyint)
1.10 Yorumlar
Sitede ürünlerin altına yorum atmak isteyen üyeler olabilir. Bunun için ürünü alması veya almaması kontrolünü yazılımda yapacağız. Bu tabloda sadece temel bilgileri ve kullancının isim vermek isteyip istemediği verilerini tutacağız.
Tablo ismini yorumlar yaptım.
id (int) P.K
kullanici_id (int)
urun_id (int)
puan (int)
isim_durum (tinyint)
yorum_baslik (varchar)
yorum_icerik (text)
yorum_tarih (varchar)
1.11 Varyasyon Grubu
Ürünlerin varyasyonunu oluştururken varyasyona bir isim koymamız gerekli. Bunu ana üründe bir sütunda da tutabilirdik fakat bir üründe birden fazla sütun da olabilir. Farklı yol mevcut mu bilgim yok ben bu yolu kullanacağım. Bu arada varyant gruplarını önceden belirlenmiş veya o ürüne özel şekilde oluşturabilirsiniz. Yani her ana ürün için bir varyasyon oluşturup ürünü girerken sürekli tekrar tekrar yazabilirsiniz ya da önceden beden, renk, uzunluk gibi gruplar oluşturarak da yapabilirsiniz. Önerim önceden belirlemektir çünkü aynı tip ürünler için tekrar tekrar veri tabanına beden isminde bir varyasyon grubu oluşturmak zorunda kalırsınız. Yine varyasyon için S/M/L veya Beyaz/Siyah isimlerini buradan gruplayabilirsiniz. Ancak burada önerim ürünlerde varyasyon_ad sütununda depolamanız. Diğer firmaların sitelerini incelediğimde bu sistemi kullandıklarını gördüm.
Tablonun adına varyasyonlar koyuyorum.
id (int) P.K
varyant_ad
1.12 Ürün Resim Galerisi
Pazaryerlerinde ürüne girdiğimizde birden çok fotoğrafı olduğunu görüyoruz. Bu resimlerin adreslerini de bir yerde depolamamız gerekiyor o yüzden ben resim galerisi için ayrı bir tablo oluşturdum. Bu tabloda resmin adresini, ürünün ID'sini ve resmin açıklamasını (HTML'de img etiketinin altındaki alt="" seçeneği) tutacağız.
id (int) P.K
urun_id (int)
resim_adresi (varchar)
resim_alt (varchar)
2. Dosya/Klasör Yapısı Oluşturma
Spagetti bir kodlamadan uzak, her şeyi tamamen düzen içinde inşa etmek için öncelikle kendimize bir yapı kurmamız lazım. Diyen olur mutlaka ya Laravel kullansana veya Codeigniter kullansana neden uğraşıyorsun? Bu yazının bir ders niteliğinde olmasını istiyorum ve burada bir PHP Framework yapısı anlatarak konudan sapmak istemiyorum. Herkes illa bir Framework kullanacak diye bir şart yok. O yüzden istediğimiz gibi olabildiğince düzgün bir yapı kurarak devam edebiliriz.
Öncelikle amacım, nesne yönelimli programlama (OOP) kullanarak basitçe veritabanından istediğim verileri direk parçaladığım temaya aktarmak. MVC yapısında direk Model'dan datayı alıp View'e aktarmışız gibi.
Örneğin; Temada logo, kategoriler, site ismi gibi verilerin bulunduğu kısmı header.php olarak parçaladım. Buraya kategorilerin ve sitenin ayarlarının bulunduğu dosyamı eklemek istiyorum. Hemen oluşturmuş olduğum harici bir PHP dosyasındaki sınıftan kolayca verileri çekeceğim ve listeleyeceğim.
O zaman bana;
Sınıfları içeren PHP dosyalarının bulunduğu bir klasör,
Tema parçalama işlemini yaptığım bir klasör,
Asıl sayfaların (index.php, kategoriler.php vb.) bulunduğu bir klasör (ana dizinde barındırsak daha basit olur),
CSS, JS, Fonts ve PHP kütüphanelerinin (PHPMailer vb.) bir klasör,
Veri tabanı bağlantısı oluşturduğum bir klasör,
Hazırlamış olduğum ve bir eklenti gibi kullanacağım fonksiyonları içeren dosyaların bulunduğu klasör (ÖRN: verilerin filtrelendiği bir fonksiyon),
Resimlerin bulunduğu bir klasör gerekiyor.
JS, CSS, resimler vb. için CDN de kullanılabilir ancak şimdi oralara girmiyorum.
Klasör yapımızı da kafadan hazırladık. Klasörlere de isimler verdim ve şöyle bir yapı kurdum;
Şimdilik bu kadar dosya var zamanla ekleme yapacağız. Zaten içleri de boş henüz yazılım kısmına geçmedik. Sadece görmeniz için ekledim.
3. Yazılım (Verileri Görüntüleme ve Veri Ekleme İşlemleri)
Konunun çok fazla uzamasını istemediğim için sadece veri çekme ve veri ekleme işlemlerini yaptım. Hatta admin panel yapmadığım için bazı yerlerde ekleme işlemini dahi yapmayacaktım ancak fikir ve konu bakımından fazla da sapmamak istiyorum bu yüzden çizgiyi bozmayayım dedim.
Bu arada ben karışıklık olmasın diye her tablo işlemleri için ayrı bir dosya açıp oraya ekledim. Daha sonra belki hepsini bir dosyada toplarım ancak şimdilik böyle daha çok işime geliyor.
3.1 Veri Tabanı Bağlantısı ve Config Dosyası
Veri tabanında 2 bağlantı bulunmakta. Birisi asıl veri tabanımız. Diğer ise infotmation_schema bağlantısı. İkisinin de ayarlarını yapıyoruz.
"config/veritabani.php"
Config dosyasında ise veri tabanımızın ve kategoriler tablomuzun ismi bulunmakta. Bu veriler de çok dil desteği denememiz için gerekli. Bunların da ayarlamasını yapalım.
"config/config.php"
3.2 Site Bilgileri
"siniflar/site_ayar.php"
Kullanımı
Tüm ayarları dizi formatında çekmek için;
Tek ayar çekmek için;
3.3 Kullanıcı Bilgileri
"siniflar/kullanici.php"
Kullanımı
Veri çekmek için (girilen değer kullanıcının ID'si veya kullanıcı adı olabilir);
veya
Kullanıcı eklemek için;
Kullanıcı - Şifre kontrolü;
3.4 Ürün Bilgileri
"siniflar/urunler.php"
Kullanımı
Tum sorgunun dizi formatındaki verisi için (girilen değer ürün ID'si veya ürün stok kodu olabilir);
Tek bir veri için (girilen değer ürün ID'si veya ürün stok kodu olabilir);
Kategori sayfasında sıralama yapmak için (verileri siralama tipi, kategorinin seflinki, başlangıç limiti, bitiş limiti şeklinde girin);
Ürün eklemek için;
3.5 Kategoriler
Çoklu dil sistemiyle uğraştığımız için burası beni biraz uğraştırdı Kategorilerde hangi diller mevcut bunu bulmak için "diller" tablosundan verileri çekebiliriz ancak ben daha güvenilir olmasını istiyordum bu yüzden tablodaki dillerin sütun isimlerini çekmek istedim. Uğraştıran kısım buydu. Sorunsuz çalışmakta.
"siniflar/kategori.php"
Kullanımı
Kategorileri çekmek için;
Kategorinin ID'sine göre dizi formatında veriyi çekmek için;
Kategori eklemeye geldik. Panelde karıştırmazsınız ancak arka planda iş değişebilir. Burada dikkat etmeniz gereken tek yer ne kadar dil varsa "array" içerisine o kadar veri eklemek. Mesela bende "tr","en","br" dilleri bulunmakta. Veriyi yollarken 3 elemanlı bir diziymiş gibi düşünerek yolluyorum.
3.6 Siparişler
"siniflar/siparis.php"
Kullanımı
ID'ye göre seçili tüm sipariş sütunlarını dizi türünden çekmek için;
Tek bir sütun verisi için;
Sipariş eklemek için;
3.7 Sipariş Edilen Ürünler
"siniflar/siparis_urun.php"
Kullanımı
Seçili ID'ye göre tüm siparis edilmiş ürünlerin listesini dizi formatında döndürmek için;
Siparis edilen ürünler tablosuna veri eklemek için;
3.8 Adresler
"siniflar/adres.php"
Kullanım
Mevcut adres verisini dizi formatında çekmek için;
Yeni adres verisi eklemek için;
3.9 Sepet
"siniflar/sepet.php"
Kullanımı
Sepettekilerin verisini çekmek için (ek olarak veritabanından ürün fiyatını, resmini, indirim durumu/değeri gibi verileri de çekebilirsiniz ve verileri SESSION'dan veya veri tabanından çekileceği kararını otomatik yapar);
Sepete Ekleme işlemi. Ziyaretçi - kullanıcı ayrımı yaparak sepeti SESSION'a veya veri tabanına aktarır. Zaten siparişi verirken giriş yapması gerekecek. Ben konu uzamasın diye oralara girmeyeceğim ama üye giriş yaptıktan veya kayıt olduktan sonra SESSION'daki sepeti veri tabanındaki sepete ekliyorsunuz bu kadar basit.
3.10 Diller
"siniflar/language.php"
Kullanımı
Seçili dilin kodunu ve ismini çekmek için;
Dil eklemek için bu sınıfı kullanacağız. Kategorilere de ekleme yapacağı için tekrar kategorilerde yeni eklenen dil için update işlemi yapmamız gerekiyor. Eğer yapmazsak boş olan sütunlar için varsayılan dilin verilerini çekecektir.
3.11 Yorumlar
"siniflar/yorum.php"
Kullanımı
Ürüne ait tüm yorumları çekmek için (ürünün ID'sine veya stok koduna göre çekebilirsiniz);
Yeni yorum eklemek için (yorumda verilen puan otomatik olarak ürüne eklenmektedir);
3.12 Varyasyon
"siniflar/varyant.php"
Kullanımı
Varyasyon adlarını çekmek için;
Varyasyon eklemek için;
3.13 Ürün Resim Galerisi
"siniflar/resimler.php"
Kullanimi
Ürüne ait resimleri çekmek için;
Bir ürüne ait resim eklemek için;
Maalesef yetiştiremedim tasarım kısmını. Birazcık girmeyi planlıyordum (ürün ekleme, kategori listeleme vb.) ama olmadı. Çok karmaşık bir yapı kurmadım ve fazla da vaktim yoktu. Kodların hepsini direk yazmıştım fakat karakter sınırı olduğu için resme dönüştürüp atmaya karar verdim. Eğer alıp incelemek isteyen varsa onlar için GitHub'a ekledim. Çok düzgün bir şey olmadı kusura bakmayın. Umarım işinize yaramıştır
GitHub Linki: https://github.com/xLosTTeaM/eticaret
Merhaba arkadaşlar. Bu yazıda sizlere sıfırdan E-Ticaret yazılımı nasıl yapılır onu göstereceğim. Sıfırdan e-ticaret sitesi yazmak aslında saçma gelebilir ama bu yazı eğitim niteliğinde olacağı için fazla sorgulamayın Kullandığım yöntemler bazılarınıza saçma gelebilir daha önce bir E-Ticaret yazılımı yapan şirkette çalışmadım. Dediğim gibi amacım tamamen eğitim.
E-Ticaret ciddi bir iştir. Açık bırakmamaya ne kadar özen gösteriyorsak burada kat kat fazla dikkat edeceğiz. Normal sitede vereceğiniz açık en fazla siteye zarar verir ancak E-Ticaret sitelerinde işler öyle değil. Sitenizdeki her kullanıcının bilgilerinden siz sorumlu oluyorsunuz. Bu ayrıntıya dikkat etmenizi istiyorum. Konusu geçmişken Web zafiyetleri hakkında bilgi almak istiyorsanız bu konumu incelemenizi öneririm İşin tasarım kısmına değinmeyeceğim.
Ek olarak JavaScript taraflı yapılan her türlü kontrolü aslında yapılmamış sayıyoruz. Her türlü kontrol sunucu taraflı olacak. Yani kontrolleri (yapılmış bile olsa) PHP ile yapacağız.
E-Ticaret Sitemizde Bulunan Özellikler:
» Çoklu dil destekli kategori
» Ürün varyant
» Ürün sıralama
» Yorum yapma
» Sınırsız alt kategori
Kullanılacak Diller:
» PHP
» SQL
1 - Veri Tabanı Tasarlama
Ufak ufak başlayalım. Sitemizde öncelikle ne gerekli onları belirlememiz lazım. Örneğin site bilgileri, ürün bilgileri, kullanıcı bilgileri vb. Benim (konuyu da fazla uzatmama cabasıyla) gerek duyduğum veriler için tablo listesi şu şekilde;
» Site Bilgileri
» Kullanıcı Bilgileri
» Ürün Bilgileri
» Kategoriler
» Siparişler
» Sipariş Edilen Ürünler (1 Siparişte Birden Çok Ürün Olabilir)
» Adresler
» Sepet (Kayıtlı Kullanıcılar İçin)
» Dil Listesi
» Yorumlar
» Varyasyon Grubu
» Ürün Resim Galerisi
Not: Tabloda uzunluk değerlerini vermiyorum siz kendiniz değer verirsiniz.
1.1 Site Bilgileri
Site bilgilerinde yer alan veriler sitemizin başlığı, kargo ücreti, iletişim adresi gibi veriler olabilir. Bu sizin keyfinize kalmış örneğin iletişim bilgileri için ayrı tablo da oluşturulabilir. Ek olarak ayar_ismi / deger şeklinde 2 sütun çok sayıda satırla da oluşturulabilir. Ben tek satır çok sayıda sütun oluşturmayı seçtim.
Site bilgilerine ait tablomuzun ismine site_ayar koyuyorum. Tablodaki sütunlar ise;
P.K = Primary Key (Birincil anahtar)
id (int) P.K
favicon (varchar)
baslik (varchar)
slogan (varchar)
logo (varchar)
m eta_baslik (varchar)
m eta_icerik (text)
ziyaret_araligi (int)
sosyal_fb (varchar)
sosyal_tw (varchar)
sosyal_ig (varchar)
whatsapp (varchar)
duyuru (text)
varsayilan_dil (varchar)
bakimmodu (tinyint)
1.2 Kullanıcı Bilgileri
E-Ticaret sitemizdeki müşteriler için oluşturmamız gereken tablo. İçerisinde giriş yapabilmesi için gerekli bilgilerin yanında telefon vb. gibi temel verilere de yer vereceğim. Normalde adresler diye bir tablo oluşturacağız zaten o yüzden adres verisini buraya eklemeyeceğim sadece seçili adresinin ID'sini burada tutacağım. Ek olarak ben tabloda tarihlerin tipini varchar veya text olarak tutuyorum. Siz nasıl isterseniz öyle yapın.
Bu tablomuzun adını hesaplar koyuyorum.
id (int) P.K
kullanici_adi (varchar)
kullanici_sifre (varchar)
kullanici_mail (varchar)
isim (varchar)
soyisim (varchar)
kayit_tarihi (varchar)
son_giris_tarihi (varchar)
secili_adres_id (int)
1.3 Ürün Bilgileri
Geldik sıkıntılı bir tabloya. Bu tabloyu oluştururken zor olduğunu düşündüğüm 2 olay vardı. 1.'si varyasyon, 2.'si ise ürünün indirim durumunda fiyata göre listeleme durumu. Çünkü indirim varsa/yoksa durumlarında ürünü neye göre sıralayacağımızı belirlemek karmaşık olabilir. Varyasyon sisteminde ise her varyasyonu neredeyse farklı bir ürünmüş gibi düşünmenin mantıklı olduğunu düşündüm ve diğer siteleri incelediğimde böyle bir karara vardım. Bunu sizin yerinize ben düşündüm zorlamayacağım sizi Ayrıca ürüne bir ID atıyoruz ancak buna rağmen yine de bir stok kodu atamanın gerektiğini düşünüyorum. Diğer eklediğim sütunlar ise ürünün puanı, gösterim sayısı vb... Bir de iade durumu var. Bazı ürünler iade edilemez statüsündedir bu sütun da onlar için gelsin...
Bu tablonun adı da urunler olsun.
id (int) P.K
urun_adi (varchar)
urun_aciklama (text)
urun_aciklama_detay (text)
urun_ozellikler (text)
urun_etiket (text)
indirim_durum (tinyint)
indirim_degeri (int)
urun_fiyat (int)
urun_kategori_id (int)
urun_resim (varchar)
urun_stok_kodu (varchar)
urun_stok (int)
eklenme_tarihi (varchar)
yayin_durum (tinyint)
gosterim_sayisi (int)
puan_1 (int)
puan_2 (int)
puan_3 (int)
puan_4 (int)
puan_5 (int)
toplam_satis (int)
ust_urun_id (int)
varyant_grup (int)
varyant_urun_ad (varchar)
iade_durum (tinyint)
1.4 Kategoriler
Şöyle bir şey denemek istedim. Sitede çoklu dil desteği oluşturmakla ilgili. Normalde istenirse her türlü yazıya eklenir ama ben konunun da daha fazla uzamaması için sadece kategorilerde kurdum bu mantığı.
Mantık şöyle;
Sitede ekli diller olacak. Kullanıcı bu diller arasında seçim yapabilecek. Örneğin ingilizceyi seçti diyelim. Aşama şu şekilde;
Kategorilerde dile ait sütun bulunmakta. Buraya kategori ismini dile göre yazıyoruz. Daha sonra varsayılan veya seçili dil veritabanında aratılıyor. Varsa daha sonra kategorilerde aratılıyor. Yoksa yine varsayılan dil kullanılıyor.
Tablo ismine kategoriler dedik.
id (int) P.K
ust_kategori_id (int)
kategori_seflink (varchar)
aktif (tinyint)
Ek olarak dil tabloları gelecek ancak bunlar panelden eklenecek. Şimdilik deneme amaçlı onları da ekliyorum.
tr (varchar)
en (varchar)
br (varchar)
Ben yapmadım ama dil tercihinde SEF link için de tablo oluşturabilirsiniz.
1.5 Siparişler
Siparişler tablosunda sipariş numarası, sipariş eden kişi, adres, tarih, sipariş durumu gibi verileri tutuyoruz. Eğer site tek firmaya aitse (başka tedarikçi yoksa) kargo takip numarası, kargo ücreti gibi verileri burada barındırabilirsiniz. Yoksa sipariş edilen ürünler tablosunda tutmanız daha mantıklı.
Bu tablomuzun ismi de siparisler olsun.
siparis_numarasi (int) P.K
müsteri_id (int)
toplam_tutar (float)
kargo_ucreti (float)
adres (text)
siparis_tarihi (varchar)
siparis_durum (int)
ip_adresi (varchar)
kargo_takip_no (varchar)
Ben bir de ek olarak sipariş tekrarlanmasın diye bir token sütunu koyuyorum. Farklı yollarla da engellenebilir benim aklıma bu şekil yapmak geldi.
token (text)
1.6 Sipariş Edilen Ürünler
Siparişe ek olarak her ürün için farklı seçenek olabilir. Örneğin 4 farklı ürün siparişinde 1 ürüne iptal/iade/değişim uygulanabilir, panelde siparişteki her ürünün fiyatı ayrı tutulmak istenebilir veya bir üründe sipariş notu gerekebilir. Bu yüzden sipariş edilen ürünler için ayrı tablo oluşturuyoruz.
Tablomuzun ismine siparis_urunler verelim.
id (int) P.K
siparis_id (int)
urun_stok_kodu (varchar)
urun_adedi (int)
urun_tutari (float)
siparis_notu (text)
siparis_eden_id (int)
siparis_tarihi (varchar)
siparis_urun_durum (int)
1.7 Adresler
Bir üye birden fazla adres ekleyebiliyor. Bu yüzden hesaplar tablosunda seçili adresin için bir sütun ekledik. Adreslere bir sütun açıp yapabilirdik de ancak bu sefer 50 adres varsa hepsini güncellememiz gerekecek böyle şeylere gerek yok
Tablo adı adresler olacak.
id (int) P.K
adres_baslik (varchar)
kullanici_id (int)
kullanici_ad (varchar)
kullanici_soyad (varchar)
kullanici_mail (varchar)
telefon (varchar)
kullanici_adres1 (text)
kullanici_adres2 (text)
kullanici_ulke (varchar)
kullanici_il (varchar)
kullanici_ilce (varchar)
kullanici_postakodu (int)
1.8 Sepet
Sepet için veritabanı oluşturmamızın nedeni giriş yapanlar için. Normalde SESSION'da da tutarız ancak farklı farklı yerlerden hesabına girdiğinde sepeti kaybolmasın diye kayıtlı kullanıcıların sepeti için ekstra veritabanı oluşturuyoruz. Bir de ödeme sonucu alırken SESSION sorun çıkarabiliyor (Bkz. Chrome Samesite Problemi). Önleyebilsek bile işimizi tarayıcının keyfine bırakmıyoruz Burada sepetin kime ait olduğunu, ürünün ID'sini veya stok kodunu, kaç tane alınacağını ve siparis notunu tutacağız. Ek olarak isterseniz eklenme tarihini de koyabilirsiniz.
Tablonun ismi sepet olacak.
id (int) P.K
kullanici_id (int)
urun_id (int)
urun_adet (int)
sepet_siparis_notu (text)
1.9 Dil Listesi
Kategorilerde bahsettiğimiz dil listesini tutacağımız tablo. Dilin kısaltması, dilin ismi ve aktif/pasif verisini tutacağız sadece.
Tablo ismi diller olsun.
dil_kodu (varchar) P.K
dil_ismi (varchar)
aktif (tinyint)
1.10 Yorumlar
Sitede ürünlerin altına yorum atmak isteyen üyeler olabilir. Bunun için ürünü alması veya almaması kontrolünü yazılımda yapacağız. Bu tabloda sadece temel bilgileri ve kullancının isim vermek isteyip istemediği verilerini tutacağız.
Tablo ismini yorumlar yaptım.
id (int) P.K
kullanici_id (int)
urun_id (int)
puan (int)
isim_durum (tinyint)
yorum_baslik (varchar)
yorum_icerik (text)
yorum_tarih (varchar)
1.11 Varyasyon Grubu
Ürünlerin varyasyonunu oluştururken varyasyona bir isim koymamız gerekli. Bunu ana üründe bir sütunda da tutabilirdik fakat bir üründe birden fazla sütun da olabilir. Farklı yol mevcut mu bilgim yok ben bu yolu kullanacağım. Bu arada varyant gruplarını önceden belirlenmiş veya o ürüne özel şekilde oluşturabilirsiniz. Yani her ana ürün için bir varyasyon oluşturup ürünü girerken sürekli tekrar tekrar yazabilirsiniz ya da önceden beden, renk, uzunluk gibi gruplar oluşturarak da yapabilirsiniz. Önerim önceden belirlemektir çünkü aynı tip ürünler için tekrar tekrar veri tabanına beden isminde bir varyasyon grubu oluşturmak zorunda kalırsınız. Yine varyasyon için S/M/L veya Beyaz/Siyah isimlerini buradan gruplayabilirsiniz. Ancak burada önerim ürünlerde varyasyon_ad sütununda depolamanız. Diğer firmaların sitelerini incelediğimde bu sistemi kullandıklarını gördüm.
Tablonun adına varyasyonlar koyuyorum.
id (int) P.K
varyant_ad
1.12 Ürün Resim Galerisi
Pazaryerlerinde ürüne girdiğimizde birden çok fotoğrafı olduğunu görüyoruz. Bu resimlerin adreslerini de bir yerde depolamamız gerekiyor o yüzden ben resim galerisi için ayrı bir tablo oluşturdum. Bu tabloda resmin adresini, ürünün ID'sini ve resmin açıklamasını (HTML'de img etiketinin altındaki alt="" seçeneği) tutacağız.
id (int) P.K
urun_id (int)
resim_adresi (varchar)
resim_alt (varchar)
2. Dosya/Klasör Yapısı Oluşturma
Spagetti bir kodlamadan uzak, her şeyi tamamen düzen içinde inşa etmek için öncelikle kendimize bir yapı kurmamız lazım. Diyen olur mutlaka ya Laravel kullansana veya Codeigniter kullansana neden uğraşıyorsun? Bu yazının bir ders niteliğinde olmasını istiyorum ve burada bir PHP Framework yapısı anlatarak konudan sapmak istemiyorum. Herkes illa bir Framework kullanacak diye bir şart yok. O yüzden istediğimiz gibi olabildiğince düzgün bir yapı kurarak devam edebiliriz.
Öncelikle amacım, nesne yönelimli programlama (OOP) kullanarak basitçe veritabanından istediğim verileri direk parçaladığım temaya aktarmak. MVC yapısında direk Model'dan datayı alıp View'e aktarmışız gibi.
Örneğin; Temada logo, kategoriler, site ismi gibi verilerin bulunduğu kısmı header.php olarak parçaladım. Buraya kategorilerin ve sitenin ayarlarının bulunduğu dosyamı eklemek istiyorum. Hemen oluşturmuş olduğum harici bir PHP dosyasındaki sınıftan kolayca verileri çekeceğim ve listeleyeceğim.
O zaman bana;
Sınıfları içeren PHP dosyalarının bulunduğu bir klasör,
Tema parçalama işlemini yaptığım bir klasör,
Asıl sayfaların (index.php, kategoriler.php vb.) bulunduğu bir klasör (ana dizinde barındırsak daha basit olur),
CSS, JS, Fonts ve PHP kütüphanelerinin (PHPMailer vb.) bir klasör,
Veri tabanı bağlantısı oluşturduğum bir klasör,
Hazırlamış olduğum ve bir eklenti gibi kullanacağım fonksiyonları içeren dosyaların bulunduğu klasör (ÖRN: verilerin filtrelendiği bir fonksiyon),
Resimlerin bulunduğu bir klasör gerekiyor.
JS, CSS, resimler vb. için CDN de kullanılabilir ancak şimdi oralara girmiyorum.
Klasör yapımızı da kafadan hazırladık. Klasörlere de isimler verdim ve şöyle bir yapı kurdum;
Şimdilik bu kadar dosya var zamanla ekleme yapacağız. Zaten içleri de boş henüz yazılım kısmına geçmedik. Sadece görmeniz için ekledim.
3. Yazılım (Verileri Görüntüleme ve Veri Ekleme İşlemleri)
Konunun çok fazla uzamasını istemediğim için sadece veri çekme ve veri ekleme işlemlerini yaptım. Hatta admin panel yapmadığım için bazı yerlerde ekleme işlemini dahi yapmayacaktım ancak fikir ve konu bakımından fazla da sapmamak istiyorum bu yüzden çizgiyi bozmayayım dedim.
Bu arada ben karışıklık olmasın diye her tablo işlemleri için ayrı bir dosya açıp oraya ekledim. Daha sonra belki hepsini bir dosyada toplarım ancak şimdilik böyle daha çok işime geliyor.
3.1 Veri Tabanı Bağlantısı ve Config Dosyası
Veri tabanında 2 bağlantı bulunmakta. Birisi asıl veri tabanımız. Diğer ise infotmation_schema bağlantısı. İkisinin de ayarlarını yapıyoruz.
"config/veritabani.php"
Config dosyasında ise veri tabanımızın ve kategoriler tablomuzun ismi bulunmakta. Bu veriler de çok dil desteği denememiz için gerekli. Bunların da ayarlamasını yapalım.
"config/config.php"
3.2 Site Bilgileri
"siniflar/site_ayar.php"
Kullanımı
Tüm ayarları dizi formatında çekmek için;
Kod:
require_once("siniflar/site_ayar.php");
$site_ayar = new site_ayar();
echo "<pre>";
print_r($site_ayar->tum_ayar());
echo "</pre>";
Tek ayar çekmek için;
Kod:
require_once("siniflar/site_ayar.php");
$site_ayar = new site_ayar();
echo $site_ayar->slogan();
3.3 Kullanıcı Bilgileri
"siniflar/kullanici.php"
Kullanımı
Veri çekmek için (girilen değer kullanıcının ID'si veya kullanıcı adı olabilir);
Kod:
require_once("siniflar/kullanici.php");
$kullanici = new kullanici_verileri(1);
echo "<pre>";
print_r($kullanici->tum_bilgiler());
echo "</pre>";
veya
Kod:
require_once("siniflar/kullanici.php");
$kullanici = new kullanici_verileri(1);
echo $kullanici->mail();
Kullanıcı eklemek için;
Kod:
require_once("siniflar/kullanici.php");
$kullanici_ekle = new kullanici_ekle;
$kullanici_ekle->set_kadi("deneme2");
$kullanici_ekle->set_sifre("123");
$kullanici_ekle->set_sifre_tekrar("123");
$kullanici_ekle->set_mail("[email protected]");
$kullanici_ekle->set_ad("Ahmet");
$kullanici_ekle->set_soyad("Ahmetoğlu");
$sonuc = $kullanici_ekle->verileri_ekle();
if ($sonuc != false) {
echo $sonuc;
}
Kullanıcı - Şifre kontrolü;
Kod:
require_once("siniflar/kullanici.php");
$kullanici = new kullanici_kontrol("Lost","123");
if($kullanici->sonuc()){
echo "basarili";
}else{
echo "basarisiz";
}
3.4 Ürün Bilgileri
"siniflar/urunler.php"
Kullanımı
Tum sorgunun dizi formatındaki verisi için (girilen değer ürün ID'si veya ürün stok kodu olabilir);
Kod:
require_once("siniflar/urunler.php");
$urunler = new tek_urun_cek(1);
echo "<pre>";
print_r($urunler->tum_veriler());
echo "</pre>";
Tek bir veri için (girilen değer ürün ID'si veya ürün stok kodu olabilir);
Kod:
require_once("siniflar/urunler.php");
$urunler = new tek_urun_cek(1);
echo $urunler->get_ad();
Kategori sayfasında sıralama yapmak için (verileri siralama tipi, kategorinin seflinki, başlangıç limiti, bitiş limiti şeklinde girin);
Kod:
require_once("siniflar/urunler.php");
$urunler = new kategori_urun_sirala("populer","kategori-1",0,10);
echo "<pre>";
print_r($urunler->get_urunArray());
echo "</pre>";
Ürün eklemek için;
Kod:
require_once("siniflar/urunler.php");
$urunler = new urun_ekle;
$urunler->set_urunAd("baslik");
$urunler->set_aciklama("aciklama");
$urunler->set_aciklamaDetay("aciklamaDetay");
$urunler->set_ozellikler("ozellikleri");
$urunler->set_etiket("etikler,etiketler,etiketler");
$urunler->set_indirimDurum(1); // Varsayılan 0
$urunler->set_indirimDeger(10); // Varsayılan 0
$urunler->set_fiyat(100);
$urunler->set_kategoriID(1); // Varsayılan 1
$urunler->set_resim("resimler/urundeneme.png");
$urunler->set_stokKodu("DNM-001");
$urunler->set_stokAdet(20); // Varsayılan 0
$urunler->set_ustUrunID(0); // // Varsayılan 0
$urunler->set_varyantGrup(""); // İsteğe Bağlı
$urunler->set_varyantAd(""); // İsteğe Bağlı
$urunler->set_iadeDurum(0); // Varsayılan 1
echo $urunler->verileri_ekle();
3.5 Kategoriler
Çoklu dil sistemiyle uğraştığımız için burası beni biraz uğraştırdı Kategorilerde hangi diller mevcut bunu bulmak için "diller" tablosundan verileri çekebiliriz ancak ben daha güvenilir olmasını istiyordum bu yüzden tablodaki dillerin sütun isimlerini çekmek istedim. Uğraştıran kısım buydu. Sorunsuz çalışmakta.
"siniflar/kategori.php"
Kullanımı
Kategorileri çekmek için;
Kod:
require_once("siniflar/kategori.php");
$kategori = new get_kategori;
echo "<pre>";
print_r($kategori->tum_kategoriler());
echo "</pre>";
Kategorinin ID'sine göre dizi formatında veriyi çekmek için;
Kod:
require_once("siniflar/kategori.php");
$kategori = new get_kategori;
echo "<pre>";
print_r($kategori->kategori(1));
echo "</pre>";
Kategori eklemeye geldik. Panelde karıştırmazsınız ancak arka planda iş değişebilir. Burada dikkat etmeniz gereken tek yer ne kadar dil varsa "array" içerisine o kadar veri eklemek. Mesela bende "tr","en","br" dilleri bulunmakta. Veriyi yollarken 3 elemanlı bir diziymiş gibi düşünerek yolluyorum.
Kod:
require_once("siniflar/kategori.php");
$kategori = new kategori_ekle;
$kategori->set_ustID(0);
$kategori->set_seflink("deneme-kategori");
$kategori->set_aktif(1);
$kategori->set_diller(array("deneme1","deneme2","deneme3"));
echo $kategori->verileri_ekle();
3.6 Siparişler
"siniflar/siparis.php"
Kullanımı
ID'ye göre seçili tüm sipariş sütunlarını dizi türünden çekmek için;
Kod:
require_once("siniflar/siparis.php");
$siparis = new siparis(1);
echo "<pre>";
print_r($siparis->tum_bilgiler());
echo "</pre>";
Tek bir sütun verisi için;
Kod:
require_once("siniflar/siparis.php");
$siparis = new siparis(1);
echo $siparis->adres();
Sipariş eklemek için;
Kod:
require_once("siniflar/siparis.php");
$siparis_ekle = new siparis_ekle;
$siparis_ekle->set_musteriID(1);
$siparis_ekle->set_toplamTutar(50);
$siparis_ekle->set_kargoUcreti(9);
$siparis_ekle->set_adres("deneme adres");
$siparis_ekle->set_token("21564-53165-53156-51586-5154");
echo $siparis_ekle->verileri_ekle();
3.7 Sipariş Edilen Ürünler
"siniflar/siparis_urun.php"
Kullanımı
Seçili ID'ye göre tüm siparis edilmiş ürünlerin listesini dizi formatında döndürmek için;
Kod:
require_once("siniflar/siparis_urun.php");
$siparis_urun = new siparis_urun(1);
echo "<pre>";
print_r($siparis_urun->tum_bilgiler());
echo "</pre>";
Siparis edilen ürünler tablosuna veri eklemek için;
Kod:
require_once("siniflar/siparis_urun.php");
$siparis_urun_ekle = new siparis_urun_ekle;
$siparis_urun_ekle->set_siparisID(1);
$siparis_urun_ekle->set_urunStokKodu("APP_001");
$siparis_urun_ekle->set_adet(5);
$siparis_urun_ekle->set_tutar(50000);
$siparis_urun_ekle->set_siparisNotu("Gri Renk");
$siparis_urun_ekle->set_musteriID(1);
echo $siparis_urun_ekle->verileri_ekle();
3.8 Adresler
"siniflar/adres.php"
Kod:
<?php
class adres_cek
{
public $adres_sorgu;
public function __construct($adres_id)
{
require_once("config/baglanti.php");
require_once("fonksiyonlar/guvenlik_kontrol.php");
$adres_id = filtre($adres_id);
if (is_numeric($adres_id)) {
$baglanti = new baglanti;
$db = $baglanti->eticaret();
$sorgu = $db->prepare("SELECT * FROM adresler WHERE id = ?");
$sorgu->execute(array($adres_id));
$adres_sorgu = $sorgu->fetch(PDO::FETCH_ASSOC);
$db = null;
$this->adres_sorgu = $adres_sorgu;
} else {
return false;
}
}
public function tum_bilgiler()
{
$veri = $this->adres_sorgu;
return $veri;
}
public function adresBaslik()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["adres_baslik"];
} else {
return 0;
}
}
public function musteriID()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_id"];
} else {
return 0;
}
}
public function musteriAd()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_ad"];
} else {
return 0;
}
}
public function musteriSoyad()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_soyad"];
} else {
return 0;
}
}
public function mail()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_mail"];
} else {
return 0;
}
}
public function telefon()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["telefon"];
} else {
return 0;
}
}
public function adres1()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_adres1"];
} else {
return 0;
}
}
public function adres2()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_adres2"];
} else {
return 0;
}
}
public function ulke()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_ulke"];
} else {
return 0;
}
}
public function il()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_il"];
} else {
return 0;
}
}
public function ilce()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_ilce"];
} else {
return 0;
}
}
public function postaKodu()
{
$veri = $this->adres_sorgu;
if ($veri != NULL) {
return $veri["kullanici_postakodu"];
} else {
return 0;
}
}
}
class adres_ekle
{
public $database;
public $adresBaslik, $musteriID, $ad, $soyad, $mail, $telefon, $adres1, $adres2, $ulke, $il, $ilce, $postaKodu;
public function __construct()
{
require_once("config/baglanti.php");
require_once("fonksiyonlar/guvenlik_kontrol.php");
require_once("fonksiyonlar/format_kontrol.php");
$baglanti = new baglanti;
$this->database = $baglanti->eticaret();
}
public function set_adresBaslik($veri)
{
$this->adresBaslik = filtre($veri);
}
public function set_musteriID($veri)
{
$this->musteriID = filtre($veri);
}
public function set_ad($veri)
{
$this->ad = filtre($veri);
}
public function set_soyad($veri)
{
$this->soyad = filtre($veri);
}
public function set_mail($veri)
{
$this->mail = filtre($veri);
}
public function set_telefon($veri)
{
$this->telefon = filtre($veri);
}
public function set_adres1($veri)
{
$this->adres1 = filtre($veri);
}
public function set_adres2($veri)
{
$this->adres2 = filtre($veri);
}
public function set_ulke($veri)
{
$this->ulke = filtre($veri);
}
public function set_il($veri)
{
$this->il = filtre($veri);
}
public function set_ilce($veri)
{
$this->ilce = filtre($veri);
}
public function set_postaKodu($veri)
{
$this->postaKodu = filtre($veri);
}
public function verileri_ekle()
{
$adresBaslik = $this->adresBaslik;
$musteriID = $this->musteriID;
$ad = $this->ad;
$soyad = $this->soyad;
$mail = $this->mail;
$telefon = $this->telefon;
$adres1 = $this->adres1;
$adres2 = $this->adres2;
$ulke = $this->ulke;
$il = $this->il;
$ilce = $this->ilce;
$postaKodu = $this->postaKodu;
if ($adresBaslik != null && $musteriID != null && $ad != null && $soyad != null && $mail != null && $telefon != null && $adres1 != null && $adres2 != null && $ulke != null && $il != null && $ilce != null && $postaKodu != null) {
if (mail_kontrol($mail)) {
$db = $this->database;
$adres_ekle = $db->prepare("INSERT INTO adresler (adres_baslik,kullanici_id,kullanici_ad,kullanici_soyad,kullanici_mail,telefon,kullanici_adres1,kullanici_adres2,kullanici_ulke,kullanici_il,kullanici_ilce,kullanici_postakodu) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
$sonuc = $adres_ekle->execute(array($adresBaslik, $musteriID, $ad, $soyad, $mail, $telefon, $adres1, $adres2, $ulke, $il, $ilce, $postaKodu));
$db = null;
if ($sonuc) {
return "basarili";
} else {
return "Bir hata oluştu.";
}
} else {
return "Lütfen geçerli bir E-Posta adresi girin.";
}
} else {
return "Tüm alanları doldurunuz.";
}
}
}
Kullanım
Mevcut adres verisini dizi formatında çekmek için;
Kod:
require_once("siniflar/adres.php");
$adres_cek = new adres_cek(1);
echo "<pre>";
print_r($adres_cek->tum_bilgiler());
echo "</pre>";
Yeni adres verisi eklemek için;
Kod:
require_once("siniflar/adres.php");
$adres_ekle = new adres_ekle;
$adres_ekle->set_adresBaslik("Ev Adresi");
$adres_ekle->set_musteriID(1);
$adres_ekle->set_ad("LosT");
$adres_ekle->set_soyad("THT");
$adres_ekle->set_mail("[email protected]");
$adres_ekle->set_telefon("+90 561 655 2258");
$adres_ekle->set_adres1("deneme adres1");
$adres_ekle->set_adres2("deneme adres2");
$adres_ekle->set_ulke("Turkiye");
$adres_ekle->set_il("Ankara");
$adres_ekle->set_ilce("Çankaya");
$adres_ekle->set_postaKodu("06000");
echo $adres_ekle->verileri_ekle();
3.9 Sepet
"siniflar/sepet.php"
Kod:
<?php
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
class sepet_veri_cek
{
public $database;
public $sepet_sorgu, $urunID, $oturum;
public function __construct($urunID)
{
if (isset($_SESSION["oturum"])) {
$oturum = $_SESSION["oturum"];
} else {
$oturum = false;
}
$this->oturum = $oturum;
require_once("config/baglanti.php");
$baglanti = new baglanti;
$db = $baglanti->eticaret();
$this->database = $db;
if ($oturum) {
$kullanici_id = $_SESSION["kullanici_id"];
$sorgu = $db->prepare("SELECT * FROM sepet WHERE urun_id = ? AND kullanici_id = ?");
$sorgu->execute(array($urunID, $kullanici_id));
$sepet_sorgu = $sorgu->fetch(PDO::FETCH_ASSOC);
$db = null;
$this->sepet_sorgu = $sepet_sorgu;
$this->urunID = $urunID;
} else {
$this->urunID = $urunID;
}
}
public function sepetUrunAdet()
{
$oturum = $this->oturum;
if ($oturum) {
$sepet_sorgu = $this->sepet_sorgu;
return $sepet_sorgu["urun_adet"];
} else {
$urunID = $this->urunID;
return $_SESSION["sepettekiler"][$urunID]["urun_adet"];
}
}
public function sepetUrunNot()
{
$oturum = $this->oturum;
if ($oturum) {
$sepet_sorgu = $this->sepet_sorgu;
return $sepet_sorgu["sepet_siparis_notu"];
} else {
$urunID = $this->urunID;
return $_SESSION["sepettekiler"][$urunID]["sepet_siparis_notu"];
}
}
public function sepetUrunResim()
{
$db = $this->database;
$urunID = $this->urunID;
$urun_sorgu = $db->query("SELECT urun_resim FROM urunler WHERE id = " . $urunID)->fetch(PDO::FETCH_ASSOC);
return $urun_sorgu["urun_resim"];
}
public function sepetUrunFiyat()
{
$db = $this->database;
$urunID = $this->urunID;
$urun_sorgu = $db->query("SELECT IF(`indirim_durum` = 0, `urun_fiyat`, `urun_fiyat`-((`urun_fiyat`*`indirim_degeri`)/100)) AS fiyat FROM urunler WHERE id = " . $urunID)->fetch(PDO::FETCH_ASSOC);
return $urun_sorgu["fiyat"];
}
public function sepetUrunIndirimDurum()
{
$db = $this->database;
$urunID = $this->urunID;
$urun_sorgu = $db->query("SELECT indirim_durum FROM urunler WHERE id = " . $urunID)->fetch(PDO::FETCH_ASSOC);
if ($urun_sorgu["indirim_durum"] == 0) {
return false;
} else {
return true;
}
}
public function sepetUrunIndirimDegeri()
{
$db = $this->database;
$urunID = $this->urunID;
$urun_sorgu = $db->query("SELECT indirim_degeri FROM urunler WHERE id = " . $urunID)->fetch(PDO::FETCH_ASSOC);
return $urun_sorgu["indirim_degeri"];
}
}
class sepete_ekle
{
public $database;
public $kullanici_id, $urun_id, $urun_adet, $siparis_notu;
public function __construct()
{
if (isset($_SESSION["oturum"])) {
$oturum = $_SESSION["oturum"];
} else {
$oturum = false;
}
$this->oturum = $oturum;
require_once("config/baglanti.php");
require_once("fonksiyonlar/guvenlik_kontrol.php");
$baglanti = new baglanti;
$db = $baglanti->eticaret();
$this->database = $db;
$db = null;
}
public function urun_id($veri)
{
$this->urun_id = filtre($veri);
}
public function urun_adet($veri)
{
$this->urun_adet = filtre($veri);
}
public function siparis_notu($veri)
{
$this->siparis_notu = filtre($veri);
}
public function sepete_ekle()
{
$urun_id = $this->urun_id;
$urun_adet = $this->urun_adet;
$siparis_notu = $this->siparis_notu;
$oturum = $this->oturum;
if ($oturum) {
$kullanici_id = $_SESSION["kullanici_id"];
$db = $this->database;
$sepet_sorgu = $db->prepare("SELECT urun_adet, urun_id, kullanici_id FROM sepet WHERE urun_id = ? AND kullanici_id = ?");
$sepet_sorgu->execute(array($urun_id, $kullanici_id));
$sepet_sorgu_sayisi = $sepet_sorgu->rowCount();
if ($sepet_sorgu_sayisi > 0) {
return false;
} else {
$sorgu = $db->prepare("INSERT INTO sepet (kullanici_id,urun_id,urun_adet,sepet_siparis_notu) VALUES (?,?,?,?)");
$sorgu->execute(array($kullanici_id, $urun_id, $urun_adet, $siparis_notu));
$sepete_ekle = $sorgu->fetch(PDO::FETCH_ASSOC);
$db = null;
if ($sepete_ekle) {
return true;
}else {
return false;
}
}
} else {
if (!isset($_SESSION["sepettekiler"])) {
$_SESSION["sepettekiler"] = array();
}
$_SESSION["sepettekiler"][$urun_id]["urun_id"] = $urun_id;
$_SESSION["sepettekiler"][$urun_id]["urun_adet"] = $urun_adet;
$_SESSION["sepettekiler"][$urun_id]["siparis_notu"] = $siparis_notu;
}
}
}
Kullanımı
Sepettekilerin verisini çekmek için (ek olarak veritabanından ürün fiyatını, resmini, indirim durumu/değeri gibi verileri de çekebilirsiniz ve verileri SESSION'dan veya veri tabanından çekileceği kararını otomatik yapar);
Kod:
require_once("siniflar/sepet.php");
$sepet = new sepet_veri_cek(1);
echo "<br>";
echo $sepet->sepetUrunNot();
echo "<br>";
echo $sepet->sepetUrunFiyat();
Sepete Ekleme işlemi. Ziyaretçi - kullanıcı ayrımı yaparak sepeti SESSION'a veya veri tabanına aktarır. Zaten siparişi verirken giriş yapması gerekecek. Ben konu uzamasın diye oralara girmeyeceğim ama üye giriş yaptıktan veya kayıt olduktan sonra SESSION'daki sepeti veri tabanındaki sepete ekliyorsunuz bu kadar basit.
Kod:
require_once("siniflar/sepet.php");
$sepete_ekle = new sepete_ekle;
$sepete_ekle->urun_id(3);
$sepete_ekle->urun_adet(10);
$sepete_ekle->siparis_notu("deneme");
$sepete_ekle->sepete_ekle();
3.10 Diller
"siniflar/language.php"
Kullanımı
Seçili dilin kodunu ve ismini çekmek için;
Kod:
require_once("siniflar/language.php");
$language = new get_language();
echo "<br>";
echo $language->dil_kodu();
echo "<br>";
echo $language->dil_ismi();
Dil eklemek için bu sınıfı kullanacağız. Kategorilere de ekleme yapacağı için tekrar kategorilerde yeni eklenen dil için update işlemi yapmamız gerekiyor. Eğer yapmazsak boş olan sütunlar için varsayılan dilin verilerini çekecektir.
Kod:
require_once("siniflar/language.php");
$dil_ekle = new set_language;
$dil_ekle->set_dilKodu("br");
$dil_ekle->set_dilAdi("Brazil");
echo $dil_ekle->verileri_ekle();
3.11 Yorumlar
"siniflar/yorum.php"
Kullanımı
Ürüne ait tüm yorumları çekmek için (ürünün ID'sine veya stok koduna göre çekebilirsiniz);
Kod:
require_once("siniflar/yorum.php");
$yorum_cek = new yorum_cek(1);
echo "<pre>";
print_r($yorum_cek->tum_veriler());
echo "</pre>";
Yeni yorum eklemek için (yorumda verilen puan otomatik olarak ürüne eklenmektedir);
Kod:
require_once("siniflar/yorum.php");
$yorum = new yorum_ekle(1);
$yorum->set_urunID(1);
$yorum->set_puan(5);
$yorum->set_isimDurum(1);
$yorum->set_yorumBaslik("Güzel Bir Cihaz");
$yorum->set_yorumIcerik("1 aydır kullanıyorum ısınma sorunu falan olmadı.");
echo $yorum->verileri_ekle();
3.12 Varyasyon
"siniflar/varyant.php"
Kullanımı
Varyasyon adlarını çekmek için;
Kod:
require_once("siniflar/varyant.php");
$varyant = new varyant;
echo "<pre>";
print_r($varyant->tum_veriler());
echo "</pre>";
Varyasyon eklemek için;
Kod:
require_once("siniflar/varyant.php");
$varyant = new varyant_ekle;
$varyant->set_varyantAd("Uzunluk"); // Ekleyeceğimiz varyantın ismini giriyoruz.
echo $varyant->verileri_ekle();
3.13 Ürün Resim Galerisi
"siniflar/resimler.php"
Kullanimi
Ürüne ait resimleri çekmek için;
Kod:
require_once("siniflar/resimler.php");
$resim_ekle = new resim_cek(1); // ürünün ID'sini yazıyoruz
echo "<pre>";
print_r($resim_ekle->resimler_array());
echo "</pre>";
Bir ürüne ait resim eklemek için;
Kod:
require_once("siniflar/resimler.php");
$resim_ekle = new resim_ekle;
$resim_ekle->set_urunID(1);
$resim_ekle->set_resimUrl("resimler/deneme123.png"); // resim yolu
$resim_ekle->set_resimAlt("deneme123 resmi"); // Seo için önemli
echo $resim_ekle->verileri_ekle();
Maalesef yetiştiremedim tasarım kısmını. Birazcık girmeyi planlıyordum (ürün ekleme, kategori listeleme vb.) ama olmadı. Çok karmaşık bir yapı kurmadım ve fazla da vaktim yoktu. Kodların hepsini direk yazmıştım fakat karakter sınırı olduğu için resme dönüştürüp atmaya karar verdim. Eğer alıp incelemek isteyen varsa onlar için GitHub'a ekledim. Çok düzgün bir şey olmadı kusura bakmayın. Umarım işinize yaramıştır
GitHub Linki: https://github.com/xLosTTeaM/eticaret
Son düzenleme: