DB işlevi kodunu birbirinden ayırma

5 Cevap php

Ben şu an bir nesne yönelimli PHP web sitesi geliştiriyorum ve sistemin geri kalanından soyut veritabanı işlevselliği için en iyi yolu belirlemek için çalışıyorum. Şu anda, ben sistem kullandığı (oldukça çok mdb2 bir arayüz) tüm bağlantıları ve sorguları yöneten bir DB sınıf var. Bu sistemi kullanarak Ancak, benim kodunda her yerde gösteren SQL sorgu dizeleri bir sürü var olduğunu fark ettik. Örneğin, benim Kullanıcı sınıfta, ben böyle bir şey var:

function checkLogin($email,$password,$remember=false){
    $password = $this->__encrypt($password);
    $query = "SELECT uid FROM Users WHERE email=? AND pw=?";

    $result = $this->db->q($query,array($email,$password));

    if(sizeof($result) == 1){
       $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC);
       $uid = $row['uid'];
    }else{
       return false;
    }

    /* Rest of the login script */
}

Ne yapmak istiyorsunuz inline SQL miktarını azaltmak için en iyi tekniği öğrenmek olduğunu. Bunu yapmak için bir yol kullanıcı (aşağıdaki gibi bir şey) kullanımını yapar sorguları her biri için Kullanıcı içindeki işlevleri yazmak olacağını anlıyoruz, ancak epeyce fonksiyonlara yol açabilir.

function checkLogin($email,$password,$remember=false){
    $password = $this->__encrypt($password);
    $uid = $this->do_verify_login_query($email,$password);

    /* Rest of the login script */
}

function do_verify_login_query($email,$encpw){
    $query = "SELECT uid FROM Users WHERE email=? AND pw=?";
    $result = $this->$db->q($query,array($email,$encpw));

    if(sizeof($result) == 1){
       $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC);
       return $row['uid'];
    }else{
       return false;
    }
}

Yani ... benim soru. Tipik bir veritabanı uygulaması kullanmak olacağını sorguları büyük miktarda yönetmek için en iyi tekniği nedir? Ben açıklanan şekilde bu durumun işleme uygun şekilde olacaktır? Ya DB sınıfı içinde sorgularının bir listesini kayıt ve DB'ın sorgu işlevi geçirilir (örneğin USER_CHECKLOGIN gibi) benzersiz bir kimliği, her ile ilişkilendirmek hakkında? Bu listede kayıtlı olduğunu sadece bu çalıştırmak olabilir sorguları sınırlamak olur Bu yöntem ayrıca, güvenlik yardımcı olabilir, ancak tüm sınıf fonksiyonları yazarken hatırlamak için bir şey daha var. Düşünceler?

5 Cevap

SQL ayrı işlevleri içine çıkardı olması iyi bir başlangıç. Yapabileceğiniz bazı diğer şeyler:

  • Veritabanı erişim kodu için ayrı sınıflar oluşturmak. Bu SQL fonksiyonları PHP tüm dosyaları etrafında dağınık yok emin olun yardımcı olacaktır.
  • Harici dosyalardan SQL yükleyin. Bu tamamen hem daha rahat yapma, SQL kodu ve PHP kodu ayırır.
  • Zaman yapabilirsiniz saklı prosedürleri kullanın. Bu tamamen sizin PHP kodu SQL kaldırır ve dış SQL idam alacak riskini azaltarak veritabanı güvenliğini artırmaya yardımcı olur.

Sen ActiveRecord Pattern uygulanması içine bakmak isteyebilirsiniz. Bu gibi bir tasarım deseni kullanarak sizin tablodaki verileri ile çalışmak nasıl bazı tutarlılık sağlar. Orada yaklaşımların bu tür, belirli sorgu türleri ağırlıklı olarak performans için bazı olumsuz yanları olabilir ama etrafında çalışmış olabilir.

Başka bir seçenek PHP için bir ORM kullanımı olabilir en güçlü şunlardır:

Hem siz, nesneleri bir dizi kullanarak veri depolamak ve sorgulamak için basit bir API sağlayan, hem de bunun hedeflenen DBMS yerli SQL dahili dönüştürülür, kendi sorgu dili var veritabanına erişmek için izin vermek, bu bir RDBMS uygulamaları göç kolaylaştıracak Basit yapılandırma değişiklikleri ile başka. Ben de size, örneğin, sadece modeli sınıfları uzatarak doğrulama eklemek için DataModel mantığı kozalayabilirsiniz gerçeği gibi.

Eğer OO PHP gibi bu yaptığını söylemek yana, o zaman neden SQL ilk etapta tüm yöntemlerle dağınık var mı? Daha yaygın modelleri olacaktır:

  1. Bir ORM kullanmak ve bu veritabanını halledeyim.
  2. Sınıfları bir veya daha fazla bellek ve veritabanındaki her şeyi güncellemek için tek sorgu kullanan bir 'tasarruf' yöntemi içine bir nesnenin tüm verileri çekmek için tek bir sorgu kullanmak 'yük' yöntemleri ver. Tüm diğer yöntemler sadece bellek manipülasyon yapmak gerekir ve veritabanı etkileşimleri yükleme / kaydetme yöntemleri sınırlıdır.

İlk seçenek genellikle daha sağlam olacak, ama ikinci daha hızlı çalışabilir ve muhtemelen bu ya endişeleri varsa, bir şeyler yapmaya alışık yolu kıyasla daha tanıdık hissedeceksiniz.

Giriş Örneğin, ben bunu yapacağını yolu, daha sonra, sadece çağrı $user->check_password($entered_password), e-posta adresi ile kullanıcı yüklemek olacaktır, ve return false / ne olursa olsun eğer {[(1)] / istisna } başarısız olur. Ne check_password ne giriş işleme kodunun herhangi bir ya da kullanıcı yüklenen alır nerede bir veritabanı olduğunu bilerek, veritabanı ile kendilerini ilgilendiren gerekir.

Başka bir seçenek veri olarak sorguları düşünmek ve onları veritabanında depolamak için. Örneğin, bu sorgu için parametreleri saklayan bir isim ve başka bir tablo ile sorgu saklayan bir tablo oluşturabilirsiniz. Sonra sorgu adını ve params dizisi alır ve herhangi bir sonuç dönen sorgualamayı PHP bir işlev oluşturun. Ayrıca, vb belirli kullanıcılara erişimi kısıtlamak sonuçları sonrası fonksiyonlarını uygulamak için sorguları diğer meta eklemek olabilir