Bu Blogda Ara

30 Haziran 2010 Çarşamba

Explode Fonksiyonu Nasıl kullanılır?Örnekli açıklama

Belirtilen dizge dizgesini belirtilen ayraç dizgesine göre alt dizgelere ayırıp bunları bir diziye yerleştirir.



// 1. örnek
$pizza = "dilim1 dilim2 dilim3 dilim4 dilim5 dilim6";
$dilimler = explode(" ", $pizza);
echo $dilimler[0]; // dilim1
echo $dilimler[1]; // dilim2

// 2. örnek
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *


?>

implode Fonksiyonu Nedir Ne işe Yarar?

implode Fonksiyonu Dizide bulunan elemanları birleştirip tek bir değişkende toplamamızı sağlar .

Örnek Kullanım :,



$dizideğişkenimiz = array('soyadı', 'eposta', 'telefon');
$virgül_ayraçlı = implode(",", $dizideğişkenimiz);

echo $virgül_ayraçlı;

//Sonuç Aşağıdaki gibi olur
// soyadı,eposta,telefon

26 Haziran 2010 Cumartesi

PHP-Program Denetimi Ve Döngüler

Programlarla veri alış verişinde bulunurken bazen şart koşmak gerekebilir. Bu tip durumlarda aşağıdaki kodları kullanırız.
if(), else, elseif, while, do, while, for, foreach, continue, switch.

Program Denetimi ve Döngüler- If Deyimi :
"if" deyimi PHP dilinde ise anlamına gelir. PHP programlarında en çok kullanılan kontrol deyimlerinden birisidir. Örneğin 3=3 ise doğru (true) değilse yanlış (false) ile geri döner.
Aşağıdaki resimden mantığını kavramak için faydalanabilirsiniz.
http://i45.tinypic.com/241846u.jpg
Yazım şekilleri
if(koşul siz belirliyorsunuz){
(burada ise koşul sağlanıyorsa ne yapılması gerektiğini belirliyorsunuz);
}

Basit bir örnek yapalım.

$a=4;

$b=2;
if($a>$b){
print "4 2'den büyüktür.";
}
?>

Doğru olduğu için ekrana (4 2'den büyüktür.) yazısı gelecektir.
Eğer biz bunu yanlış yaparsak yani ; aşağıdaki kodlar gibi

$a=4;

$b=1;
if ($a<$b){
print "$a küçüktür $b'den."
}
?>

Karşımıza boş bir sayfa çıkacaktır.


Devam edecek...

Php de Yarum satırları Nasıl eklenir?

Bazen yazdığımız kodların hatırlanması ya da başka kişiler tarafından kontrol ve kolay anlaşılması için yorumlarda bulunabiliriz. Genellikle üç çeşit yolda yazılmakta. Bunların örneklerini aşağıdan takip edebilirsiniz.

Örnek 1 :

/*
Konu: PHP Programı
Yazar: phpdersleri.info
Tarih: 12.Ocak.2010
*/
?>

Örnek 2 :

// Buraya yorumlarınızı yazabilirsiniz.
//Buraya yorumlarınızı dilediğiniz kadar yazabilirisiniz
?>

Örnek 3 :

#Bu da başka bir yorum simgesi.
#bu şekilde yorumlara devam edebilirsiniz.
?>

Şimdi gelelim kodlar arasında bu yorum satırlarının kullanılmasına. Aşağıda mantığının anlaşılması açısından basit bir örnek verilmiştir.

Örnek 4 :

//$a değişkenine merhaba kelimesini atadık.
$a="merhaba";
//echo komutu ile $a değişkenin taşıdığı değeri ekrana yazdırdık.
echo $a ;
?>

Örnek 5 :

/* $a değişkenine 5 sayısını atadık
$b değişkenine 6 sayısını atadık
*/
$a=5; $b=6;
// burada if koşulu ile ekrana 5 sayısı 6 sayısından küçüktür yazdıracağız.
if($a>$b) {
echo "5 sayısı 6 sayısından büyüktür.";
}else{
echo "5 sayısı 6 sayısından küçüktür";
}
?>

Konunun başında belirttiğimiz gibi kodlarımızın arasında açıklayıcı ya da hatırlama maksatlı yorumlar yazarız. Bunları PHP yorumlayıcıları göz ardı edeceklerdir.

23 Haziran 2010 Çarşamba

Php ile Nesne Yönelimli Programlamaya Giriş

PHP'den önce C++ veya benzeri bir dille uğraştıysanız, o zaman OOP (Object Oriented Programming) yani Nesneye Yönelik Programlama (NYP) ile tanışmışsınızdır. NYP ile daha önce uğraşmadıysanız gözünüzü biraz korkutabilir, ama aslında pek korkacak bir şey yok. NYP aslında sadece bir programlama yaklaşımıdır.
Mesela C yapısal bir programlama dili, daha sonra çıkan C++ ise nesne yönelimli bir dildir. NYP üstün özellikleri olan bir yaklaşımdır ama hiç kimse C++ ile yapılan bir programın C ile yazılamayacağını söyleyemez. NYP sadece size programlarınızı yazmanız için olaylara daha değişik bakmanızı sağlayan bir yaklaşım sunmaktadır. Nasıl bir yaklaşım mı,nesnelerle çalşmak tabii...

Şimdi diyeceksiniz,yaw kardeşim yıllardır yazıyoz kod, her işimizi de yaptık, nerden çıktı bu nesneler? Ne gibi bi faydası var bunların bize?
NYP'nin getirmiş olduğu pek çok kolaylık ve güzellikler var :

  1. 1- Nesne kavramı,nesnelerin metod ve özellikler içermeleriyle, artık programcının kendisine yüklemiş olduğu değişkenler,durumlar,fonksiyonlar arasında bulunan ilişkileri programcıdan alıp nesnenin depolama özelliği sayesinde nesneye yükleyebiliyor. Programcı kendisine yüklemiş olduğu bu sorumluluğu,nesne kavramı ile halledebiliyor.
  2. 2- Nesne kavramı gerçek yaşam problemlerini programlamaya aktarmada kolaylık getiriyor.
  3. 3- NYP, kalıtım özelliği sayesinde, yazılan kod başka amaçlar için ek özellikler eklenerek tekrar kullanılabiliyor.
  4. 4- NYP,ile yazılan kod daha okunabilir ve anlaşılabilir oluyor.
  5. 5- NYP ve kalıtım programcıların kollektif çalşmalarına olanak sunuyor.
  6. 6- Zor problemleri sunduğu yaklaşım ile daha kolay ve hızlı çözülebilir hale getiriyor.

Şimdi de bu yazdıklarıma bakarak diyeceksiniz,yaw neymiş bu NYP, iyice merak ettik... :-)

Aslında NYP daha çok büyük çaplı projelerde kullanılmak üzere tasarlanmştır.Varolan bir projenizi NYP yaklaşımı ile olduğundan daha karmaşık bir şekle de sokabilirsiniz. Ama yukarıda belirttiğim gibi tekrar kullanılabilir,daha okunaklı,sonradan geliştirilmeye açık kod yazmak istiyorsanız ne olursa olsun NYP tam size göre...

Nesne de nesne ? Nedir bu nesne?
Class'lar aslında değişkenler ve fonksiyonlardan oluşan paketler gibidirler.Değişkenlere 'özellik', fonksiyonlara 'metod' denir. Class'lar sadece kendilerinden oluşturulucak nesnelerin yapılarını gösteren tanımlamalardır.
Mesela


class ogrenci{

//özellikler
var $ad;
var $soyad;
//metodlar
function isim_ata($str)
{$this->ad=$str;}
function soyadi_ata($str)
{$this->soyad=$str;}
}
$murat = new ogrenci;
Şu an için yukarıdaki kodun ne anlama geldiğini anlamanıza gerek yok- birazdan geçeceğiz -sadece şunu görmeniz gerek. Öncelikle ogrenci adlı bir class tanımladık. 'ogrenci' class tanımlaması ile ogrenci class'ı ile oluşturulacak nesnelerin özellik ve metodlarını belirlemiş ve tasarlamş olduk. Şu ana kadar herhangi hafızada yer kaplayan bir şey yapmş olmadık. Ama aşağıdaki satır ile varolan bu class yapısından bir nesne oluşturuyoruz.
$murat = new ogrenci;
Artık hafızada bu class yapısının bir kopyası oluşturulup, $murat isimli değişkene atanmş oldu.Aynı şekilde
$mustafa = new ogrenci;
dediğimizde yine hafızada bir kopya daha oluşturulup $mustafa isimli değişkene atanıyor.


PHP ve Nesneler :
Yukarıda da bir giriş yaptığımız üzere artık soyut konuşmayı kesip hemen PHP'nin NYP syntax'ına geçelim. PHP C++ ve JAVA kadar güçlü bir şekilde NYP'yı desteklemese bile bu konuda oldukça iyi olduğunu söyleyebiliriz. Çünkü sonuçta PHP standalone programlar (.EXE programlar) geliştirmek için değil de web üzerinde çalşmak için tasarlanmş bir dildir.Bu yüzden diğer dillere göre daha zayıf bir NYP anlayşı vardır. Java veya c++ ile uğraşanlar için söyleyelim, Multi inheritance,tam anlamıyla depolama,destructor fonksiyonlar desteklenmemektedir. Neyse,geçelim...
Sınıf tanımlaması class kelimesi ile yapılır, tanımlama içinde sınıf metodları ve özellikleri tanımlanır.


class ogrenci {

//özellikler
var $ad;
var $soyad;
//özellikler

function ogrenci(){
echo "Ögrenci olusturuldu...";
}
}

?>
Sinif tanimlandiktan sonra sinifi program
içinde kullanmak istedigimizde new operatörünü kullaniriz.
$mustafa = new ogrenci;
?>
Bu andan itibaren hafızada bir ogrenci sınıf kopyası oluşturulur ve $mustafa isimli değişkene atanır. Artık $mustafa isimli bir değişkeni kullanarak sınıfın metod ve özelliklerine erişebiliriz.Bu iş için '->' operatörü kullanılır.


$mustafa = new ogrenci;

$mustafa->ogrenci();
echo $mustafa->ad;
echo $mustafa->soyad;
?>

Bu arada dikkat ettiyseniz ogrenci sınıfının ogrenci isimli bir metodu var. Sınıf adıyla aynı isme sahip olan fonksiyonların NYP'da özel bir durumları vardır. Bu fonksiyonlara constructor denir. Yani $mustafa = new ogrenci; ile yeni bir nesne oluşturulduğunda yapılan bir sonraki iş sınıf yapısı içinde constructor fonksiyon varsa onu işlemektir. Mesela $mustafa=new ogrenci; çalştırıldığında

