php

Alan Adı Sorgulama : Rivy.Net

Son zamanlarda üzerinde uğraştığım projemden biraz bahsedeceğim bu yazımda size;
Onun adı rivy :)

Kısaca nedir ? Ne işe yarar?
Rivy, Php – Ajax – MySql tabanlı bir alan adı sorgulama sistemi.  Bundan yaklaşık  1 ay önce r10′da dolaşırken tesadüf eseri görüp kaydettiÄŸim domainim üzerine neler yapabileceÄŸim konusunda öneriler alırken bir kaç arkadaşın(webloader) söyledikleri üzerine aklıma giren projem oldu rivy :) İlk aÅŸamada alan adlarını sorgulayabildiÄŸiniz, boÅŸ veya dolu olup olmadığını, dolu ise whois bilgilerini görebildiÄŸiniz rivy ile ilerneyen günlerde tamamen ücretsiz olarak düşecek domainlerinizi ekleyip – listeyebileceÄŸiniz,  takip ettiÄŸiniz domain düştüğünde size mail ile haber verecek bir sistemi hizmetinize sunmayı planlıyorum.

Rivy’i buradan ziayret edebilirsiniz :)


PHP Pratik Sınıf İşlemleri

Yeni yazımda sizlere geçenlerde keşfettiğim pratik bir işlemden bahsedeceğim.
Bahsettiğim işlem kimilerinize pratik, kimilerinize kullanışsız gelebilir. Karar sizin :)

İşleyiş şöyle oluyor;
Örneğin üyelik sistemi yapıyoruz. Basit anlamda ekleme silme ve düzenleme işlemlerine ihtiyacımız var. Bunun için öncelikle bir kullanıcı sınıfı oluşturuyoruz;

<?php
 
class Kullanici
{
    public $ID;
    public $KullaniciAdi;
    public $Sifre;
    public $EPosta;
    public $Adi;
    public $Soyadi;
    public $Sehir;
    public $Adres;
    public $PostaKodu;
    public $Telefon;
    public $WebSitesi;
}
?>

basit anlamda kullanıcı özelliklerini tanımlıyoruz öncelikle. Daha sonra kullanıcı işlemlerini yapacak olan ekleme, silme, düzenleme fonksiyonlarını yazacağız.İşte bahsettiğim olayın pratikliği burada devreye giriyor. Normalde örneğin düzenleme işlemini yapan fonksiyon içinde düzenleme sorgusu için sorguyu metin olarak yazar, içine de eklenecek değişkenleri yazarız. Misal;

mysql_query("UPDATE kullanici SET adi = '$this->Adi WHERE id = '$this->ID' '");

şeklinde yazarız. 2 satır şey yazmaktan üşendiğim zaman keşfettiğim işlem sayesinde fonksiyon sınıf içinden property leri okuyarak sorguya dahil ediyor. Bu durumda yeni bir property eklediğimizde veya var olan property lerden birini sildiğimiz zamanlarda hem sınıf içinde değişiklik yapar, hemde sorguda değişiklik yaparız. Bu yöntem sayesinde sınıf propertysinde değişiklik yaptığımız zaman otomatik olarak sorguya yansıyor.
Bu işlemi yapabilmek için öncelikle işlemleri yaptığımız sınıfın propertylerini okumaya ihtiyacımız var. Bunun için;

print_r($this);

dediğimiz zaman $this ile varolan sınıfı object olarak alıyoruz. Bu object türündeki değişkenimizi işlemlerimiz için array türüne cast ediyoruz.

(array)$this;

Bir dizide var olan key isimlerine ulaşmak için ise array_keys() fonksiyonunu kullanıyoruz.;

$sinif = array_keys((array)$this);
echo $sinif[0]; // Kullanıcı sınıfının 0. propertysi olan "ID" yi bize geri döner.

