makaleler, yazılar, şarkı sözleri, gerekli bilgiler

Çarşamba, Ekim 04, 2006

AJAX: XMLHttpRequest Vs. iFrames

Should you use the old iFrame tricks or the new XMLHttpRequest? There is not better or worse when comparing these two techniques, but they are certainly different. While both of them allow you to communicate with the server in the background, you should choose the appropriate for your situation depending on a few questions: Do you want the back-forward buttons to work? Do you plan to perform more than one simultaneous request? Do you need cross-site calls? Do you need to monitor the status of your calls?

I'm pretty sure there are more differences, and way around the ones I will mention for either technique, but out of the box, here are the differences:

XHR iFrame
Multithread: yes no
Back button no yes
Cross-site no yes
Statuses yes no

Some people use iframes because it's easier to monitor… all you have to do is to show the hidden iframe and voila, you see the responses. On the other hand, I use several http traffic sniffers that give me even more accurate information, and they're extremely easy to use. So that's not a plus for me.

Multithread is huge... you could achieve this with iframes if you create a framework that will create a new iframe using dom, use it for the call and delete it once it's completed. When using XHR, you can easily create a new remote request with simple scripting.

The back button breaks by default when using XHR. Sometimes it is actually good, f.e, if I populate a city and state using a zip code, or check if an email has been taken prior to submitting a form I wouldn't like to add a history step, so I'm glad the back button doesn't recognize that request. There are ways around it too if you do need it to work. I will post some solutions/possibilities soon.

Cross-site scripting ... while you would like this to work to use web services, they do not really work with iframes either. When scripting with iframe you need to explicitly call a function in the parent or top window, so unless you control both sites, this advantage is useless. You can implement a server side web service proxy relatively easy and I would suggest doing that if you need to use WS.

Finally, statuses... with an iframe you do not know in that status your call is. With XHR you have 5 different ones: 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, 4 = complete. They are useful to provide the user with more accurate information.

In conclusion, most of the times XHR is preferable over iframes, but there are cases and cases. Google maps uses iframes, while google suggest uses XHR.

This article was republished with permission of the Author.

Pazar, Ekim 01, 2006

PHP'de Oturum ( Session ) Fonksiyonu ve Uygulamaları

Bu dökümanda sizlere Php de önemli konulardan biri olan Session ( Oturum ) konusunu anlatmaya çalışacam. Öyle ki aslında Php de kullanılması temel fonksiyonlardan biridir. Php server taraflı bir dil olduğundan dolayı yapılan kodlamaların çoğunda sayfa ziyaretçisi ile bağlantılı bazı codelar gerekebilir. Fazla uzatmadan hemen konuya giriyoruz.


Php ile ilgilendiğinizi düşünerek size şu soruyu soruyorum; Daha önce hiç düşündünüzmü? Php ile sayfaya gelen ziyaretçiler sayfaya bağlı dosya veya database ile işlem yaparlar yada onlar sayfada iken açık olan bazı dosyalar nasıl diğer ziyaretçilerinkilerle karışmaz? Şöle söylersem sanırım yanlış olmaz. " Php de her ziyaretçi için bir oturum id si vardır. Bu id ziyaretçinin yaptığı işlemleri ve etkilenen dosya ve benzeri şeyleri diğer ziyaretçilerinkiler ile karışmasını en gelleyen bir numaradır."


Yazdığım dökümanlarda fazla yazdığımı kodları öğretirken uğraştırdığımı düşünenler varsa lütfen " Güncellenme sorunu, hack edilme sorunu, copy paste sorunu vs.. türünde sorunlarla uğraşan, sayfasına sağdan soldan bulma php scriptleri koyup amacı sadece kullanıcı çekmek olan sayfalardan yaralanabilirsiniz. Fazla geyik ve göndermeye girmeden hemen kodlara başlıyalım.


Her zamanki gibi öncelikle aşağıdaki kodları bir notepad aracılığıyla kaydedin.












<?

session_start();
echo $PHPSESSID;

?>

Şimdi scripti çalıştırdığımız anda eğer eski bir apache web server kullanıyorsanız aşağıdaki gibi bir hata alabilirsiniz.


Warning: Undefined variable: PHPSESSID in xxxxxxxxx\dosyadi.php on line 4


Bu birazda php.ini dosyanızdaki " Hata Raporlama " ayarınada bağlıdır. Sonuç olarak böyle bir hata alırsanız yada ekranda bom boş bir sayfa görürseniz yapmanız gereken tek şey sayfayı bir kez refresh etmektir.


33093b51ece6ea183a9bd1a3ffd307db


Ekranda buna benzer çok uzun bir rakam göriceksiniz. İşte bu sizin php tarafından sağlanmış olan " Session id " niz. Şimdi kodumuzu bir inceleyelim.


session_start(); // php de sayfa kullanıcısına oturum id si vermek amacıyla kullanılan komut. Adındanda anlaşılabileceği gibi kullanıcıya bir oturum başlangıcı yapmaktadır.


echo $PHPSESSID; // burada artık önceki bildiğiniz gibi echo komutu ile ekrana bastırılan $PHPSESSID değişkenini görüyoruz.


Burada anlıyacağınız gibi biz $PHPSESSID adında bir değişken tanımlamadığımız halde session_start() fonksionu bu işi bizim için yapmış oldu.


Eeee şimdi ne olmuş diyenler varsa hemen okumaya devam etsin.


Şimdi şöyle düşünün kullanıcı sizin sayfanıza ilk geldiğinde bir değişken tanımlıyorsunuz ve kullnıcı browser penceresini kapatana kadar aynı değişken her yerde geçerli oluyor.


Ne mi? Biraz daha açıklıyım şimdi düşünün sayfanın girişinde kullanıcıya bir font, bir arka plan rengi, bir şifre yada herhangi bir numara verdiniz ve kullanıcı sayfadan çıkana kadar hep aynı ayarlarla sayfanızda dolaştı bu hoş olmazmıydı. Böylece hem siz aynı kodları yazmamış olursunuz hemde kullanıcı sayfayı istediği ayarlarla dolaşır.


Anlıyacağınız 4-5 değişkenle sanki theme li bir sayfa yapmış oluyorsunuz. Bu yazıyı okuyan usta php ciler bana kızabilir, zira session id ile yapılacabilecekler bu kadar değil ilerde zamanı geldikçe anlatmaya çalışacam. Çok fazla geyik oldu yine hemen yukarıdaki kodlarımızı biraz daha geliştirelim.












<?

session_start();
session_register("sayi");
$sayi++;
echo $sayi;

?>

Yukarıdaki kodu kaydedip çalıştırdığımız anda ekranda


1


çıktısını görücez. Şimdi 3-4 kez refresh ( yenile ) düğmesine basıp sayfayı yenileyin. Sayının git gide arttığını göreceksiniz. Şimdi herhangi bir başka sayfaya gidin mesala http://www.zeb.biz sonra tekrar geri dönün sayının hala eskisi gibi olduğunu göreceksiniz. Yani browserınız açık olduğu sürece $sayi değişkenin değeri her sayfayı okuduğunuzda bir tane artacaktır. Yukarıdaki kodları incelersek;


session_start(); // bu satırı artık öğrendik oturum açıyoruz...


session_register("sayi"); // bu satır ile browserımız açık olduğu sürece geçerli olan bir değişken tanımlıyoruz bir nevi çerez ( cookie ) yani.