1- Hafızada sınıf yapısının bir kopyası oluşturulacak
2- Constructor fonksiyon - yani ogrenci - çağrılacak ve ekrana 'Öğrenci oluşturuldu' yazılacaktır.

Şimdi NYP'ya biraz alştığımıza göre sınıf yapımızı daha düzgün bi şekle getirelim :


class ogrenci {

var $ad;
var $soyad;
function ogrenci ($isim,$soyisim){

$this->ad=$isim;
$this->soyad = $soyisim;
}
}

$mustafa = new ogrenci ("Mustafa","Karabulut");
echo "Yeni ögrenci:". $mustafa->ad." ".$mustafa->soyad;
?>

Öncelikle şunu söyleyeyim constructor fonksiyonlar parametre kabul edebilirler,eğer constructor için parametre söz konusu ise yeni nesne oluşturulurken bu parametrelerde verilmelidir. Burada yeni bir şeyler gözünüze çarpmş olmalı: $this ...
Normalde class özelliklerine ve fonksiyonlarına değişken adı ve '->' operatorü ile erişebiliyoruz. Peki ya henüz daha bir değişken oluşturulmadığı durumlarda,sınıf henüz tasarlanırken yani sınıf tanımlaması içinde sınıfın özelliklerine nasıl erişeceğiz. şte burada '$this' devreye girmekte ve içinde bulunulan sınıfın özellik ve metodlarına erişimde kullanılmaktadır.

Bilmemiz gereken bir iki nokta var:
1-Constructor fonksiyonlar nesne oluşturulduğunda otomatik çağrıldıkları için nesnenin ilk özellik ve işlemlerini yaptırmak için oldukça uygundurlar. Eğer bir constructor kullanmıyorsak bu tür ilk atamaları kendimiz bir şekilde yapmak zorunda kalırız.Bu açıdan çoğu durumda constructor kullanmak oldukça avantajlıdır.
2- C++ ve Java'da olduğu gibi destructor fonksiyonlar yoktur.

Kalıtım :
NYP'nin belki de en güzel özelliklerinden birisi de miras kavramıdır. Genellikle benzer özellikler taşıyan sınıflarda aynı özelliklerin tekrar tekrar yazılmasını önler. Varolan bir sınıf yapısına sadece bir kaç özellik daha ekleyerek hem yeni sınıf yapısını elde etmiş ,varolan kodu tekrar kullanılır yapmş ve aynı şeyleri tekrar yazmaktan kurtulmuş olursunuz.
Kalıtım olayı PHP'de extends anahtar sözcüğü ile yapılır.Örneğin :


class ogrenci {

var $ad;
var $soyad;
function ogrenci()
{}
}
class liseli extends ogrenci{

var $lise_adi;
function liseli($isim,$soyisim)
{
$this->ad=$isim;
$this->soyad=$soyad;
}

function set_lise_adi($str)
{
$this->lise_adi=$str;
}
}

?>
// Böylece liseli adli ogrenci sinifinin bütün özellik ve

// metodlarini barindiran, ayni zamanda kendine has '$lise_adi'
// ve 'liseli','set_lise_adi' metod ve özelliklerine sahip bir
// sinif yazms olduk.

$murat = liseli ("murat","hüdevandigar");
$murat->set_lise_adi("bilmem ne lisesi");
echo "Ögrencimiz : ".$murat->ad." ".$murat->soyad;
echo "
Okulu :" .$murat->lise_adi;
?>

Çok şık di mi ? Sadece kodu bir kere yazıp, çok değişik yerlerde kullanabiliyoruz. Tabii bir kaç nokta var dikkat edilecek :
1- 'liseli' sınıf kopyası hafızada oluşturulduğunda constructor fonksiyon olarak 'liseli' fonksiyonu çağrılır ve 'ogrenci' fonksiyonu çağrılmaz. Çünkü PHP4'de kural şöyledir :
a. Eğer sınıf adına sahip bir fonksiyon varsa onu çağır
b. Eğer yoksa taban sınıfın constructor fonksiyonunu çağır.

NOT:PHP3'de b kuralı geçerli değildir. Sadece a.kuralı geçerlidir.
2-üst sınıf içinde alt sınıf ile aynı isimde bir fonksiyon varsa, üst sınıfın fonksiyonu geçerlidir.


class a {

function c()
{echo "AAA";}
}
class b extends a{
function c()
{echo "BBB";}
}

$letter = new b;
$letter->c();
?>
Ekrana ne yazacak ? Ekrana "BBB" yazılacaktır. Çünkü üst sınıfın fonksiyonu alt sınıfın fonksiyonunun üstüne yazılmştır.
3- Peki alt sınıfın aynı isimli bir fonksiyonunu üstüne yazılıyorsa, alt sınıftaki aynı isimli fonksiyona erişmek için ne yapacağız ? Mesela yukarıdaki örnek için ekrana 'AAA' yazdırmamız gerekiyor ise ne yapacağız ? Burada 'parent::' anahtar kelimesini kullanacağız.


class a {

function c()
{echo "AAA";}
}
class b extends a{
function c()
{
parent::c();
echo "BBB";
}
}

$letter = new b;
$letter->c();
?>
parent::c() ile bir alttaki sınıfın c() fonksiyonunu çağırıyoruz. Böylece bu örnekte ekrana :
AAABBB yazılacaktır.

Buraya kadar NYP,Class,PHP'nin NYP syntax'ını gördüğümüze göre şimdi de güzel bir örnek ile bilgilerimizi pekiştirelim...


Dosyalama islemlerini yapan basit bir sinif yapisi:
Böylece hem dosya işlemlerini yapan fonksiyonları inceleyip hem de sınıf kullanarak NYP kavramına biraz daha ısınalım.
Şu işlemleri yapan bir sınıf yazalım :
1- Dosyaya kayıt ekleyen
2- Dosyadan kayıt silen
3- Dosyada kayıt arayan


######################################################

# #
# Coded By : Mustafa Karabulut (mkarabulut@ceviz.net) #
# Purpose : Just to share knowledge #
# Respect please: Do not sell or republish,reuse without #
# permission of the owner #
# #
# #
# Stand firm in the straight path as you are commanded #
#######################################################
class filemanager{

var $filepath;
var $records;
var $recordSep;
var $fieldSep;
var $error;
function filemanager($file,$rsep="\r\n",$fsep="|"){
//dosyayi aç
if ($dosya = @fopen ($file,"r")){
//tüm dosyanin içeriğini oku ve
$content=fread($dosya,filesize($file));
//bütün içeriği kayitlara parçala
$this->records=explode($rsep,$content);
//kayit ve alan ayraçlarini belirle
$this->recordSep=$rsep;
$this->fieldSep =$fsep;
//dosya path
$this->filepath=$file;
} else {
$this->error[]="$file açilamadi";
}
@fclose($dosya);
} // function file manager sonu
function add_record ($newrecordarray){
//diziyi kayit formatina getir
$newrecordstr=implode($this->fieldSep,$newrecordarray);
//kaydi ekle
$this->records[]=$newrecordstr;
}
function delete_record($recordnumber){
$first_slice = array_slice($this->records,0,$recordnumber);
$second_slice = array_slice($this->records,$recordnumber+1);
$this->records = array_merge($first_slice,$second_slice);
}
function find_record($recordname){
//sadece isme göre arar
for($i=0;$irecords);$i++){
$fields=explode($this->fieldSep,$this->records[$i]);
if ($fields[0]==$recordname){
return $i;
}
}
}
function update_file(){

//kayitlari dosya formatinda birlestir
$recordstr=implode($this->recordSep,$this->records);
$dosya=fopen($this->filepath,"w");
fwrite($dosya,$recordstr);
fclose($dosya);
}
} // class sonu
Şimdi biraz açıklama yapmamız gerek sanırım :-).

Önce dosyamızın ve programımızın çalışma mantığı üzerine bir şeyler söyleyelim. Dosyamızda kayıtlarımızı ve kayıtların alanlarını ayırmak için özel karakterler kullanıyoruz.Mesela
Mustafa|Karabulut|Programcı'\r\n'Şahin|Gür|Webmaster

Her kaydı \r\n karakterleri ile ayırıyoruz. Bu Windows sistemlerde alt satıra geçme karakteridir.Text dosyamızı notepad ile açtığımızda her kaydın bir satır teşkil ettiğini görürsünüz. Dosya yapımıza göre her kayıt 3 alandan oluşuyor. İsim,soyisim ve meslek... Kaydın alanlarını ayırmak için ise '|' karakterini kullanıyoruz.


function filemanager($file,$rsep="\r\n",$fsep="|"){

...
}

Constructor fonksiyon tek parametre,isteğe göre 2 veya 3 parametre ile çalışabiliyor.İlk parametre kesin verilmesi gereken dosya adı-dosyanın yolu desek daha doğru olur-,2. ve 3. parametreler ise eğer verilirse dosya için geçerli kayıt ve alan ayraçlarını belirliyor.Örneğimizde bu değerler için default parametreler verdiğimizden,bunları yazmazsak bahsettiğimiz değerler kullanılacak.
Constructor'da dosya açılıp,bütün içeriği okunduktan sonra içeriği kayıt ayraç karakteri ile parçalayıp tüm kayıtları bir diziye atıyoruz.Bunu explode fonksiyonu ile yapıyoruz.
$this->records=explode($rsep,$content);
Explode fonksiyonu kısaca,ikinci parametresi ile verilen stringi birinci parametredeki stringe göre parçalar ve her elemanı bir diziye atar.

Örneğin:


Örneğin:


$str="Mustafa#Karabulut#Sahin";

$dizi=explode("#",$str);
/*
artik
$dizi[0]="Mustafa";
$dizi[1]="Karabulut";
$dizi[2]="Sahin";
*/
?>
Explode fonksiyonunun tam ters işlemini ise implode yapmaktadır.Kısaca verilen bir diziyi istenilen bir karakter ile birleştirip bir string verir.Mesela yukarıdaki $dizi değişkenini kullanırsak :


$yeni_str=implode("&",$dizi);

/*
$yeni_str="Mustafa&Karabulut&Sahin";
*/
?>

Diğer sınıf metodlarımız ise adlarından anlaşılacağı üzere kayıt ekleme,kayıt bulma ve kayıt silme işlemlerini yapıyor. Ama gene de program içinde kullandığımız bir kaç fonksiyonu burada anlatsak iyi olur heralde:

array_slice: Bu fonksiyon verilen bir dizi içinden belirli bir parçayı alıp yeni bir dizi geri dönderir. Kullanımı:


array_slice($eski_dizi,$baslangicindis,$kac_tane);

$dizi = array ("Mustafa","Karabulut","Sahin","Gür");
$yeni_dizi=array_slice ($dizi,0,2);
$yeni_dizi2=array_slice($dizi,2,2);
$yeni_dizi3=array_slice($dizi,2);
?>