Yukarıdaki kod parçacığında ise sınıf property isimlerine erişmiş oluyoruz.
Basit bir döngü ile dizimizin içinde bir tur atarak işlem yapacağımız sorgumuzu rahatlıkla oluşturabiliyoruz.
Sonuç olarak ise ortaya kendi kendine sorgusunu yaratan basit bir fonksiyon ortaya çıkıyor;

  public function Degistir()
    {
        if((int)$this->ID != 0)
        {
            $sorguMetin = 'UPDATE kullanicilar SET ';
            $sinif = array_keys((array)$this);
            for($i = 1;$i<count($sinif);$i++)
            {
                $sinifKucuk = strtolower($sinif[$i]);
                $sinifBuyuk = $this->{$sinif[$i]};
                if($sinifKucuk == 'sifre')
                {
                    if($sinifBuyuk != '')
                    {
                        $sinifBuyuk = md5(sha1($sinifBuyuk));
                        $this->Sifre = $sinifBuyuk;
                        $sorguMetin .= " $sinifKucuk = '$sinifBuyuk'";
                        if($i<count($sinif)-1)
                        {
                            $sorguMetin .= ', ';
                        } 
 
                    }
 
                }
                else
                {
                    $sorguMetin .= " $sinifKucuk = '$sinifBuyuk'";    
                    if($i<count($sinif)-1)
                    {
                        $sorguMetin .= ', ';
                    } 
                }
 
 
            }
            $sorguMetin .= " WHERE id = '$this->ID'";
 
            mysql_query($sorguMetin);
        }

php sayfalama

bir zamanlar yazmış olduğum dağınık sayfalama fonksiyonunu toparlayıp class haline getirdim.

Class :

<?php 
////////////////////////////////////////////////////
//                                                                                            	  
//	Code By İsmail Perim                                                 
//	http://www.ismailperim.net
//	<ismailperim@gmail.com>
//	
//	Dosya                : /sayfalama.php
//	Açıklama            : Sayfalandırma Sınıfı
//							
////////////////////////////////////////////////////
 
class Sayfalama
{
	public $KayitSayisi = 10;
	public $Sorgu = "";
	public $ToplamKayit = "";
	public $Linkler = "";
	public $Sayfa = "";
	public function Sayfalama($_Sorgu,$_TopKay,$_Sayfa,$_KayitSayisi=10)
	{
		$this->KayitSayisi = $_KayitSayisi;
		$this->Sorgu = $_Sorgu ;
		$this->ToplamKayit = $_TopKay;
		$this->Sayfa = $_Sayfa;
	}
	public function Olustur()
	{
 
			$adet=15;
 
			if($_GET['sayfa']==0)
			{
				$_GET['sayfa']=1;
				$sayfa=0;
				$kayit=0;
			}
			elseif($_GET['sayfa']==1)
			{
				$sayfa=0;
				$kayit=0;
			}
			else
			{
				$sayfa=$_GET['sayfa'];
				$kayit=($sayfa*$adet-$adet);
			}
 
			$sorgu_temp = $this->Sorgu."   LIMIT $kayit,$adet  ";
			$this->Sorgu=mysql_query($sorgu_temp);
 
			#######################   LİNKLER  #######################
			
					$sonraki=$_GET['sayfa']+1;
					$onceki=$_GET['sayfa']-1;
										if($onceki>0)
					{
						$this->Linkler.='<a href="?'.$this->Sayfa.'sayfa='.$onceki.' " style="text-decoration:none;"> [ Önceki ] </a>';
					}
					$say=$this->ToplamKayit;
					$link=ceil($say/$adet);
					$nokta=0;
					$nokta1=0;
					for($i=1;$i<$link+1;$i++)
					{
 
						if($i<$sayfa+6 && $i>$sayfa-6)
						{
							if((int)$sayfa==$i)
							{
								$this->Linkler.='<b>';
							}
 
							$this->Linkler.='<a href="'.$this->Sayfa.'sayfa='.$i.'" style="text-decoration:none;"> ['.$i.'] </a>';
 
							if((int)$sayfa==$i)
							{
								$this->Linkler.='</b>';
							}
 
						}	
						else
						{
							if( $i<$sayfa+6 && $nokta== 0)
							{
								$this->Linkler.=  '<a href="'.$this->Sayfa.'sayfa='.($sayfa-5).' " style="text-decoration:none;"> [ ... ] </a>';
								$nokta = 1;
							}	
							if( $i>$sayfa-6 && $nokta1== 0)
							{
								$this->Linkler.=  '<a href="'.$this->Sayfa.'sayfa='.($sayfa+5).' " style="text-decoration:none;"> [ ... ] </a>';
								$nokta1 = 1;
							}	
 
						}
					}
 
					if($sonraki<$link+1)
					{
						$this->Linkler.='<a href="'.$this->Sayfa.'sayfa='.$sonraki.' " style="text-decoration:none;"> [ Sonraki ] </a>';
					}
 
 
			#######################  / LİNKLER #######################
	}
}
 
 
 
?>

Örnek Kullanım :

////////////////////////////////////////////////////
//                                                                                            	  
//	Code By İsmail Perim                                                 
//	http://www.ismailperim.net
//	<ismailperim@gmail.com>
//	
//	Dosya                : /sayfalama_ornek.php
//	Açıklama            : Sayfalandırma Sınıfı Örneği
//							
////////////////////////////////////////////////////
 
# Sayfalama Sınıfımızı Ekliyoruz
include_once "sayfalama.php";
 
# MySQL Bağlantılarını Yaptığımız Sayfamız
include_once "baglanti.php";
 
# Toplam Kayıt Sayısını Alıyoruz.
$KayitSayisi = mysql_num_rows(mysql_query("SELECT * FROM Tablo"));
 
#Bir Sayfada Gösterilecek Kayıt Sayısı
$KacKayit = 15;
 
# Yeni Bir Sayfalama Sınıfı Türetiyoruz
$Sayfa = new Sayfalama("SELECT * FROM Tablo ",$KayitSayisi,"index.php?Islem=KayitListe&",$KacKayit);
 
# Sınıfımız Gerekli İşlemleri Yaparak Sorguları Sayfalandırmaya Uygun Hale Getiriyor
$Sayfa->Olustur();
 
# Oluşan Sayfa Linklerini Ekrana Bastırıyoruz
echo $Sayfa->Linkler;
 
# Sayfalandırma Sonucu Uygun Hale Getirilen Sorgumuzu İşlemlerimiz İçin Kullanıyoruz.
while($Veri = mysql_fetch_array($Sayfa->Sorgu))
{
     #... İşlemlerimiz ... #
}
?>

plesk client api

Bir kaç gün önce bir projede Plesk panelde kaytılı domainlere yeni mail adresi ekleme, silme, düzenleme gibi iÅŸlemleri yapmam gerekiyordu. Bunun üzerine küçük çaplı araÅŸtırmalar sonucunda Plesk’in bir API si olduÄŸunu öğrendim ve araÅŸtırmalarımı birazcık daha sürdürdükten sonra gerekli dökümanları elde etmiÅŸtim ve oturup ihtiyacıma uygun birÅŸeyler çıkartmaya baÅŸladım.
Öncelikle size sistemin nasıl işlediğinden bahsetmek istiyorum;
Plesk Panelin API uyumlu sürümlerinde “enterprise/control/agent.php” konumundaki dosyaya Plesk panelin anlayacağı dilden (: XML verileri göndererek ve yine aynı yöntemle cevaplarını alarak iÅŸlemlerimiz yapıyor ve iÅŸlem sonuçlarını görüyoruz. Fazla söze gerek yok (:
Plesk, Burda ve burda gerekli açıklamaları ve örnekleri yapmış.

Gelelim benim örneğime;

php nin cURL kütüphanesini kullanaraktan bu verileri gönderme ve yanıtlarını alma işini yaptım. İşte bu işlemleri yapan sınıfımız;

<?php
// <ismailperim@gmail.com>
class Mail
{
public $Host;
public $Port = "81";
public $Path = 'enterprise/control/agent.php';
public $Kullanici = "admin";
public $Sifre;
public $DomainID;
public $Sonuc;
public $SonucSayi;
 
public $MailAd;
public $MailSifre;
 
private $Oturum;
private $Url; 
private $Basliklar ;
 
	public function Mail($_Host = null,$_Port = null ,$_Kullanici = null,$_Sifre = null,$_DomainID =null)
	{
		if(!is_null($_DomainID))
		{
			$this->Host = $_Host;
			$this->Port = $_Port;
			$this->Kullanici = $_Kullanici;
			$this->Sifre = $_Sifre;
			$this->DomainID = $_DomainID;
		}
 
		$this->Url = "http://".$this->Host.":".$this->Port."/".$this->Path."";
		$this->Basliklar = array(
		'HTTP_AUTH_LOGIN: '.$this->Kullanici.'',
		'HTTP_AUTH_PASSWD: '.$this->Sifre.'',
		'Content-Type: text/xml'); 
 
 
 
		$this->Oturum = curl_init();
		curl_setopt($this->Oturum, CURLOPT_SSL_VERIFYHOST, 0);
		curl_setopt($this->Oturum, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($this->Oturum, CURLOPT_HTTPHEADER, $this->Basliklar);
		curl_setopt($this->Oturum, CURLOPT_URL, $this->Url);
		curl_setopt($this->Oturum, CURLOPT_RETURNTRANSFER, true);
	}
	public function Ekle($_Isim,$_Sifre)
	{
		$_Paket = <<<EOP
		<packet version="1.4.2.0">
			<mail>
			<create>
			   <filter>
			      <domain_id>$this->DomainID</domain_id>
			      <mailname>
			          <name>$_Isim</name>
			          <mailbox>
			              <enabled>true</enabled>
			          </mailbox>
			          <password>$_Sifre</password>
			          <permissions>
			              <cp_access>true</cp_access>
			          </permissions>
			      </mailname>
			   </filter>
			</create>
			</mail>
		</packet>
EOP;
		curl_setopt($this->Oturum, CURLOPT_POSTFIELDS, $_Paket);
		$_Donen = curl_exec($this->Oturum);
		//curl_close($this->Oturum); 
		if(eregi("<status>ok</status>",$_Donen))
		{
			$this->Sonuc = "E-mail Adresiniz Eklendi.";
			$this->SonucSayi = true;
		}
		else
		{
			$this->Sonuc = "E-mail Adresiniz Eklenemedi";
			$this->SonucSayi = false;
		}
		return $this->Sonuc;
	}
	private function ListeDonustur($_Liste)
	{
	//echo $_Liste;
		$_Donen = array(array());
		$Dok = new DOMDocument();
		$Dok->loadXML($_Liste);
		$Sonuclar = $Dok->getElementsByTagName( "result" );
		$i = 0;
		foreach($Sonuclar as $S)
		{
			$Isim = $S->getElementsByTagName( "name" );
			$_Donen[$i]["isim"] = $Isim->item(0)->nodeValue;
			$Sifre= $S->getElementsByTagName( "password" );
			$_Donen[$i]["sifre"] = $Sifre->item(0)->nodeValue;
			$i++;
		}
		return $_Donen;
	}
	public function Liste($_Isim=null)
	{
		$this->Mail();
		if(!is_null($_Isim))
		{
			$_IsimIc = "<name>$_Isim</name>";
 
		}
		else
		{
			$_IsimIc = "";
		}
		$_Paket = <<<EOP
		<packet version="1.4.2.0">
			<mail>
				<get_info>
					<filter>
						<domain_id>$this->DomainID</domain_id>
						$_IsimIc
					</filter>
					<cp_access/>
					<mailbox/>
					<aliases/>
					<permissions/>
				</get_info>
			</mail>
		</packet>
EOP;
 
		curl_setopt($this->Oturum, CURLOPT_POSTFIELDS, $_Paket);
		$_Donen = curl_exec($this->Oturum);
		//curl_close($this->Oturum); 
		return $this->ListeDonustur($_Donen);
	}
	public function Duzenle($_Isim,$_Sifre)
	{
		$this->Sil($_Isim);
		if($this->SonucSayi)
		{
			$this->Ekle($_Isim,$_Sifre);
			if($this->SonucSayi)
			{
				$this->Sonuc = "E-Mail Adresiniz Düzenlendi";
				$this->SonucSayi=true;
			}
			else
			{	
				$this->Sonuc = "E-Mail Adresiniz Düzenlenemedi";
				$this->SonucSayi=false;
			}
		}	
		else
		{	
			$this->Sonuc = "E-Mail Adresiniz Düzenlenemedi";
			$this->SonucSayi=false;
		}
	}
	public function Sil($_Isim = null)
	{
		if(!is_null($_Isim))
		{
			$_Paket = <<<EOP
			<packet version="1.4.2.0">
			<mail>
			<remove>
			   <filter>
			      <domain_id>$this->DomainID</domain_id>
			      <name>$_Isim</name>
			    </filter>
			</remove>
			</mail>
		</packet>
EOP;
		curl_setopt($this->Oturum, CURLOPT_POSTFIELDS, $_Paket);
		$_Donen = curl_exec($this->Oturum);
		if(eregi("<status>ok</status>",$_Donen))
			{
				$this->Sonuc = "E-Mail Adresiniz Silindi.";
				$this->SonucSayi = true;
			}
			else
			{
				$this->Sonuc = "E-Mail Adresiniz Silinemedi";
				$this->SonucSayi = false;
			}
		}
	}
	public function Kapat()
	{
		curl_close($this->Oturum); 
	}
}
 
 
?>

ajax

Nedir bu AJAX ?

Son zamanlarda web dünyasında sıkça duymaya & görmeye baÅŸladığımız AJAX ingilizcede “Asynchronous JavaScript And XML” anlamını taşımaktadır.

AJAX, genel anlamda JavaScript ve XmlHttpRequestler aracılığıyla GET ve POST istekleri gönderip, bu isteklerin cevaplarını yine istekleri gönderdiÄŸimiz yöntem olan JavaScript’le geri almaktır.

Kısaca AJAX’ın bileÅŸenlerini tanıyalım;

GET ve POST istekleri:

Hazırladığım web sayfalarına bir veri göndermek için kullandığımız istekler, php, asp, asp.net v.b. diller ile programlanmış web sayfaları tarafından alınarak işleme sokulur.Örneğin bir iletişim forumundaki verilerimizi post veya get methodu ile bir web sayfasına göndeririz.Bu web sayfası isteğimizdeki değişkenler ve karşılığı olan verileri alarak bir dizi işlem sonucu iletişim formundan gelen verileri bize iletmiş olur.

JavaScript :

JavaScript, sayfalarımızda kullandığımız, “Client Side” bir dildir. Yani JavaScript kodları diÄŸer dillerdeki gibi sunucuda yorumlanıp geriye bir yanıt dönmek yerine web sayfasını çalıştıran kullanıcının web tarayıcısı tarafından yorumlanarak web sayfasıyla etkileÅŸimli bir halde yanıt döner.

XmlHttpRequest :

Son zamanlarda Microsoftun ActiveX’inden sonra diÄŸer tarayıclarda ortaya çıkmış olan kütüphanedir.Genel anlamıyla yada AJAX denilen olayda iÅŸimize yaradığı kadarıyla XmlHttpRequest’ler, GET ve POST isteklerini JavaScript aracılığıyla Xml halinde belirttiÄŸimiz sayfalara gönderen ve yine bu isteklerin yanıtlarını JavaScript aracılığıyla geri dönen “ÅŸey” dir.

AJAX tüm bunların birleşiminden oluşan ve JavaScript ile web sayfalarından aldığımız verileri diğer işlem yapacak sayfalara gönderir ve bunların yantılarını yine bize döner. Bu yanıtları işleyerek bir sonuc olarak web sayfalarımıza yansıtırız.

Peki, neden AJAX’a ihtiyaç duyarız ?

İstek gönderme ve yanıtlarını alma iÅŸlemini server-side dillerde de yapabiliriz. Fakat AJAX’ı bunlardan ayıran kısım ise bütün bu iÅŸlemlerin aSenkron olarak yapılmasıdır.

Yani bir web sayfası server-side bir dil ile gelen verileri iÅŸler, bir sonuç yaratır ve bu sonucu ekranda gösterdiÄŸinde o sayfa durmuÅŸ demektir. Bütün kodlar çalışır ve bize sonucu gösterir. BaÅŸka iÅŸlemler yapabilmek için baÅŸka sayfalara, baÅŸka istekler göndermemiz gerekmektedir. Bu ise farklı bir sayfaya yönlenmek, o sayfanın çalışma ekrana getirilmesi demektir. Kısaca sadece server-side diller ile olÅŸturulan web sayfaları statik‘tir. AJAX ise bu sayfaları dinamik bir hale getirmemizi saÄŸlar . Normalde bir butona basıldığında gerekli iÅŸlemler için sunucuya istek gönderilip isteÄŸin yanıtının alınıp sayfanın tekrar ekrana getirilmesine karşın AJAX ile butona basıldığında arka plandaki baÅŸka bir sayfa aracılığıyla gerekli iÅŸlemleri içeren isteÄŸi ve yanıtını dinamik anlamda gönderip, alabiliriz.İşte AJAX bu marifetleri ile iÅŸimize çok yarayan bir araç, kavram v.s. olmuÅŸtur.

AJAX’ı daha iyi anlayabilmeniz için yaptığım küçük bir örnek.

ÖrneÄŸimde, bugüne kadar bulabildiÄŸim, en iyi ve Türkçe karakterlerde en sorunsuz XmlHttpRequest kütüphanesi olan eyceks ‘i kullandım.

Örnek

İşlem’i yapan php sayfası

İlerleryen zamanlarda AJAX ile ilgili php mysql kullanılarak yapılmış daha geniş kapsamlı örnekler, AJAX ve php ile yaşayabilceğimiz sorunlar ve çözümleri ile ilgili makaleler yayınlamayı planlıyorum.

Kaynak Dosyalar – Source