$sayi++; // bu satır ile $sayi adındaki değişkenin değerini 1 tane arttırıyoruz. Eğer böle bir değişken yoksa değerini 0 ile yaratıp 1 tane arttırıyor.


echo $sayi; // bu satır ilede $sayi değişkenini ekrana bastırıyoruz.


Diyelimki $sayi değişkeninin değerini sileceğiz ve bir daha kullanmıyacağız. Bu iş için onun değerini boş yapmak yada değiştirmek pek akıllıca olmaz çünkü bu tür değişkenler hafızada yer kaplarlar. Bu yüzden en akıllıca yöntem session_unregister() komutudur.


Mesala yukarıdaki örneğe göre sayi değişkeninin değerini boşaltmak için












<?

session_start();
session_register("sayi");
$sayi++;
echo $sayi;

session_unregister("sayi");
echo $sayi;

?>

Yukarıdaki gibi kod çalıştığı zaman $sayi değişkeninin değerinin boşaldığını göreceksiniz.


Session fonksiyonları hakkında şuan için öğrenmeniz gereken temel bilgileri size sundum. Aslında session ile ilgili bir çok özellik var ama şuanda bu bilgiler ile başlamanız daha uygun olacaktır. İlerleyen zamanlarda daha gelişmiş session komutlarını " PHP Dili " dışındaki " Dökümanlar " bölümünden sizlerle paylaşıcam.


Mesala session_destroy() tüm değişkenleri yok edebili yada session_unset() komutu ile değişken içini boşaltabilirsiniz . Php dili How To dökümanlarından


session_start , session_destroy, session_name, session_module_name, session_save_path, session_id ,session_register , session_unregister , session_unset , session_is_registered , session_get_cookie_params , session_set_cookie_params , session_decode , session_encode , session_set_save_handler , session_cache_limiter


gibi session komutları ve fonksiyonları hakkında bilgi edinebilirsiniz.


Şimdi kısa biz özet yapıp dökümanı bitirelim.


---


1 - Php dili server taraflı bir dil olduğundan sayfa ziyaretçilerinin yapacakları işlemlerin birbirine karışmaması ve her kullanıcının kendi işlemlerini yapabilmesi için serverın kullanıcıyı tanıyabileceği bir oturum id si verilir. Bu id her kullanıcı için farklı bir numaradır.


2 - Kullanıcının oturumunu başlatmak için session_start() komutu kullanılır.


3 - $PHPSESSID değişkeni session_start() fonksiyonu ile otomatik olarak tanımlanan bir değişkendir.


4 - session_register() komutu ile o anki browser ın hafızasına bir değişken atanabilir ve tüm browser ömrü süresince bu değişken hafızada kalır. Üzerinde işlemler yapılabilir.


5 - session_unregister() komutu ile hafızadaki bir değişkenin değeri boşaltılabilir.

Windows Server 2003'e PHP 5 ve MySQL kurulumu

Windows 2003 Server’a PHP 5 ve MYSQL KURALIM


 


Bu yazıda sizlere Windows Server 2003 üzerine Php 5 ve MySQL kurulumunu anlatacağım. Eğer elinizde Php 5 ve MySQL varsa hemen işe koyulabiliriz. Ben Php’nin 5.0.1 sürümünü ve MySQL’in de 4.0.20d sürümünü kullanacağım. Her iki yazılımı da Windows Standart Server 2003 üzerine kuracağım.


 


Php, Windows için zip’li olarak www.php.net adresinden indirilebiliyor. Php’yi indirdikten sonra C dizini altına “php” isimli bir klasöre açalım. Açtıktan sonra “c:/php” de yer alan “php5ts.dll” dosyasını “c:/windows” altına kopyalayalım. Bunun ardından yine “c:/php” içinde yer alan php.ini-dist dosyasını da “c:/windows” altına kopyalayalım. Kopyaladığımız “php.ini-dist” dosyasının adını “php.ini” olarak değiştirelim.


 


Şimdi php.ini dosyasında birkaç değişiklik yapacağız. Değişiklikleri hem Php hem de MySQL için yapacağız.


 


Öncelikle “cgi.force_redirect” satırını bulalım. Bu satırın önünce “;” yer almaktadır. “;” ün anlamı bu satırın açıklama satırı olduğunu belirtmektir. Başında “;” olan bir satırda yer alan komutlar çalıştırılmazlar. Biz satırın başındaki “;” ü silelim. Ardından da satırın sonunda yer alan “1” rakamını “0” olarak değiştirelim.


 


Aslında bu haliyle Php’yi çalışırtırmamız mümkün. Ancak MySQL için de gerekli ayarları da yapalım. Php’nin yeni sürümü ile birlikte MySQL’i çalıştırmak için “php_mysql.dll” adlı bir dosyayı kullanıyoruz. Bu dosya da Php ile birlikte gelmektedir.


 


MySQL ile ilgili olarak “php.ini” dosyasında yapmamız gereken Php’nin MySQL’e bağlanmak için kullandığı php_mysql.dll dosyasını kullanılır hale getirmek. Bunu için


 


extension_dir = "./"


 


satırını


 


extension_dir = "c:/php/ext"


 


olarak değiştirelim. Bu şekilde extensions klasörü Php tarafından kullanılabilir. Peki ne var bu extensions klasörünün içinde? Php’nin işlem yaparken kullanacağı dosyalar burada bulunuyor. Örneğin MySQL, XML, MSSQL gibi değişik işlemleri yapabilmesi için ihtiyaç duyduğu tüm dosyalar burada yer alıyor. İkinci olarak MySQL için yapmamız gereken


 


;extension=php_mysql.dll


 


Satırının başında yer alan “;” işaretini kaldırmaktır. Bildiğiniz üzere “;” satırda yer alan komutların çalışmamasını sağlıyordu. Başında “;” bulunan satırlar birer okuma satırı oluyordu.


 


Php için yapacaklarımız bu kadar. Şimdi sıra MySQL’de. MySQL’in kurulumunu yapmalısınız şimdi. Kurulum için extra bir bilgiye ihtiyacınız yok. Normak şekilde kurmanız yeterli olacaktır.


 


Windows 2003 Server’lar IIS 6 ile beraber gelmektedir. IIS 6 beraberinde pek çok özellik getirmektedir. İşin kötü tarafı eğer Windows XP bir sistem kullanıyorsanız IIS 6’yı yüklemek gibi bir şansınız olmamamktadır. Sadece Windows 2003’lerde yer almaktadır.


 


Gerek kontrol gerekse de beraberinde gelen yenilikler sayesinde oldukça iyi bir Web Server programı olduğunu söyleyebiliriz. Özellikle Application Pool bana göre onu öne çıkaran en büyük özelliktir.


 


Neyse biz işimize geri dönelim ve IIS 6 için Php’nin gerektirdiği ayarları yapalım.


 


Windows Server 2003 ailesi Server 2000 ailesinden farklı olarak kurulumda IIS de kurulmamaktadır. IIS’i siz kurulumdan sonra kurmalısınız. Kurulum için “Manage Your Server” ekranına ihtiyacınız olacaktır. Burada “Add or Remove a role” linkine tıklamanız gerekmektedir. Karşınıza gelecek olan listeden “Internet Information Server” ı seçip Next butonuna tıklamalısınız. Yine Next butonuna tıkladığınız zaman ise kurulum başlayacaktır. Kurulum için gerekli olan dosyalar Windows CD’sinde yer almaktadır. Kurulumun bitmesi ile IIS çalışır hale gelecektir.


 


