Benim kullanıcı sınıfta bir veritabanı sınıfını kullanma

5 Cevap php

Projemde ben bütün MySQL şeyler işlemek için kullanabileceğiniz bir veritabanı sınıfı var. Bu, bir veritabanına bağlanan sorguları çalışır, hataları yakalar ve bağlantıyı kapatır.

Şimdi benim sitede bir üye alanı oluşturmak gerekiyor, ve ben, şifre / kullanıcı adı değişiklikleri / sıfırlar giriş, kayıt işlemek Kullanıcıların sınıf oluşturmak için gidiyor ve çıkıyor edildi. Bu kullanıcılar sınıfta benim veritabanı sınıfı için yapılmış ne olduğunu bariz nedenlerle ... için MySQL kullanmak gerekir.

Ama benim kullanıcıların sınıfta benim veritabanı sınıfını kullanmak nasıl olarak karıştı. Benim kullanıcı sınıfı için yeni bir veritabanı nesnesi oluşturmak ve sonra bu sınıfta bir yöntem bitmiş olduğunda onu kapatmak sahip olmak istersiniz? Ya ben bir şekilde (bu durumda ben olsam yardım, orada ne yapacağını hiçbir fikrim gerekir.) Benim tüm betik boyunca kullanılabilecek bir 'küresel' veritabanı sınıfı yapabilirim

Herhangi bir geri bildirim için teşekkür ederiz bana verebilir.

5 Cevap

Simple, 3 step process. 1/ Create a database object. 2/ Give it to your user class constructor. 3/ Use it in the user methods.

Küçük bir örnek.

Database.class.php Dosya:

<?php
class Database{
  public function __construct(){
    // Connects to database for example.
  }

  public function query($sqlQuery){
    // Send a query to the database
  }
  [...]
}

User.class.php in:

<?php

class User{
  private $_db;
  public function __construct(Database $db){
    $this->_db = $db;
  }

  public function deleteUser(){
    $this->_db->query('DELETE FROM Users WHERE name = "Bobby"');
  }
}

Şimdi, örneğin userManager.php in:

<?php
$db = new Database();
$user = new User($db);
// Say bye to Bobby :
$user->deleteUser();

Eğer bu eski tekniğin güncel moda adını isterseniz, "Bağımlılık Enjeksiyon" google. Php Singleton deseni yakında solacak.

Ne yapmak ister Singleton pattern akılda ile veritabanı sınıf olun. Eğer zaten bir veritabanı nesnesi varsa bu şekilde, sadece onu alır, aksi halde yeni bir tane oluşturur. Örneğin:

Database.class.php

class Db
{
    protected static $_link;

    private function __construct()
    {
        // access your database here, establish link
    }

    public static function getLink()
    {
        if(self::_link === null) {
            new Db();
        }
        return self::_link;
    }

    // etc.

}


User.class.php

class User
{
    protected $_link;    // This will be the database object
    ...

    public function __construct()
    {
        $this->_link = Db::getLink();
    }

}

Ve şimdi $this->_link->query(...) gibi, veritabanı fonksiyonları yapmak için User 's $_link özelliği kullanabilirsiniz. Sen mutlaka sınıfı o kadar veritabanı ile etkileşim yoksa yapıcısındaki Db::getLink() koymak zorunda değilsiniz.

Eğer bir nesne olarak veritabanı kullanıyorsanız bu yana, neden sadece "kullanıcılar sınıf" yapması gereken şeyler dikkat çekmek için istihdam nesne yöntemleri eklemek değil. Kullanıcıların sınıf veritabanı sınıfının bir işaretçi içerebilir. Veritabanı sınıfı veritabanı korumak ve kullanıcıların sınıf uygun bir şekilde kullanmak olduğunu sağlayacaktır.

Ben daha iyi yaklaşımın bir database.php üzerinde kendi hemen instatiate ve sonra User.php üzerine dahil veritabanı sınıfı oluşturmak için olacağını düşünüyorum. o zaman bir veritabanı gerektiren bir işlev oluşturmak her zaman, size veritabanı nesnesini küreselleştirmek.

Check this. databse.php

