• 22-02-2013, 11:09:23
    #1
    class DB
    {
    private	$sorgu,$select,$from,$where;
    function __construct(){}
    
    
    public function select($deger){
    $this->select=$deger;
    }	
    
    public function from($deger){
    $this->from=$deger;	
    }
    public function where($deger){
    $this->where=$deger;	
    }	
    		
    function __destruct(){
    $this->sorgu=mysql_query("select ".$this->select." from ".$this->from." where ".$this->where);
    return $this->sorgu;	
    }	
    }
    
    
    
    
    $data=new DB;
    $data->select("*");
    $data->from("icerik");
    $data->where("id=1");
    
    $yaz=mysql_fetch_array($data);
    echo $yaz["ad"];



    Bu şekilde basit bir sorgu classı hazırlamaya çalışıyorum veri çekme işlemleri için sorguyu oluşturup destruct fonksoyunu ile değeri geri yollamaya calışıyorum fakat classı kullanmaya calışırken sıkıntı yaşıyorum bunu nasıl yapmalıyım?(Class yapısına yeni yeni başladım yardımcı olabilecek arkadaşlara şimdiden teşekkürler)

    ve son olarak bu __destruct veya construct fonksiyonları sadece php5temi çalışıyo önceki sürümlerle bi yapı farkı varmış doğrumudur.
  • 22-02-2013, 13:46:57
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    batuhanaydin adlı üyeden alıntı: mesajı görüntüle
    Class Ornek 
    {
    	public function __construct()
    	{
    		echo __METHOD__ . PHP_EOL;
    	}
    	
    	public function __destruct()
    	{
    		echo __METHOD__ . PHP_EOL;
    	}
    }
    
    
    /*
     * Sınıf çağırıldığında ilk önce __construct(); çalışacaktır..
     * En son ise __desctruct(); çalışır ve orada da mysql_close ile veritabanı bağlantısını sonlandırabilirsiniz..
     * */ 
    
    $ornek = new Ornek();
    
    /*
     * Çıktı ;
    *  Ornek::__construct
    *  Deneme..
    *  Ornek::__destruct
    * */
    
    echo '<br />Deneme.. <br />';
    /*
     * __desctruct methodu burada çalışacak..
     * */
    
    // Önceki sürümlerde ise
    
    Class deneme 
    {
    	public function deneme()
    	{
    		echo __METHOD__;	
    	}
    }
    // Şeklinde yazıldığında deneme methodunu sınıf adı ile aynı koyduğunuzda başlangıç olarak alıyordu , __desctruct için ne yapıldığını bilemiyorum.
    $deneme = new deneme();
    Yani __construct() da veritabanı bağlantısı başlatıp __desctruct() methodunda sonlandırmanız mantıklı olacaktır ..
    syntax hatalarınız olabilir ayrıca class keywordunu yanlış yazmışınız evrensel kod yapısına uyumsuzluk sağlıyor.
  • 22-02-2013, 14:33:36
    #3
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Sınıfınız çok yetersiz görünüyor. Üzerinde bir plan yapıp ihtiyaçlar ne ise ona göre bir yapı oluşturmanız gerekir. Size kendi yazdığım bir "query builder" sınıfının kaynak kodlarını veriyorum. Normalde bunu PDO'yu "extend" ederek hazırladım. Kolay anlamanız için mysql'e çevirmeye çalıştım. Ama hataları olabilir; çalıştırmadım.

    https://gist.github.com/grafitus/ab21ac735f9cc00ae0d7

    PHP bilmemkaç sürümü önceki __construct() yerine sınıfınızın isminde bir metot tanımlarsanız o __construct() oluyordu. Hâlâ da bu destekleniyor sanırım. Ama __construct() kullanmak daha okunaklı ve güncel olur.

    Kodunuzda __destruct() içerisinde SQL'inizi çalıştırmışsınız. Burada bence bir hata/olmaması gereken bir şey var. Şöyleki her kullandığınız sınıf (artık nesne oluyor) bellekte yer kaplayacaktır. Siz her sorgu için tekrar tekrar nesne oluşturursanız bu işlem bellekte fazla yer kullanımına yani performans düşüşüne neden olacaktır. Ancak bunun yerine sınıfınızı bir kere oluşturup diğer sorgularınızı da bunun üzerinde hazırlayabilirseniz performans sağlarsınız.
  • 22-02-2013, 14:43:24
    #4
    dostlar yanlış anlaşılmalara gerek yok construct ve destruct focksiyon yapılarının ne işe yaradığını anladım yalnız benım yazdıgım sınıftaki mantık hatası ne niye hata alıyorum ben bi yanlışlık göremedim onlarca deneme sonrası buraya yazdım.

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 14:43:24 -->-> Daha önceki mesaj 14:35:08 --

    grafitus adlı üyeden alıntı: mesajı görüntüle
    Sınıfınız çok yetersiz görünüyor. Üzerinde bir plan yapıp ihtiyaçlar ne ise ona göre bir yapı oluşturmanız gerekir. Size kendi yazdığım bir "query builder" sınıfının kaynak kodlarını veriyorum. Normalde bunu PDO'yu "extend" ederek hazırladım. Kolay anlamanız için mysql'e çevirmeye çalıştım. Ama hataları olabilir; çalıştırmadım.

    https://gist.github.com/grafitus/ab21ac735f9cc00ae0d7

    PHP bilmemkaç sürümü önceki __construct() yerine sınıfınızın isminde bir metot tanımlarsanız o __construct() oluyordu. Hâlâ da bu destekleniyor sanırım. Ama __construct() kullanmak daha okunaklı ve güncel olur.

    Kodunuzda __destruct() içerisinde SQL'inizi çalıştırmışsınız. Burada bence bir hata/olmaması gereken bir şey var. Şöyleki her kullandığınız sınıf (artık nesne oluyor) bellekte yer kaplayacaktır. Siz her sorgu için tekrar tekrar nesne oluşturursanız bu işlem bellekte fazla yer kullanımına yani performans düşüşüne neden olacaktır. Ancak bunun yerine sınıfınızı bir kere oluşturup diğer sorgularınızı da bunun üzerinde hazırlayabilirseniz performans sağlarsınız.


    hocam öncelikle yardımınız için teşekkurler daha öncede belirttiğim üzere oop framework yapılarına çok uzağım sadece mantığı geliştirmek adına böylesi denemeler yapıyorum dediğiniz üzere her sorguda yeni bi class tanımlamak gibi muazzam buyuk bı hataya dusmusum . Bunu farkettirmeniz iyi oldu benim için .

    Verdiğiniz sınıfı inceleyeceğim teşekkürler.

    Yalnız merak ettiğim husus benim yazdığım classın mantık olarak yanlış olsada çalışmamasının sebebi nedir o.
  • 22-02-2013, 15:01:33
    #5
    Siz sondan 1. satırda DB sınıfınızdan türettiğiniz nesneyi mysql_fetch_aray'a gönderiyorsunuz. Parametre olarak $this->sorgu'yu vermeniz gerekli diye gördüm ben.
  • 22-02-2013, 15:07:31
    #6
    	public function query($sql = null, array $values = array(), array $options = array())
    	{
    		$this->_queryCount++;
     
    		$this->_sql = $sql ?: $this->_sql;
     
    		$this->_dirty = false;
     
    		return mysql_query($this->_sql); -->Burası ile aynı
    	}

    Benım hatam bunu destruct'ta yapmammı acaba ? Ben bikaç deneme daha yapayım hocam tekrar teşekkürler yardımların için saolasın
  • 22-02-2013, 17:16:43
    #7
    grafitus adlı üyeden alıntı: mesajı görüntüle
    Sınıfınız çok yetersiz görünüyor. Üzerinde bir plan yapıp ihtiyaçlar ne ise ona göre bir yapı oluşturmanız gerekir. Size kendi yazdığım bir "query builder" sınıfının kaynak kodlarını veriyorum. Normalde bunu PDO'yu "extend" ederek hazırladım. Kolay anlamanız için mysql'e çevirmeye çalıştım. Ama hataları olabilir; çalıştırmadım.

    https://gist.github.com/grafitus/ab21ac735f9cc00ae0d7

    PHP bilmemkaç sürümü önceki __construct() yerine sınıfınızın isminde bir metot tanımlarsanız o __construct() oluyordu. Hâlâ da bu destekleniyor sanırım. Ama __construct() kullanmak daha okunaklı ve güncel olur.

    Kodunuzda __destruct() içerisinde SQL'inizi çalıştırmışsınız. Burada bence bir hata/olmaması gereken bir şey var. Şöyleki her kullandığınız sınıf (artık nesne oluyor) bellekte yer kaplayacaktır. Siz her sorgu için tekrar tekrar nesne oluşturursanız bu işlem bellekte fazla yer kullanımına yani performans düşüşüne neden olacaktır. Ancak bunun yerine sınıfınızı bir kere oluşturup diğer sorgularınızı da bunun üzerinde hazırlayabilirseniz performans sağlarsınız.
    QueryBuilder sınıfınız güzelmiş hocam teşekkürlerimi sunarım, yer imlerine aldım.
  • 22-02-2013, 18:57:06
    #8
    nekrofil adlı üyeden alıntı: mesajı görüntüle
    	public function query($sql = null, array $values = array(), array $options = array())
    	{
    		$this->_queryCount++;
     
    		$this->_sql = $sql ?: $this->_sql;
     
    		$this->_dirty = false;
     
    		return mysql_query($this->_sql); -->Burası ile aynı
    	}

    Benım hatam bunu destruct'ta yapmammı acaba ? Ben bikaç deneme daha yapayım hocam tekrar teşekkürler yardımların için saolasın
    Aslında evet. Fakat onu düzeltseniz de yapınız yine de hatalı olur. Örnek vereyim bir veritabanı sınıfı hazırlıyorsanız, veritabanı sürücünüze (MySQL'e yani) bağlanma işlemini __contruct()'ta, sürücünüzle bağlantıyı sonlandırma işlemini de (mysql_close() yani) __destruct() metotdunda yapmalıydınız.

    php.net'te de belirtildiği üzere __construct() ve __destruct() metotları herhangi bir şey döndürmemeli -- "void", programlamada "değer döndürmeyen" anlamındadır. Yani return ... ; kullanılmamalı bu metotlarda. Bu sebeple ana sebep bu. Ekstra bir metot kullanarak sorununuzu çözebilirsiniz.

    saintx adlı üyeden alıntı: mesajı görüntüle
    QueryBuilder sınıfınız güzelmiş hocam teşekkürlerimi sunarım, yer imlerine aldım.
    Önemli değil. Fakat belirtmeliyim ki onu sadece fikir vermesi amacıyla paylaştım. Bir scriptte kullanılacak kadar stabil değil. Bunu gözardı etmeyin.