IIS 6’yı açtığımız zaman 5 ve 5.1’dekine benzer olarak sol tarafta yer alan bölümler ihtiyacımız olan işlemleri yapmak için gerekli kolaylığı sunmaktadır. Sol tarafta listenin sonunda “Web Extensions” yer almaktadır. Tıkladığımız zaman sağ tarafta IIS tarafından çalıştırılabilecek olan web dosya uzantılarının listesi yer almaktadır. Örneğin IIS’in ASP dosyalarını çalıştırmamasını ayarlayabilirsiniz bu bölümden. Biz sağ tarafta üstte yer alan “CGI Web Extensions”ı seçip “Allow” butonuna tıklayacağız. Bu şekilde CGI komutları artık IIS tarafından çalıştırılmaya başlanacaktır. Hemen aklıma gelmişken söyliyeyim. Windows 2003 Server’a Php’yi CGI olarak kuracağız.


 


Şimdi sol taraftan “Web Sites” a tıklayalım. Default Web Site’a sağ tıklayıp “Properties” i seçelim. Karşımıza gelecek pencerede “Home Directory” sekmesine gelelim. Sağ altta “Configuration” butonu yer almaktadır. “Configuration” butonuna tıkladığımız zaman karşımıza “Application Configuration” penceresi açılacaktır. Mappings sekmesindeki “Add” butonuna tıklayalım. “Add/Edit Application Extension Mapping” penceresi açılacaktır. Browse butonuna tıklayıp “c:/php” içindeki “php-cgi.exe” dosyasını seçip “Open” butonuna tıklayalım. “Add/Edit Application Extension Mapping” penceresindeki “Extension” kutucuğuna “.php” yazalım. (Noktayı unutmayalım). Ok butonlarına tıklayarak pencereleri kapatalım ve IIS’i tekrar başlatalım.


 


Aslına bakarsanız yapılacak işler bundan ibaret. Ancak NTFS formatlı dizinlerde bir de çalıştırma izni verilmesi gerekmektedir. Bunun için C altında yer alan “php” klasörünü açalım. Klasör içinde “php-cgi.exe” dosyasını bulalım. Sağ tıklayıp “Properties” i seçelim. Security sekmesine gelelim. Burada “php-cgi.exe” dosyasını kimlerin çalıştırma yetkisinin olduğu ve hangi yetkilerle çalıştırabildikleri yer almaktadır. Bizim yapmamız gereken bu listeye bir de IUSR_makinaadi kullanıcısını eklemektedir. Add butonunu kullanarak IUSR_makinaadi kullanıcısını listeye eklemelisiniz. Eğer bilgisayarınıza “ceviz” adını verdiyseniz eklemeniz gereken kullanıcı “IUSR_ceviz”’dir. Kullanıcıyı ekledikten sonra altta yer alan yetki listesinde “execution” ın seçili olup olmadığını kontrol ediniz.


 


İşte bu kadar. Windows 2003 Server üzerine Php, MySQL kurup IIS için gerekli ayarları yaptık. İsterseniz çalışıp çalışmadığını deneyebilirsiniz. Aşağıdaki kodları Notepad’de yazıp “phpinfo.php” adıyla wwwroot altına kaydediniz. Daha sonra da tarayıcıdan çağırabilirsiniz. Karşınıza Php 5.01. yazılı olan bir sayfa gelirse çalışıyor demektir.

Php 'de Referanslar

PHP 'de Referanslar



Merhaba,



PHP 'de referanslar, sık kullanımını görmesek de aslında bilmemizde yararı olan şeyler. Daha önce C veya C++ ile uğraştıysanız referansları göstericiler ile aynı kefeye koyabilirsiniz. Nitekim aynı olmadıklarını da göz ardı etmemelisiniz. PHP 'de referansları daha çok başka bir değişkene ulaşmak için gereken kısa yol gibi düşünebilirsiniz ve *NIX sistemlerinde “hardlinking” 'e benzetebilirsiniz.



REFERANSLARA GİRİŞ





<?php

$asil = 'Ali ata bak';

$kopya = &$asil;

echo $kopya;

?>





Yukarıda göründüğü üzere $kopya değişkenine $asil değişkeninin değeri reference sayesinde atanıyor. Reference işareti olarak '&' işaretini kullanıyoruz. Referansları diziler ile de kullanabiliriz, örnek:



<?php

$asil[0] = 'Oya Ata Bak';

$asil[1] = 'Ali ata bak';

$kopya = &$asil;

print_r($kopya);

?>





Ayrıca aşağıda görülen referans edilen değişkenin referansı da doğru bir tanımlamadır:



<?php

$asil = 'Ali ata bak';

$kopya = &$asil;

$kopya2 = &$kopya;

echo $kopya2;

?>





Referanslar birbirine tür ve içerik olarak tam anlamıyla eşittir:



<?php

$asil = 'Ali ata bak';

$kopya = &$asil;

if ($kopya === $asil) echo "eşitlik var";

else echo "eşitlik yok";

?>





Yukarıdaki kod size hep eşitlik var değerini verecektir. Not: '===' operatörü == 'nın işlevi yanında değişkenlerin türlerinin de aynı olup olmadığına bakar.





Ek bilgi:


C bilmeyenler için & işaretinin anlamını kaydedelim. & işareti C 'de verilen değişkenin hafıza üzerine bulunduğu yerin adresini verir. C ' de göstericileri kullanmak için özel bir türde nesne yaratılır ve nesnenin başına * koyarak adresi alınan nesnenin içeriğine ulaşılabilir. Örnek olarak bir kod yazalım:



#include <stdio.h>



int main(void) {

int *i, p=1;

i = &p;

printf("İcerik: %d \n Adresi: %d",*i,i);

return 0;

}





PHP 'de gördüğünüz üzere '*' işaretinin kullanımı söz konusu değildir ve PHP 'de memory adresi değişkene atanmaz referans sadece bir kısayoldur.







REFERANSLARIN ÖMÜRLERİ




Aşağıdaki kodu inceliyoruz:



<?php

$asil = 'Ali ata bak';

$kopya = &$asil;

echo $kopya;

echo $asil;

$asil = 'Kaya ata bak';

echo $kopya;

echo $asil;

$kopya = 'Oya ata bak';

echo $kopya;

echo $asil;

?>





Yukarıda kodu çalıştırdığınızda da göreceğiniz üzere, $asil ya da $kopya değişkenini değiştirdiğinizde, değer de her durumda değişiyor. Ama unutmamız gereken bir nokta var, $kopya ve $asil aynı değere sahip farklı değişkenlerdir. Yani içindeki değer dışında değişkene bir işlem yaptığımızda ortadaki değer kaybolmaz! Aşağıdaki kodu inceliyoruz:

<?php

$asil = 1;

$kopya = &$asil;

unset($asil);

echo $kopya;

?>





Yukarıda $asil ya da $kopya değişkenini unset ile yok etmemiz ortadaki değerin yok olmasını sağlamaz. İki değişkenden birini unset ettiğimizde diğerinin değeri değişmeden kalır.



Global olarak fonksiyonun içine aldığımız değerlerin ömürleri ne olacak? Hadi bakalım:



<?php

$deger1 = "Ornek degisken";

$deger2 = "";



function fonksiyon() {

global $deger1, $deger2;

$deger2 = &$deger1;

}



fonksiyon();