<?php
 require_once ('includes/config.php');

 class MysqlDb{
 public $connection;
 private $last_query;
 private $magic_quotes_active;
 private $real_escape_string_exists;


 public function __construct() {
    $this->open_connection();
    $this->magic_quotes_active = get_magic_quotes_gpc();
$this->real_escape_string_exists = function_exists( "mysql_real_escape_string" );
 }

 public function open_connection() {
     $this->connection    = mysql_connect(DBHOST,DBUSER,DBPASS);
     if(!$this->connection){
         die("Could not Connect ".mysql_error());
     }else{
         $db = mysql_select_db(DB,  $this->connection);
     } 
 }

 public function close_connection(){
     if(isset($this->connection)){
         mysql_close($this->connection);
         unset($this->connection);
     }
 }

 public function query($sql){
     $this->last_query   =   $sql;
     $results            = mysql_query($sql, $this->connection);
     $this->comfirm_query($results);
     return $results;
 }

 private function comfirm_query($results){
     if(!$results){
         $output     =   "Querry Failed " .mysql_error()."<br />";
         $output    .=    "Last Query: " .  $this->last_query;
         die($output);
     }
 }

 public function escape_value($value){

if( $this->real_escape_string_exists ) { 
    if($this->magic_quotes_active ) { $value = stripslashes( $value ); }
    $value = mysql_real_escape_string( $value );
} else { 
    if( !$this->magic_quotes_active ) { $value = addslashes( $value ); }
}
return $value;
 }

 public function fetch_array($results){
     return mysql_fetch_array($results);         
 }

 public function num_row($results){
     return mysql_num_rows($results);
 }

 public function insert_id(){
     return mysql_insert_id($this->connection);
 }

 public function affected_row(){
     return mysql_affected_rows();
 }
}
$database   =   new MysqlDb();

?>

burada User.php olduğu

<?php
require_once ('includes/database.php');

class User {

public $id;
public $fName;
public $lName;
Public $userName;
public $password;
public $email;
public $acess;

public static function find_all(){
    global $database;
    return self::find_by_sql("SELECT * FROM users");       
}

public static function find_by_id($id=0){
    global $database;
    $results_array = self::find_by_sql("SELECT * FROM users where id={$id}");
    return !empty($results_array)? array_shift($results_array) : false;
}

public static function find_by_sql($sql){
    global $database;
    $results = $database -> query($sql);
    $object_array = array();
    while($row = $database -> fetch_array($results)){
        $object_array[] = self::instantiate($row);
    }
    return $object_array;
}

public static function instantiate($row){
     $user   =   new self;
     foreach($row as $attribute => $value){
         if($user -> has_attribute($attribute)){
             $user -> $attribute = $value;
         }
     }
     return $user;
}

private function has_attribute($attribute){
    $object_vars = get_object_vars($this);
    return array_key_exists($attribute, $object_vars);

}
}

?>

Burada PDO kullanarak bir çözümdür.

<?php
    class Database {
        private static $dbh;

        public static function connect() {
            $host = "mysql:dbname=YOUR_DB_NAME;host=YOUR_DB_SERVER";
            $username = "YOUR_USERNAME";
            $password = "YOUR_PASSWORD";
            try {
                self::$dbh = new PDO( $host, $username, $password );
                self::$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
                self::$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
                self::$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            } catch( PDOException $e ){
                $error_message = $e->getMessage();
                exit();
            }
            return self::$dbh;
        }
    }

    class MYObject {
        public static $dbh = null;

        public function __construct(PDO $db = null) {
            if($db === null){
                $this->dbh = Database::connect();
            } else {
                $this->dbh = $db;
            }
        }
    }

    class User extends myObject {
        public function __construct($id = null, PDO $db = null) {
            if($db === null){
                parent::__construct();
            } else {
                parent::__construct($db);
            }

            if($id !== null){
                return $this->select($id);
            }
        }

        public function select($id) {
            $retVal =false;
            try {
                $stmt = $this->dbh->prepare("SELECT...");
                $stmt->execute();

                if( $stmt->rowCount()==1 ){
                    $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    $retVal =json_encode($row);
                 }
            } catch (PDOException $e ) {
                $error_message = $e->getMessage();
                exit();
            }
            return $retVal;
        }
    }
?>