Kendi yazdığım eticaret sisteminde karşılaştığım bir durumdan yola çıkarak, ihtiyacı olabilecek kişilere, PHP ve MYSQL’de sayı tabanları arasında çeviri yapmak ve bunu kullanmak ile ilgili bir yazı yazmak istedim.
Veri tabanında sipariş durumunu tutmam gerekiyordu, bende daha evvel bu gibi durumlarda kullanmak için OI_Param diye 6 karakterli varchar bir field oluşturmuştum. Bu alanın 5’inci karakterinde 0-3 arası numaralarda sipariş durumlarını tutmaya karar vermiştim.
İlk planladığım durumlar şöyleydi;
_ : Yeni Siparişler
0 : Hazırlanıyor
1 : Kargoda Olan Sipariş
2 : Teslim Edilmiş Sipariş
3 : İptal Olan Sipariş
Mesela kargoda olan siparişleri listeletmek için SQL sorgusunda where alanına SUBSTR(OI_Param,5,1)=’1′ ekleyerek bu siparişleri listeletmek niyetindeydim.
Sonrasında bir siparişteki ürünlerin her birinin durumu belirleme kararı aldım. Çünkü bir siparişteki ürünlerin her birinin farklı durumlarda olma ihtimali vardı. Örneğin siparişteki ürünlerin bir kısmı henüz “ürün hazırlanıyor” durumundayken bir kısmı “kargoya verilmiş” olma ihtimali vardı. Dolayısıyla siparişin burda geçen her bir durumda aynı anda bulunabileceğini anladım.
Örneğin, müşterimiz aynı anda 5 adet ürün sipariş verdi. Bu siparişteki ürünlerden 2’si aynı gün temin edildi ve kargolanıp teslim edildi. Ardından bir ürün daha temin edildi ve kargolandı. Bu sırada ilk eline ulaşan ürünlerden birini beğenmeyip, iade işlemi yaptı. Kalan iki üründe hazırlanıyor durumunda. Dolayısıla sipariş aslında her durumda bulunuyor.
Yani ben bu gibi siparişler için panelde, hangi listelerde yer alıyorsa bunlarda ayrı ayrı listeletmem lazım. Bu durumda toplamda 4 farklı durumun kombinasyonuyla 16 farklı listeletme çeşitliliği ortaya çıkıyor.
Düşündüm ve elimde durum tutabileceğim 1 karakterlik OI_Param[4] var. Bende şöyle yapmaya verdim. Durum çeşitliliğini 16’lık sayı tabanında bu alanda tutabilir ve 2’lik sayı tabanında da programlama kısmında karşılaştırmasını yapabilirdim.
Örneğin; 2’lik sayı tabanında 4 basamaklı bir sayı düşünelim ve bu sayı tabanında her bir karakter 4 özelliğimizin temsil etsin; 1 ise, özellik var 0 ise yok.
Sağdan 1. basamak : Hazırlanan Siparişler
2. basamak : Kargoda Olan Sipariş
3. basamak : Teslim Edilmiş Sipariş
4. basamak : İptal Olan Sipariş
Örneğin, sayı 0110 olursa bu siparişte hazırlanan ve teslim edilmiş ürünler var demektir. Bu sayının 16’lık tabandaki karşılığı ise 6‘dır
Sipariş ilkkez veri tabanına eklendiğinde OI_Param‘ın 5. karakteri 0 değeriyle kaydedilir. Bu siparişin yeni olduğu durumdur. Daha sonra siparişteki her bir ürünün durmunun değiştiğinde siparişin de durumunu ürün durumlarına göre güncelledim. Algoritması Şöyleki;
fonksiyon üç adet değişken almaktadır.
base_convert(string $sayi, int $hangi_tabandan, int $hangi_tabana)
$sayi="1110";
echo base_convert($sayi,2,16);
// çıktı : E
16’lık sayı tabanındaki bu tek karakterki değerleri veritabanındaki OI_Param[4] alanında saklayayıp, listelemeyi yaparken SQL sorgusunuda kolaylıkla yapabiliriz.
Örneğin kargoda ürünü olan siparişleri listeletmek istersek sorguda where alanına
SUBSTR(CONV(SUBSTR(OI_Param,5,1),16,2),-2,1) == ‘1’ karşılaştırmasını eklememiz yeterli olacak.
Bu şu işlemi yapıyor; OI_Param’ın beşinci karakterini alıp, 16 tabandan 2’lik tabana çeviriyor ve ikilik tabanda sondan 2. karakterin 1 olması durumunu kontrol ediyor.
mysql’de sayı tabanı çevriminde php’deki base_convert fonksiyonu ile benzer şekilde çalışan CONV fonksiyonu kullanılmaktadır.
Fonksiyona verilen
ilk değer çevrimi yapılacak sayı,
ikincisi hangi tabandan çevrim yapılacağı,
üçüncü değer hang itaba çevrileceğidir.
mysql> SELECT CONV('a',16,2);
-> '1010'
mysql> SELECT CONV('6E',18,8);
-> '172'
Bu yazıda temel olarak php’de ve mysql’de sayı tabanları arasında çevrimi nasıl yapacağımızı ve bunu ne gibi durumlarda kullanabileceğimizi görmüş olduk.
Umarım bu yazı çözemediğiniz bazı problemlere ışık tutabilir ve size yeni perspektif kazandırabilir.
Yazı Ne Hakkında : base_convert, CONV, developer, eticaret, MYSQL, PHP, sayı tabanları, veritabanı
Özellikle güzel bir örnek barındırarak anlatılmış olması benim için çok iyi oldu. Güzel bir yöntem olmuş. Anlatım için de eline sağlık.