RSS
 

PHP & MySQL Tek Alanda Çoklu Veri Tutma – Tips&Tricks

06 Dec

Merhaba,

Başlıktanda anlayacağınız üzere bir data’nın birden çok özelliği olabilir ve bazı ID’ler ile eşizleştirilmeside gerekebilir. Nasıl yani?

Örneğin; Bir e-ticaret sistemi geliştirdiğinizi düşünün bir ürünün renk, boyut gibi özellikleri var ve bu özellikler her ürün için birden fazla olabilir. Örneğin;

* Product 1 -> Red,Blue,Green – XL,L,M,S (Tabii bu değerler sınırlı değil yarın bir gün Yellow ve XXL gibi yeni değerlerde gelebilir.)

Şimdi yukarıdaki Red,Blue,Green ve XL,L,M,S’i MySQL’deki tek bir row’da tutmak istersek bunları aralarına virgül koyup, REGEX gibi yollarla parçalayarak işlemek hataya açık şekilde tutmaktır. Her özellik için bir alan oluşturup bunlara 0 ve 1 gibi değerler ile tutmakta mantıklı değil. Çünkü yukarıda parantez içinde belirttiğim gibi yeni özellikler geldiğinde tabloyu düzenlemeniz gerekmektedir ve bir sınırıda yoktur. Yani 50 tane de olabilir bu özellikler.

Biz ise, PHP’de serialize edip bu şekilde tutacağız. Hatta bir adım ileri gidip sadece Key’leri değil bu Key’lere Value’lar verip ikisini birden işleyeceğiz.

Elimizdeki değerler;

* Product 1 Properties;

  • Red -> 20
  • Green -> 62
  • Blue -> 14
  • XL  -> 52
  • L -> 75
  • M -> 318
  • S -> 98
Şimdi bu özellikleri ve değerlerini; Özellik -> Adet şeklinde düşünelim. Hemen PHP tarafına geçiyoruz.
$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

Şimdi array haline getirdiğimiz değerlerimizi serialize edip bir de bu haldeki çıktılarına bakalım.

  // Yukarıdaki kodların altına ekliyoruz
print(serialize($productColorArr)); 
# a:3:{s:3:"Red";i:20;s:5:"Green";i:62;s:4:"Blue";i:14;}
print("\n\r");
print(serialize($productSizeArr)); 
# a:4:{s:2:"XL";i:52;s:1:"L";i:75;s:1:"M";i:318;s:1:"S";i:98;}

Bu kodun çıktıları yanlarına eklediğim gibi olması gerekiyor. Bu işlemden sonra DB’ye insert edebiliriz. SELECT ettiğimizde UNSERIALIZE etmemiz gerekmektedir. Nasıl?


$productColorArr = array(
 "Red" => 20,
 "Green" => 62,
 "Blue" => 14
 );

$productSizeArr = array(
 "XL" => 52,
 "L" => 75,
 "M" => 318,
 "S" => 98
 );

 $srz_ProductColorArr = serialize($productColorArr);
 $srz_ProductSizeArr = serialize($productSizeArr);

 print_r(unserialize($srz_ProductColorArr));
 print("\n\r");

print_r(unserialize($srz_ProductSizeArr));

Buraya kadar güzel, peki bunları veri tabanında ne şekilde tutucaz? Bu değerleri tutacağımız color ve size adında 2 tane alanımız olsun bunların veri türü TEXT olsun. Bunların INSERT ve SELECT ettirme kısmını zaten biliyorsunuz. Peki, içlerinden bazı değerleri çıkartma veya bir key’in value’nu nasıl değiştireceğiz? İçinden çıkartmak istedikleriniz varsa aşağıdaki şekilde filtreleyebilirsiniz.


/* unserialize ettiğimiz data bize Array döndüğünden bu noktadan sonra

Array'ler üzerinde execute edebildiğimiz tüm kodları çalıştırabiliriz.

*/
<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);
		
$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);
		
$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);
		
$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);
# Dizi içinde Red ve Blue olan key'leri filtreledik.
$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));

print_r($filteredColor); # Green yazması gerek sadece. 
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Bir diğer senaryo; $productSizeArr ‘deki M key’nin değerini 18 eksiltmek istersek.

<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);
		
$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);
		
$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);
		
$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);
		
$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));
		
if(array_key_exists("M", $usrz_ProductSizeArr)){
	$usrz_ProductSizeArr["M"] -= 18;
	array_values($usrz_ProductSizeArr);
}
		
print_r($filteredColor);
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Kodumuzun son hali yukarıdaki şekildedir. Böylece, unserialize edilmiş data üzerinde nasıl işlem yapabileceğimizide gördük.

Son bir trick olarak array_merge() methoduna bakmanızı öneririm. İki array’i birleştirerek tek bir dizi haline getirmektedir. İşinize yarabilir.

print(“İyi Çalışmalar”);

:)

 
1 Comment

Posted in MySQL, PHP

 

Leave a Reply

 

 
  1. Serkan

    18/12/2011 at 14:23

    Benimde sık sık kullandığım çok faydalı bir yönteme değinmişsin. Anlatım da gayet açıklayıcı olmuş. Teşekkürler.