Sıfırdan E-Ticaret "Backend" Çalışması

LosT

Yaşayan Forum Efsanesi
5 Şub 2015
8,117
31
-
Hocam elinize sağlık. sadece meraktan soruyorum: ne kadar zamanınızı aldı?

Başlayıp bitirene kadar 2 gün geçti. Ancak bu 2 günde sadece geceleri yazmıştım. Tam hatırlamıyorum ama 5 saat kadar uğraşmış olmam lazım. Konu ve veri tabanı tasarımı hariç.
 
Son düzenleme:

LosT

Yaşayan Forum Efsanesi
5 Şub 2015
8,117
31
-
Yok konu için değil canım genel olarak. Ayrıca son cümlede ne demek istediğini anlamadım, kötü manasındamı iyi manasındamı :)?

Anladım. Evet ileride NodeJS veya Python çalışmayı düşünüyorum. Ancak Web için ihtiyacım olursa muhtemelen NodeJS öğrenirim.
Son cümlemde NodeJS'i övdüm aslında. Daha güzel projeler yaparım demek istemiştim :) Aklımda bazı fikirler var.
 

şıkk

Üye
24 Eki 2023
108
47
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.

4dKDtQ.png


E-Ticaret Sitemizde Bulunan Özellikler:
» Çoklu dil destekli kategori
» Ürün varyant
» Ürün sıralama
» Yorum yapma
» Sınırsız alt kategori

4dKDtQ.png


Kullanılacak Diller:
» PHP
» SQL

4dKDtQ.png


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.

4dKDtQ.png


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)

IwE1F.png


4dKDtQ.png


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)

Iw5Ab.png


4dKDtQ.png


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 :D 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)

Iwun3.png


4dKDtQ.png


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.

Iwq8X.png


4dKDtQ.png


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)

Iwq8X.png


4dKDtQ.png


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)

IwMhT.png


4dKDtQ.png


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)

Iwl6c.png


4dKDtQ.png


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)

Iwpmr.png


4dKDtQ.png


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)

IwsG7.png


4dKDtQ.png


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)

IwAYl.png


4dKDtQ.png


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

IwAYl.png


4dKDtQ.png


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)

IwJAa.png


4dKDtQ.png


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;

Iw07u.png


Ş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.

4dKDtQ.png


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.

4dKDtQ.png


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"

IIUr8.png


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"

II2PJ.png


4dKDtQ.png


3.2 Site Bilgileri

"siniflar/site_ayar.php"

IInds.png


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>";

IwGx2.png


Tek ayar çekmek için;
Kod:
require_once("siniflar/site_ayar.php");
$site_ayar = new site_ayar();

echo $site_ayar->slogan();

IwWvf.png


4dKDtQ.png


3.3 Kullanıcı Bilgileri

"siniflar/kullanici.php"

I2GJ6.png

IIBUB.png


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>";

IwKOq.png


veya

Kod:
require_once("siniflar/kullanici.php");
$kullanici = new kullanici_verileri(1);

echo $kullanici->mail();

Iwe6o.png


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";
}

Iwe6o.png


4dKDtQ.png


3.4 Ürün Bilgileri

"siniflar/urunler.php"

IILbU.png

II7tM.png

IIJj2.png

II0Nf.png


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>";

IwhWR.png


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();

IwOYY.png


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>";

Iwdc8.png


Ü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();

Iwa9J.png


4dKDtQ.png


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"

II4oU.png

II9RO.png


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>";

Iwy7L.png


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>";

Iw7xs.png


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();

IwDMB.png


4dKDtQ.png


3.6 Siparişler

"siniflar/siparis.php"

IIk0E.png

IICT6.png


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>";

IwLOy.png


Tek bir sütun verisi için;
Kod:
require_once("siniflar/siparis.php");
$siparis = new siparis(1);

echo $siparis->adres();

IwTwM.png


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();

IwiqU.png


4dKDtQ.png


3.7 Sipariş Edilen Ürünler

"siniflar/siparis_urun.php"

IIVrX.png

IIbpb.png


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>";

IwYWO.png


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();

IwYWO.png


4dKDtQ.png


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>";

IwQk6.png


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();

IwocX.png


4dKDtQ.png


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();

IwtDb.png


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();

4dKDtQ.png


3.10 Diller

"siniflar/language.php"

IIuoc.png

IIMVr.png


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();

I2wxF.png


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();

I22M3.png


4dKDtQ.png


3.11 Yorumlar

"siniflar/yorum.php"

IIZ07.png

IIlTl.png


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>";

I2nqc.png


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();

I2ISk.png


4dKDtQ.png


3.12 Varyasyon

"siniflar/varyant.php"

IIs4n.png


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>";

I2jwT.png


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();

I2xKr.png


4dKDtQ.png


3.13 Ürün Resim Galerisi

"siniflar/resimler.php"

IIApa.png


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>";

I2Bz7.png


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();

I2rkl.png


4dKDtQ.png


4dKDtQ.png


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: GitHub - xLosTTeaM/eticaret

CckryH.gif

Eline ne sağlık büyük emek
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.