PHP ve MYSQL’de sayı tabanlarıyla işlem yapmak

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.

Karşılaştığım durum neydi?

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.

Peki bunu ben bu verileri veri tabanında nasıl tutabilirdim?

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

Peki bu özellikleri 2’li sayı sisteminde nasıl oluşturmalı ve veri tabanında güncellemeliyim?

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;

  1. 0000 olan bir durum değişkeni oluşturdum.
  2. Siparişteki tüm ürünler ile ilgili bir döngü kurdum.
  3. Döngü içinde ürünlerin durumlarona göre gerekli  basamakları 1’e çevirdim
    1. Hazırlanan ürün için sağdan 1. basamak 1 olsun
    2. Kargoda olan ürün için sağdan 2. basamak 1 olsun
    3. Teslim edilmiş olan ürün için sağdan 3. basamak 1 olsun
    4. İade edilmiş olan ürün için sağdan 4. basamak 1 olsun
  4. daha sonra php’nin base_convert fonksiyonu sayesinde ikilik tabanda oluşturduğum bu sayıyı 16’lık tabana çevirip, veri tabanındaki gerekli alanı güncelledim

PHP’deki base_convert fonksiyonu nasıl kullanılır?

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 

Güncellediğim bu sipariş bilgisine göre listeleme nasıl yapabilirim?

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.

MYSQ’deki sayı tabanı çeviri fonksiyonu nasıl kullanılır?

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'

 

SONUÇ

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.

Bir Yorum Adet Yorum Yapıldı... ( Sende Yorum Yaz! )

  • Ö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.


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

En Komik Tv Facebook Sayfası Yok Artık Facebook Sayfası