Şimdi bakalım: $yeni_dizi değişkenine $dizi değişkeninin 0.elemanından itibaren 2 eleman atıyoruz.Böylece $yeni_dizi dizisinde "Mustafa","Karabulut" elemanları var artık.
$yeni_dizi2,ise 2. elemandan itibaren 2 eleman alıyor, yani elemanları "Şahin" ve "Gür".
Son kullanımda ise değişik bir şey var,fonksiyona son parametre verilmemiş, eğer fonksiyona son parametre verilmezse,verilen 2. parametreden itibaren dizinin sonuna kadar olan bütün elemanlar atılır.Yani
$yeni_dizi3 dizisinde 2.elemandan itibaren $dizi dizisinin sonuna kadar olan bütün elemanlar atılır.Bu da "Şahin" ve "Gür" demek oluyor.

array_merge : Verilen iki veya daha fazla diziyi birleştirip bir dizi geri dönderir.


$dizi = array_merge ($yeni_dizi,$yeni_dizi2);

$dizi2= array_merge ($yeni_dizi,$yeni_dizi2,$yeni_dizi3);
?>

Oldukça basit bir kullanımı var di mi ?

Herneyse bu açıklamalardan sonra gelelim, sınıf yapımızı kullanan bir örnek yazmaya, aşağıdaki koda bir bakın:


//örnek kullanım


$filem=new filemanager("deneme.txt");

$filem->add_record(array("Mustafa","Karabulut","Programci"));
$filem->add_record(array("Erdal","güler","The Bozo"));
$filem->add_record(array("Sahin","Gür","WEpmaster"));
$filem->add_record(array("Hakan","Mustak","Coder"));
$filem->add_record(array("billy","GAtez","Windowzcu"));
$silinecek= $filem->find_record("Mustafa");
echo "$silinecek kaydi silinecek...";
$filem->delete_record($silinecek);
//her zaman bunu yaparak bitirmemiz gerekiyor

$filem->update_file();
?>

Gördüğünüz gibi sınıf yapınısını bir kere yazdıktan sonra,sınıfı metodları kullanarak oldukça şık,zarif kodlar ortaya çıkabiliyor. Kod karmaşıklıktan kurtulup daha okunabilir bir hale geliyor. Kendinizi sanki PHP'nin built-in sınıflarını ve fonksiyonlarını kullanıyor gibi hissediyorsunuz.Ayrıca başkaları da sizin sınıf ve metdolarınızı kullanarak kendi kodlarını yazabiliyor. Bu da kodun taşınabilir ve tekrar tekrar kullanılabilirliğini artırmış oluyor.

Herneyse,bu örnek ile beraber, NYP'ya bir adım atmış olduk. Yukarıdaki sınıf yapısını daha da geliştirebiliriz aslında. Mesela constructor fonksiyonda,sınıfın error özelliğini kullandık ama diğer fonksiyonlarda kullanmadık. $this->error kullanılarak sınıfa get_last_error,get_all_errors,error_exists gibi kontrol metodları ekleyebilirsiniz. Bu metodları kullanarak fonksiyonların istenmeyen bir iş yapmasını engelleyebilirsiniz. Mesela olası bir dosya açılma hatası olmuşsa,delete_record metodunun çalışmasını durdurabilirsiniz.


function error_exists(){

if (isset($this->error)){
return true;
} else {
return false;
}
}
function delete_record($num){
if (!$this->error_exists){
// islemleri yap
}
}
?>

Aynı şekilde diğer metodlarıda istenmeyen durumlara karşı koruyabilirsiniz.

Şimdilik bu kadar. Gelecek yazıda görüşmek üzere.Bu yazı hakkındaki eleştirilerinizi,görüşlerinizi ve yayınlanmasını istediğiniz yazı konularını hem forumlarımıza yazabilir hemde mkarabulut@ceviz.net adresine postalayabilirsiniz.

21 Haziran 2010 Pazartesi

jQuery ve PHP ile Basit Ajax Uygulama Örneği

Bu yazımızda JQuery kütüphanesini kullanarak örnek bir Ajax uygulaması oluşturacağız. Uygulamadan özetle bahsedecek olursak formdaki 2 adet inputa girilen sayıları toplama işlemine tabi tutuyor. İhtiyacımız olanlar bir adet JQuery kütüphanesi ;) Buradan indirebilirsiniz. Dosyamızı indirip sayfaya dahil etmek yerine Google‘dan dahil ediyoruz, bunun pek çok nedeni var, fakat en önemlisini açıklayalım. Kullanıcı eğer daha önce sayfasına jQuery‘yi bu şekilde dahil eden bir siteye girmişse, bizim sitemize girdiği zaman tarayıcı jQuery.min.js dosyasını bir daha indirmiyor, önbellekten alıyor, böylelikle çok daha hızlı bir hizmet sunmuş oluyoruz.Şimdi form.html adında yeni bir html dosyası oluşturup kütüphaneyi sayfamıza dahil etmeliyiz, bunu da şu şekilde yapıyoruz;

1

Artık sayfamızda JQuery nin tüm nimetlerini kullanabiliriz. Şimdi hemen örnek ajax uygulamamızı yapmaya başlıyoruz, ajax_fonk adında bir adet fonksiyon oluşturuyoruz, bu fonksiyon formumuzu ajax.php sayfasına ajaxla post edecek ve ajax.php den dönen veriyi de “sonuc” adlı div in içerisinde gösterecek;

01

Sayfamıza bir adet form ekliyoruz, fonksiyon bu formdaki bilgileri ajax.php ye post ediyor;

01<form id="hesapform" name="hesapform" action="javascript:ajax_fonk();">
02
03<label for="s1">Sayı 1label>
04<input id="s1" name="s1"><br />
05
06<label for="s2">Sayı 2label>
07<input id="s2" name="s2"><br />
08
09<label for="topla">label>
10<input id="topla" name="topla" value="Sayıları Topla" type="submit">input>
11form>
12
13<div id="sonuc">div>

Gördüğümüz gibi hesapform adlı formun action eventinde daha önce yazdığımız fonksiyonu çağırıyoruz ve formu ajaxla post etmiş oluyoruz. Bir de “sonuc” adında boş bir div oluşturduk, sonucu bu div in içerisinde göstereceğiz. html sayfamız şimdilik bitti, şimdi ajax.php sayfamıza geçiyoruz, burda formdan gelen verileri toplama işlemine tabi tutacağız ve sonucu göstereceğiz; ajax.php adında bir php sayfası oluşturuyoruz, içeriği şöyle;

1
2 $s1 = $_POST['s1'];
3 $s2 = $_POST['s2'];
4
5 if ((!($s1==""))or(!($s2==""))) {
6 $sonuc = $s1 + $s2;
7 echo $sonuc;
8 }
9?>

Herşeyi eksiksiz yaptıysak sorunsuz bir şekilde çalışması lazım.

Özetle ne yaptığımızı anlatalım, $s1 ve $s2 adında 2 değişken oluşturuyoruz ve formdan gelen verileri bu değişkenlere atıyoruz. daha sonra bu verilerden herhangi birisinin boş olup olmadığını kontrol ediyoruz, eğer ikisi de doluysa bu 2 sayıyı toplayıp sonucu $sonuc değişkenine atıyoruz ve echo komutuyla sayfaya basıyoruz.

Uygulamanın çalışır haline burdan ulaşabilirsiniz.

Bir dahaki yazımızda görüşmek üzere, hoşçakalın,..

PHP ile Google Ajax Search API Kullanımı

Merhaba,

Size daha eski yazılarımda JSON’dan bahsetmiştim ve genelde sitelerin API’lerinde kullanıldığından bahsetmiştim. Bu yazıda Google Ajax Search API kullanımını anlatacağım. API normalde javascript ile kullanım için hazırlanmış fakat diğer dillerle de çeşitli yöntemlerle kullanmak mümkün. Biz PHP ile birlikte CURL kullanacağız. Çıktı, JSON formatında olacak, daha sonra önceki yazıda anlattığım şekilde JSON çıktısını işleyip kafamıza göre kullanabileceğiz.

Çok önemli bir nokta; kim olduğumuzu Google’a söylememiz gerekiyor. Bunun için CURL da referer bilgisini kendimiz elle giriyoruz. API key girmemizi de istiyor, fakat zorunlu değil. O yüzden göz ardı ediyoruz. Sonuçlar google.com.tr deki sonuçlardan farklı olabilir. Çünkü API, google.com daki sonuçları veriyor bize.

Hemen işe koyulalım;

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Hüseyin%20KELEŞ

bu adresi tarayıcımızda çalıştırdığımızda google.com’da “Huseyin KELEŞ” diye aratıp sonuçları JSON formatında almış olacağız, ekranda gördüğünüz şey JSON formatında arama sonuçlarıdır. Birazdan PHP ile aynı şeyi yapacağız.

Yeni bir PHP dosyası oluşturuyoruz, içeriği aşağıdaki gibi olacak;

01
02 $aranacak = "Hüseyin KELEŞ";
04
05 // REFERER'a dikkat!!
06 $ch = curl_init();
07 curl_setopt($ch, CURLOPT_URL, $url);
08 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
09 curl_setopt($ch, CURLOPT_REFERER, "http://www.whosayin.com/");
10 $cikti = curl_exec($ch);
11 curl_close($ch);
12
13 // JSON çıktısını aldık, json_decode ile işledik.
14 $json = json_decode($cikti);
15
16 // $json değişkeninde ne varsa ekrana basıyoruz.
17 print_r($json);
18?>

Sayfayı çalıştırdığınızda ekranda “Hüseyin KELEŞ” için arama sonuçlarını görüyor olmanız lazım.

Başka bir yazıda buluşmak üzere,..

Ajax ve PHP İle Komple Proje Yönetimi

Bildiğiniz üzere PHP, Web (ağ) uygulamaları geliştirmede kullanılan bir programlama dilidir. Ajax ise JavaScript, DOM ve XMLHttpRequest teknolojisinin kombinasyonu sayesinde sunucu ile kullanıcı arasında dinamik etkileşimler kurulmasını sağlayan bir Ağ tekniği olmakla beraber; yeni bir programlama dili değildir.

Bu makalede size PHP, Ajax ve veritabanı olarak MySQL altyapısını kullanarak dinamik bir Ağ uygulamasını nasıl geliştireceğinizi, hepsinin ötesinde; bunu komple bir proje olarak ele alıp, ufak ölçekli bir projenin başından sonuna kadar nasıl hayata geçirileceğini adım adım anlatacağım.


