在我的用户类中使用数据库类

时间:2010-04-05 02:19:11

标签: php database class object

在我的项目中,我有一个数据库类,用于处理所有MySQL的东西。它连接到数据库,运行查询,捕获错误并关闭连接。

现在我需要在我的网站上创建一个成员区域,我打算构建一个用户类来处理注册,登录,密码/用户名更改/重置和注销。在这个用户类中,我需要使用MySQL,原因很明显......这就是我的数据库类。

但是我对如何在用户类中使用我的数据库类感到困惑。我是否想为我的用户类创建一个新的数据库对象,然后只要该类中的方法完成就关闭它?或者我以某种方式创建一个可以在整个脚本中使用的“全局”数据库类(如果是这种情况我需要帮助,不知道该怎么做。)

感谢您提供给我的任何反馈。

6 个答案:

答案 0 :(得分:22)

简单,3步骤。 1 /创建数据库对象。 2 /将它提供给用户类构造函数。 3 /在用户方法中使用它。

很少的例子。

File Database.class.php:

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

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

在User.class.php中:

<?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"');
  }
}

现在,在userManager.php中,例如:

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

如果你想要这个旧技术的当前流行名称,谷歌“依赖注入”。 php中的Singleton模式很快就会消失。

答案 1 :(得分:1)

正如他所说,将所有函数放在数据库类中,并使用数据库对象从您的用户类访问这些函数。这应该是您的最佳方法。 例如:
global $database;
userclassvar = $database->doSomething();

答案 2 :(得分:1)

我喜欢做的是让数据库类考虑Singleton pattern。这样,如果您已经有一个数据库对象,它只会检索它,否则会创建一个新对象。例如:

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();
    }

}

现在您可以使用User的{​​{1}}属性来执行数据库功能,例如$_link。如果您的类不必与数据库交互那么多,那么您不必将$this->_link->query(...)放在构造函数中。

答案 3 :(得分:0)

由于您使用数据库作为对象,为什么不只是向“用户类”可以使用的对象添加方法来处理它需要做的事情。 users类可以包含指向数据库类的指针。数据库类将保护您的数据库,并确保用户类正在正确使用它。

答案 4 :(得分:0)

我认为更好的方法是创建一个数据库类,它在database.php上自行实现,然后将其包含在user.php中。然后,每次创建需要数据库的函数时,都会对数据库对象进行全球化。

检查一下。 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     =   "Query 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();

?>

这是user.php

<?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);

}
}

?>

答案 5 :(得分:0)

这是使用PDO的解决方案。

<?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;
        }
    }
?>