echo "$deger2";

?>





Böyle bir durumda $deger2 'nin dışarıdaki değeri değişmeyecektir. Çünkü fonksiyonun içinde yapılan işlem fonksiyona aittir. Eğer $deger2 değişkeninin değerini dışarda da değiştirmek istiyorsak aşağıdaki yöntemi uygulayabiliriz:



<?php

$deger1 = "Ornek degisken";

$deger2 = "";



function global_referanslar() {

global $deger1, $deger2;

$GLOBALS["deger2"] = &$deger1;

}



global_references();

echo "$deger2";

?>





Daha önce referanslar ile uğraşanların ve C bilenlerin aklına bunun bir yöntemi daha olduğu akıllarına gelebilir, nitekim ileride ele alacağımız bir durum olacak, onun için aklınıza geldiyse unutmayın :)





Ek Bilgi:


Referansların gösterici (pointer) olmadıklarını unutmayın, aşağıdaki kod beklediğiniz gibi çalışmayacaktır:



<?php

$deger =1;

function fonksiyon(&$ic) {

$ic = &$GLOBALS["deger2"];

}

foo($deger);

echo $deger2;

?>





Yukarda $deger2 'nin içine değer atanmadığını göreceksiniz. Oysaki C 'de göstericiler ile böyle bir şey yapmak mümkündür.







FONKSİYONLAR İLE REFERANS KULLANIMI


Basit olarak referansların ne olduğunu gördük şimdi asıl mevzumuza gelelim, referansların fonksiyonlar ile kullanımına.



Yukarıda önceden unutmayın dediğim şey vardı ya şimdi oraya geldik, yani global değişkenleri direkt uğraşmadan değiştirmeye:



<?php

function fonksiyon(&$ic_deger) {

$ic_deger++;

}

$deger=5;

fonksiyon($deger);

echo $deger;

?>





Yukarıdaki $deger 'in son değerinin '6' olduğunu göreceksiniz. C ile uğraşmış kişiler için bu şaşırtıcı gelmiyor olabilir. Ama biz bilmeyenler için biraz derine inelim. Fonksiyonu yukarıdaki gibi tanımlamak fonksiyonun içindeki $ic_deger ile $deger değişkeninin içeriğini fonksiyon içinde birbirine bağlamaktır. $ic_deger ve $deger değişkenleri fonksiyon içinde aynı içeriğe yönlendirilmişlerdir. $ic_deger bu içeriği değiştirdiğinde doğal olarak $deger değişkeninin içeriğinin de değiştirmiş olacağından $deger global değişkeninin içeriği de $ic_deger++; işlemi sonunda değişmiş olacak.



Yukarıdaki olay aklınızı karıştırdıysa üzülmeyin birkaç kez okuyup uygulama yapın anlayacaksınız.





Ek Bilgi:


İşe yarayacağını düşünmediğim bir özellik olan reference return olayını da ele alalım ve aşağıdaki kodu inceleyelim.




<?php

function &fonksiyon($sayi){

$var = &$sayi;

$sayi *= $sayi;

return $var;

}

$sonuc = &fonksiyon(5);

echo $sonuc;



?>





Bu basit örneği sadece kuralı göstermek için yazdım. Fonksiyon tanımının başına '&' koymak fonksiyonun referans olan bir değer döndürdüğünün göstergesidir eğer bunu aşağıdaki gibi kullanırsanız,



<?php

function &fonksiyon($sayi){

$var = &$sayi;

return $var*$var;

}

$sonuc = &fonksiyon(5);

echo $sonuc;



?>







"Notice: Only variable references should be returned by reference in /usr/vs/vs/reference.php on line xx" haberini alırsınız çünkü $var*$var bir reference belirtmez. Ama sonuç yine dönecektir.



Ayrıca lütfen değişkene değer atarken de '&' kullanmamıza dikkat edin. İşleri biraz daha karıştıralım :)



<?php

$sonuc = 4;

function &fonksiyon(&$sayi){

$sayi *= $sayi;

return $sayi;

}

$sonuc2 = &fonksiyon($sonuc);

echo $sonuc;

echo $sonuc2

?>





Bu kodu incelerseniz çıktının 1616 olduğunu göreceksiniz.



Dikkat: Normalde referans döndürüyorsanız fonksiyonda '&' karakteri kullanmanıza gerek yok, PHP bunu zaten kendi anlayabilecek kapasitede. Bunun için ekstra bilgi kısmında ya zaten :) Aşağıdaki kod yukardaki ile aynı işlevi görecektir ve hiçbir notice hata vs. vermeyecektir.



<?php

$sonuc = 4;

function fonksiyon(&$sayi){

$sayi *= $sayi;

return $sayi;

}

$sonuc2 = fonksiyon($sonuc);

echo $sonuc;

echo $sonuc2

?>





Bu olay PHP5 'te kaldırılmıştır ve '&' kullanırsanız size E_STRICT düzeyinde bir hata mesajı verecektir. Aynı durum sadece fonksiyonlar için değil sınıflar için de geçerlidir.







Fonksiyonlarda global anahtar kelimesi aslında $degisken = &$GLOBALS["degisken"]; ile aynı görevi görür. $degisken değerini unset ettiğimizde global değişken de unset edilmez. Peki ya direkt $degisken = $GLOBALS["degisken"]; yazarsak fark ne olur. Bu en güzel bir örnekle anlatılır değil mi :)




<?php

$sayi = 4;

function fonksiyon(){

$sayi = $GLOBALS["sayi"];

$GLOBALS["sayi"] = 5;

echo $sayi;

}



fonksiyon();

?>





bu kod ekrana 4 yazdırıyorken;



<?php

$sayi = 4;

function fonksiyon(){

$sayi = &$GLOBALS["sayi"];

$GLOBALS["sayi"] = 5;

echo $sayi;

}



fonksiyon();

?>





bu kod ekrana 5 yazdıracaktır. Gördünüz farkı değil mi :)







Konuyu burada bitirirken aslında bu makaleyi okuduktan sonra referanslara ihtiyacım yok diyebilirsiniz. Ama fazla bilgi asla göz çıkarmaz. Yarın bir gün bir başkasının kodlarını incelerken gördüğünüz referansları hayda bu neydi diyeceğinize beni hatırlarsınız :)

Kaynaklar:  Bu makaleyi hazırlarken sadece php el kitapçığından yararlandım.

Php ile Grafik ( GD )

⇒GD DESTEĞİ



Windows sistemlerde GD desteği için php.ini dosyamızdaki ;extension_php_gd.dll satırın başındaki noktalı virgülü kaldırmamız gerekir.



Linux sistemlerde ise www.boutelll.com/gd adresinden, dosyaları indirip derlememiz gerekir.



⇒Grafik Oluşturuyoruz



Grafik oluştururken Php ye bu sayfayı Grafik olarak kullancağımza dair bilgi vermemiz gerekir, bunun içinde header fonksiyonlarından yararlanıcaz.






<?

header("Content-type: image/jpeg");

?>







header için type olarak image/jpeg kullandık, bu başlık jpeg formatında bir resim oluşturmak için png için image/png kullanabiliriz.



Şimdi bir tane resim oluşturalım.



Resim alanı oluşturmak için imagecreate(); ve (Jpeg formatı için)  imagejpeg();, kullandığımız belliği boşaltmak içinde imagedestroy(); fonksiyonlarını kullanıyoruz.



<?