I. Başlarken
Proje geliştirmek, ama nasıl?
Hazır sınıflar ve kullanımı
II. Kod adı: nMembership
Macromedia® Dreamweaver 8®, Yeni site oluşturmak
Dosya ve klasör yerleşimi
MySQL™ 5.0 ile veritabanı oluşturmak ve ezSQL
III. Klasörler yavaş yavaş dolarken...
Peki ne yapacağız bilen var mı?
Herşeyden önce altyapı
Prototype'im benim
Kendi sınıfını kendin yaz
Ortaya yeşillik: Ajax
IV. Daha dinamik, daha estetik
Efektler, efektler...
Küçük detaylar
V. Kaynaklar, tavsiyeler
İndirme kaynakları
Bunları okuyun


Proje geliştirmek, ama nasıl?
Yapılan araştırmalara göre günümüzde Ağ uygulamalarının %40 gibi bir oranı PHP dilini kullanıyor. Web 2.0 ile birlikte patlama yaşayan uygulamalar içindeki oranı ise hemen hemen %80 civarında. Her ne kadar Ajax işin içine katıldığında Ruby ile kıyasıya bir rekabet içerisinde olsa da, uygulama geliştiriciler için PHP halen popüler bir ortam.

Bir uygulamayı dağınık kod ve dosya yapıları ile geliştirmek; test aşamasında meydana gelebilecek aksaklıkları gidermek ve proje sonunda doğabilecek artı istekleri gerçekleştirmek açısından geliştirici için oldukça büyük sıkıntılar doğurur. Bunun yerine bir disiplin içerisindeki kişisel standartlarla, kendi çizdiğimiz prosedürlerle hareket etmek, her zaman için daha iyi verim almamızı ve problem tespiti/giderme işlemlerinde sürate olanak sağlar.

elbette zorlu bir parkurun eşiğinde olabilirsiniz. Fakat bu makalenin esas amacının, size bu yeteneği ve mantık yapısını kazandırmak olduğunu bilmenizi istiyorum. Dilerseniz kaynaklar bölümünde bunu sizin için daha önceden yapmış arkadaşların Framework (Uygulama geliştirme ortamı, O.K.)'lerini bulabilirsiniz. Ama burda kendi ortamımızı yaratıp, bir standardizasyon sağlamaya çalışacağız.

Hazır sınıflar ve kullanımı
Her ne kadar kendi ortamımızı yaratacağız derken, "yazılmışı var ama biz niye yazmıyoruz" edalarıyla hava atmaya çalışsam da, Kuzey Buz Denizi'ni yeniden keşfetmeye gerek yok sanırım. Tabiki iyi yazılmış sınıfları yerinde ve uygun ölçüleriyle kullanmak her zaman için iyi olacaktır.

PHP sınıflarını aramak için benim takip ettiğim yegane site şu an için PHPClasses.org. Üye olduğunuz taktirde her gün siteye yeni eklenen sınıflar hakkındaki kısa bilgilieri e-posta adresinize göndermekten üşenmiyorlar. Prototype ise JavaScript kütüphaneleri içerisinde en gelişmiş ve en popüler olanı. Kullanımını anlatan kaynak sıkıntısına ise Sergio Pereira, Developer Notes for prototype.js başlıklı makalesinde oldukça güzel bir çözüm getirmiş.

Hazır PHP sınıflarının kullanımı, sınıfın özelliklerine ve kullanım alanına göre değişmektedir. Sınıf yazımında ortak bir yazım standardı uygulanamayacağı için geliştiriciler sınıf dosyalarıyla beraber sınıfın nasıl kullanılacağını anlatan bir/birkaç örnek uygulamayı da sunmaktalar.

Üstünkörü tarif etmektense ufak (?) bir sınıf yazıp bunu nasıl kullandığımızı, örneklerle açıklamak istiyorum. Aşağıda görebileceğiniz ornek_sinif adındaki sınıfımız içinde dört adet fonksiyon bulunuyor. Bunlar; sınıfın içindeki genel değişkenleri, sabitleri vs. belirleyen ornek_sinif(), toplama işlemini gerçekleştiren topla(), çarpma işlemini gerçekleştiren carp() ve tüm fonksiyonları bir arada kullanabilmemizi sağlayan islem() adlı fonksiyonlarımız. Tüm fonksiyonlarımız argümanlarını array (dizi değişkeni) olarak alıyor. Bu nedenle toplama, çarpma ve toplu hesap işleminde herhangi bir rakam kısıtlaması yok. Önce fonksiyona göz atın ve ardından bu sınıfımızı nasıl kullanacağımıza bakalım.

