Tasarım Uygulama Çoklu kullanıcı Al - PHP

2 Cevap php

Herkese selamlar, ben çok fazla kod fazlalık olmadan birden fazla kullanıcı kapmak için daha verimli bir yol arıyorum.

Ben bir Kullanıcılar sınıf var, (burada son derece yoğun gösterimi var)

    Class Users {

    function __construct() { ... ... }

    public static function getNew($id) {

         // This is all only example code
         $sql = "SELECT Name,Email,Etc.. FROM Users WHERE User_ID=?";

         // Retrieval using prepared statements would go here
         $user = new User();
         $user->setID($id);
         ....

         return $user;
}
  public static function getNewestUsers($count) {
     $sql = "SELECT User_ID,Name,Email,Etc.. FROM Users ORDER BY Join_Date LIMIT ?";

     $users = array();

     // Prepared Statement Data Here

     $stmt->bind_result($id,$name,$email,$etc);

     while($stmt->fetch()) {
        $users[] = Users::getNew($id);
        ...
     }
     return $users;
   }
   // These have more sanity/security checks, demonstration only.
   function setID($id) { $this->id = $id; }
   function setName($name) { $this->name = $name; }
 ...
}

Bu veritabanına çağrıları her zaman dolar sayısı numarasını yapar, çünkü çok net bir şekilde bir döngüde () getNew çağırarak, verimsiz. Ben daha ziyade tek bir SQL deyiminde tüm kullanıcıları seçmek olacaktır.

Sorun kullanıcıları dizileri almak için muhtemelen bir düzine ya da öylesine yöntemleri, yani tüm bu şimdi hep sonradan değiştirebilir yapısı çok tekrarlıyor veritabanı sütunların isimlerini bilmek gerekir olmasıdır.

Ben bu sorunu yaklaşım olabilir diğer bazı yolları nelerdir? Benim gol verimlilik, esneklik, ölçeklenebilirlik ve iyi tasarım uygulamaları içerir.

2 Cevap

Simplification of boilerplate SQL binding

Bu bir öneri olarak çok bir çözüm değildir:

Sen kadarıyla sql burada metale oldukça çıplak koşuyoruz. Ben biraz daha fazla sql dışarı ayıran tavsiye, ben yararlı bulduk tek yolu en query diyelim, basit bir veritabanı soyutlama kitaplık işlevini yaratıyor. Yukarıdaki Mikushi örneğini kullanarak:

// params: $select = full select statement with binding placeholders
// params: $bindings = either associative or numeric array, whichever fits your database binding method better
function query($select, $bindings=array()){
$res = array();

// Loop over each binding here
// Run the bound select statement, get the $res result

while($row = mysql_fetch_assoc($res)) {
        $rows[] = $row;

    }
    return $rows;
}

İdeal kullanım, PDO ile nasıl bağlayıcı eserlerin gidiyor ben Mysql_Fetch_Assoc için bağlayıcı yöntemi ile gerçekten aşina değilim () çünkü

$user_data = query('SELECT User_ID,Name,Email,Etc.. FROM Users ORDER BY Join_Date LIMIT :count', array('count'=>$count));

Bu üç faydası vardır: basit bağlama, hiç veritabanlarını geçmek gerekiyorsa tek veya çoklu-satır deyimleri seçin (bir% 80-of-the-time kullanımı harf), ve potansiyel olarak daha kolay bir süre için kazan-plaka yapmak zorunda değil.

Factory Pattern to Separate Creation of User objects from modification

Bildiğim kadarıyla kullanıcı yaratılış orijinal mesele olarak, nasıl kullanma hakkında factory pattern User User nesneler üzerinde gerçekleştirebileceğiniz yöntemleri nesneleri oluşturulmasını ayırmak için onların Kendi veri?

Class UserFactory{
    public static function getNewestUsers($count){
        $sql_statement = "SELECT User_ID,Name,Email,Etc.. FROM Users ORDER BY Join_Date LIMIT :count";
        $users_info = query($sql_statement, array('count'=>$count);
        $users = array();
        foreach($users as $user_info){
            $users[] = new User($user_info);
        }
        return $users;
    }
}

Kullanın:

$user_objects = UserFactory::getNewestUsers( 45 );

Kullanıcı nesnesi sonra sadece olacaktır: Mikushi bahseder gibi veri bir dizi üzerinde __ yapıcısı () kullanın ve fabrika potansiyel değişiklikleri kaydetmek için bir function saveUser($user_object) olabilir (ki bu veriler üzerinde değişiklik yapmak.

Eğer kullanıcı nesnesi __ construct yöntemi parametre olarak bir dizi kabul yapabilir:

class User 
{

    public function __construct($infos) {
        if(is_array($infos)) {
            $this->_initFromArray($infos);
        } else if(is_numeric($infos)) {
            $this->_initFromID($infos);
        } else {
            //Handle error
        }

    }

    private function _initFromArray($userInfo) {
        //Set your stuff in here
    }

    private function _initFromID($userID) {
        //Do your SQL magic
    }

    public function getUsersNewest($count) {
        sql = "SELECT * FROM Users ORDER BY Join_Date LIMIT ?";

        $users = array();

        // Prepared Statement Data Here
        while($row = mysql_fetch_assoc($res)) {
            $users[] = new Users($row);

        }
        return $users;
    }

}

Hat boyunca bir şey ...