header("Content-type: image/jpeg");

$resim  = imagecreate(250,250); // Bu fonksiyonla resim alanımızın boyutlarını belirledik.

imagejpeg($resim); // ve burda da boyutlarını belirlediğimiz resmi oluşturduk.

imagedestroy($resim); // Burda ise Resim oluştukdan sonra bellekte yer kaplar. Bellekti kapladığımız yeri silmek için bu fonksiyonu kullandık.

?>





NOT: Resim oluşturken renk belirlemediğimizde Php otomatik olarak Siyah rengini kullanır.

Bu yüzden bu php kodumuzu çalıştırdığımzda 250x250 formatında siyah bir resim oluşur.



⇒Renk kullanımı





Renk kullanmak için imagecolorallocate(); fonksiyonunu kullanıyoruz.



Kullanımı: $renk =  imagecolorallocate($resim,$R,$G,$B);



NOT: Renk oluştururken RGB ( Red Green Blue ) renk sistemini kullanıcaz  RGB hakkında bilgi için http://en.wikipedia.org/wiki/RGB adresini inceleyebilirsiniz.



⇒Resmi boyamak



<?

header("Content-type: image/jpeg");

$resim  = imagecreate(250,250);

$kirmizi = imagecolorallocate( $resim, 255,0,0 );



imagefill ( $resim,0,0,$kirmizi );



imagejpeg($resim);

imagedestroy($resim);

?>





imagefill();  İstediğimiz koordinatı istediğimiz renge boyamak için kullanılır. Eğer komple boyamak istiyorsak 0,0 koordinatlarını veriyoruz.



Bu kodumuzun çıktısı 250x250 formatlarında kırmızı bir resim olucaktır.



⇒Resimde obje kullanmak



Obje olarak Dikdörtgen, Daire/Elips, Çizgi, Yazı  kullanımına değincez.



►Dikdörtgen



Dikdörgen oluşturmak için imagefilledrectangle(); fonksiyonunu kullanıyoruz.



Kullanımı: imagefilledrectangle ( $resim, $x1,$y1,$x2,$y2,$renk );




<?

header("Content-type: image/jpeg");

$resim  = imagecreate(250,250);

$kirmizi = imagecolorallocate( $resim, 255,0,0 );

$mor = imagecolorallocate( $resim, 100,50,100 );

imagefill ( $resim,0,0,$kirmizi );



imagefilledrectangle($resim,50,50,150,150,$mor);



imagejpeg($resim);

imagedestroy($resim);

?>





Bu kod ile  X düzleminde 50 ye 150 ve y düzleminde 50 ye 150 arasındaki kalan alan mor renginde dikdörtgen yerleştirdik.



NOT: Koordinat belirlerken matematik te bildiğimiz koordinat sistemi ile aynı mantıkla koordinat belirliyoruz.



Sağdan sola  -<------->+     x koordinati



yukarıdan aşşağıya y koordinatı ( yukarısı + aşağısı -  )



►Daire/Elips



Daire veya elips oluşturmak için imagefilledellipse(); fonksiyonunu kullanıyoruz.



Kullanımı: imagefilledellipse ( $resim, $x,$y,$W,$H,$renk );



$x ve $y değerleriyle oluşturacağımız elipsin merkez koordinatlarını, $W değişkeniyle elipsin eninin boyunu $H ilede Yukseklik boyunu ayarlıyoruz ( Haliyle Daire oluşturmak için $W ile $H nin eşit olması gerekir. )



300x300 formatında bir resimin tam ortasına yarıçapı 50 olan bir çember yerleştirelim.



<?

header("Content-type: image/jpeg");

$resim  = imagecreate(300,300);

$kirmizi = imagecolorallocate( $resim, 255,0,0 );

$mor = imagecolorallocate( $resim, 100,50,100 );

imagefill ( $resim,0,0,$kirmizi );



imagefilledellipse($resim,150,150,50,50,$mor);



imagejpeg($resim);

imagedestroy($resim);

?>





►Çizgi



Çizgi (line ) oluşturmak için gerekli fonksiyon imageline();



Kullanımı: imageline ( $resim, $x1,$y1,$x2,$y2,$renk );



300x300 formatında bir resme 50.50  koordinatlarından 250.250 koordinatlarına giden bir çizgi oluşturalım.



<?

header("Content-type: image/jpeg");

$resim  = imagecreate(300,300);

$kirmizi = imagecolorallocate( $resim, 255,0,0 );

$mor = imagecolorallocate( $resim, 100,50,100 );

imagefill ( $resim,0,0,$kirmizi );



imageline($resim,150,150,50,50,$mor);



imagejpeg($resim);

imagedestroy($resim);

?>





►Yazı



Resmimizde istediğimiz koordinata yazı yazmamız mümkündür bunun için imagestring(); fonksiyonunu kullanıyoruz.



Kullanımı: imagestring($resim,$font(int),$x,$y,"Yazı",$renk);



300x300 formatında bir resme 200.200 koordinatlarından başlayan Mor renginde oCRaCy yazalım



<?

header("Content-type: image/jpeg");

$resim  = imagecreate(300,300);

$kirmizi = imagecolorallocate( $resim, 255,0,0 );

$mor = imagecolorallocate( $resim, 100,50,100 );

imagefill ( $resim,0,0,$kirmizi );



imagestring($resim,1,200,200,"oCRaCy",$mor);



imagejpeg($resim);

imagedestroy($resim);

?>





Kolay Gelsin

PHP Alisveris Sitesi Yapimi

Aslında bir alış veriş sepeti tasarlamak veritabanındaki ürün bilgilerine göre olur. Yani ilk önce ürünlerle ilgili veritabanın tasarlanması en iyisi.

Örnek bir veritabanındaki ürün tablosunda neler olabilir acaba:



istediklerim:





  • Ürün adı



  • fiyatı



  • Ürün detayı



  • Stok durumu



  • indirim oranı


...

v.s



gibi daha geniş bir veritabanı tablosu tasarımıda istenebilir.



Tablomuzu oluşturalım:



CREATE TABLE `urunler` (

`id` int(11) NOT NULL auto_increment,

`urunadi` varchar(250) NOT NULL default '',

`fiyat` int(11) NOT NULL default '0',

`resim` varchar(200) default '',

`detay` text NOT NULL,

`stok` int(11) default '0',

`indirim` int(4) default '0',

`goster` char(1) default '1',

`tarih` datetime default '0000-00-00 00:00:00',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin5;




Tabloyu veritabanına kaydettikten sonra içine ürünlerimizi ekleyelim:



INSERT INTO `urunler`(`urunadi`,`fiyat`,`resim`,`detay`) VALUES('Buz dolabı','400','abcd1.jpg','Bu buzdolabı ile yazı rahat geçirin');

INSERT INTO `urunler`(`urunadi`,`fiyat`,`resim`,`detay`) VALUES('Televizyon','200','abcd2.jpg','Bu televizyon ile rahatsız olabilirsiniz');

INSERT INTO `urunler`(`urunadi`,`fiyat`,`resim`,`detay`) VALUES('Kiatap','10','abcd3.jpg','Son yılların en çok okunan Kitabı');

INSERT INTO `urunler`(`urunadi`,`fiyat`,`resim`,`detay`) VALUES('incik boncuk','4','abcd4.jpg','Sevgilinize bir küpe alın onu mutlu edin');




Ben stok,indirim,goster,tarih gibi değerleri girmedim. Ama siz isterseniz sorguyu kendinize göre yeniden düzenleyebilirsiniz. Şimdilik bu kadarı benim için yeterli.



Sıra geldi sanal mağazamıza gelecek olan hasan ağanın ürünlerimizden birisini nasıl alacağına.



Hasan ağa,ahamet ağa ve daha birçok değerli müşterimiz rahatça ve kapkaççılardan korunsun diye onlara yüksek mertebeden bir üyelik vereceğiz. Bir nevi sanal pasaport.

Mağaza öyle sokak ortasında olmadından her gelen malı elleyemiyor yani.

Üyeler tablomuzu ben aşağıdaki gibi tasarladım ,eğer eksikse siz kendinize göre daha genişini tasarlayın ;)