PLAIN TEXTPHP:
class ornek_sinif {
var $hesaplayan;

function ornek_sinif()
{
$this->hesaplayan = "Onur Köse";
}

function carp($rakamlar)
{
$carpma_sonuc = 0;
$sayac = 0;

if ( !is_array($rakamlar) )
return 0;

foreach ( $rakamlar as $rakam )
{
$carp_cache = 0;

if ( $sayac == 0 )
{
$carpma_sonuc = $rakam;
$sayac = 1;
}
elseif ( $sayac == 1 )
{
$carp_cache = $carpma_sonuc * $rakam;
$carpma_sonuc = 0;
}

$carpma_sonuc += $carp_cache;
}

return $carpma_sonuc;
}

function topla($rakamlar)
{
$toplama_sonuc = 0;

if ( !is_array($rakamlar) )
return $toplama_sonuc;

foreach ( $rakamlar as $rakam )
$toplama_sonuc += $rakam;

return $toplama_sonuc;
}

function islem($degerler)
{
$islem_sonuc = 0;

if ( !is_array($degerler) )
return $islem_sonuc;

for ( $i = 0; $i switch ( $degerler[islemler][$i] )
{
case "topla":
$islem_sonuc += $this->topla($degerler[rakamlar][$i]);
break;
case "carp":
$islem_sonuc += $this->carp($degerler[rakamlar][$i]);
break;
}

$islem_sonuc = "Hesaplayan: ".$this->hesaplayan."\nSonuç: ".$islem_sonuc;

return $islem_sonuc;
}

}

Bir sınıfı kullanmak için öncelikle sınıfı bir nesne olarak ele almalıyız.

$hesapla = new ornek_sinif();

Artık $hesapla adlı değişkenimizi ornek_sinif() nesnesine eşitledikten sonra sınıfımıza ait fonksiyonları $hesapla değişkeni üzerinden kullanabiliriz. Örnek olarak bir toplama işlemini;

echo $hesapla->topla( array(5, 5, 3, 4, 6) );

şeklinde hesaplattıktan sonra ekranda elde edeceğimiz çıktı (5+5+3+4+6) 23 olacaktır. Bir çarpma işlemi yaptırmak istersek;

echo $hesapla->carp( array(5, 5, 2, 2) );


ile ekrana (5x5x2x2) 100 yazdıracağız. Hepsinin sonunda tek bir satırda tüm işlemleri istediğimiz kadar kullanmamızı sağlayan islem() fonksiyonunu ise şu şekilde kullanabiliriz -çok dizi değişkeni kullanıldığından açarak yazıyorum-;

PLAIN TEXTPHP:
echo $hesapla->islem(
array(
"islemler"=>array(
"topla", "carp"
),
"rakamlar"=>array(
array(5, 5, 3, 4, 6),
array(5, 5, 2, 2)
)
)
);


Gördüğünüz üzere hazır sınıflar, nasıl kullanılacakları anlatıldığı taktirde oldukça basit ve kullanışlıdır
Macromedia® Dreamweaver 8®, Yeni site oluşturmak
Çoğu DW (Dreamweaver) kullanıcısının bilmediği ya da bildiği halde nimetlerinden nasıl yararlanacağı hakkında fikri olmadığı için kullanmadıkları bir konuya değinmek istiyorum. DW'da Site oluşturmak ve kullanmak hakkında anlatacaklarım, projelerinizi kontrol altında tutabilmek açısından oldukça faydalı olacaktır.

1. DW'da yeni bir Site oluşturmak için önce üst menüdeki "Site"ye, ardından açılan menüdeki "New site" sekmesine tıklayın.
DW

2. Açılan pencerenin üstünde "Basic" ve "Advanced" başlıklı iki adet sekme bulunmaktadır. Bunlardan "Basic" yazanına tıklayarak devam edelim. "What would you like to name your site?" başlıklı alana projemize verdiğimiz ismi yazalım. Ben bu projemizi "nMembership" olarak adlandırdım. Ardından "What is the HTTP address (URL) of your site?" başlıklı alana da bilgisayarınızdaki ya da ücreti mukabili kullandığımız -bir hosting firmasından satın aldığımız- sunucumuzun yayın yaptığı adresi yazalım. Ben bu alana projeyi kendi bilgisayarımda yürüttüğüm için "http://localhost/n_membership/" adresini girdim. Bilgileri girdikten sonra aşağıdaki "Next" butonuna tıklayın.


"Basic" ve "Advanced"
3. Geldiğimiz aşamada iki seçenek bulunuyor. Olayın özünü anlattığım için ben bu aşamayı "No, I don't want to use a server technology." seçeneğini işaretleyerek geçtim.

4. Bu aşamada -Testing Files- proje dosyalarımızı bulunduracağımız klasörün fiziksel adresini girmemiz gerekiyor. Eğer proje dosyaları kendi bilgisayarınızda yer alacaksa "Edit local copies on my machine, then upload to server when ready (recommended)" seçeneğini işaretledikten sonra altındaki alanın yanındaki klasör simgesine tıklayarak gerekli klasörü belirtin ve "Next" butonuna tıklayın.

5. Son adım olan "Sharing Files" aşamasında uygulamamızı bitirdiğimizde hangi ortamda yayınlayacağımızı belirtmemiz gerekiyor. Eğer projenizi bir sunucuda yayınlamak istiyorsanız buradaki "How do you connect to your remote server?" alanından "FTP"yi seçerek gerekli ftp hesap bilgilerinizi girmelisiniz. Ben herhangi bir sunucuda yayınlamayacağım için burayı "Local/Network" olarak bırakıp altındaki alana tekrar proje klasörünün fiziksel adresini girdim ve "Next" butonuna tıkladım. Karşımıza çıkan yeni adımda "No, do not enable check in and check out." seçeneğini işaretleyip tekrar "Next" butonuna tıklayalım.

Sharing Files

6. Tüm işlemleri bitirdikten sonra karşımıza girdiğimiz bilgileri kontrol etmemiz için bir ekran çıktı. Bu bilgileri kontrol ettikten sonra "Done" butonuna tıklayarak işlemi bitirelim. Daha doğrusu, projeyi başlatalım

Artık DW bizim "nMembership" kod adlı projemizi hiç unutmayacak ve üst menüden "Window>Files" sekmesine tıkladığınızda karşınıza gelecek paneldeki ilk seçme kutusundaki sürücü listesinin altına eklenmiş şekilde projemizi görebileceğiz. Tıkladığımız anda karşımıza proje klasöründeki dosyalarımız ve klasörlerimiz gelecektir. Buranın fonksiyonlarını anlayabilmeniz için dilediğiniz dosya ya da klasöre sağ tıklayıp yapabileceğiniz işlemleri görebilirsiniz. Bu yaptığımız işin sonuçlarını projemizdeki dosya işlemlerinde ve proje sonunda hep beraber göreceğiz.

Bir projeyi büyük boyutlara ulaştığı anda dizginleyebilmenin en etkili yolu, projeye başlamadan önce gerekli hiyerarşinin oturtulacağı zeminin iyi belirlenmesidir. Tüm dosya klasörleri tek bir dizinde saklamak işleri ne kadar zorlaştıracaksa, detay olan her iş için ayrı klasör tutmakta en az o kadar zorlaştırır. Bu nedenle proje ihtiyaçları doğrultusunda sade, klasör isimleriyle neyin nerde olduğu kolay anlaşılabilir, dosya isimleriyle de ne işe yaradıkları bir bakışta farkedilebilir olmalıdır. Tabiki bunun tahlilini projenin en başında yapmak mümkün değildir. Çünkü çalıştıkça işler ve ihtiyaçlar artacak ve yeni dosya ve klasörlere ihtiyaç duyacağız. Ben başlangıçta nMembership için şöyle bir hiyerarşi kurdum;

Hiyerarşi

Bunların dışında kalan detayları aklımda şu şekilde planladım;

Sayfalara include() ya da require() ile çağıracağım tüm dosyalarımı "includes" klasöründe saklayacağım,
XmlHttpRequest ile yapacağım işlemlerde "ajax" adlı klasör içerisine, işlemi içeren fonksiyon adıyla bir klasör daha oluşturup; sorguyu, oluşturduğum bu klasördeki "index.php" dosyasına yönlendireceğim. Yani dosyalara değil doğrudan klasöre sorgu çekeceğim.
(Örn: ajax/hesapla/?islem=topla&rakamlar=(5,2,7,1))
MySQL bağlantısı ve işlemlerinde Justin Vincent tarafından yazılan bir sınıf olan ezSQL'i kullanacağım. Bu sınıfa ait birkaç dosyanın birlikte kullanılması gerektiği için includes klasöründe "ez_sql" adında yeni bir klasör oluşturup bu dosyaları buraya yerleştireceğim.
Şu an için aklıma gelen dosya ve klasörler bu kadar. Fakat ileride ihtiyacımız doğrultusunda yeni birkaç klasör daha oluşturacağız. Sonuç olarak elde ettiğim sistem şu halde;

Kolasörler

MySQL 5.0 ile veritabanı oluşturmak ve ezSQL
Dosya ve klasör altyapımızı oluşturduktan sonra altyapı açısından yapmamız gereken son şey veritabanımızı oluşturmak ve gerekli bağlantıları sağlamak. Yeni bir veritabanını birçok değişik programla yaratabileceğiniz gibi, sanırım bu konuda alışkanlıklar ön plana çıkıyor. Çünkü ben, bu işi yapan daha hızlı programlar da görmüş olmama rağmen, phpMyAdmin'den vazgeçemiyorum bir türlü. Bu nedenle yeni veritabanı oluşturma işlemini pMA (phpMyAdmin) üzerinden tarif edeceğim.

1. pMA anasayfasındaki "Yeni veritabanı oluştur" başlıklı alana projemize uygun bir veritabanı adı yazalım. Ben nMembership için "s_n_membership" adında bir isim uygun gördüm. Başındaki "s" (Şubatın s'si) veritabanının hangi ayda hazırlandığını belirtiyor. pMA sol taraftaki seçme kutusunda veritabanlarını listelerken başharflere göre gruplandırma yaptığı için, hangi ay hangi projeyi yürüttüğümü daha iyi takip ediyorum. Veritabanları biriktikçe bir sonraki sene yine "s" ile başlayan bir veritabanı yarattığımda önceki yıllardaki projelere göz atıp maziyi hatırlıyorum Veritabanı adı yanındaki "Karşılaştırma" yazılı seçme kutusundan "latin5_turkish_ci"yi seçip, "Oluştur" butonuna tıkladım.

MySQL 5.0 ile veritabanı oluşturmak ve ezSQL

2. Artık s_n_membership adlı veritabanımız oluşturulduğuna göre, dosyalarımızla gerekli bağlantıları oluşturmanın zamanı geldi. Daha önce de dediğim gibi bu iş için ezSQL sınıfını kullanacağız. Klasör yapımızı oluştururken bu sınıfa ait dosyaları includes/ez_sql/ konumuna zaten kopyalamıştık. Şimdi yapmamız gereken bir dosyada sınıfı kullanarak bağlantıyı sağlamak. Bu iş için includes/ klasörü içinde "general.inc.php" adında yeni bir dosya oluşturacağım. Fakat bu işlemi DW'daki "Files" panelinden yapacağım. Nasıl yaptığımı aşağıdaki resimde detaylı bir şekilde görebilirsiniz;

Tag Inspector

3. Oluşturduğum general.inc.php adlı dosyayı açarak içeriğine şu satırları giriyorum;

PLAIN TEXTPHP:
session_start();
ob_start();

$mysql_uname = "root";
$mysql_pass = "";
$mysql_db_name = "s_n_membership";

require_once("ez_sql/ez_sql_core.php");
require_once("ez_sql/ez_sql_mysql.php");

$mysql_acts = new ezSQL_mysql($mysql_uname, $mysql_pass, $mysql_db_name);

4. Burada gördüğünüz üzere önce veritabanı bağlantımız için gerekli olan bilgileri belirleyip ezSQL_mysql nesnesini yaratırken argüman olarak sınıfımıza teslim ediyoruz ve bu bilgilerle sağlanacak bağlantıyı bir nesne şeklinde $mysql_acts değişkenine eşitliyoruz. Artık veritabanımız ve bağlantısı hazır.

Not: Normal şartlarda buradaki "sistem ayarı" olarak kabul edilebilecek olan veritabanı adı, mysql kullanıcı adı ve şifresi gibi değişkenleri ayrı bir dosyada tutabiliriz fakat şu anda ihtiyaç duymadığım için doğrudan general.inc.php içerisine yazıyorum.

20 Haziran 2010 Pazar

Php için En çok kullanılan Veritabanı Kütüphaneleri

\

Bazen SQL sorgusu yazmak gerçekten sıkıcı oluyor. Bu kütüphaneler bir nebze olsun sizi gülümsetecektir.

ADOdb - PHP Veritabanı soyutlama kütüphanesi.


Doctrine - PHP 5.2.3 için ORM (Object relational mapper) ilişkisel haritalama aracı. En çok kullanılan veri tabanı erişim katmanıdır.

Propel - Başka bir ORM aracı.

Outlet - Açık kaynaklı bir veri tabanı kütüphanesi.


17 Haziran 2010 Perşembe

php de pathinfo() Fonksiyonunun kullanımı

pathinfo() :Bir dosya yolu hakkında bilgi döndürür. işlevi belirtilen yol hakkında bilgi içeren bir ilişkisel dizi döndürür.


$path_parts = pathinfo('/siteler/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // PHP 5.2.0'dan beri.
?>

curl ile download yapmak

function dosya_indir($link,$name=null)

{

$link_info = pathinfo($link); //Yol bilgilerini değişkene atıyoruz.
$uzanti = strtolower($link_info['extension']); //Dosyanın uzantısını değişkene atıyoruz.
$file = ($name) ? $name.'.'.$uzanti : $link_info['basename']; //Eğer kayıt edilmek üzere dosya adı girilmişse, girilen dosya adını değişkene atıyouruz, girilmemişse orjinal adını değişkene atıyoruz.

$curl = curl_init($link);
$fopen = fopen($file,'w');

curl_setopt($curl, CURLOPT_HEADER,0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_0);
curl_setopt($curl, CURLOPT_FILE, $fopen);

curl_exec($curl);
curl_close($curl);
fclose($fopen);

}

dosya_indir('http://site/a.zip');
PHP dosyasının bulunduğu dizine orjinal adında yani [a.zip] şeklinde dosyayı kayıt eder.

dosya_indir('http://site/a.zip','dosya_adi',);
PHP dosyasının bulunduğu dizine 2. parametre yani [dosya_adi.zip] şeklinde dosyayı kayıt eder.

15 Haziran 2010 Salı

Php ile web sayfalarından Meta tag ları alma

Php ile web sayfalarından Meta tag ve favicon ları alma

function getLinksInfo($url) {

$web_page = file_get_contents($url);

$data['keywords']="";
$data['description']="";
$data['title']="";
$data['favicon']="";
$data['images']=array();

preg_match_all('#<title([^>]*)?>(.*)</title>#Uis', $web_page, $title_array);
$data['title'] = $title_array[2][0];
preg_match_all('#<meta([^>]*)(.*)>#Uis', $web_page, $meta_array);
for($i=0;$i<count($meta_array[0]);$i++) {
if (strtolower(attr($meta_array[0][$i],"name"))=='description') $data['description'] = attr($meta_array[0][$i],"content");
if (strtolower(attr($meta_array[0][$i],"name"))=='keywords') $data['keywords'] = attr($meta_array[0][$i],"content");
}
preg_match_all('#<link([^>]*)(.*)>#Uis', $web_page, $link_array);
for($i=0;$i<count($link_array[0]);$i++) {
if (strtolower(attr($link_array[0][$i],"rel"))=='shortcut icon') $data['favicon'] = makeabsolute($url,attr($link_array[0][$i],"href"));
}
preg_match_all('#<img([^>]*)(.*)/?>#Uis', $web_page, $imgs_array);
$imgs = array();
for($i=0;$i<count($imgs_array[0]);$i++) {
if ($src = attr($imgs_array[0][$i],"src")) {
$src = makeabsolute($url,$src);
if (getRemoteFileSize($src)>15000) array_push($imgs,$src);
}
if (count($imgs)>5) break;
}
$data['images']=$imgs;

return $data;
}

print_r(getLinksInfo("http://www.dizzin.com"));

dönen sonuç dizidir(array).
$gelen=getLinksInfo("http://www.dizzin.com");
echo $gelen['keywords'];
gibide değişkene alabilirsiniz

14 Haziran 2010 Pazartesi

Formdan Gelen verileri Mysql Eklemek

PHP ile veritabanı uygulamalarında, genel olarak yapılacak işlemler. Veritabanına veri kaydetme, veri listeleme, veri düzenleme ve veri silme işlemleridir. Bu işlemlerden ilk olarak veritabanına veri kaydetme konusunu inceleyeceğiz. Sonraki yazılarımızda, sırasıyla veri listeleme, düzenleme ve silme işlemleriyle devam ederiz.

Öncelikle, bir forma inputlar aracılığıyla girilmiş olan bilgileri, post metoduyla diğer bir sayfaya aktarıp, aktardığımız sayfada veritabanı bağlantısı olduğu varsayılarak kayıt işlemi yapılacaktır.

Kayıt için gerekli olan örnek bir form oluşturalım:
kaynağı göster
yazdır?
1

2
3
4
5





Üstte gördüğümüz gibi, kaydet.php sayfasına post edilen, isim ve soyisim olarak adlandırılmış iki tane input ve formu submit etmemizi sağlayan bir buton bulunmaktadır. Burda önemli olan nokta, inputların ‘name’ değerleridir.

Kayıt yapacağımız tablo yapımız;
kaynağı göster
yazdır?
1 CREATE TABLE `test`.`defter` (
2 `defter_id` INT( 5 ) NOT NULL AUTO_INCREMENT ,
3 `defter_isim` VARCHAR( 100 ) NOT NULL ,
4 `defter_soyisim` VARCHAR( 100 ) NOT NULL ,
5 PRIMARY KEY ( `defter_id` ) ,
6 UNIQUE (
7 `defter_id`
8 )
9 ) ENGINE = MYISAM CHARACTER SET latin5 COLLATE latin5_turkish_ci;

Formumuz ve tablomuz hazır olduğuna göre, kaydet.php dosyasına geçiyoruz;
kaynağı göster
yazdır?
01 /*
02 Veritabanı bağlantı kodları burada oluyor.
03 */
04
05 //Form post metoduyla gönderilen bilgileri alıp değişkenlere atayalım.
06 $ad = $_POST['isim'];
07 $soyad = $_POST['soyisim'];
08
09 //Veritabanında bulunan 'defter' isimli tablonun 'defter_isim' ve 'defter_soyisim' alanlarına kayıt edelim.
10 $kaydet = mysql_query("insert into defter (defter_id, defter_isim, defter_soyisim) values (NULL, '$ad', '$soyad')") or die("Hata: kayıt işlemi gerçekleşemedi.");

Tüm veritabanına kayıt işlemleri, genel olarak yukarda bahsedilen mantıkta gerçekleştirilmektedir. Yukarda oluşturulan değişkenleri farklı fonksiyonlardan geçirerek, güvenlik açısından doğabilecek sıkıntıları engelleyebiliriz.

Php de Birleşik Atama Operatörleri

Birleşik atama operatörlerinin amacı; bir değişken üzerine işlem yapıp sonucu tekrar bu değişkene atamaktır.
Örneğin ;
kaynağı göster
yazdır?
$a += 10;

$a = $a + 10;
?>

Yukardaki 2 örnek kodda aynı sonucu vermektedir. Kullanılabilir diğer operatörler

* $a += $b
* $a -= $b
* $a *= $b
* $a /= $b
* $a %= $b
* $a .= $b

13 Haziran 2010 Pazar

Curl Kütüphanesinin Php ile Kullanımı

CURL , ( Client URL Library Functions)

PHP 4.0.2 versiyonu ile yanında çok işe yarayacak bir kütüphane getirdi. Curl kütüphanesiyle upload/download, GET/POST işlemleri, çerez ve proxy yollama işlemleri, kullanıcı, şifre onaylama sayfaları(auth.) yapılabilir.

Bu makaleyi okumadan önce sunucunuzda curl yüklü olup olmadığından emin olun. Eğer yüklü değilse http://curl.haxx.se/libcurl/php/install.html adresinden nasıl yükleme & kurulum yapıldığına bakabilirsiniz.
Curl oturumlarında sıkça kullanacağımız birkaç fonksiyon var.

curl_init() : Yeni bir curl oturumu başlatır.
curl_setopt() : Curl transferi için seçenekleri parametreler halinde kullanmaya yarar.
curl_exec() : curl_setopt() ile belirlenmiş seçenekleri işler ve transfer işlemini yapar.
curl_close() : Daha önceden curl_init ile açılmış curl oturumunu kapatır.
curl_getinfo() : Yapılan curl işlemi hakkında çeşitli bilgilere ulaşmak için kullanılır.

Bu fonksiyonların hakkında daha ayrıntılı bilgiye tıklayarak (php manual) ulaşabilirsiniz. Curl ile bir sayfanın çıktısını alan örnek bir uygulama yapalım.

1.
// Curl oturum baslatiliyor.
2.
$ch = curl_init();
3.

4.
// URL
5.
curl_setopt($ch, CURLOPT_URL, "http://www.xhandros.net/bl/index.php");
6.
curl_setopt($ch, CURLOPT_HEADER, 0);
7.

8.
curl_exec($ch); // ekrana basiliyor
9.
curl_close($ch); // sunucu hafizasindan siliniyor


Bu kod URL içeriğini sayfaya basacaktır. curl_init ile yeni bir oturum başlatıldı, setopt ile transfer seçenekleri tanımlandı, işlem yapıldı ve curl_close ile hafızadan silindi. curl_setopt içindeki header parametresi sayfa çıktısını almak için gerekli. Url parametresi ise çıktısı alınacak adresi temsil ediyor. curl_init("$adres"); şeklinde yapılma imkanıda mevcut.
Şimdide curl ile localde olmayan bir sunucuya POST olarak veri gönderelim.

1.
$ch = curl_init(); // oturum baslat
2.
// POST adresi
3.
curl_setopt($ch, CURLOPT_URL,"http://www.site.com/test.php");
4.

5.
curl_setopt($ch, CURLOPT_POST, 1);
6.
curl_setopt($ch, CURLOPT_POSTFIELDS,"isim=ahmet&soyad=yilmaz");
7.

8.
curl_exec ($ch);
9.
curl_close ($ch);


POSTFIELDS seçeneğinde, normalde nasıl GET ile browser üzerinden veri yolluyorsak aynı şekilde yolluyoruz. Bu şekilde üyelik isteyen sitelere otomatik olarak üyelikler açılabilir. (foreach yardımıyla).çeşitli log sistemlerinde kullanılabilir. Mesela yazıp, sattığınız sistemlerin nerelerde kullanıldığını loglamak için kendi sunucunuza nerede kullanıldığına ait çeşitli bilgiler yollayabilirsiniz.

curl ile sockets kütüphanesinde olduğu gibi sahte isteklerde yollamak mümkündür. Örneğin; referer bilgisini istediğimiz şekilde değiştirip istek gönderebiliriz.

1.
$ch = curl_init();
2.
curl_setopt($ch, CURLOPT_URL,"http://localhost/test.php");
3.
curl_setopt($ch,CURLOPT_REFERER,"ceviz.net");
4.

5.
curl_exec ($ch);
6.
curl_close ($ch);


CURLOPT_REFERER parametresini istediğimiz şekilde değiştirdik :-) Bu şekilde ".htaccess" ile yapılan korumalarda aşılabiliyor. Diğer sayfada öğrendiklerimizle birkaç CURLOPT parametresi ekleyip bir dosya indirme fonksiyonu yazalım.

1.
2.
/*
3.
- Yunus Emre Yilmaz / a.k.a yns
4.
- http://www.ceviz.net disinda kaynak gösterilmeden kullanilamaz.
5.
*/
6.

7.
function dosya_indir($adres,$ad)
8.
{
9.
if (!extension_loaded(curl)) {
10.

11.
die("Extension yuklu degil socket deneyebilirsin");
12.
}
13.

14.
$ch = curl_init("$adres");
15.
if (!$ch) {
16.
die("Curl oturumu baslatamadim..");
17.

18.
}
19.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
20.
$data = curl_exec($ch);
21.
curl_close($ch);
22.

23.
// baglantiyi kapa
24.

25.
$islem = fopen("$ad", "a+");
26.
fwrite($islem, $data);
27.
fclose($islem);
28.

29.
if ($islem) {
30.
echo" Dosya basariyla yuklendi...";
31.
} else {
32.
die("Dosya yuklenemedi");
33.
}
34.
}
35.
// Örnek kullanim
36.
// dosya_indir('http://www.ceviz.net/yns.rar','yns.rar');
37.
// 1. kisim yuklenecek URL , 2. kisim server'a yuklendigi zamanki dosya adi
38.
?>


Şimdi gelelim sistemin nasıl işlediğine ;

İlk once curl'un yüklü olup olmadığına bakılıyor, eğer yüklü değilse hata mesajı veriliyor. Curl işlemi başlatıldıktan sonra CURLOPT_RETURNTRANSFER seçeneğiyle curl_exec()'ten dönen dener sayfaya çıktı olarak verilmez, tanımlandığı değişkende, örnekte $data tutulur. $data değişkenine adres'in bilgileri alındıktan sonra dosya yazma işlemi fonksiyonları ile sunucuda yeni dosya oluşturulur. Sonra dosya indirme işlemi tamamlanır. Eğer bu işlemi local olmayan sunucunuzda yaparsanız çok büyük dosyaları çok az bir zamanda çekebileceğinizi görebilirsiniz.

Ben yaptığım testlerde saniyede 400 kb civarı çekiyordum :-) İşleme curl_Getinfo altında CURLINFO_SPEED_DOWNLOAD parametresi eklerseniz download hızını ölçebilirsiniz.

1.
$dlhizi = curl_getInfo($ch,"CURLINFO_SPEED_DOWNLOAD");


Tüm bu fonksiyonun yaptığını *nix curl'u ilede yapabilirsiniz. Örneğin;

1.
system("curl -o dosyaadi.rar http://www.ceviz.net/dosyaadi.rar ");


aynı işi görecektir. Ama system, passthru gibi komutlar güvenlik nedeniyle genelde yasaklıdır.

Genel olarak curl kullanımını anlamışsınızdır umarım. Şu an için curl hakkında daha fazla bilgi bulmak isterseniz 2 adresle sınırlısınız. http://www.php.net/curl/ ve http://curl.haxxe.se adresleri işinize yarayabilir.

12 Haziran 2010 Cumartesi

Nesne Yönelimli PHP – Bölüm 1

Makaleler Hakkında

3 Bölümden oluşacak makale dizisinde, Object Oriented (Nesne Yönelimli) PHP’nin temellerini; kodunuzu yönetmeyi, bileşenleri birbirinden ayrı tutmayı ve gerektiğinde bunlara kolaylıkla erişebilmeyi konu alacağız.

3. makale ile birlikte; genel veritabanı işlemlerini gerçekleştirmek üzere basit bir MySQLi (MySQL Improved) sınıfı yazacağız.
Bu Yazıda

1. Nesneler(Objects) ve Sınıflar (Classes) nedir?
2. İlk sınıfımızı yazalım.
3. Sınıfların kullanımı.
4. Sınıfların kişiselleştirilmesi (Dinamizm eklenmesi)

1. Nesneler ve Sınıflar

Sınıflar, basitçte; fonksiyonlar deposu olarak tanımlanabilir. Başka türlü beznetmek gerekirse; Masaüstünüzdeki bir klasör sınıf ise o klasörün içindeki dosyalarda fonksiyonlardır.

Bir de klasik bir örnek üzerinden anlatalım:

oop-php-part1-dog-example

Resimde de gördüğünüz gibi köpek sınıfının, koşmak, yürümek, oyun oynamak, havlamak gibi fonksiyonları mevcut. Bu yapı bir sınıfın en genel tanımıdır.

Şimdi, sınıfın ne olduğunu az çok öğrendik. Peki bu sınıfı kodlarımızda nasıl kullanacağız. İşte bu noktada işin içine Nesneler giriyor. “Köpek” adındaki bir sınıfı kullanmak için bir bir değişken tanımlamamız gerekir.

Daha bağlantılı olması için sınıf yazımından itibaren kodumuza başlayalım:
2. İlk sınıfımızı yazalım.

İlk kodumuz olduğu için, olabildiğince basit ilerleyelim; Favori kod editörünüzü açın, myClass.php adına boş bir dosya oluşturun ve içine aşağıdaki kod bloğunu yazın:

class myClass
{
function Merhaba()
{
echo "Merhaba!";
}
}
?>

Eğer bu dosyayı sunucunuzda çalıştırmaya kalkarsanız, ekrana hiçbirşey yazmayacaktır. Çünkü yapmış oldumuz şey sadece bir sınıf tanımlamak, sınıfın içindekileri çalıştırmak adına şu an için birşey yapmadık.

Devamında yine boş bir dosya olışturup myClass.php ile aynı klasörün içine index.php adıyla kaydedin.
3. Sınıfların kullanımı.

index.php içinde, myClass.php içindeki sınıfımıza erişmek için, ilk önce sayfamıza myClass.php‘nin referansını eklememiz gerek. Aşağıdaki kodda bunun nasıl yapıldığı gösterilmiştir:


require_once('myClass.php');

$myClass = new myClass();

$myClass->Merhaba();

?>

Eğer bu sefer index.php’yi tarayıcınızda çalıştırırsanız ekranda “Merhaba dünya!” yazdığnı göreceksiniz. Şimdi yaptığımız çalışmanın üzerinden geçelim. Öncelikle “require_once(‘myClass.php’)” satırı ile index.php sayfamıza, içinde sınıfımızın bulunduğu myClass.php sayfamızı çağırdık. Bir sonraki satırda bu sınıfımızı bir değişken gibi kullanabilmemiz için gerekli olan nesne tanımlamasını yaptık, bu sayede $myClass nesnesi üzerinden sınıfımız içerisindeki “Merhaba()” fonksiyonuna erişebiliyoruz. Son olarak tanımladığımız nesnenin Merhaba() fonksiyonunu çağırdık ve belirlediğimiz metin ekrana yazdırıldı.
4. Sınıfların kişiselleştirilmesi

Şimdi, elimizdeki hazır sınıfımızı kişiselleştirmek adına şöyle bir değişiklik yapalım: sitemize kullanıcı adı ve şifresiyle giriş yapmış birine adıyla hitap ederek merhaba diyelim. bunu yapmak için myClass.php’ye geri dönüp aşağıdaki değişiklikleri yapın:

class myClass
{
function Merhaba($kullanici)
{
echo "Hello " . $kullanici . "!";
}
}
?>

Bütün yaptığımız, ekrana “Merhaba dünya” yazan fonksiyona bir parametre eklemekten ibaret. Bu sayede fonksiyonumuza index.php‘den istediğimiz kullanıcı adını göndererek, o kişiye özel merhaba yazdırabiliriz. index.php sayfasına geri dönün ve aşağıdaki değişiklikleri uygulayın:


require_once('myClass.php');

$myClass = new myClass();

$myClass->Merhaba('Ali');

?>

index.php sayfasını tarayıcınızda açtığınızda ekranda “Merhaba Ali!” yazdığını görürsünüz.

Bu çalışma ile de sınıflarımızı nasıl kişiselleştirip, dinamizm katabileceğimizi gördük.

Kurtman Çelik

11 Haziran 2010 Cuma

Php de İfade Operatörleri Kullanımları ve Örnekleri

PHP'de yapacağımız ve yaptıracağımız her şey için PHP ifadelerini kullanırız. Adı üstünde çalışmamızı ifade edecek şeylere PHP ifadeleri deriz. Genel olarak arasına yazacağımız her şey bir PHP ifadesidir.

Bunlardan bir çoğunu ayrı başlıklar altında anlattım ve şimdi ise yeni bir başlık altında operatörlere ve mantıksal ifadelere değineceğim.

Şimdi ifadelerimizde ve değişkenler üzerinde bir takım işlemler yapmamızı ve koşullar belirtmemizi sağlayacak olan operatörlerden başlayalım, bol etiketli bir yazı olacak.
PHP operatörleri

Bu başlık altında sırayla aritmetik operatörler ve atama operatörlerini anlatacağım. Kalan karşılaştırma operatörleri, mantıksal operatörler ve diğer operatörleride bir sonraki yazımda anlatacağım.
Aritmetik operatörler

Aritmetik operatörler gayet basit. İlkokulda öğrendiğimiz şeyler, bunlara matematiksel operatörlerde diyebilirsin. Bu operatörler ile istediğin değerlerin toplamasını, çıkarmasını, bölmesini ve çarpmasını yapabilirsin.

İşte PHP'de aritmetik operatörler, isimleri ve örnekleri:
Operatör İsim Örnek
+ Toplama $a + $b
- Çıkartma $a - $b
* Çarpma $a * $b
/ Bölme $a / $b
% Modül $a % $b

Bunların bir de uygulamasını gösterelim:

$a = 10;
$b = 20;
$c = 5;
$sonuc = $a + $b - $c;
echo $sonuc;

Ekranda 15 yazar.

$a değişkeninin değeri 10, $b değişkeninin değeri 20, $c değişkeninin değeri ise 5. $sonuc değişkenine de $a değişkeni artı $b değişkeni ve eksi $c değişkeni dedik, bu da $sonuc değişkenine 10 + 20 - 5 işlemini yaptırarak 15 değerini verdi.

Bir tane de işe yarar bir deneme ile gösterelim:

$yil = 2010;
$dogum_yili = 1992;
$yas = $yil - $dogum_yili;
echo $yas;

Ekranda 18 yazar. Şu anki yıldan doğum yılımızı çıkarttık ve yaşımızı bulduk.
Karakter katarı operatörleri

İki ya da daha fazla karakteri ard arda eklemek için kullanacağın bu operatörü aslında bir kaç ders öncesinde örnek olarak kullandım. Orada anlamamış olabilirsin. Ama şimdi bu eksikliği gidereceğiz.

Yazıları ve diğer değerleri yan yana birleştirmek ve başka değerlere eklemek için "." (nokta) operatörünü kullanacağız. Hemen bir örnek ile göstereyim yine:

$isim = 'Musa';
$mesaj = 'Selam ';
$sonuc = $mesaj . $isim;

echo $sonuc;

Ekranda Selam Musa yazar. Burada $sonuc değişkenine $mesaj değişkeni ile $isim değişkenini yan yana ekledik.

Bir kaç örnek daha göstereyim:

$isim = 'Musa';
$sonuc = 'Selam ' . $isim;

echo $sonuc;

Bu sefer de aynı şey yazar. Farklı yaptığımız şey; $mesaj değişkeni kullanmak yerine sonuç değişkenine direkt mesajımızı verdik ve yanına nokta operatörü ile $isim değişkenini birleştirdik.
Tek tırnak ile çift tırnak arasındaki fark

Bu konuda son olarak dikkat etmemiz gereken ufak bir farklı yoldan bahsedeceğim. Bu da PHP de " (çift tırnak) ile ' (tek tırnak) arasında bazı kullanım farklılıkları olması. Tek tırnak ile vereceğimiz değerlerin içerisine değişken yazamayız, hemen örnek ile gösterelim:

$isim = 'Musa';
$mesaj = 'Selam $isim';

echo $mesaj;

Ekranda Selam $isim yazar. Çünkü biz değişkeni de tek tırnak içinde yazdık. Bu nedenle o $isim'e bir değişken değil yazı gözüyle baktı. Eğer $isim değişkenini yazdırmak istiyorsan işte o zaman bir yukarıda verdiğimiz örnekteki gibi yapmalısın.

Bu bahsettiğim olay yanlızca tek tırnak için geçerli. Çift tırnakda ise bu durum daha farklı. Çift tırnak içerisine yazacağımız değişkenlerin değerleri yazar. Yani nokta operatörünü kullanmadan da değişkenleri çift tırnak içinde birleştirebiliyoruz. Hemen yine bir örnek geliyor:

$isim = 'Musa';
$mesaj = "Selam $isim";

echo $mesaj;

Çok dikkat edin bir önceki örnek ile aynı fakat sadece mesaj değişkeninde tek tırnak değil çift tırnak kullandık. Ve bu durumda ekranda Selam Musa yazacak. Çünkü çift tırnak içine yazılan değişkenlerin değerlerini verir. Fakat tek tırnakda böyle bir durum söz konusu değil.

Buradaki amaç bazen dolar işaretini kendi başına kullanmamız gereken bazı yerlerde PHP'nin o dolar iaşretini değişken sanmamasını sağlamaktır. Mesela ekrana "Ücret: 100$" yazdırmak istediğimizde eğer çift tırnak kullanırsak PHP hata verir. Çünki çift tırnak içerisinde dolar işareti özel karakter ve değişken ifadesi olarak algılanır. Bu durumlarda tek tırnak ya da kaçış operatörü kullanılır.
Kaçış operatörü

Kaçış operatörü ters bölüm işaretidir "\".

Kaçış operatörünün kullanımınıda hemen bir örnek ile gösterelim:

$mesaj = "Ücret: 100\$";
echo $mesaj;

Ekranda Ücret: 100$ yazar. Çift tırnak ile $ dolar işaretini kullandık ama başına ters bölüm işareti koyduk. Bu nedenle o dolar işaretini değişken olarak algılamadı.

Çift tırnakta değişken kullandığımız için $ dolar işaretinden kaçmakta kullandığımız bu operatörü aynı zamanda çift tırnak içine çift tırnak içeren bir şey yazarkende kullanabiliriz. Hemen buna da bir örnek:

$mesaj = "Musa: \" bu kaçış operatörünü anlamak için iyi bir örnek\" dedi.";
echo $mesaj;

Ekranda Musa: " bu kaçış operatörünü anlamak için iyi bir örnek" dedi. yazar. Çift tırnak içinde çift tırnak işaretini kullansaydık PHP hata verirdi. Ama kaçış operatörü sayesinde böyle bir hata almadık ve kendimizi ifade ettik.

Biraz karışık bir konu gibi gelebilir ama aslında basit. Son olarak hepsini bir örnek ile göstereyim:

$isim = "Musa";
$mesaj = "Merhaba ";

$sonuc = $mesaj . $isim; // Değeri: Merhaba Musa
$sonuc = "$mesaj $isim"; // Değeri: Merhaba Musa
$sonuc = 'Selam ' . $isim; // Değeri: Selam Musa
$sonuc = 'Değerimiz: 100,000,000$'; //Değeri: Değerimiz: 100,000,000$
$sonuc = "Bu hatalı bir fiyat: 100$"; //PHP hata verir!
$sonuc = "Bu hatasız bir fiyat: 100\$"; //Değeri: Bu hatasız bir fiyat: 100$
$sonuc = "Tırnak denemesi: \"PHP\""; //Değeri: Tırnak denemesi: "PHP"
$sonuc = "Hatalı bir örnek, "kaçış karakteri" kullanmadan tırnak açtık"; //PHP hata verir.

Atama operatörleri

Atama operatörleri ile değişkenlere değer atarız. Temel atama operatörü eşittirdir (=). Bunu geçen örneklerde ve anlatımlarda anladığını varsayıyorum. Tek bir eşittir işareti, istenilen değişkene istenilen değeri atamamızı sağlar.

Diğer operatörlerini de bir tablo üzerinde gösterelim. Bu operatörler birleşik atama operatörleri. Bunlar bir değişkenin sonuna bir değer eklemekte ya da değişkendeki sonuca bir sayı eklememizi kolaylaştırır. Basit bir örnek ile kavrayabileceğimiz bu birleşik atama operatörlerini önce tabloda gösterelim:
Operatör Kullanışı Karşılığı
+= $a += $b $a = $a + $b
-= $a -= $b $a = $a - $b
*= $a *= $b $a = $a * $b
/= $a /= $b $a = $a / $b
%= $a %= $b $a = $a % $b
.= $a .= $b $a = $a . $b

Örnek bir atama operatörü kullanımı:

$a = 10;
$b = 20;
$a += $b;

echo $a;

Ekranda 30 yazar. Birleşik atama operatörü kullanarak toplama işlemi yaptık ve varolan değişkenin değerine atadığım değişkenin değerini ekledik.

Bu birleşik atama operatörü bizim değişkenin sonuna ekleyeceğimiz ya da çıkartacağımız değerler için aynı değişkeni tekrar yazdırmayarak bize kolaylık sağlar.
Bir değer arttırma ya da eksiltme

Bir değişkendeki sayısal değeri bir arttırmak için çift artı (++) operatörünü, bir değer eksiltmek için de çift eksi (--) operatörünü kullanırız.

Örnek kullanımı:

$a = 10;
$a++;
echo $a;

Ekranda 11 yazar. $a değişkeninin değerini 1 arttırdık ve ekrana yazdırdık.

i

Php Döngüleri ve Kullanım Şekilleri Detaylı Anlatım

Döngüler sayesinde bir kod bloğunu istediğin kadar ard arda tekrarlayabilirsin. PHP'de 4 tane döngü mevcut, her biri aslında teknik olarak aynı şeyi yapıyor sadece kullanımları farklı. En çok kullanışlı olan While ve for döngüsüdür.

Döngüler hem çok eğlenceli, hem en işe yarar ifadelerden birisi. Sonsuz döngüye girme gibi riskleri olsa bile PHP'nin varsayılan çalışma zamanı limiti bu riski ortadan kaldırıyor.

Basit bir kod bloğu ve döngüler sayesinde harika işler başarabilirsin. Mesela toplu güncellemelerde ve liste gibi yerlerde döngüler kullanılır.
While döngüsü

While döngüsünün koşul olayı if ifadesi ile aynı diyebiliriz. İçerisine yazacağımız koşul doğru olduğunda kod bloğunu çalıştıran if ifadesinde olduğu gibi whilede aynı şeyi yapar. Tek farkı döngü olduğu için koşul doğru olduğu sürece tekrarlar.

while( koşul ) {
// koşul olumlu olduğu sürece çalışacak kod bloğu
}

While döngüsünde sonsuz döngüye girmek çok kolay, bu yüzden kodlarken biraz dikkatli olmak lazım. Eğer koşul her zaman doğru olacak şekilde olursa while de hiç durmadan döner.

$sayi = 10;
while($sayi == 10) {
echo 'sayi değişkeni 10 olduğu sürece bu yazı hep yazılacak';
}

Yukarıdaki örnek sonsuz döngüye girer, yani hatalıdır. Koşula $sayi değişkeni 10'a eşit olduğu sürece kod bloğunu ard arda çalıştır dedik. Döngüden önce $sayi değişkenine 10 değerini verdiğimiz için ve değerini hiç değiştirmediğimiz için döngü sonuza kadar döner.

Peki nasıl sınırlı ve kontrollü bir döngü yapacağız? Bu sorunun cevabıda gayet basit. Eğer döngü boyunca koşula yazdığımız değerlerin değişmesini sağlarsak döngüde belli bir dönüşten sonra durar. Hemen buna da bir örnek gösterelim.

$sayi = 0;
while($sayi < 5) {
echo ' Döngü ' . $sayi;
$sayi++;
}

Ekranda Döngü 0 Döngü 1 Döngü 2 Döngü 3 Döngü 4 yazar ve durur. Önce $sayi adında değişken oluşturup 0 değerini verdik, while döngümüzün koşulunada $sayi değişkeni 5 den küçük olduğu sürece dön dedik, kod bloğunun içerisine ise echo ile bir çıktı verdirttik ve hemen sonrasında $sayi değişkeninin değerini 1 arttırdık. Bu sayede her çalışmasında değer 1 artacak ve 5. çalışmasında duracaktır.

While için son örnek olarak birde matematiksel hesap yaptıralım:

$sayi = 1;
$sonuc = 1;

while($sayi < 10) {
$sonuc = $sonuc * $sayi;
$sayi++;
}

echo $sonuc;

Ekranda 362880 yazar. Burada $sonuc değişkenini her döngüde 1 arttırarak çarptık. Yani ilk olarak 1*1 sonrasında 1*2, sonra 2 * 3 ... şeklinde sayı 10 dan küçük olana kadar çarptık.
For döngüsü

For döngüsü belirli sayıda dönecek olan kodların kullanımında kullanışlıdır. For döngüsüne 3 parametre girilir. Birinci parametre döngüde kullanılacak olan değişkeni ve değerini tanımlar, ikinci parametre whilede olduğu gibi koşulu belirtir, üçüncü parametre ise her döndüğünde yapacağı işlemi belirtir.

for( başlangıç; koşul; her çalışmada olacak olan ) {
// koşul doğru olduğu sürece çalışacak kod bloğu
}

Hemen örnek bir kullanım göstereyim:

for($sayi = 0; $sayi < 5; $sayi++) {
echo ' Döngü ' . $sayi;
}

Ekranda az önce while örneğindeki çıktı ile aynı sonucu alırız. İlk parametrede $sayi değişkenine 0 değerini atadık, ikinci parametrede koşulu belirttik ve son paramterede ise her çalışmada sayı değişkenini bir arttırmasını söyledik. Sonuç olarak böyle belli sayıda dönmelerde for en idealidir.
Foreach döngüsü

Foreach döngüsüne array döngüsü diyebiliriz. Paramtere olarak bir dizi alır, ve dizi içindeki eleman sayısı kadar döner. Sadece bir dizi ve foreach döngüsü ile güzel bir listeleme yapabiliriz. Kullanımı diğer döngülerden farklı ama basittir.

Paramterede as deyiminden sonra yazdığımız değişkene her döngüde sırayla bir eleman değerini yükler.

foreach($dizi as $eleman) {
// dizinin tum elemanlarının sayısı kadar döner
}

Örnek kullanım:

$meyveler = array('Elma', 'Armut', 'Portakal', 'Muz');

foreach($meyveler as $meyve) {
echo $meyve . ' Yiyin! ';
}

Ekranda Elma Yiyin! Armut Yiyin! Portakal Yiyin! Muz Yiyin! yazar.

Dizide ne kadar eleman varsa hepsini sırayla parameterede belirttiğimiz değişkene atayarak döndürür.
Foreach anahtarları ve değerleri ile döndürme

İlk gösterdiğim kullanımda yanlızca dizideki değerlerine ulaşabiliyorduk. Şimdi dizideki hem anahtara hem de değere ulaşmak için ise "$dizi as $anahtar => $deger" şeklinde kullanacağız.

Örnek kullanım:

$bilgi['ad'] = 'Musa';
$bilgi['yas'] = 18;
$bilgi['yer'] = 'İstanbul';

foreach($bilgi as $isim => $deger) {
echo $isim . ' : ' . $deger . '
';
}

Ekran çıktısı:

ad : Musa
yas : 18
yer : İstanbul

Foreach listeleme olaylarında en sık kullanacağımız döngülerden birisidir.
Do ... While Döngüsü

En son bahsedeğim bu döngü diğerlerinin yanında pek kullanışlı değil, ama yine de bilmekte fayda var. Do While döngüsü aslında While döngüsünün koşul olayı ile aynı tek farkı; döngü koşul geçerli olsun ya da olmasın en az 1 kere çalışır. yani kod bir kere çalıştıktan sonra 2. dönmede koşulu kontrol eder, tüm espirisi budur.

do
{
// 1 kez çalışıp sonradan koşul ile dönecek olan kod bloğu
}
while ( koşul );

Örnek kullanım:

$sayi = 20;

do
{
echo 'Selam Dünya!';
}
while ( $sayi < 10 );

Ekranda 1 kez Selam Dünya! yazar. Aslında while yazdığımız koşul geçersiz. Yani $sayi değişkeni 10 dan küçük değil ama do while döngüsünde koşula bakılamdan önce 1 kere çalıştırıldığı için kod bir kez çalıştırlacaktır.
Break ifadesi ile döngüleri durdurmak

DÖngüleri sadece kuşulalr geçersiz olduğunda değil istersen break ifadesi ile istediğin yerde de durdurabilirsin. Örneğin deneme yanılma yolu ile çok uzun sürecek bir döngünün içindeyken aradığın şeyi bulduğunda döngünün daha fazla devam etmesini engelleyebilirsin.

Break türkçe anlamı kırmakdır. Yani döngüleri break ile istediğim yerde kırabiliriz. Hemen örnek bir kullanım gösterelim:

for($sayi = 0; $sayi < 100; $sayi++) {
echo $sayi;
if($sayi == 5) {
break;
}
}

Burada 100 kez dönecek olan bir for döngüsü yaptık ve her döndüğünde ekrana sayıyı yazmasını istedik. Ama aynı zamanda içine bir koşul daha koyduk, eğer sayi değişkeninin değeri 5 olur ise break ifadesini çalıştır. Bu da demek oluyor ki ekranda 012345 yazacak. Yani 100 e kadar dönecek olan bir döngüyü break ile istediğimiz yerde durdurduk.