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

Php 在我的用户类中使用数据库类,php,database,class,object,Php,Database,Class,Object,在我的项目中,我有一个数据库类,用于处理所有MySQL内容。它连接到数据库、运行查询、捕获错误并关闭连接 现在我需要在我的站点上创建一个成员区域,我要构建一个users类,该类将处理注册、登录、密码/用户名更改/重置和注销。在这个用户类中,我需要使用MySQL,原因很明显。。。这就是我的数据库类的用途 但是我不知道如何在我的用户类中使用我的数据库类。我是否希望为我的用户类创建一个新的数据库对象,然后在该类中的方法完成时将其关闭?或者我是否以某种方式创建了一个可以在整个脚本中使用的“全局”数据库类

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

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

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


谢谢你能给我的任何反馈。

既然你把数据库当作一个对象来使用,为什么不向这个对象添加一些方法,让你的“用户类”来处理它需要做的事情呢。users类可以包含指向数据库类的指针。database类将保护您的数据库,并确保users类正确使用它。

正如他所说,将所有函数放在database类中,并使用database对象从user类访问这些函数。这应该是对你来说最好的方法。 如:

全球$数据库
userclassvar=$database->doSomething();

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

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
$\u link
属性执行数据库功能,如
$this->\u link->query(…)
。如果您的类不必与数据库进行太多的交互,则不必将Db::getLink()放入构造函数中。

简单的三步过程。 1/创建一个数据库对象。 2/将其交给用户类构造函数。 3/在用户方法中使用它

小例子

文件Database.class.php:

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

  public function query($sqlQuery){
    // Send a query to the database
  }
  [...]
}
<?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"');
  }
}

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

看看这个。 database.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);

}
}

?>

下面是一个使用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;
        }
    }
?>


这听起来很像将两个类混合在一起。我更喜欢类完全独立的解决方案,除非我遗漏了什么?OO设计是关于封装的。对我来说,独立封装数据库,然后让类访问它是有意义的,这样它就可以单独控制对数据库的访问。然而,其他设计也是可能的。有两个类都可以直接访问数据库,尽管我的观点是,这增加了额外的复杂性。我认为另一种方法是实例化一个连接到数据库的数据库类实例,然后使用一个单独的类通过从数据库类检索的数据库句柄来执行“用户”操作。。。如果你愿意的话,这应该行得通。也许是我所希望的最好的答案,我现在明白了。谢谢。。。虽然我似乎无法在不注册的情况下接受这个答案,但lolThis可能已经有几年了,但感谢您发布这篇文章——我花了两天时间四处寻找,试图弄清楚为什么我的一个类没有拉入我的DB类连接id,这导致$this->_链接没有启动,并将我的mysqli_uuu[blah blah]作为第一个参数。再次感谢。嘿,我一直在尝试实现一个类似的概念,建立这样一个链接的代码是什么?我尝试使用self::\u link=和$this->\u链接,但两者都不允许我设置链接。
<?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;
        }
    }
?>