2 Kasım 2008

Php ile Javascript arasında veri aktarımı

Daha önce bir yazımda json veri yapısından bahsetmiştim. Bu yazımda da php ile javascript arasında bilgi aktarımının nasıl yapılabileceğini bir örnekle açıklamaya çalışacağım. Önce javascriptdeki nesne yapısından bahsedeyim. Javascriptte bir nesne şu şekilde tanımlanabilir:


obj = new Object;

Şimdi de bu nesneye bazı öğeler ekleyelim:


obj.x = 1;
obj.y = 2;

Bu iki ifadeyle nesnemize x ve y adlarında iki değişken eklemiş olduk. Bu örnekte sınıf kullanmadan sadece veri içeren bir nesne oluşturmuş olduk. (Konumuz veri aktarımı olduğu için şimdilik bununla yetiniyorum. Ama tabiki işlevler içeren bir nesne de oluşturabilirsiniz.).

Oluşturduğumuz bu nesneyi Object kelimesini kullanmadan da oluşturabiliriz:


obj = {"x":1,"y":2};

Tanıdık geldi mi? Bu tanımlama aynı nesnenin daha önce bahsettiğim json yapısı ile tanımlanmış halidir. Zaten json kelimesinin açılımı javascript object notation yani javascript nesne gösterimi demektir. Aşağıdaki gibi bir kodla deneme yapabilirsiniz:


obj = {"x":1,"y":2};
alert( "obj.x="+obj.x );
alert( "obj.y="+obj.y );

Bu kod obj nesnesinin x ve y elemanlarını uyarı vererek bildirecektir. İlk gösterdiğim yöntemdeki gibi her eleman için teker teker atama yapmak yerine json tanımlamasını kullanarak nesne oluşturmanın daha kolay olduğunu görüyorsunuz.

Şimdi asıl meselemiz olan php ile javascript arasında veri aktarımına geçebiliriz. Bunun için php 5.2 sürümünden itibaren kurulum gerektirmeden kullanılabilen json_encode ve json_decode işlevlerini kullanabiliriz. Bu işlevler adlarından tahmin edeceğiniz gibi sırasıyla veriyi json biçiminde kodlayan ve kodlanmış halini php veri yapısına çeviren işlevlerdir. json_decode işlevinin kullanımına bir örnek verelim:

$json_data = '{"x":1,"y":2}';
$php_data = json_decode($json_data);
print_r($php_data);

Burada basitçe json verimizi bir değişkene atayıp json_decode işlevini uygulayarak elde ettiğimiz veriyi (nesneyi) print_r ile yazdırıyoruz. Bunun sonunda şu çıktıyı elde ederiz:

stdClass Object
(
[x] => 1
[y] => 2
)

Tahmin edeceğimiz gibi standart bir php nesnesi elde ettik. Sınıfın türü hariç aynı sonucu veren bir php kodu şu şekilde olur:

class Obj{
var $x=1;
var $y=2;
}
$obj = new Obj();
print_r($obj);

Bunun çıktısı da yukarıdaki gibi olur ancak nesnemiz kendi tanımladığımız Obj sınıfından oluşturulduğu için stdClass yerine Obj adını görürsünüz.

Hazır gelmişken bu kez de tersten gidelim ve oluşturduğumuz bu Obj nesnesini json_encode ile kodlayarak bir json çıktısı elde edelim:

class Obj{
var $x=1;
var $y=2;
}
$obj = new Obj();
$json_data = json_encode($obj);
echo $json_data;

Bu kodu çalıştırarak en baştaki javascript kodumuzda obj nesnesini oluştururken kullandığımız json nesnesini elde ederiz:

{"x":1,"y":2}

Artık json dönüşümlerinin nasıl yapıldığını biliyorsunuz. Ancak hala php ve javascript arasında nasıl veri aktarımı yapılacağından bahsetmedik. Aslında bunun nasıl yapılacağı sizin ihtiyaçlarınıza ve aktarımın hangi yönde (php 'den javascript 'e yada javascript 'den php 'ye ) olacağına bağlıdır. Önce php'den javascript'e yapılan bir aktarım örneği verelim:

<?
$php_data_1 = array( 'a',1,'php','json',2008 );
$php_data_2 = array( 'a'=>1, 'b'=>2, 'c'=>'php', 'd'=>'javascript' );

$json_data_1 = json_encode($php_data_1);
$json_data_2 = json_encode($php_data_2);
?>
<script type="text/javascript">
var nesne_1 = <?=$json_data_1?> ;
var nesne_2 = <?=$json_data_2?> ;
</script>

Bu kodun çıktısı şöyle olur:
var nesne_1 = ["a",1,"php","json",2008] ;
var nesne_2 = {"a":1,"b":2,"c":"php","d":"javascript"} ;

Bu örnekte php tarafında iki adet dizi tanımladık ve bunları json_encode ile kodlayarak javascript kodumuzdaki javascript değişkenlerine atama yapılacak şekilde kullandık. Burada fark edeceğiniz gibi birinci json verisi bir dizidir (öğeler köşeli parantezler içinde) ancak ikincisi nesnedir (öğeler küme parantezleri içinde). Bunun nedeni php'deki array verisinin isimli anahtar değerlerinden oluşması halinde (associative array) aslında bir çeşit nesne olmasıdır. Yani herhangi bir sınıftan türetmediğimiz halde ikinci dizimiz aslında bir nesnedir.

Yukarıdaki örnekte php ile tanımladığımız veriyi javascript koduna aktarmış olduk. Şimdi de bunun tersine, yani javascript ortamından php ortamına (sunucuya) verinin aktarılmasına geçelim. Bu aslında öncekinden daha zordur çünkü öncelikli olarak işlenen kod sunucuda çalıştırılan php kodlarıdır. Javascript kodları ise sunucunun tarayıcıya verdiği çıktının yorumlanması ile çalıştırılır. Önceki örneğimizdeki aktarım yönü bu sıraya uygundu ancak şimdi tarayıcıda oluşturulan yada işlenen verinin sunucuya aktarılması gerekiyor. Bunun için ya json kodunu bir karakter dizisi (string) olarak sunucuya gönderip sunucuda bu veriyi json_decode ile açarız yada veriyi ajax ile POST yada GET yöntemlerinden biriyle gönderip sunucuda $_POST, $_GET yada $_REQUEST ile erişebiliriz. Yada daha karmaşık veri aktarım durumlarında bu ikisinin bir karışımını kullanarak verinin bazı öğelerini parametrelere ayırıp post/get elemanları olarak göndeririz, bir kısmını da json olarak paketleyip yine bu parametrelerden biri olarak aktarabiliriz.

Javascript 'den php 'ye (genel olarak tarayıcıdan sunucuya) veri aktarımı yapılırken sayfanın yenilenmesini istemiyorsak AJAX (Asynchronous JavaScript and XML) kullanmamız gerekiyor. Bu konuyu ise başka bir yazıya bırakıyorum.

2 yorum:

sanfirat dedi ki...

Çok teşekkürler çok güzel izah etmişsiniz bana çok faydalı oldu. js'den php ye veri aktarımını da bekliyeceğim.

admin dedi ki...

Teşekkürler. js 'den php 'ye aktarım ajax ile yapılıyor ve bu konuyu şu yazıda anlattım: http://eezgu.blogspot.com/2009/03/jquery-ile-ajax-kullanm.html

Kripto paralar hakkında

Kripto paralar, merkezi olmayan, şifrelenmiş ve dağıtılmış bir veritabanı olan blok zinciri teknolojisi kullanılarak oluşturulan dijital par...