CREATE TABLE `uyeler` (

`id` int(11) NOT NULL auto_increment,

`ad` varchar(30) NOT NULL default '',

`soyad` varchar(30) NOT NULL default '',

`kullaniciadi` varchar(30) NOT NULL default '',

`Email` varchar(60) NOT NULL default '',

`sifre` varchar(32) NOT NULL default '',

`sesid` varchar(70) NOT NULL default '',

`onay` varchar(30) default '0',

`il` varchar(100) NOT NULL default '',

`ilce` varchar(100) NOT NULL default '',

`semt` varchar(100) NOT NULL default '',

`mahalle` varchar(100) NOT NULL default '',

`adres` varchar(100) NOT NULL default '',

`ceptel` varchar(100) NOT NULL default '',

`tarih` date NOT NULL default '0000-00-00',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin5;




INSERT INTO `uyeler`(`ad`,`soyad`,`kullaniciadi`,`Email`,`sifre`,`onay`) VALUES('Gökçe','ÇİFTÇİ','gciftci','gciftci@gmail.com',MD5('1234'),'1');

Üye girişi için PHP koldarımızı yazalım.



form.html



<FORM method="POST" action="giris.php" method=post>

Kullanıcı adı: <INPUT type=text name="kullaniciadi" value="">

Şifre: <INPUT type="password" name="sifre" value="">

<INPUT type=hidden name="durum" value="giris">

<INPUT type="submit" value="Giriş Yap">

</FORM>






giris.php programımızı yazalım:



<?php

session_start();

$conn = mysql_connect("localhost", "kullanıcıadı", "şifre");

if (!$conn) {

echo "veritabanına ulaşılamadı,kullanıcıadı,şifre yada localhost bilgisi yanlış olabilir: " . mysql_error();

exit;

}

if (!mysql_select_db("veritabanıadı")) {

echo "Veritabanı adı doğru değil, yada yok: " . mysql_error();

exit;

}



if($_POST['durum'] == 'giris'){

$kullaniciadi=htmlentities(mysql_real_escape_string($_POST['kullaniciadi']));

$result = mysql_query("SELECT kullaniciadi,sifre FROM uyeler WHERE kullaniciadi='{$kullaniciadi}'") or die(mysql_error());

$row = mysql_fetch_array($result);

if($row['kullaniciadi'] == ""){

echo "<b>Kullanıcı adınız yada şifreniz hatalı.</b>";

}else{

if($row['onay'] == "0"){

echo "Hesabınızı aktive etmek için Eposta adresinize gönderilen adresi tıklayarak giriş yapmanız gerekir"; exit;

}

$sifre = $_POST['sifre'];

if($row['sifre'] == md5($sifre)){

$_SESSION['kullaniciadi'] = $_POST['kullaniciadi'];

$_SESSION['uye'] = 'uyemiz';

header("Location: hesap.php");

exit;

}

else{

echo "<b>Kullanıcı adınız yada şifreniz hatalı.</b>";

}

}

}else{

header("Location: form.html");

}

mysql_close($conn);

?>





kullanıcımızın bilgileri şayet doğru ise onu hesap.php programına yönlendiriyoruz. Böylece bilgilerini ve siparişini görebilecek.

hesap.php programımızı yazalım ama önce program içinde kullanacağımız sparis tablosunu oluşturalım



Üye tablomuz tamam.Üye girişi için programımızda tamam, Şimdi sıra geldi üyelerimizin bize vereceği sparişi kaydetmeye. Bunun içinde bir tablo oluşturalım. Ben siparis adını vereceğim bu tabloyu aşağıdaki gibi tasarladım.



CREATE TABLE `sparis` (

`id` int(11) NOT NULL auto_increment,

`uyeid` int(11) NOT NULL default '0',

`sparis` varchar(100) NOT NULL default '',

`fiyat` varchar(32) NOT NULL default '',

`adet` int(10) default '1',

`durumu` int(1) default '',

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin5;






şimdilik sipariş tablomuz boş. Yukarıda bir kayıtlı kullanıcımız var onun adına bir sipariş vereceğiz zaten.Ozaman sipariş tablomuza nasıl kayıt yapıldığını göreceğiz.

hesap.php programımızı şimdi yazabiliriz.





<?php

session_start();

$conn = mysql_connect("localhost", "kullanıcıadı", "şifre");

if (!$conn) {

echo "veritabanına ulaşılamadı,kullanıcıadı,şifre yada localhost bilgisi yanlış olabilir: " . mysql_error();

exit;

}

if (!mysql_select_db("veritabanıadı")) {

echo "Veritabanı adı doğru değil, yada yok: " . mysql_error();

exit;

}

if($_SESSION['kullaniciadi'] == '' || $_SESSION['uye'] == ''){

header("Location: giris.php");

exit;

}

$kullaniciadi=$_SESSION['kullaniciadi'];

$result1 = mysql_query("SELECT * FROM uyeler WHERE kullaniciadi='{$kullaniciadi}'");

if (!$result1) {

echo "Sorguda hata var ($sql) sorguyu gözden geçirin: " . mysql_error();

exit;

}

$row1 = mysql_fetch_assoc($result1);

$uyeid=$row1['id'];

$result = mysql_query("SELECT * FROM sparis WHERE uyeid='{$uyeid}'");

if (mysql_num_rows($result) == 0) {

echo "<h2>Hiç siparişiniz yok.</h2>";

echo "Sipariş vermek için lütfen <a href='sepet1.php'>Sipariş sayfası</a> nı tıklayın.";

exit;

}

while ($row = mysql_fetch_assoc($result)) {

echo $row['sparis'] . "- " . $row['fiyat'] . "- " . $row['adet']. "<br>\n";

}

mysql_free_result($result);

mysql_close($conn);

?>



Gelelim veritabanımızda bulunan urunler adlı tablomuzda kayıtlı olan ürünleri ekrana yazdırmaya. Bunun için aşağıdaki kodları yazdım. Sade ve anlaşılır olmasına çalıştım. Ama dileyen dahada karmaşık hale getirebilir ;)



sepet1.php







<?php

$conn = mysql_connect("localhost", "root", "1234");

if (!$conn) {

echo "veritabanına ulaşılamadı,kullanıcıadı,şifre yada localhost bilgisi yanlış olabilir: " . mysql_error();

exit;

}

if (!mysql_select_db("proje")) {

echo "Veritabanı adı doğru değil, yada yok: " . mysql_error();

exit;

}

$sql = "SELECT urunadi, fiyat, resim,detay FROM urunler"; # sorguda DESC ve ORDER BY, GROUP BY ve LIMIT kullanılabilir. Bu size kalmış birşey.

$result = mysql_query($sql);

if (!$result) {

echo "Sorguda hata var ($sql) sorguyu gözden geçirin: " . mysql_error();

exit;

}

if (mysql_num_rows($result) == 0) {

echo "Kayıtlı hiçbir bilgiye rastlanmadı.";

exit;

}

include("sepet2.php");

echo "<table>";

while ($row = mysql_fetch_assoc($result)) {

echo '<tr><TD>

<img src="'.$row["resim"].'" border=0><br>'.$row["urunadi"].' <br>'.$row["detay"].'<br>'.$row["fiyat"].'</TD>

<TD>

<FORM method="POST" action="sepet1.php" method=post>

<INPUT type=hidden name="durum" value=1>

<INPUT type="hidden" name="urun" value="'.$row["urunadi"].'">

<INPUT type="hidden" name="fiyat" value="'.$row["fiyat"].'">

<INPUT type="text" name="adet" size="3" value="1">

<INPUT type="submit" value="Sepete Ekle">

</FORM>

</TD></tr>';

}

echo "</table>";

mysql_free_result($result);

mysql_close($conn);

?>





Kodlarımızı sepet1.php olarak kaydettim ve çalıştırdım. Herşey yolunda. Yani istediğim gibi ürünlerimi ekran fiyat bilgisi ile birlikte ekrana yazdı.

Sipariş için tablomuzu okuttuk ve gereklibilgiler sayfaya yazdırıldı bu tamam. Sıra geldi sepet temin etmeye. Yüksek mertebedeki üyelerimize sepet vermesek ayıp olur. Mallar elde taşınmaz karizmaya zarar. Sonra pişman olup birdaha mağazaya gelmezler. Müşteri veli nimetmizdir.



Capiyto arkadaşımızın yazdığı class kullanacağım. Çünkü gayet kullanışlı.

bu kodlarıda sepet2.php olarak kaydedelim.





<?

session_start();

class sepet {

var $sepetteki_urunler;



function sepet () {

if (isset($_SESSION["sepetteki_urunler"])) {

$this->sepetteki_urunler = $_SESSION["sepetteki_urunler"];

}

}



function sepete_ekle ($urun_no,$adet) {

$this->sepetteki_urunler[$urun_no] = $adet;

}



function sepetten_cikar ($urun_no,$adet) {

if (isset($this->sepetteki_urunler[$urun_no])) {

if ($this->sepetteki_urunler[$urun_no] > $adet) {

$this->sepetteki_urunler[$urun_no] = $adet;

} else {

unset($this->sepetteki_urunler[$urun_no]);

}

}

}



function sepeti_kaydet () {

if (isset($this->sepetteki_urunler)) $_SESSION["sepetteki_urunler"] = $this->sepetteki_urunler;

}



function sepeti_listele () {

if (isset($_SESSION["sepetteki_urunler"])) {

return $_SESSION["sepetteki_urunler"];

} else {

return false;

}

}



function oturum_kapat () {

#session_destroy();

$_SESSION["sepetteki_urunler"]='';

header("Location: sepet2.php");

}

}



?>



<?php

#şimdi yukarıdaki class ile nasıl çalışacağız onu ele alalım.



$yeni_sepet = new sepet;

if ($_POST["durum"]==1) {

$yeni_sepet->sepete_ekle($_POST["urun"],$_POST["adet"]."-".$_POST["fiyat"]);

$yeni_sepet->sepeti_kaydet();

}





if ($_POST["durum"]==2) {

$yeni_sepet->sepetten_cikar($_POST["urun"],$_POST["adet"]);

$yeni_sepet->sepeti_kaydet();

}



if ($_POST["durum"]==3) {

$yeni_sepet->oturum_kapat();

}







if ($_POST["durum"]==4) {



$conn = mysql_connect("localhost", "root", "1234");

if (!$conn) {

echo "veritabanına ulaşılamadı,kullanıcıadı,şifre yada localhost bilgisi yanlış olabilir: " . mysql_error();

exit;

}



if (!mysql_select_db("proje")) {

echo "Veritabanı adı doğru değil, yada yok: " . mysql_error();

exit;

}





if($_SESSION['kullaniciadi'] == '' || $_SESSION['uye'] == ''){

header("Location: giris.php");

exit;

}



$kullaniciadi=$_SESSION['kullaniciadi'];



$result1 = mysql_query("SELECT * FROM uyeler WHERE kullaniciadi='{$kullaniciadi}'");



if (!$result1) {

echo "Sorguda hata var ($sql) sorguyu gözden geçirin: " . mysql_error();

exit;

}



$row1 = mysql_fetch_assoc($result1);



$uyeid=$row1['id'];



$urunler = $yeni_sepet->sepeti_listele();

while (list($anahtar,$deger) = each($urunler)) {



$tutar=explode("-", $deger);

$result= mysql_query("INSERT INTO `sparis`(`uyeid`,`sparis`,`fiyat`,`adet`) VALUES('{$uyeid}','{$anahtar}','{$tutar[1]}','{$tutar[0]}')") or die(mysql_error());



}



if (!$result) {

echo "Sorguda hata var ($sql) sorguyu gözden geçirin: " . mysql_error();

exit;

}else{

echo "bilgileriniz ve siparişleriniz alındı,en kısa zamnda sizinle kontak kurup bilgileri doğruluyacağız.Teşekkür ederiz.";

exit;

}

}



$urunler = $yeni_sepet->sepeti_listele();

$durum=0;

$sepet='<table border=1>';

$toplamtutar=0;



if($urunler){

while (list($anahtar,$deger) = each($urunler)) {



$tutar=explode("-", $deger);

$toplam=$tutar[0]*$tutar[1];

$sepet.= "<tr><td>Ürün ".$anahtar."</td><td>".$toplam." YTL ".$tutar[0].' adet </td>

<td> <FORM method="POST" action="sepet1.php" method=post>

<INPUT type="hidden" name="urun" value="'.$anahtar.'">

<INPUT type="hidden" name="adet" size="9" value="'.$deger.'">

<input type=hidden name="durum" value=2>

<INPUT type="submit" value="Sepeten Sil">

</form></td></tr>';

$durum=1;

$toplamtutar +=$toplam;

}

}else{

echo "<h2>sepetiniz boş</h2>";

}



if($durum){

$bosalt= '<tr><td>&nbsp;</td><td><FORM method="POST" action="sepet1.php" method=post>

<input type=hidden name="durum" value=3>

<INPUT type="submit" value="Sepeti boşalt">

</form></td><td><FORM method="POST" action="sepet1.php" method=post>

<input type=hidden name="durum" value=4>

<INPUT type="submit" value="Gönder">

</form></td></tr>';

$sepet.='<tr><td>Toplam Tutar:</td><td>'.$toplamtutar.'</td><td></td></tr>';

}

$sepet.=$bosalt;

$sepet.="</table>";

echo $sepet;

?>

PHP Güvenlik Kod Uygulaması



güvenlik.php:

<?

function olustur () {

 $sifre = substr(md5(rand(0,999999999999)),-6);

 if ($sifre) {

  session_start();

  $_SESSION["guv"] = $sifre;

  $width  = 100;

  $height =  30;

  $resim  = ImageCreate($width,$height);

  $beyaz  = ImageColorAllocate($resim, 255, 255, 255);

  $rand   = ImageColorAllocate($resim, rand(0,255), rand(0,255), rand(0,255));

  ImageFill($resim, 0, 0, $rand);

  ImageString($resim, 5, 24, 7, $_SESSION["guv"], $beyaz);

  ImageLine($resim, 100, 19, 0, 19, $beyaz);

  header("Content,type: image/png");

  ImagePng($resim);

  ImageDestroy($resim);

 }

}

olustur();

?>



Evet şimdi satır satır açıklayalım....



function olustur () {

bu satırda olustur(); fonksiyonumuzu tanımlıyoruz


$sifre = substr(md5(rand(0,999999999999)),-6);

bu satırda rasgele rand() fonksiyonu ile üretilen degerin md5() fonksiyonu ile şifreleyip subtr() fonksiyonu ile oluşan degerin son 6 karakterini alıp $sifre değişkenimize atıyoruz..


if ($sifre) {

satırı ile $sifre değişkenimiz doğru döndüyse yani bir deger elde edildiyse işlemlere başla dedik


session_start();

oluşan degeri bir oturum değişkenine kaydedebilmek için oturumumuzu başlattık


$_SESSION["guv"] = $sifre;

bu satırda oluşan degerimizi $_SESSION["guv"] oturum değişkenimize atadık. Böyle yapmamızın nedeni diğer sayfalarda buna ulaşabilmek. Eğer ki oluşan değeri bir txt yada benzeri bişeyde tutsaydık bunu bulup güvenliğimizi delip geçebilirlerdi...


$width  = 100;

$height =  30;


bu iki satırda ise oluşturacağımız resmin en ve boy ölçümlerini belirledik yani resmimiz 100x30 boyutlarında olucak...


$resim  = ImageCreate($width,$height);

bu satırda ImageCreate(); fonksiyonu ile belirlediğimiz ölçülerde bir resim yaratıp bunu $resim değişkenine atıyoruz...


$beyaz  = ImageColorAllocate($resim, 255, 255, 255);

bu satırda ise ilerde kullanabilmek için bir renk tanımladık ve rengimizi $beyaz değişkenine atıyoruz...


$rand   = ImageColorAllocate($resim, rand(0,255), rand(0,255), rand(0,255));

bu satırda da bi önceki işlem gibi bir renk tanımladık fakat farklı olarak bu satırda tanımladığımız renk sürekli değişen bir renktir. isterseniz siz bu 2 satırda başka renkleri deneyebilirsiniz...


ImageFill($resim, 0, 0, $rand);

bu satırımızda ImageFill() fonksiyonu kullanarak oluşturmuş olduğumuz resmimizin arkaplan rengini belirledik... Ve bu sürekli değişen bir arkaplan olucaktır. dediğim gibi isterseniz siz bunu sabitleyebilirsiniz...

Görüntü koordinatları, sol üst köşeden başlar (x=0, y=0). Görüntünün sağ alt köşesi ise x=$width y=$height dir. Tipik grafik standartının tam tersi olduğu için bunu unutmayınız...


ImageString($resim, 5, 24, 7, $_SESSION["guv"], $beyaz);

bu satırda ise ImageString(); fonksiyonu ile tanımlamış olduğumuz resim dosyasında belirlediğimiz koordinatlara daha önceden elde ettiğimiz kodu resmimizin üzerine yazdırıyoruz.. burda yazılan yazının rengi beyazdır... burda 24,7 x ve y koordinatlarını temsil etmektedir  burda font 1 ile 5 arasında değişen bir sayıdır.. Bunlar bir dizi yerleşik fontu temsil etmektedir..


ImageLine($resim, 100, 19, 0, 19, $beyaz);

burda ise oluşturduğumuz resmimize bir çizgi çiziyoruz.. yani maksat biraz daha zorlaştırmak... burdaki 100 19 0 19 değerleri ile oynayabilirsiniz daha değişik çizgiler elde etmek için...


header("Content,type: image/png");

bu satırımızda artık oluşan resmimizin tip'ini belirliyoruz ben png olarak belirledim siz isterseniz jpeg olarak da belirleyebilirsiniz..


ImagePng($resim);

bu satırda ise oluşturduğumuz resmi ekrana basıyoruz...


ImageDestroy($resim);

en son olarak resmimiz için ayrılan belleği boşaltıyoruz...


}

}


ile fonksiyonumuzu sonlandırıyoruz


olustur();


diyerek artık guvenlik.php imizi bitiriyoruz...




form.php:


<? session_start(); ?>

<FORM METHOD="POST" ACTION="kontrol.php">

<img src="guvenlik.php"><br>

Güvenlik Kodu:<INPUT TYPE="text" NAME="kod"><br>

<INPUT TYPE="submit">

</FORM>


burda dikkatli olmamız gereken oluşan ve değişen resmimizi <img src=guvenlik.php> şeklinde ekrana göstermemizdir eğer siz guvenlik.php yi include edip ardından olustur(); derseniz ekranda resim yerine abuk subuk karakterler görebilirsiniz...


kontrol.php:

<?

session_start();

if (empty($_POST["kod"]) || empty($_SESSION["guv"]) || !$_SESSION["guv"]) {

 echo "<a href=form.php>Lütfen Form Sayfasına Gidiniz..</a>";

} else {

 if ($_POST["kod"] == $_SESSION["guv"]) {

  echo "Güvenlik Kodu Doğru...";

  unset($_SESSION["guv"]);

  exit;

 } else {

  echo "<a href=form.php>Güvenlik Kodu Hatalı Lütfen Yeniden Deneyiniz...</a>";

 }

}

?>


ilk satırda oturum başlatıyoruz $_SESSION["guv"] oturum değişkenine erişebilmek ve oturum kontrolü için....


if (empty($_POST["kod"]) || empty($_SESSION["guv"]) || !$_SESSION["guv"]) {

bu satırda bazı kişilerin direk güvenlik kodumuzu geçmelerini engellemek için yazdığımız bir dizi güvenlik satırı yazdık...

empty() fonksiyonu ile kod değişkenin gelip gelmediği aynı şekilde $_SESSION["guv"] oluşup oluşmadığı ya da !$_SESSION["guv"] ile ziyaretçi için bir oturum kaydedilmiş mi diye bakıyoruz.. eğer bunlar olmamış ise ekrana form sayfasına gitmeleri için yönlendirme linkini yazdırıyoruz....


Eğer kişi form doldurmuş ise devreye


if ($_POST["kod"] == $_SESSION["guv"]) {

satırı giriyor. burda formdan gelen kod değeri ile oluşan ve session değişkeninde sakladığımız değerleri karşılaştırıyoruz eğer bu 2 deger birbiri ile uyuşuyorsa eşit ise ziyareçiyi bilgilendiriyoruz ve ardından unset() fonksiyonu ile oluşturduğumuz session oturum değişkenini sonlandırıyoruz yani içeriğini yok ediyoruz ve programımızı sonlandırıyoruz..


Eğer gelen değer ile session'da sakladığımız değerler birbirine eşit değilse ziyaretçiyi uyarıyoruz...


Evet bir güvenlik kod uygulaması mantığını anlatmaya çalıştım bu basit bir resim ortaya suncaktır. Siz isterseniz dahada karmaşık bir resim elde edebilirsiniz veya arkaplanda renk yerine kendinizin kareli vb resimlerinizi kullanabilirsiniz yada fontları değiştirebilirsiniz...


GD uygulamaları için http://tr.php.net/gd kütüphanesini inceleyebilirsiniz...


Anlattığım sistemin çalışan hali


http://www.ayva.net/form.php